commit b110254086e41d17c5676d8ed21d887b73e018dc Author: zhangyunmei Date: Tue Dec 30 16:16:19 2025 +0800 first commit diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..a11976f Binary files /dev/null and b/.DS_Store differ diff --git a/Podfile b/Podfile new file mode 100644 index 0000000..f7d0d29 --- /dev/null +++ b/Podfile @@ -0,0 +1,18 @@ +platform :ios, '15.0' +use_frameworks! + +target 'TastePick' do + pod 'FirebaseAnalytics' + pod 'FirebaseCrashlytics' + pod 'IronSourceSDK', '9.2.0.0' + #pod 'IronSourceAdMobAdapter' +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + target.build_configurations.each do |config| + config.build_settings['BUILD_LIBRARY_FOR_DISTRIBUTION'] = 'YES' + config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '15.0' + end + end +end diff --git a/Podfile.lock b/Podfile.lock new file mode 100644 index 0000000..a6ecc31 --- /dev/null +++ b/Podfile.lock @@ -0,0 +1,171 @@ +PODS: + - FirebaseAnalytics (12.7.0): + - FirebaseAnalytics/Default (= 12.7.0) + - FirebaseCore (~> 12.7.0) + - FirebaseInstallations (~> 12.7.0) + - GoogleUtilities/AppDelegateSwizzler (~> 8.1) + - GoogleUtilities/MethodSwizzler (~> 8.1) + - GoogleUtilities/Network (~> 8.1) + - "GoogleUtilities/NSData+zlib (~> 8.1)" + - nanopb (~> 3.30910.0) + - FirebaseAnalytics/Default (12.7.0): + - FirebaseCore (~> 12.7.0) + - FirebaseInstallations (~> 12.7.0) + - GoogleAppMeasurement/Default (= 12.7.0) + - GoogleUtilities/AppDelegateSwizzler (~> 8.1) + - GoogleUtilities/MethodSwizzler (~> 8.1) + - GoogleUtilities/Network (~> 8.1) + - "GoogleUtilities/NSData+zlib (~> 8.1)" + - nanopb (~> 3.30910.0) + - FirebaseCore (12.7.0): + - FirebaseCoreInternal (~> 12.7.0) + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/Logger (~> 8.1) + - FirebaseCoreExtension (12.7.0): + - FirebaseCore (~> 12.7.0) + - FirebaseCoreInternal (12.7.0): + - "GoogleUtilities/NSData+zlib (~> 8.1)" + - FirebaseCrashlytics (12.7.0): + - FirebaseCore (~> 12.7.0) + - FirebaseInstallations (~> 12.7.0) + - FirebaseRemoteConfigInterop (~> 12.7.0) + - FirebaseSessions (~> 12.7.0) + - GoogleDataTransport (~> 10.1) + - GoogleUtilities/Environment (~> 8.1) + - nanopb (~> 3.30910.0) + - PromisesObjC (~> 2.4) + - FirebaseInstallations (12.7.0): + - FirebaseCore (~> 12.7.0) + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/UserDefaults (~> 8.1) + - PromisesObjC (~> 2.4) + - FirebaseRemoteConfigInterop (12.7.0) + - FirebaseSessions (12.7.0): + - FirebaseCore (~> 12.7.0) + - FirebaseCoreExtension (~> 12.7.0) + - FirebaseInstallations (~> 12.7.0) + - GoogleDataTransport (~> 10.1) + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/UserDefaults (~> 8.1) + - nanopb (~> 3.30910.0) + - PromisesSwift (~> 2.1) + - GoogleAdsOnDeviceConversion (3.2.0): + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/Logger (~> 8.1) + - GoogleUtilities/Network (~> 8.1) + - nanopb (~> 3.30910.0) + - GoogleAppMeasurement/Core (12.7.0): + - GoogleUtilities/AppDelegateSwizzler (~> 8.1) + - GoogleUtilities/MethodSwizzler (~> 8.1) + - GoogleUtilities/Network (~> 8.1) + - "GoogleUtilities/NSData+zlib (~> 8.1)" + - nanopb (~> 3.30910.0) + - GoogleAppMeasurement/Default (12.7.0): + - GoogleAdsOnDeviceConversion (~> 3.2.0) + - GoogleAppMeasurement/Core (= 12.7.0) + - GoogleAppMeasurement/IdentitySupport (= 12.7.0) + - GoogleUtilities/AppDelegateSwizzler (~> 8.1) + - GoogleUtilities/MethodSwizzler (~> 8.1) + - GoogleUtilities/Network (~> 8.1) + - "GoogleUtilities/NSData+zlib (~> 8.1)" + - nanopb (~> 3.30910.0) + - GoogleAppMeasurement/IdentitySupport (12.7.0): + - GoogleAppMeasurement/Core (= 12.7.0) + - GoogleUtilities/AppDelegateSwizzler (~> 8.1) + - GoogleUtilities/MethodSwizzler (~> 8.1) + - GoogleUtilities/Network (~> 8.1) + - "GoogleUtilities/NSData+zlib (~> 8.1)" + - nanopb (~> 3.30910.0) + - GoogleDataTransport (10.1.0): + - nanopb (~> 3.30910.0) + - PromisesObjC (~> 2.4) + - GoogleUtilities/AppDelegateSwizzler (8.1.0): + - GoogleUtilities/Environment + - GoogleUtilities/Logger + - GoogleUtilities/Network + - GoogleUtilities/Privacy + - GoogleUtilities/Environment (8.1.0): + - GoogleUtilities/Privacy + - GoogleUtilities/Logger (8.1.0): + - GoogleUtilities/Environment + - GoogleUtilities/Privacy + - GoogleUtilities/MethodSwizzler (8.1.0): + - GoogleUtilities/Logger + - GoogleUtilities/Privacy + - GoogleUtilities/Network (8.1.0): + - GoogleUtilities/Logger + - "GoogleUtilities/NSData+zlib" + - GoogleUtilities/Privacy + - GoogleUtilities/Reachability + - "GoogleUtilities/NSData+zlib (8.1.0)": + - GoogleUtilities/Privacy + - GoogleUtilities/Privacy (8.1.0) + - GoogleUtilities/Reachability (8.1.0): + - GoogleUtilities/Logger + - GoogleUtilities/Privacy + - GoogleUtilities/UserDefaults (8.1.0): + - GoogleUtilities/Logger + - GoogleUtilities/Privacy + - IronSourceAdQualitySDK (9.1.1) + - IronSourceSDK (9.2.0.0): + - IronSourceSDK/AdQuality (= 9.2.0.0) + - IronSourceSDK/Ads (= 9.2.0.0) + - IronSourceSDK/AdQuality (9.2.0.0): + - IronSourceAdQualitySDK (~> 9.1.1) + - IronSourceSDK/Ads (9.2.0.0) + - nanopb (3.30910.0): + - nanopb/decode (= 3.30910.0) + - nanopb/encode (= 3.30910.0) + - nanopb/decode (3.30910.0) + - nanopb/encode (3.30910.0) + - PromisesObjC (2.4.0) + - PromisesSwift (2.4.0): + - PromisesObjC (= 2.4.0) + +DEPENDENCIES: + - FirebaseAnalytics + - FirebaseCrashlytics + - IronSourceSDK (= 9.2.0.0) + +SPEC REPOS: + trunk: + - FirebaseAnalytics + - FirebaseCore + - FirebaseCoreExtension + - FirebaseCoreInternal + - FirebaseCrashlytics + - FirebaseInstallations + - FirebaseRemoteConfigInterop + - FirebaseSessions + - GoogleAdsOnDeviceConversion + - GoogleAppMeasurement + - GoogleDataTransport + - GoogleUtilities + - IronSourceAdQualitySDK + - IronSourceSDK + - nanopb + - PromisesObjC + - PromisesSwift + +SPEC CHECKSUMS: + FirebaseAnalytics: e423129866107aeacf6010a280b9c9829f9ea50d + FirebaseCore: c7b57863ce0859281a66d16ca36d665c45d332b5 + FirebaseCoreExtension: 731a5744970bcd73ad95ab2a2b8a1f46353e86dd + FirebaseCoreInternal: 571a2dd8c975410966199623351db3a3265c874d + FirebaseCrashlytics: 9ce9ce4bb179e31ab91a937d0a73d302a9752d1b + FirebaseInstallations: 6d05424a046b68ca146b4de4376f05b4e9262fc3 + FirebaseRemoteConfigInterop: 0bae7d21510b3a0a79af727961c4973aac585add + FirebaseSessions: bc59e7d0ba90f96f40325fd1defbdec86ba26f20 + GoogleAdsOnDeviceConversion: d68c69dd9581a0f5da02617b6f377e5be483970f + GoogleAppMeasurement: 8f59e08efecfa1bcd57f0a56fab07d079366268c + GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7 + GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1 + IronSourceAdQualitySDK: 56314ade811a5226f76dfd377bc09aca0d6610c0 + IronSourceSDK: 66e1483cd62fb63162a965651f6f41c6b91664db + nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 + PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 + PromisesSwift: 9d77319bbe72ebf6d872900551f7eeba9bce2851 + +PODFILE CHECKSUM: d5996328bf850c1edcffa2f11870ef2026910ae0 + +COCOAPODS: 1.16.2 diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/Info.plist b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/Info.plist new file mode 100644 index 0000000..8af8967 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/Info.plist @@ -0,0 +1,107 @@ + + + + + AvailableLibraries + + + BinaryPath + FirebaseAnalytics.framework/FirebaseAnalytics + LibraryIdentifier + tvos-arm64_x86_64-simulator + LibraryPath + FirebaseAnalytics.framework + SupportedArchitectures + + arm64 + x86_64 + + SupportedPlatform + tvos + SupportedPlatformVariant + simulator + + + BinaryPath + FirebaseAnalytics.framework/FirebaseAnalytics + LibraryIdentifier + tvos-arm64 + LibraryPath + FirebaseAnalytics.framework + SupportedArchitectures + + arm64 + + SupportedPlatform + tvos + + + BinaryPath + FirebaseAnalytics.framework/Versions/A/FirebaseAnalytics + LibraryIdentifier + ios-arm64_x86_64-maccatalyst + LibraryPath + FirebaseAnalytics.framework + SupportedArchitectures + + arm64 + x86_64 + + SupportedPlatform + ios + SupportedPlatformVariant + maccatalyst + + + BinaryPath + FirebaseAnalytics.framework/FirebaseAnalytics + LibraryIdentifier + ios-arm64_x86_64-simulator + LibraryPath + FirebaseAnalytics.framework + SupportedArchitectures + + arm64 + x86_64 + + SupportedPlatform + ios + SupportedPlatformVariant + simulator + + + BinaryPath + FirebaseAnalytics.framework/FirebaseAnalytics + LibraryIdentifier + ios-arm64 + LibraryPath + FirebaseAnalytics.framework + SupportedArchitectures + + arm64 + + SupportedPlatform + ios + + + BinaryPath + FirebaseAnalytics.framework/Versions/A/FirebaseAnalytics + LibraryIdentifier + macos-arm64_x86_64 + LibraryPath + FirebaseAnalytics.framework + SupportedArchitectures + + arm64 + x86_64 + + SupportedPlatform + macos + + + CFBundlePackageType + XFWK + XCFrameworkFormatVersion + 1.0 + + diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/_CodeSignature/CodeDirectory b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/_CodeSignature/CodeDirectory new file mode 100644 index 0000000..36005f6 Binary files /dev/null and b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/_CodeSignature/CodeDirectory differ diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/_CodeSignature/CodeRequirements b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/_CodeSignature/CodeRequirements new file mode 100644 index 0000000..665b37e Binary files /dev/null and b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/_CodeSignature/CodeRequirements differ diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/_CodeSignature/CodeRequirements-1 b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/_CodeSignature/CodeRequirements-1 new file mode 100644 index 0000000..fdf23c2 Binary files /dev/null and b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/_CodeSignature/CodeRequirements-1 differ diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/_CodeSignature/CodeResources b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/_CodeSignature/CodeResources new file mode 100644 index 0000000..3f308aa --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/_CodeSignature/CodeResources @@ -0,0 +1,2068 @@ + + + + + files + + ios-arm64/FirebaseAnalytics.framework/FirebaseAnalytics + + +50JxPMlBeVIgoxc1nzOJUv+KLA= + + ios-arm64/FirebaseAnalytics.framework/Headers/FIRAnalytics+AppDelegate.h + + JxSy4BVIpZB3s+tbI3EgcIVsvN0= + + ios-arm64/FirebaseAnalytics.framework/Headers/FIRAnalytics+Consent.h + + IN4riVkldIj3MlPpvlUuU1i+I8w= + + ios-arm64/FirebaseAnalytics.framework/Headers/FIRAnalytics+OnDevice.h + + qCVWeURR2H/730qAxDkUkne4zcQ= + + ios-arm64/FirebaseAnalytics.framework/Headers/FIRAnalytics.h + + qF0PqJIJlH473QD9WZ5nxizYrzg= + + ios-arm64/FirebaseAnalytics.framework/Headers/FIREventNames.h + + 3dDQnWiYf2p99DjSkAocwjN7k+Q= + + ios-arm64/FirebaseAnalytics.framework/Headers/FIRParameterNames.h + + GVXnlXOGaaO+522/yhl3hgWbNXo= + + ios-arm64/FirebaseAnalytics.framework/Headers/FIRUserPropertyNames.h + + 33ogzLW88kbc3XVXJp9Opq9Znmc= + + ios-arm64/FirebaseAnalytics.framework/Headers/FirebaseAnalytics-Swift.h + + NSOPtD1H6eHjhxTV8P4V6araJC4= + + ios-arm64/FirebaseAnalytics.framework/Headers/FirebaseAnalytics-umbrella.h + + wE8Bjq1o5wGq1TFJb0gCJUmRelQ= + + ios-arm64/FirebaseAnalytics.framework/Headers/FirebaseAnalytics.h + + 6tM+QmAiCFyFHMaFXgWsH/uYosM= + + ios-arm64/FirebaseAnalytics.framework/Info.plist + + RUM4Mym2jvL3TeDE5xXwO+unaEA= + + ios-arm64/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/Project/arm64-apple-ios.swiftsourceinfo + + 3fYzOB9Dcu8b3UmIdfkJdcPWPsI= + + ios-arm64/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios.abi.json + + N+BlXnidSGr9TcxodQZs9fFJH6o= + + ios-arm64/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios.private.swiftinterface + + t+Bno+rjxHvtYGE/eRv7C1DIXBc= + + ios-arm64/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios.swiftdoc + + u+03zD19cPFRqzd0A3n5YBMtszA= + + ios-arm64/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios.swiftinterface + + t+Bno+rjxHvtYGE/eRv7C1DIXBc= + + ios-arm64/FirebaseAnalytics.framework/Modules/module.modulemap + + uLysK0T5K1GSoqJmcXx9AnZ9lqY= + + ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/FirebaseAnalytics + + lJXbEpn5lG+8avTV+MkrEoIzr34= + + ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Headers/FIRAnalytics+AppDelegate.h + + JxSy4BVIpZB3s+tbI3EgcIVsvN0= + + ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Headers/FIRAnalytics+Consent.h + + IN4riVkldIj3MlPpvlUuU1i+I8w= + + ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Headers/FIRAnalytics+OnDevice.h + + qCVWeURR2H/730qAxDkUkne4zcQ= + + ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Headers/FIRAnalytics.h + + qF0PqJIJlH473QD9WZ5nxizYrzg= + + ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Headers/FIREventNames.h + + 3dDQnWiYf2p99DjSkAocwjN7k+Q= + + ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Headers/FIRParameterNames.h + + GVXnlXOGaaO+522/yhl3hgWbNXo= + + ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Headers/FIRUserPropertyNames.h + + 33ogzLW88kbc3XVXJp9Opq9Znmc= + + ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Headers/FirebaseAnalytics-Swift.h + + eD33R7+jU8HGj3yhcliBJCHX7RU= + + ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Headers/FirebaseAnalytics-umbrella.h + + wE8Bjq1o5wGq1TFJb0gCJUmRelQ= + + ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Headers/FirebaseAnalytics.h + + 6tM+QmAiCFyFHMaFXgWsH/uYosM= + + ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/Project/arm64-apple-ios-macabi.swiftsourceinfo + + m5hJUUOEP8O9d6Yp2rtswYTIv4g= + + ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/Project/x86_64-apple-ios-macabi.swiftsourceinfo + + mLRwHbkVECrqpKdOP1EndNweK+8= + + ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios-macabi.abi.json + + N+BlXnidSGr9TcxodQZs9fFJH6o= + + ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios-macabi.private.swiftinterface + + N3HKBtKVvQcrvKuDJcc/kJiiPZ0= + + ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios-macabi.swiftdoc + + DKXJm9EGD90t7qJYBGYPCOMjnHs= + + ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios-macabi.swiftinterface + + N3HKBtKVvQcrvKuDJcc/kJiiPZ0= + + ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-ios-macabi.abi.json + + N+BlXnidSGr9TcxodQZs9fFJH6o= + + ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-ios-macabi.private.swiftinterface + + 1d8uWbLGguskR21i0cvFaBlovfE= + + ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-ios-macabi.swiftdoc + + O0ZdafClGd1DstEdoua3P7CHAo4= + + ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-ios-macabi.swiftinterface + + 1d8uWbLGguskR21i0cvFaBlovfE= + + ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/module.modulemap + + uLysK0T5K1GSoqJmcXx9AnZ9lqY= + + ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Resources/Info.plist + + oqeflG6Eg4eeJEPTv7iHgZcavos= + + ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/FirebaseAnalytics + + RBjAm7CG43+UOcSBKRTVB0u9tNI= + + ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRAnalytics+AppDelegate.h + + JxSy4BVIpZB3s+tbI3EgcIVsvN0= + + ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRAnalytics+Consent.h + + IN4riVkldIj3MlPpvlUuU1i+I8w= + + ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRAnalytics+OnDevice.h + + qCVWeURR2H/730qAxDkUkne4zcQ= + + ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRAnalytics.h + + qF0PqJIJlH473QD9WZ5nxizYrzg= + + ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIREventNames.h + + 3dDQnWiYf2p99DjSkAocwjN7k+Q= + + ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRParameterNames.h + + GVXnlXOGaaO+522/yhl3hgWbNXo= + + ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRUserPropertyNames.h + + 33ogzLW88kbc3XVXJp9Opq9Znmc= + + ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FirebaseAnalytics-Swift.h + + eD33R7+jU8HGj3yhcliBJCHX7RU= + + ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FirebaseAnalytics-umbrella.h + + wE8Bjq1o5wGq1TFJb0gCJUmRelQ= + + ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FirebaseAnalytics.h + + 6tM+QmAiCFyFHMaFXgWsH/uYosM= + + ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Info.plist + + jGYjqKFpO/92YzNrjIf2rH180MU= + + ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/Project/arm64-apple-ios-simulator.swiftsourceinfo + + 5xZByG2A6yYm021oS2aEqrPqZGA= + + ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/Project/x86_64-apple-ios-simulator.swiftsourceinfo + + e0nXpBSOq5ivY85MG171NNw5X5A= + + ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios-simulator.abi.json + + N+BlXnidSGr9TcxodQZs9fFJH6o= + + ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios-simulator.private.swiftinterface + + A9aAI3mrfR9y1oLRvEVS6LaK24g= + + ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios-simulator.swiftdoc + + XOV3ldgtRj/3IZGelhqs1tIapzI= + + ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios-simulator.swiftinterface + + A9aAI3mrfR9y1oLRvEVS6LaK24g= + + ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-ios-simulator.abi.json + + N+BlXnidSGr9TcxodQZs9fFJH6o= + + ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-ios-simulator.private.swiftinterface + + daXdPyVEs/4KhE/EA6tEZifcAtA= + + ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-ios-simulator.swiftdoc + + TRygjAbTHHCSMhRShovhDq9/fc8= + + ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-ios-simulator.swiftinterface + + daXdPyVEs/4KhE/EA6tEZifcAtA= + + ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/module.modulemap + + uLysK0T5K1GSoqJmcXx9AnZ9lqY= + + macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/FirebaseAnalytics + + Sle2k2AiKpft5qkiK1MYKJ/G14Y= + + macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Headers/FIRAnalytics+AppDelegate.h + + JxSy4BVIpZB3s+tbI3EgcIVsvN0= + + macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Headers/FIRAnalytics+Consent.h + + IN4riVkldIj3MlPpvlUuU1i+I8w= + + macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Headers/FIRAnalytics+OnDevice.h + + qCVWeURR2H/730qAxDkUkne4zcQ= + + macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Headers/FIRAnalytics.h + + qF0PqJIJlH473QD9WZ5nxizYrzg= + + macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Headers/FIREventNames.h + + 3dDQnWiYf2p99DjSkAocwjN7k+Q= + + macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Headers/FIRParameterNames.h + + GVXnlXOGaaO+522/yhl3hgWbNXo= + + macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Headers/FIRUserPropertyNames.h + + 33ogzLW88kbc3XVXJp9Opq9Znmc= + + macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Headers/FirebaseAnalytics-Swift.h + + eD33R7+jU8HGj3yhcliBJCHX7RU= + + macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Headers/FirebaseAnalytics-umbrella.h + + sXk7jWhcfsvb8eJb7/NDl2Dy2RQ= + + macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Headers/FirebaseAnalytics.h + + 6tM+QmAiCFyFHMaFXgWsH/uYosM= + + macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/Project/arm64-apple-macos.swiftsourceinfo + + 3R1cC+EvYmqC1sN5FCi/UFB5mYE= + + macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/Project/x86_64-apple-macos.swiftsourceinfo + + R0mfCOuAc5UXyAt6+JMU2y3CuuE= + + macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-macos.abi.json + + N+BlXnidSGr9TcxodQZs9fFJH6o= + + macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-macos.private.swiftinterface + + IC0w8TiyFu0nvMNMp4hAjzvfAvc= + + macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-macos.swiftdoc + + w+J0wMwhibYlM1fgn7KpjIuOxfM= + + macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-macos.swiftinterface + + IC0w8TiyFu0nvMNMp4hAjzvfAvc= + + macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-macos.abi.json + + N+BlXnidSGr9TcxodQZs9fFJH6o= + + macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-macos.private.swiftinterface + + scnrk6FwEWp9cHmnpM4lMXQMy/Q= + + macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-macos.swiftdoc + + +1eqzhD6qNYGLqUMnBO++jFLndo= + + macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-macos.swiftinterface + + scnrk6FwEWp9cHmnpM4lMXQMy/Q= + + macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/module.modulemap + + jWZ+azdgXQdH9z56z25NptmWlq4= + + macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Resources/Info.plist + + ashsezZkIBeWT9l3o2tgkTPMRoE= + + tvos-arm64/FirebaseAnalytics.framework/FirebaseAnalytics + + YwFvcscjgkELGoCOtfSXHcqfMPc= + + tvos-arm64/FirebaseAnalytics.framework/Headers/FIRAnalytics+AppDelegate.h + + JxSy4BVIpZB3s+tbI3EgcIVsvN0= + + tvos-arm64/FirebaseAnalytics.framework/Headers/FIRAnalytics+Consent.h + + IN4riVkldIj3MlPpvlUuU1i+I8w= + + tvos-arm64/FirebaseAnalytics.framework/Headers/FIRAnalytics+OnDevice.h + + qCVWeURR2H/730qAxDkUkne4zcQ= + + tvos-arm64/FirebaseAnalytics.framework/Headers/FIRAnalytics.h + + qF0PqJIJlH473QD9WZ5nxizYrzg= + + tvos-arm64/FirebaseAnalytics.framework/Headers/FIREventNames.h + + 3dDQnWiYf2p99DjSkAocwjN7k+Q= + + tvos-arm64/FirebaseAnalytics.framework/Headers/FIRParameterNames.h + + GVXnlXOGaaO+522/yhl3hgWbNXo= + + tvos-arm64/FirebaseAnalytics.framework/Headers/FIRUserPropertyNames.h + + 33ogzLW88kbc3XVXJp9Opq9Znmc= + + tvos-arm64/FirebaseAnalytics.framework/Headers/FirebaseAnalytics-Swift.h + + NSOPtD1H6eHjhxTV8P4V6araJC4= + + tvos-arm64/FirebaseAnalytics.framework/Headers/FirebaseAnalytics-umbrella.h + + wE8Bjq1o5wGq1TFJb0gCJUmRelQ= + + tvos-arm64/FirebaseAnalytics.framework/Headers/FirebaseAnalytics.h + + 6tM+QmAiCFyFHMaFXgWsH/uYosM= + + tvos-arm64/FirebaseAnalytics.framework/Info.plist + + 7dPZveE3SLJc2yLc1stQoSK6Dro= + + tvos-arm64/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/Project/arm64-apple-tvos.swiftsourceinfo + + qGjGOnjou1K37U73hY2nyo0MSXo= + + tvos-arm64/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-tvos.abi.json + + N+BlXnidSGr9TcxodQZs9fFJH6o= + + tvos-arm64/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-tvos.private.swiftinterface + + B5J/WOKWoHfm1dadQMFr+b2QN8Y= + + tvos-arm64/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-tvos.swiftdoc + + vTZFgmu47AJSrEFfr92DW8i+gFg= + + tvos-arm64/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-tvos.swiftinterface + + B5J/WOKWoHfm1dadQMFr+b2QN8Y= + + tvos-arm64/FirebaseAnalytics.framework/Modules/module.modulemap + + uLysK0T5K1GSoqJmcXx9AnZ9lqY= + + tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/FirebaseAnalytics + + kLY0sEdWD2IVJIaI0MnLQNqTp9I= + + tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRAnalytics+AppDelegate.h + + JxSy4BVIpZB3s+tbI3EgcIVsvN0= + + tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRAnalytics+Consent.h + + IN4riVkldIj3MlPpvlUuU1i+I8w= + + tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRAnalytics+OnDevice.h + + qCVWeURR2H/730qAxDkUkne4zcQ= + + tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRAnalytics.h + + qF0PqJIJlH473QD9WZ5nxizYrzg= + + tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIREventNames.h + + 3dDQnWiYf2p99DjSkAocwjN7k+Q= + + tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRParameterNames.h + + GVXnlXOGaaO+522/yhl3hgWbNXo= + + tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRUserPropertyNames.h + + 33ogzLW88kbc3XVXJp9Opq9Znmc= + + tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FirebaseAnalytics-Swift.h + + eD33R7+jU8HGj3yhcliBJCHX7RU= + + tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FirebaseAnalytics-umbrella.h + + wE8Bjq1o5wGq1TFJb0gCJUmRelQ= + + tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FirebaseAnalytics.h + + 6tM+QmAiCFyFHMaFXgWsH/uYosM= + + tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Info.plist + + hP79oBBQQUkL97F7y2wx76t5LIY= + + tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/Project/arm64-apple-tvos-simulator.swiftsourceinfo + + 2lzd8cB6CKvVtyDEANQjoJQgy40= + + tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/Project/x86_64-apple-tvos-simulator.swiftsourceinfo + + Ml3UsESzPNhChG8pnYxrJLtBOCU= + + tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-tvos-simulator.abi.json + + N+BlXnidSGr9TcxodQZs9fFJH6o= + + tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-tvos-simulator.private.swiftinterface + + LbpLRhOei/aNpjFMswrK6rU+LlY= + + tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-tvos-simulator.swiftdoc + + 9UdP3wUvKXmdVQqe20lk/2Gs9hs= + + tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-tvos-simulator.swiftinterface + + LbpLRhOei/aNpjFMswrK6rU+LlY= + + tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-tvos-simulator.abi.json + + N+BlXnidSGr9TcxodQZs9fFJH6o= + + tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-tvos-simulator.private.swiftinterface + + l5bFdSjh0ft/v0nFOCU2vohPpyU= + + tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-tvos-simulator.swiftdoc + + rvrBZgzPvP0rJK+Km//mwIOW3G4= + + tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-tvos-simulator.swiftinterface + + l5bFdSjh0ft/v0nFOCU2vohPpyU= + + tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/module.modulemap + + uLysK0T5K1GSoqJmcXx9AnZ9lqY= + + + files2 + + ios-arm64/FirebaseAnalytics.framework/FirebaseAnalytics + + hash + + +50JxPMlBeVIgoxc1nzOJUv+KLA= + + hash2 + + YlOMzSz9z2Btt3f2ANyVtR6WXNMBFL9U/JlZFM4Q3MM= + + + ios-arm64/FirebaseAnalytics.framework/Headers/FIRAnalytics+AppDelegate.h + + hash + + JxSy4BVIpZB3s+tbI3EgcIVsvN0= + + hash2 + + HSPmaeLSu5PqNTtlwUWfRT4cyVX65JmeB/oed8f0pdU= + + + ios-arm64/FirebaseAnalytics.framework/Headers/FIRAnalytics+Consent.h + + hash + + IN4riVkldIj3MlPpvlUuU1i+I8w= + + hash2 + + ebGwpP2JZ0Rp6BdXhKiLUYOq6nJG7la5O0y/wEKfyak= + + + ios-arm64/FirebaseAnalytics.framework/Headers/FIRAnalytics+OnDevice.h + + hash + + qCVWeURR2H/730qAxDkUkne4zcQ= + + hash2 + + VCwjCeh+eoHcFlnTXJ1cCst6pLdzKM2pL6vFi6tUFX0= + + + ios-arm64/FirebaseAnalytics.framework/Headers/FIRAnalytics.h + + hash + + qF0PqJIJlH473QD9WZ5nxizYrzg= + + hash2 + + teuGW/mYJQuXcA7jnEFjwsjMDqqf/0ASMSc9sL8ItBA= + + + ios-arm64/FirebaseAnalytics.framework/Headers/FIREventNames.h + + hash + + 3dDQnWiYf2p99DjSkAocwjN7k+Q= + + hash2 + + VtmidPK5LQACYEHPy/fRchFif3LZrv/+TNe9ULDC1LQ= + + + ios-arm64/FirebaseAnalytics.framework/Headers/FIRParameterNames.h + + hash + + GVXnlXOGaaO+522/yhl3hgWbNXo= + + hash2 + + JoBT9bmqTnu36PgaeShSWm2KdETgErmIjPJfMCCD9us= + + + ios-arm64/FirebaseAnalytics.framework/Headers/FIRUserPropertyNames.h + + hash + + 33ogzLW88kbc3XVXJp9Opq9Znmc= + + hash2 + + z0lD0Agt0NzOZdG+xd6QpXvGS+06dK4A3RYK0Wu1OKw= + + + ios-arm64/FirebaseAnalytics.framework/Headers/FirebaseAnalytics-Swift.h + + hash + + NSOPtD1H6eHjhxTV8P4V6araJC4= + + hash2 + + t/8KBk8d0oE4Rbf4TsLI+2F8EKF9UH4fGelPoPr2gFM= + + + ios-arm64/FirebaseAnalytics.framework/Headers/FirebaseAnalytics-umbrella.h + + hash + + wE8Bjq1o5wGq1TFJb0gCJUmRelQ= + + hash2 + + LOiywMHEh60MswGEzs9lM8P6m3oohYp+IWaiZtbwVVM= + + + ios-arm64/FirebaseAnalytics.framework/Headers/FirebaseAnalytics.h + + hash + + 6tM+QmAiCFyFHMaFXgWsH/uYosM= + + hash2 + + VS1dxfDwCZeRcJYgkkEUhmdXx6ch9X/E8YjKBX367WY= + + + ios-arm64/FirebaseAnalytics.framework/Info.plist + + hash + + RUM4Mym2jvL3TeDE5xXwO+unaEA= + + hash2 + + hUFa1syKRXYhCgwdbD2oHKkh76ACzozxMWO/+Wl6r+Y= + + + ios-arm64/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/Project/arm64-apple-ios.swiftsourceinfo + + hash + + 3fYzOB9Dcu8b3UmIdfkJdcPWPsI= + + hash2 + + ZQLMv8524zzRXwtNc2D4dUg0WW6YmTI+wTHrY5uC/uI= + + + ios-arm64/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios.abi.json + + hash + + N+BlXnidSGr9TcxodQZs9fFJH6o= + + hash2 + + ogweVk0pkzgHQQp/wtYEudfGqhc735oO9NduPkeHz2w= + + + ios-arm64/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios.private.swiftinterface + + hash + + t+Bno+rjxHvtYGE/eRv7C1DIXBc= + + hash2 + + UepVdrFlo8MmBTuAxwmlnSPu9WHO7Ggt1o8lLC9ZLMc= + + + ios-arm64/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios.swiftdoc + + hash + + u+03zD19cPFRqzd0A3n5YBMtszA= + + hash2 + + OiWV4PHU/uFS/1qBF6feTwRANSXo1fe9C/p7OrTWZfY= + + + ios-arm64/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios.swiftinterface + + hash + + t+Bno+rjxHvtYGE/eRv7C1DIXBc= + + hash2 + + UepVdrFlo8MmBTuAxwmlnSPu9WHO7Ggt1o8lLC9ZLMc= + + + ios-arm64/FirebaseAnalytics.framework/Modules/module.modulemap + + hash + + uLysK0T5K1GSoqJmcXx9AnZ9lqY= + + hash2 + + vxNgOuI61t45Sed09vILAKePFm9riTp4aZ48hjDRPIQ= + + + ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/FirebaseAnalytics + + symlink + Versions/Current/FirebaseAnalytics + + ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Headers + + symlink + Versions/Current/Headers + + ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Modules + + symlink + Versions/Current/Modules + + ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Resources + + symlink + Versions/Current/Resources + + ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/FirebaseAnalytics + + hash + + lJXbEpn5lG+8avTV+MkrEoIzr34= + + hash2 + + ejkH5H298FD/SV5rF6JBcMolU94uMUthxgFEmYC1BPY= + + + ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Headers/FIRAnalytics+AppDelegate.h + + hash + + JxSy4BVIpZB3s+tbI3EgcIVsvN0= + + hash2 + + HSPmaeLSu5PqNTtlwUWfRT4cyVX65JmeB/oed8f0pdU= + + + ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Headers/FIRAnalytics+Consent.h + + hash + + IN4riVkldIj3MlPpvlUuU1i+I8w= + + hash2 + + ebGwpP2JZ0Rp6BdXhKiLUYOq6nJG7la5O0y/wEKfyak= + + + ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Headers/FIRAnalytics+OnDevice.h + + hash + + qCVWeURR2H/730qAxDkUkne4zcQ= + + hash2 + + VCwjCeh+eoHcFlnTXJ1cCst6pLdzKM2pL6vFi6tUFX0= + + + ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Headers/FIRAnalytics.h + + hash + + qF0PqJIJlH473QD9WZ5nxizYrzg= + + hash2 + + teuGW/mYJQuXcA7jnEFjwsjMDqqf/0ASMSc9sL8ItBA= + + + ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Headers/FIREventNames.h + + hash + + 3dDQnWiYf2p99DjSkAocwjN7k+Q= + + hash2 + + VtmidPK5LQACYEHPy/fRchFif3LZrv/+TNe9ULDC1LQ= + + + ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Headers/FIRParameterNames.h + + hash + + GVXnlXOGaaO+522/yhl3hgWbNXo= + + hash2 + + JoBT9bmqTnu36PgaeShSWm2KdETgErmIjPJfMCCD9us= + + + ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Headers/FIRUserPropertyNames.h + + hash + + 33ogzLW88kbc3XVXJp9Opq9Znmc= + + hash2 + + z0lD0Agt0NzOZdG+xd6QpXvGS+06dK4A3RYK0Wu1OKw= + + + ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Headers/FirebaseAnalytics-Swift.h + + hash + + eD33R7+jU8HGj3yhcliBJCHX7RU= + + hash2 + + mkoss7xM0yRCfsw+xw3DWn6OEkO/XgwtzZtnef3CcgI= + + + ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Headers/FirebaseAnalytics-umbrella.h + + hash + + wE8Bjq1o5wGq1TFJb0gCJUmRelQ= + + hash2 + + LOiywMHEh60MswGEzs9lM8P6m3oohYp+IWaiZtbwVVM= + + + ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Headers/FirebaseAnalytics.h + + hash + + 6tM+QmAiCFyFHMaFXgWsH/uYosM= + + hash2 + + VS1dxfDwCZeRcJYgkkEUhmdXx6ch9X/E8YjKBX367WY= + + + ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/Project/arm64-apple-ios-macabi.swiftsourceinfo + + hash + + m5hJUUOEP8O9d6Yp2rtswYTIv4g= + + hash2 + + XIfwqhoz9JSSsUmQQEt1JqBJTx3eEo7D8G6e9rAhQoQ= + + + ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/Project/x86_64-apple-ios-macabi.swiftsourceinfo + + hash + + mLRwHbkVECrqpKdOP1EndNweK+8= + + hash2 + + ue3IcWZwV71FBZMlQRifGUrgsH101m2zKtDRvdkdwXg= + + + ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios-macabi.abi.json + + hash + + N+BlXnidSGr9TcxodQZs9fFJH6o= + + hash2 + + ogweVk0pkzgHQQp/wtYEudfGqhc735oO9NduPkeHz2w= + + + ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios-macabi.private.swiftinterface + + hash + + N3HKBtKVvQcrvKuDJcc/kJiiPZ0= + + hash2 + + 812LlKHhl4CKjB5lhl7dNrua1yPYZT9A37pR+eOGXOA= + + + ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios-macabi.swiftdoc + + hash + + DKXJm9EGD90t7qJYBGYPCOMjnHs= + + hash2 + + oh2kVDurril9MScAgSnieJynWSbOv05NeuQcbfIHgqA= + + + ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios-macabi.swiftinterface + + hash + + N3HKBtKVvQcrvKuDJcc/kJiiPZ0= + + hash2 + + 812LlKHhl4CKjB5lhl7dNrua1yPYZT9A37pR+eOGXOA= + + + ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-ios-macabi.abi.json + + hash + + N+BlXnidSGr9TcxodQZs9fFJH6o= + + hash2 + + ogweVk0pkzgHQQp/wtYEudfGqhc735oO9NduPkeHz2w= + + + ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-ios-macabi.private.swiftinterface + + hash + + 1d8uWbLGguskR21i0cvFaBlovfE= + + hash2 + + jkHzv+cOneQf+fkJrH34e/HskkYb8LQ9r3LzwT0IO2g= + + + ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-ios-macabi.swiftdoc + + hash + + O0ZdafClGd1DstEdoua3P7CHAo4= + + hash2 + + 7RaA9pD03GgAjmyrlqZ3hkUa0wT+eA/oO7DPlUZH49Q= + + + ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-ios-macabi.swiftinterface + + hash + + 1d8uWbLGguskR21i0cvFaBlovfE= + + hash2 + + jkHzv+cOneQf+fkJrH34e/HskkYb8LQ9r3LzwT0IO2g= + + + ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/module.modulemap + + hash + + uLysK0T5K1GSoqJmcXx9AnZ9lqY= + + hash2 + + vxNgOuI61t45Sed09vILAKePFm9riTp4aZ48hjDRPIQ= + + + ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Resources/Info.plist + + hash + + oqeflG6Eg4eeJEPTv7iHgZcavos= + + hash2 + + ovms14AdRnY/+bRhXKdd5HSoxa0nVHd1GQkCMxondd8= + + + ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/Current + + symlink + A + + ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/FirebaseAnalytics + + hash + + RBjAm7CG43+UOcSBKRTVB0u9tNI= + + hash2 + + DO98Na4ido28hcvxXsTCnP7BpQu5aA6Jalr7uvB/0gg= + + + ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRAnalytics+AppDelegate.h + + hash + + JxSy4BVIpZB3s+tbI3EgcIVsvN0= + + hash2 + + HSPmaeLSu5PqNTtlwUWfRT4cyVX65JmeB/oed8f0pdU= + + + ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRAnalytics+Consent.h + + hash + + IN4riVkldIj3MlPpvlUuU1i+I8w= + + hash2 + + ebGwpP2JZ0Rp6BdXhKiLUYOq6nJG7la5O0y/wEKfyak= + + + ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRAnalytics+OnDevice.h + + hash + + qCVWeURR2H/730qAxDkUkne4zcQ= + + hash2 + + VCwjCeh+eoHcFlnTXJ1cCst6pLdzKM2pL6vFi6tUFX0= + + + ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRAnalytics.h + + hash + + qF0PqJIJlH473QD9WZ5nxizYrzg= + + hash2 + + teuGW/mYJQuXcA7jnEFjwsjMDqqf/0ASMSc9sL8ItBA= + + + ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIREventNames.h + + hash + + 3dDQnWiYf2p99DjSkAocwjN7k+Q= + + hash2 + + VtmidPK5LQACYEHPy/fRchFif3LZrv/+TNe9ULDC1LQ= + + + ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRParameterNames.h + + hash + + GVXnlXOGaaO+522/yhl3hgWbNXo= + + hash2 + + JoBT9bmqTnu36PgaeShSWm2KdETgErmIjPJfMCCD9us= + + + ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRUserPropertyNames.h + + hash + + 33ogzLW88kbc3XVXJp9Opq9Znmc= + + hash2 + + z0lD0Agt0NzOZdG+xd6QpXvGS+06dK4A3RYK0Wu1OKw= + + + ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FirebaseAnalytics-Swift.h + + hash + + eD33R7+jU8HGj3yhcliBJCHX7RU= + + hash2 + + mkoss7xM0yRCfsw+xw3DWn6OEkO/XgwtzZtnef3CcgI= + + + ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FirebaseAnalytics-umbrella.h + + hash + + wE8Bjq1o5wGq1TFJb0gCJUmRelQ= + + hash2 + + LOiywMHEh60MswGEzs9lM8P6m3oohYp+IWaiZtbwVVM= + + + ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FirebaseAnalytics.h + + hash + + 6tM+QmAiCFyFHMaFXgWsH/uYosM= + + hash2 + + VS1dxfDwCZeRcJYgkkEUhmdXx6ch9X/E8YjKBX367WY= + + + ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Info.plist + + hash + + jGYjqKFpO/92YzNrjIf2rH180MU= + + hash2 + + L5ZixOvDsI2gUlsNO9qcCY4vKjGRmqK2xkwkXNPAcwI= + + + ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/Project/arm64-apple-ios-simulator.swiftsourceinfo + + hash + + 5xZByG2A6yYm021oS2aEqrPqZGA= + + hash2 + + y94OXKo433m9Fhrq7zIHooLI86IpgXU+tVgk8E+4quM= + + + ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/Project/x86_64-apple-ios-simulator.swiftsourceinfo + + hash + + e0nXpBSOq5ivY85MG171NNw5X5A= + + hash2 + + QNxkNjrC09oxj0cQQyv5cWDoSID/r1Y/4RGf3m0oB+g= + + + ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios-simulator.abi.json + + hash + + N+BlXnidSGr9TcxodQZs9fFJH6o= + + hash2 + + ogweVk0pkzgHQQp/wtYEudfGqhc735oO9NduPkeHz2w= + + + ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios-simulator.private.swiftinterface + + hash + + A9aAI3mrfR9y1oLRvEVS6LaK24g= + + hash2 + + oJiIhlIdWvyOq2/FHIx5VEXc9RG46Z5lDvt2Pclzpjk= + + + ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios-simulator.swiftdoc + + hash + + XOV3ldgtRj/3IZGelhqs1tIapzI= + + hash2 + + 1yQ1nP661viQEQ0gTk+7YURaBW6LK9ukbJcjokM7AUQ= + + + ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios-simulator.swiftinterface + + hash + + A9aAI3mrfR9y1oLRvEVS6LaK24g= + + hash2 + + oJiIhlIdWvyOq2/FHIx5VEXc9RG46Z5lDvt2Pclzpjk= + + + ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-ios-simulator.abi.json + + hash + + N+BlXnidSGr9TcxodQZs9fFJH6o= + + hash2 + + ogweVk0pkzgHQQp/wtYEudfGqhc735oO9NduPkeHz2w= + + + ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-ios-simulator.private.swiftinterface + + hash + + daXdPyVEs/4KhE/EA6tEZifcAtA= + + hash2 + + ou5HS2Qnt199UYYtMGYnlvgkqh1TRoRe41YUinBfMYo= + + + ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-ios-simulator.swiftdoc + + hash + + TRygjAbTHHCSMhRShovhDq9/fc8= + + hash2 + + zSl4vnqWuW9bV27WQ1ls4iaHv11TfjrHi0nZ4VyZXI4= + + + ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-ios-simulator.swiftinterface + + hash + + daXdPyVEs/4KhE/EA6tEZifcAtA= + + hash2 + + ou5HS2Qnt199UYYtMGYnlvgkqh1TRoRe41YUinBfMYo= + + + ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/module.modulemap + + hash + + uLysK0T5K1GSoqJmcXx9AnZ9lqY= + + hash2 + + vxNgOuI61t45Sed09vILAKePFm9riTp4aZ48hjDRPIQ= + + + macos-arm64_x86_64/FirebaseAnalytics.framework/FirebaseAnalytics + + symlink + Versions/Current/FirebaseAnalytics + + macos-arm64_x86_64/FirebaseAnalytics.framework/Headers + + symlink + Versions/Current/Headers + + macos-arm64_x86_64/FirebaseAnalytics.framework/Modules + + symlink + Versions/Current/Modules + + macos-arm64_x86_64/FirebaseAnalytics.framework/Resources + + symlink + Versions/Current/Resources + + macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/FirebaseAnalytics + + hash + + Sle2k2AiKpft5qkiK1MYKJ/G14Y= + + hash2 + + PJ54AXpb6+tk+hyS6SIxIsG6u/2hVMVtDdoK7rDWhXQ= + + + macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Headers/FIRAnalytics+AppDelegate.h + + hash + + JxSy4BVIpZB3s+tbI3EgcIVsvN0= + + hash2 + + HSPmaeLSu5PqNTtlwUWfRT4cyVX65JmeB/oed8f0pdU= + + + macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Headers/FIRAnalytics+Consent.h + + hash + + IN4riVkldIj3MlPpvlUuU1i+I8w= + + hash2 + + ebGwpP2JZ0Rp6BdXhKiLUYOq6nJG7la5O0y/wEKfyak= + + + macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Headers/FIRAnalytics+OnDevice.h + + hash + + qCVWeURR2H/730qAxDkUkne4zcQ= + + hash2 + + VCwjCeh+eoHcFlnTXJ1cCst6pLdzKM2pL6vFi6tUFX0= + + + macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Headers/FIRAnalytics.h + + hash + + qF0PqJIJlH473QD9WZ5nxizYrzg= + + hash2 + + teuGW/mYJQuXcA7jnEFjwsjMDqqf/0ASMSc9sL8ItBA= + + + macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Headers/FIREventNames.h + + hash + + 3dDQnWiYf2p99DjSkAocwjN7k+Q= + + hash2 + + VtmidPK5LQACYEHPy/fRchFif3LZrv/+TNe9ULDC1LQ= + + + macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Headers/FIRParameterNames.h + + hash + + GVXnlXOGaaO+522/yhl3hgWbNXo= + + hash2 + + JoBT9bmqTnu36PgaeShSWm2KdETgErmIjPJfMCCD9us= + + + macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Headers/FIRUserPropertyNames.h + + hash + + 33ogzLW88kbc3XVXJp9Opq9Znmc= + + hash2 + + z0lD0Agt0NzOZdG+xd6QpXvGS+06dK4A3RYK0Wu1OKw= + + + macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Headers/FirebaseAnalytics-Swift.h + + hash + + eD33R7+jU8HGj3yhcliBJCHX7RU= + + hash2 + + mkoss7xM0yRCfsw+xw3DWn6OEkO/XgwtzZtnef3CcgI= + + + macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Headers/FirebaseAnalytics-umbrella.h + + hash + + sXk7jWhcfsvb8eJb7/NDl2Dy2RQ= + + hash2 + + E6EdPyZp5cQbOObE0CPO9/R+QvTIYlDIOHvuzam/9H8= + + + macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Headers/FirebaseAnalytics.h + + hash + + 6tM+QmAiCFyFHMaFXgWsH/uYosM= + + hash2 + + VS1dxfDwCZeRcJYgkkEUhmdXx6ch9X/E8YjKBX367WY= + + + macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/Project/arm64-apple-macos.swiftsourceinfo + + hash + + 3R1cC+EvYmqC1sN5FCi/UFB5mYE= + + hash2 + + zHQD28LSqkLXMnZ0LjnsL4cada6CWiyPuPu2yFaBo6M= + + + macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/Project/x86_64-apple-macos.swiftsourceinfo + + hash + + R0mfCOuAc5UXyAt6+JMU2y3CuuE= + + hash2 + + BkYColn+63t0QQY5PlY9DCdaKtrao9ZokbLNT0o3tS0= + + + macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-macos.abi.json + + hash + + N+BlXnidSGr9TcxodQZs9fFJH6o= + + hash2 + + ogweVk0pkzgHQQp/wtYEudfGqhc735oO9NduPkeHz2w= + + + macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-macos.private.swiftinterface + + hash + + IC0w8TiyFu0nvMNMp4hAjzvfAvc= + + hash2 + + Kjo9MSpraTlXdA/OcBdCZryN3BJWe4wLWfjJKVeYO0I= + + + macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-macos.swiftdoc + + hash + + w+J0wMwhibYlM1fgn7KpjIuOxfM= + + hash2 + + Y7jGr1jEXcDk0fQD4G6alofhB+bFwX0xdZ5pwtrOLr8= + + + macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-macos.swiftinterface + + hash + + IC0w8TiyFu0nvMNMp4hAjzvfAvc= + + hash2 + + Kjo9MSpraTlXdA/OcBdCZryN3BJWe4wLWfjJKVeYO0I= + + + macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-macos.abi.json + + hash + + N+BlXnidSGr9TcxodQZs9fFJH6o= + + hash2 + + ogweVk0pkzgHQQp/wtYEudfGqhc735oO9NduPkeHz2w= + + + macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-macos.private.swiftinterface + + hash + + scnrk6FwEWp9cHmnpM4lMXQMy/Q= + + hash2 + + t6xdNSGYV6Fe09LMKN0mzp8YtZQQ1q/b93CIphE3n8w= + + + macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-macos.swiftdoc + + hash + + +1eqzhD6qNYGLqUMnBO++jFLndo= + + hash2 + + xWxDoBIOYLW9ND+nNJXIubsblH3KqxlKahcoI3MBCic= + + + macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-macos.swiftinterface + + hash + + scnrk6FwEWp9cHmnpM4lMXQMy/Q= + + hash2 + + t6xdNSGYV6Fe09LMKN0mzp8YtZQQ1q/b93CIphE3n8w= + + + macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/module.modulemap + + hash + + jWZ+azdgXQdH9z56z25NptmWlq4= + + hash2 + + e4a41Axjw7BAywMms/GuOcqrdwPIVYuMRsPznqQS0X8= + + + macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Resources/Info.plist + + hash + + ashsezZkIBeWT9l3o2tgkTPMRoE= + + hash2 + + D2R9w1z5WDOggh/9ErAGulV7jUnECeYC2shrowLAnKM= + + + macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/Current + + symlink + A + + tvos-arm64/FirebaseAnalytics.framework/FirebaseAnalytics + + hash + + YwFvcscjgkELGoCOtfSXHcqfMPc= + + hash2 + + LCs4Ho3Mk+lMPZDpddsuieVrJ0mJKEUxuqutrZZeXG4= + + + tvos-arm64/FirebaseAnalytics.framework/Headers/FIRAnalytics+AppDelegate.h + + hash + + JxSy4BVIpZB3s+tbI3EgcIVsvN0= + + hash2 + + HSPmaeLSu5PqNTtlwUWfRT4cyVX65JmeB/oed8f0pdU= + + + tvos-arm64/FirebaseAnalytics.framework/Headers/FIRAnalytics+Consent.h + + hash + + IN4riVkldIj3MlPpvlUuU1i+I8w= + + hash2 + + ebGwpP2JZ0Rp6BdXhKiLUYOq6nJG7la5O0y/wEKfyak= + + + tvos-arm64/FirebaseAnalytics.framework/Headers/FIRAnalytics+OnDevice.h + + hash + + qCVWeURR2H/730qAxDkUkne4zcQ= + + hash2 + + VCwjCeh+eoHcFlnTXJ1cCst6pLdzKM2pL6vFi6tUFX0= + + + tvos-arm64/FirebaseAnalytics.framework/Headers/FIRAnalytics.h + + hash + + qF0PqJIJlH473QD9WZ5nxizYrzg= + + hash2 + + teuGW/mYJQuXcA7jnEFjwsjMDqqf/0ASMSc9sL8ItBA= + + + tvos-arm64/FirebaseAnalytics.framework/Headers/FIREventNames.h + + hash + + 3dDQnWiYf2p99DjSkAocwjN7k+Q= + + hash2 + + VtmidPK5LQACYEHPy/fRchFif3LZrv/+TNe9ULDC1LQ= + + + tvos-arm64/FirebaseAnalytics.framework/Headers/FIRParameterNames.h + + hash + + GVXnlXOGaaO+522/yhl3hgWbNXo= + + hash2 + + JoBT9bmqTnu36PgaeShSWm2KdETgErmIjPJfMCCD9us= + + + tvos-arm64/FirebaseAnalytics.framework/Headers/FIRUserPropertyNames.h + + hash + + 33ogzLW88kbc3XVXJp9Opq9Znmc= + + hash2 + + z0lD0Agt0NzOZdG+xd6QpXvGS+06dK4A3RYK0Wu1OKw= + + + tvos-arm64/FirebaseAnalytics.framework/Headers/FirebaseAnalytics-Swift.h + + hash + + NSOPtD1H6eHjhxTV8P4V6araJC4= + + hash2 + + t/8KBk8d0oE4Rbf4TsLI+2F8EKF9UH4fGelPoPr2gFM= + + + tvos-arm64/FirebaseAnalytics.framework/Headers/FirebaseAnalytics-umbrella.h + + hash + + wE8Bjq1o5wGq1TFJb0gCJUmRelQ= + + hash2 + + LOiywMHEh60MswGEzs9lM8P6m3oohYp+IWaiZtbwVVM= + + + tvos-arm64/FirebaseAnalytics.framework/Headers/FirebaseAnalytics.h + + hash + + 6tM+QmAiCFyFHMaFXgWsH/uYosM= + + hash2 + + VS1dxfDwCZeRcJYgkkEUhmdXx6ch9X/E8YjKBX367WY= + + + tvos-arm64/FirebaseAnalytics.framework/Info.plist + + hash + + 7dPZveE3SLJc2yLc1stQoSK6Dro= + + hash2 + + TTNrIlya+oo01kdsHPgYvt/odW1eVP4VxqAC7Javi1k= + + + tvos-arm64/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/Project/arm64-apple-tvos.swiftsourceinfo + + hash + + qGjGOnjou1K37U73hY2nyo0MSXo= + + hash2 + + FEz3bHxxA1x0hEDbsk/PE8HrhIwxRtRHEkJBCzv6Orw= + + + tvos-arm64/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-tvos.abi.json + + hash + + N+BlXnidSGr9TcxodQZs9fFJH6o= + + hash2 + + ogweVk0pkzgHQQp/wtYEudfGqhc735oO9NduPkeHz2w= + + + tvos-arm64/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-tvos.private.swiftinterface + + hash + + B5J/WOKWoHfm1dadQMFr+b2QN8Y= + + hash2 + + Jpr6b5bkPCGVyiI9j7THJLbSvnOxu79WWldLyi+Qj9k= + + + tvos-arm64/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-tvos.swiftdoc + + hash + + vTZFgmu47AJSrEFfr92DW8i+gFg= + + hash2 + + 93JhqN4pG5PBOKkxktfidnJSt9PXgyqi4U9rEVPG0/U= + + + tvos-arm64/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-tvos.swiftinterface + + hash + + B5J/WOKWoHfm1dadQMFr+b2QN8Y= + + hash2 + + Jpr6b5bkPCGVyiI9j7THJLbSvnOxu79WWldLyi+Qj9k= + + + tvos-arm64/FirebaseAnalytics.framework/Modules/module.modulemap + + hash + + uLysK0T5K1GSoqJmcXx9AnZ9lqY= + + hash2 + + vxNgOuI61t45Sed09vILAKePFm9riTp4aZ48hjDRPIQ= + + + tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/FirebaseAnalytics + + hash + + kLY0sEdWD2IVJIaI0MnLQNqTp9I= + + hash2 + + 1nNobKJeZT1sUKC9/92EIvhpdonKPM00beR0AWcZ2OE= + + + tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRAnalytics+AppDelegate.h + + hash + + JxSy4BVIpZB3s+tbI3EgcIVsvN0= + + hash2 + + HSPmaeLSu5PqNTtlwUWfRT4cyVX65JmeB/oed8f0pdU= + + + tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRAnalytics+Consent.h + + hash + + IN4riVkldIj3MlPpvlUuU1i+I8w= + + hash2 + + ebGwpP2JZ0Rp6BdXhKiLUYOq6nJG7la5O0y/wEKfyak= + + + tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRAnalytics+OnDevice.h + + hash + + qCVWeURR2H/730qAxDkUkne4zcQ= + + hash2 + + VCwjCeh+eoHcFlnTXJ1cCst6pLdzKM2pL6vFi6tUFX0= + + + tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRAnalytics.h + + hash + + qF0PqJIJlH473QD9WZ5nxizYrzg= + + hash2 + + teuGW/mYJQuXcA7jnEFjwsjMDqqf/0ASMSc9sL8ItBA= + + + tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIREventNames.h + + hash + + 3dDQnWiYf2p99DjSkAocwjN7k+Q= + + hash2 + + VtmidPK5LQACYEHPy/fRchFif3LZrv/+TNe9ULDC1LQ= + + + tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRParameterNames.h + + hash + + GVXnlXOGaaO+522/yhl3hgWbNXo= + + hash2 + + JoBT9bmqTnu36PgaeShSWm2KdETgErmIjPJfMCCD9us= + + + tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRUserPropertyNames.h + + hash + + 33ogzLW88kbc3XVXJp9Opq9Znmc= + + hash2 + + z0lD0Agt0NzOZdG+xd6QpXvGS+06dK4A3RYK0Wu1OKw= + + + tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FirebaseAnalytics-Swift.h + + hash + + eD33R7+jU8HGj3yhcliBJCHX7RU= + + hash2 + + mkoss7xM0yRCfsw+xw3DWn6OEkO/XgwtzZtnef3CcgI= + + + tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FirebaseAnalytics-umbrella.h + + hash + + wE8Bjq1o5wGq1TFJb0gCJUmRelQ= + + hash2 + + LOiywMHEh60MswGEzs9lM8P6m3oohYp+IWaiZtbwVVM= + + + tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FirebaseAnalytics.h + + hash + + 6tM+QmAiCFyFHMaFXgWsH/uYosM= + + hash2 + + VS1dxfDwCZeRcJYgkkEUhmdXx6ch9X/E8YjKBX367WY= + + + tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Info.plist + + hash + + hP79oBBQQUkL97F7y2wx76t5LIY= + + hash2 + + VZfGCymhZPpfEccKLl8pbtEwHUXUVmpiI6Vtm/Dmbjk= + + + tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/Project/arm64-apple-tvos-simulator.swiftsourceinfo + + hash + + 2lzd8cB6CKvVtyDEANQjoJQgy40= + + hash2 + + a5j2PD1PKNg2J7ZabMxMsGQpd/O2KqOTtLCpkNVSCI4= + + + tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/Project/x86_64-apple-tvos-simulator.swiftsourceinfo + + hash + + Ml3UsESzPNhChG8pnYxrJLtBOCU= + + hash2 + + wq5fJONjOP4KECzTK58aKz01InxGTL8E7D3ZA1rpCdQ= + + + tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-tvos-simulator.abi.json + + hash + + N+BlXnidSGr9TcxodQZs9fFJH6o= + + hash2 + + ogweVk0pkzgHQQp/wtYEudfGqhc735oO9NduPkeHz2w= + + + tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-tvos-simulator.private.swiftinterface + + hash + + LbpLRhOei/aNpjFMswrK6rU+LlY= + + hash2 + + 1lpCI62xTOQwiOpzd3LkZ5DG+OU5wa09Afzyz4VukqQ= + + + tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-tvos-simulator.swiftdoc + + hash + + 9UdP3wUvKXmdVQqe20lk/2Gs9hs= + + hash2 + + Cx6FCGZ57p4qxxDeuMHrWXJsoUGYQOuhWMgsjXDuhok= + + + tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-tvos-simulator.swiftinterface + + hash + + LbpLRhOei/aNpjFMswrK6rU+LlY= + + hash2 + + 1lpCI62xTOQwiOpzd3LkZ5DG+OU5wa09Afzyz4VukqQ= + + + tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-tvos-simulator.abi.json + + hash + + N+BlXnidSGr9TcxodQZs9fFJH6o= + + hash2 + + ogweVk0pkzgHQQp/wtYEudfGqhc735oO9NduPkeHz2w= + + + tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-tvos-simulator.private.swiftinterface + + hash + + l5bFdSjh0ft/v0nFOCU2vohPpyU= + + hash2 + + PnrCWDokxBXJ91bSvG6KwOv6OggY+nRogLCUp7vqGXg= + + + tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-tvos-simulator.swiftdoc + + hash + + rvrBZgzPvP0rJK+Km//mwIOW3G4= + + hash2 + + GIHPtW+F+yBVGWb77IIasPoKViMtXeR2ZSw737vhtJY= + + + tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-tvos-simulator.swiftinterface + + hash + + l5bFdSjh0ft/v0nFOCU2vohPpyU= + + hash2 + + PnrCWDokxBXJ91bSvG6KwOv6OggY+nRogLCUp7vqGXg= + + + tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/module.modulemap + + hash + + uLysK0T5K1GSoqJmcXx9AnZ9lqY= + + hash2 + + vxNgOuI61t45Sed09vILAKePFm9riTp4aZ48hjDRPIQ= + + + + rules + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^version.plist$ + + + rules2 + + .*\.dSYM($|/) + + weight + 11 + + ^(.*/)?\.DS_Store$ + + omit + + weight + 2000 + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^Info\.plist$ + + omit + + weight + 20 + + ^PkgInfo$ + + omit + + weight + 20 + + ^embedded\.provisionprofile$ + + weight + 20 + + ^version\.plist$ + + weight + 20 + + + + diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/_CodeSignature/CodeSignature b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/_CodeSignature/CodeSignature new file mode 100644 index 0000000..ef0ce52 Binary files /dev/null and b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/_CodeSignature/CodeSignature differ diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/FirebaseAnalytics b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/FirebaseAnalytics new file mode 100644 index 0000000..b64d934 Binary files /dev/null and b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/FirebaseAnalytics differ diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/Headers/FIRAnalytics+AppDelegate.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/Headers/FIRAnalytics+AppDelegate.h new file mode 100644 index 0000000..cb1e407 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/Headers/FIRAnalytics+AppDelegate.h @@ -0,0 +1,80 @@ +#import + +#import "FIRAnalytics.h" + +NS_ASSUME_NONNULL_BEGIN + +/// Provides App Delegate handlers to be used in your App Delegate. +/// +/// To save time integrating Firebase Analytics in an application, Firebase Analytics does not +/// require delegation implementation from the AppDelegate if neither SwiftUI nor UIScene lifecycle +/// is adopted. Instead this is automatically done by Firebase Analytics. Should you choose instead +/// to delegate manually, you can turn off the App Delegate Proxy by adding +/// FirebaseAppDelegateProxyEnabled into your app's Info.plist and setting it to boolean `NO`, and +/// adding the methods in this category to corresponding delegation handlers. +/// +/// To handle Universal Links, you must return `true` in +/// `UIApplicationDelegate.application(_:didFinishLaunchingWithOptions:)`. +@interface FIRAnalytics (AppDelegate) + +/// Handles events related to a URL session that are waiting to be processed. +/// +/// 1. If SwiftUI lifecycle is adopted, call this method from +/// `UIApplicationDelegate.application(_:handleEventsForBackgroundURLSession:completionHandler:)` +/// in your app delegate. +/// +/// 2. If SwiftUI lifecycle is not adopted, Firebase Analytics does not require delegation +/// implementation from the AppDelegate. If you choose instead to delegate manually, you can set +/// FirebaseAppDelegateProxyEnabled to boolean `NO` in your app's Info.plist and call this method +/// from +/// `UIApplicationDelegate.application(_:handleEventsForBackgroundURLSession:completionHandler:)` +/// in your app delegate. +/// +/// @param identifier The identifier of the URL session requiring attention. +/// @param completionHandler The completion handler to call when you finish processing the events. +/// Calling this completion handler lets the system know that your app's user interface is +/// updated and a new snapshot can be taken. ++ (void)handleEventsForBackgroundURLSession:(NSString *)identifier + completionHandler:(nullable void (^)(void))completionHandler; + +/// Handles the event when the app is launched by a URL (custom URL scheme or universal link). +/// +/// 1. If SwiftUI lifecycle is adopted, use `onOpenURL(perform:)` to register a handler and call +/// this method in the handler. +/// +/// 2. If UIScene lifecycle is adopted, call this method from +/// `UISceneDelegate.scene(_:willConnectTo:options:)` and +/// `UISceneDelegate.scene(_:openURLContexts:)` when the URL contexts are available. +/// +/// 3. If neither SwiftUI nor UIScene lifecycle is adopted, Firebase Analytics does not require +/// delegation implementation from the AppDelegate. If you choose instead to delegate manually, you +/// can set FirebaseAppDelegateProxyEnabled to boolean `NO` in your app's Info.plist and call this +/// method from `UIApplicationDelegate.application(_:open:options:)` in your app delegate. +/// +/// @param url The URL resource to open. This resource can be a network resource or a file. ++ (void)handleOpenURL:(NSURL *)url; + +/// Handles the event when the app receives data associated with user activity that includes a +/// Universal Link. +/// +/// 1. If SwiftUI lifecycle is adopted, use `onOpenURL(perform:)` to register a handler and call +/// `Analytics.handleOpen(_:)` instead in the handler. +/// +/// 2. If UIScene lifecycle is adopted, call this method from +/// `UISceneDelegate.scene(_:willConnectTo:options:)` and `UISceneDelegate.scene(_:continue:)` when +/// NSUserActivity is available. See the [Apple +/// doc](https://developer.apple.com/documentation/xcode/supporting-universal-links-in-your-app) for +/// more details. +/// +/// 3. If neither SwiftUI nor UIScene lifecycle is adopted, Firebase Analytics does not require +/// delegation implementation from the AppDelegate. If you choose instead to delegate manually, you +/// can set FirebaseAppDelegateProxyEnabled to boolean `NO` in your app's Info.plist and call this +/// method from `UIApplication.application(_:continue:restorationHandler:)` in your app delegate. +/// +/// @param userActivity The activity object containing the data associated with the task the user +/// was performing. ++ (void)handleUserActivity:(id)userActivity; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/Headers/FIRAnalytics+Consent.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/Headers/FIRAnalytics+Consent.h new file mode 100644 index 0000000..7758390 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/Headers/FIRAnalytics+Consent.h @@ -0,0 +1,51 @@ +#import + +#import "FIRAnalytics.h" + +NS_ASSUME_NONNULL_BEGIN + +/// The type of consent to set. Supported consent types are `ConsentType.adStorage`, +/// `ConsentType.analyticsStorage`, `ConsentType.adUserData`, and `ConsentType.adPersonalization`. +/// Omitting a type retains its previous status. +typedef NSString *FIRConsentType NS_TYPED_ENUM NS_SWIFT_NAME(ConsentType); + +/// Enables storage (such as device identifiers) related to advertising. +extern FIRConsentType const FIRConsentTypeAdStorage; + +/// Enables storage (such as app identifiers) related to analytics, e.g. visit duration. +extern FIRConsentType const FIRConsentTypeAnalyticsStorage; + +/// Sets consent for sending user data to Google for advertising purposes. +extern FIRConsentType const FIRConsentTypeAdUserData; + +/// Sets consent for personalized advertising. +extern FIRConsentType const FIRConsentTypeAdPersonalization; + +/// The status value of the consent type. Supported statuses are `ConsentStatus.granted` and +/// `ConsentStatus.denied`. +typedef NSString *FIRConsentStatus NS_TYPED_ENUM NS_SWIFT_NAME(ConsentStatus); + +/// Consent status indicating consent is denied. For an overview of which data is sent when consent +/// is denied, see [SDK behavior with consent +/// mode](https://developers.google.com/tag-platform/security/concepts/consent-mode#tag-behavior). +extern FIRConsentStatus const FIRConsentStatusDenied; + +/// Consent status indicating consent is granted. +extern FIRConsentStatus const FIRConsentStatusGranted; + +/// Sets the applicable end user consent state. +@interface FIRAnalytics (Consent) + +/// Sets the applicable end user consent state (e.g. for device identifiers) for this app on this +/// device. Use the consent settings to specify individual consent type values. Settings are +/// persisted across app sessions. By default consent types are set to `ConsentStatus.granted`. +/// +/// @param consentSettings A Dictionary of consent types. Supported consent type keys are +/// `ConsentType.adStorage`, `ConsentType.analyticsStorage`, `ConsentType.adUserData`, and +/// `ConsentType.adPersonalization`. Valid values are `ConsentStatus.granted` and +/// `ConsentStatus.denied`. ++ (void)setConsent:(NSDictionary *)consentSettings; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/Headers/FIRAnalytics+OnDevice.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/Headers/FIRAnalytics+OnDevice.h new file mode 100644 index 0000000..5f87c0d --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/Headers/FIRAnalytics+OnDevice.h @@ -0,0 +1,51 @@ +#import + +#import "FIRAnalytics.h" + +NS_ASSUME_NONNULL_BEGIN + +API_UNAVAILABLE(macCatalyst, macos, tvos, watchos) +@interface FIRAnalytics (OnDevice) + +/// Initiates on-device conversion measurement given a user email address. Requires dependency +/// GoogleAdsOnDeviceConversion from +/// https://github.com/googleads/google-ads-on-device-conversion-ios-sdk/ to be linked in, otherwise +/// it is a no-op. +/// @param emailAddress User email address. Include a domain name for all email addresses +/// (e.g. gmail.com or hotmail.co.jp). ++ (void)initiateOnDeviceConversionMeasurementWithEmailAddress:(NSString *)emailAddress + NS_SWIFT_NAME(initiateOnDeviceConversionMeasurement(emailAddress:)); + +/// Initiates on-device conversion measurement given a phone number in E.164 format. Requires +/// dependency GoogleAdsOnDeviceConversion from +/// https://github.com/googleads/google-ads-on-device-conversion-ios-sdk/ to be linked in, otherwise +/// it is a no-op. +/// @param phoneNumber User phone number. Must be in E.164 format, which means it must be +/// limited to a maximum of 15 digits and must include a plus sign (+) prefix and country code +/// with no dashes, parentheses, or spaces. ++ (void)initiateOnDeviceConversionMeasurementWithPhoneNumber:(NSString *)phoneNumber + NS_SWIFT_NAME(initiateOnDeviceConversionMeasurement(phoneNumber:)); + +/// Initiates on-device conversion measurement given a sha256-hashed user email address. Requires +/// dependency GoogleAdsOnDeviceConversion from +/// https://github.com/googleads/google-ads-on-device-conversion-ios-sdk/ to be linked in, otherwise +/// it is a no-op. +/// @param hashedEmailAddress User email address as a UTF8-encoded string normalized and hashed +/// according to the instructions at +/// https://firebase.google.com/docs/tutorials/ads-ios-on-device-measurement/step-3. ++ (void)initiateOnDeviceConversionMeasurementWithHashedEmailAddress:(NSData *)hashedEmailAddress + NS_SWIFT_NAME(initiateOnDeviceConversionMeasurement(hashedEmailAddress:)); + +/// Initiates on-device conversion measurement given a sha256-hashed phone number in E.164 format. +/// Requires dependency GoogleAdsOnDeviceConversion from +/// https://github.com/googleads/google-ads-on-device-conversion-ios-sdk/ to be linked in, otherwise +/// it is a no-op. +/// @param hashedPhoneNumber UTF8-encoded user phone number in E.164 format and then hashed +/// according to the instructions at +/// https://firebase.google.com/docs/tutorials/ads-ios-on-device-measurement/step-3. ++ (void)initiateOnDeviceConversionMeasurementWithHashedPhoneNumber:(NSData *)hashedPhoneNumber + NS_SWIFT_NAME(initiateOnDeviceConversionMeasurement(hashedPhoneNumber:)); + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/Headers/FIRAnalytics.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/Headers/FIRAnalytics.h new file mode 100644 index 0000000..ec88689 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/Headers/FIRAnalytics.h @@ -0,0 +1,155 @@ +#import + +#import "FIREventNames.h" +#import "FIRParameterNames.h" +#import "FIRUserPropertyNames.h" + +NS_ASSUME_NONNULL_BEGIN + +/// The top level Firebase Analytics singleton that provides methods for logging events and setting +/// user properties. See the developer guides for general +/// information on using Firebase Analytics in your apps. +/// +/// @note The Analytics SDK uses SQLite to persist events and other app-specific data. Calling +/// certain thread-unsafe global SQLite methods like `sqlite3_shutdown()` can result in +/// unexpected crashes at runtime. +NS_SWIFT_NAME(Analytics) +@interface FIRAnalytics : NSObject + +/// Logs an app event. The event can have up to 25 parameters. Events with the same name must have +/// the same parameters. Up to 500 event names are supported. Using predefined events and/or +/// parameters is recommended for optimal reporting. +/// +/// The following event names are reserved - events with these names will be dropped, and instead an +/// error event will be logged: +///
    +///
  • ad_activeview
  • +///
  • ad_click
  • +///
  • ad_exposure
  • +///
  • ad_query
  • +///
  • ad_reward
  • +///
  • adunit_exposure
  • +///
  • app_clear_data
  • +///
  • app_exception
  • +///
  • app_remove
  • +///
  • app_store_refund
  • +///
  • app_store_subscription_cancel
  • +///
  • app_store_subscription_convert
  • +///
  • app_store_subscription_renew
  • +///
  • app_update
  • +///
  • app_upgrade
  • +///
  • dynamic_link_app_open
  • +///
  • dynamic_link_app_update
  • +///
  • dynamic_link_first_open
  • +///
  • error
  • +///
  • firebase_campaign
  • +///
  • first_open
  • +///
  • first_visit
  • +///
  • notification_dismiss
  • +///
  • notification_foreground
  • +///
  • notification_open
  • +///
  • notification_receive
  • +///
  • os_update
  • +///
  • session_start
  • +///
  • session_start_with_rollout
  • +///
  • user_engagement
  • +///
+/// +/// @param name The name of the event. Should contain 1 to 40 alphanumeric characters or +/// underscores. The name must start with an alphabetic character. Some event names are +/// reserved. See FIREventNames.h for the list of reserved event names. The "firebase_", +/// "google_", and "ga_" prefixes are reserved and should not be used. Note that event names are +/// case-sensitive and that logging two events whose names differ only in case will result in +/// two distinct events. To manually log screen view events, use the `screen_view` event name. +/// @param parameters The dictionary of event parameters. Passing `nil` indicates that the event has +/// no parameters. Parameter names can be up to 40 characters long and must start with an +/// alphabetic character and contain only alphanumeric characters and underscores. Only String, +/// Int, and Double parameter types are supported. String parameter values can be up to 100 +/// characters long for standard Google Analytics properties, and up to 500 characters long for +/// Google Analytics 360 properties. The "firebase_", "google_", and "ga_" prefixes are reserved +/// and should not be used for parameter names. ++ (void)logEventWithName:(NSString *)name + parameters:(nullable NSDictionary *)parameters + NS_SWIFT_NAME(logEvent(_:parameters:)); + +/// Sets a user property to a given value. Up to 25 user property names are supported. Once set, +/// user property values persist throughout the app lifecycle and across sessions. +/// +/// The following user property names are reserved and cannot be used: +///
    +///
  • first_open_time
  • +///
  • last_deep_link_referrer
  • +///
  • user_id
  • +///
+/// +/// @param value The value of the user property. Values can be up to 36 characters long. Setting the +/// value to `nil` removes the user property. +/// @param name The name of the user property to set. Should contain 1 to 24 alphanumeric characters +/// or underscores and must start with an alphabetic character. The "firebase_", "google_", and +/// "ga_" prefixes are reserved and should not be used for user property names. ++ (void)setUserPropertyString:(nullable NSString *)value forName:(NSString *)name + NS_SWIFT_NAME(setUserProperty(_:forName:)); + +/// Sets the user ID property. This feature must be used in accordance with +/// Google's Privacy Policy +/// +/// @param userID The user ID to ascribe to the user of this app on this device, which must be +/// non-empty and no more than 256 characters long. Setting userID to `nil` removes the user ID. ++ (void)setUserID:(nullable NSString *)userID; + +/// Sets whether analytics collection is enabled for this app on this device. This setting is +/// persisted across app sessions. By default it is enabled. +/// +/// @param analyticsCollectionEnabled A flag that enables or disables Analytics collection. ++ (void)setAnalyticsCollectionEnabled:(BOOL)analyticsCollectionEnabled; + +/// Sets the interval of inactivity in seconds that terminates the current session. The default +/// value is 1800 seconds (30 minutes). +/// +/// @param sessionTimeoutInterval The custom time of inactivity in seconds before the current +/// session terminates. ++ (void)setSessionTimeoutInterval:(NSTimeInterval)sessionTimeoutInterval; + +/// Asynchronously retrieves the identifier of the current app session. +/// +/// The session ID retrieval could fail due to Analytics collection disabled, app session expired, +/// etc. +/// +/// @param completion The completion handler to call when the session ID retrieval is complete. This +/// handler is executed on a system-defined global concurrent queue. +/// This completion handler takes the following parameters: +/// sessionID The identifier of the current app session. The value is undefined if the +/// request failed. +/// error An error object that indicates why the request failed, or `nil` if the request +/// was successful. ++ (void)sessionIDWithCompletion:(void (^)(int64_t sessionID, NSError *_Nullable error))completion; + +/// Returns the unique ID for this instance of the application or `nil` if +/// `ConsentType.analyticsStorage` has been set to `ConsentStatus.denied`. +/// +/// @see `FIRAnalytics+Consent.h` ++ (nullable NSString *)appInstanceID; + +/// Clears all analytics data for this instance from the device and resets the app instance ID. ++ (void)resetAnalyticsData; + +/// Adds parameters that will be set on every event logged from the SDK, including automatic ones. +/// The values passed in the parameters dictionary will be added to the dictionary of default event +/// parameters. These parameters persist across app runs. They are of lower precedence than event +/// parameters, so if an event parameter and a parameter set using this API have the same name, the +/// value of the event parameter will be used. The same limitations on event parameters apply to +/// default event parameters. +/// +/// @param parameters Parameters to be added to the dictionary of parameters added to every event. +/// They will be added to the dictionary of default event parameters, replacing any existing +/// parameter with the same name. Valid parameters are String, Int, and Double. Setting a key's +/// value to `NSNull()` will clear that parameter. Passing in a `nil` dictionary will clear all +/// parameters. ++ (void)setDefaultEventParameters:(nullable NSDictionary *)parameters; + +/// Unavailable. +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/Headers/FIREventNames.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/Headers/FIREventNames.h new file mode 100644 index 0000000..701ed88 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/Headers/FIREventNames.h @@ -0,0 +1,438 @@ +/// @file FIREventNames.h +/// +/// Predefined event names. +/// +/// An Event is an important occurrence in your app that you want to measure. You can report up to +/// 500 different types of Events per app and you can associate up to 25 unique parameters with each +/// Event type. Some common events are suggested below, but you may also choose to specify custom +/// Event types that are associated with your specific app. Each event type is identified by a +/// unique name. Event names can be up to 40 characters long, may only contain alphanumeric +/// characters and underscores ("_"), and must start with an alphabetic character. The "firebase_", +/// "google_", and "ga_" prefixes are reserved and should not be used. + +#import + +/// Ad Impression event. This event signifies when a user sees an ad impression. Note: If you supply +/// the @c AnalyticsParameterValue parameter, you must also supply the @c AnalyticsParameterCurrency +/// parameter so that revenue metrics can be computed accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterAdPlatform (String) (optional)
  • +///
  • @c AnalyticsParameterAdFormat (String) (optional)
  • +///
  • @c AnalyticsParameterAdSource (String) (optional)
  • +///
  • @c AnalyticsParameterAdUnitName (String) (optional)
  • +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventAdImpression NS_SWIFT_NAME(AnalyticsEventAdImpression) = + @"ad_impression"; + +/// Add Payment Info event. This event signifies that a user has submitted their payment +/// information. Note: If you supply the @c AnalyticsParameterValue parameter, you must also supply +/// the @c AnalyticsParameterCurrency parameter so that revenue metrics can be computed accurately. +/// Params: +/// +///
    +///
  • @c AnalyticsParameterCoupon (String) (optional)
  • +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterPaymentType (String) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventAddPaymentInfo NS_SWIFT_NAME(AnalyticsEventAddPaymentInfo) = + @"add_payment_info"; + +/// Add Shipping Info event. This event signifies that a user has submitted their shipping +/// information. Note: If you supply the @c AnalyticsParameterValue parameter, you must also supply +/// the @c AnalyticsParameterCurrency parameter so that revenue metrics can be computed accurately. +/// Params: +/// +///
    +///
  • @c AnalyticsParameterCoupon (String) (optional)
  • +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterShippingTier (String) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventAddShippingInfo NS_SWIFT_NAME(AnalyticsEventAddShippingInfo) = + @"add_shipping_info"; + +/// E-Commerce Add To Cart event. This event signifies that an item(s) was added to a cart for +/// purchase. Add this event to a funnel with @c AnalyticsEventPurchase to gauge the effectiveness +/// of your checkout process. Note: If you supply the @c AnalyticsParameterValue parameter, you must +/// also supply the @c AnalyticsParameterCurrency parameter so that revenue metrics can be computed +/// accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventAddToCart NS_SWIFT_NAME(AnalyticsEventAddToCart) = @"add_to_cart"; + +/// E-Commerce Add To Wishlist event. This event signifies that an item was added to a wishlist. Use +/// this event to identify popular gift items. Note: If you supply the @c AnalyticsParameterValue +/// parameter, you must also supply the @c AnalyticsParameterCurrency parameter so that revenue +/// metrics can be computed accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventAddToWishlist NS_SWIFT_NAME(AnalyticsEventAddToWishlist) = + @"add_to_wishlist"; + +/// App Open event. By logging this event when an App becomes active, developers can understand how +/// often users leave and return during the course of a Session. Although Sessions are automatically +/// reported, this event can provide further clarification around the continuous engagement of +/// app-users. +static NSString *const kFIREventAppOpen NS_SWIFT_NAME(AnalyticsEventAppOpen) = @"app_open"; + +/// E-Commerce Begin Checkout event. This event signifies that a user has begun the process of +/// checking out. Add this event to a funnel with your @c AnalyticsEventPurchase event to gauge the +/// effectiveness of your checkout process. Note: If you supply the @c AnalyticsParameterValue +/// parameter, you must also supply the @c AnalyticsParameterCurrency parameter so that revenue +/// metrics can be computed accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterCoupon (String) (optional)
  • +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventBeginCheckout NS_SWIFT_NAME(AnalyticsEventBeginCheckout) = + @"begin_checkout"; + +/// Campaign Detail event. Log this event to supply the referral details of a re-engagement +/// campaign. Note: you must supply at least one of the required parameters +/// AnalyticsParameterSource, AnalyticsParameterMedium or AnalyticsParameterCampaign. Params: +/// +///
    +///
  • @c AnalyticsParameterSource (String)
  • +///
  • @c AnalyticsParameterMedium (String)
  • +///
  • @c AnalyticsParameterCampaign (String)
  • +///
  • @c AnalyticsParameterTerm (String) (optional)
  • +///
  • @c AnalyticsParameterContent (String) (optional)
  • +///
  • @c AnalyticsParameterAdNetworkClickID (String) (optional)
  • +///
  • @c AnalyticsParameterCP1 (String) (optional)
  • +///
  • @c AnalyticsParameterCampaignID (String) (optional)
  • +///
  • @c AnalyticsParameterCreativeFormat (String) (optional)
  • +///
  • @c AnalyticsParameterMarketingTactic (String) (optional)
  • +///
  • @c AnalyticsParameterSourcePlatform (String) (optional)
  • +///
+static NSString *const kFIREventCampaignDetails NS_SWIFT_NAME(AnalyticsEventCampaignDetails) = + @"campaign_details"; + +/// Earn Virtual Currency event. This event tracks the awarding of virtual currency in your app. Log +/// this along with @c AnalyticsEventSpendVirtualCurrency to better understand your virtual economy. +/// Params: +/// +///
    +///
  • @c AnalyticsParameterVirtualCurrencyName (String)
  • +///
  • @c AnalyticsParameterValue (Int or Double)
  • +///
+static NSString *const kFIREventEarnVirtualCurrency + NS_SWIFT_NAME(AnalyticsEventEarnVirtualCurrency) = @"earn_virtual_currency"; + +/// Generate Lead event. Log this event when a lead has been generated in the app to understand the +/// efficacy of your install and re-engagement campaigns. Note: If you supply the +/// @c AnalyticsParameterValue parameter, you must also supply the @c AnalyticsParameterCurrency +/// parameter so that revenue metrics can be computed accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventGenerateLead NS_SWIFT_NAME(AnalyticsEventGenerateLead) = + @"generate_lead"; + +/// In-App Purchase event. This event signifies that extra content or a subscription was purchased +/// by a user inside an app. Note: This is different from the ecommerce purchase event. Note: If you +/// supply the @c AnalyticsParameterValue parameter, you must also supply the +/// @c AnalyticsParameterCurrency parameter so that revenue metrics can be computed accurately. +/// Params: +/// +///
    +///
  • @c AnalyticsParameterCurrency (String)
  • +///
  • @c AnalyticsParameterFreeTrial (Int) (optional)
  • +///
  • @c AnalyticsParameterPrice (Double) (optional)
  • +///
  • @c AnalyticsParameterPriceIsDiscounted (Int) (optional)
  • +///
  • @c AnalyticsParameterProductID (String) (optional)
  • +///
  • @c AnalyticsParameterProductName (String) (optional)
  • +///
  • @c AnalyticsParameterQuantity (Int) (optional)
  • +///
  • @c AnalyticsParameterSubscription (Int) (optional)
  • +///
  • @c AnalyticsParameterValue (Double)
  • +///
+static NSString *const kFIREventInAppPurchase NS_SWIFT_NAME(AnalyticsEventInAppPurchase) = + @"in_app_purchase"; + +/// Join Group event. Log this event when a user joins a group such as a guild, team or family. Use +/// this event to analyze how popular certain groups or social features are in your app. Params: +/// +///
    +///
  • @c AnalyticsParameterGroupID (String)
  • +///
+static NSString *const kFIREventJoinGroup NS_SWIFT_NAME(AnalyticsEventJoinGroup) = @"join_group"; + +/// Level End event. Log this event when the user finishes a level. Params: +/// +///
    +///
  • @c AnalyticsParameterLevelName (String)
  • +///
  • @c AnalyticsParameterSuccess (String)
  • +///
+static NSString *const kFIREventLevelEnd NS_SWIFT_NAME(AnalyticsEventLevelEnd) = @"level_end"; + +/// Level Start event. Log this event when the user starts a new level. Params: +/// +///
    +///
  • @c AnalyticsParameterLevelName (String)
  • +///
+static NSString *const kFIREventLevelStart NS_SWIFT_NAME(AnalyticsEventLevelStart) = @"level_start"; + +/// Level Up event. This event signifies that a player has leveled up in your gaming app. It can +/// help you gauge the level distribution of your userbase and help you identify certain levels that +/// are difficult to pass. Params: +/// +///
    +///
  • @c AnalyticsParameterLevel (Int)
  • +///
  • @c AnalyticsParameterCharacter (String) (optional)
  • +///
+static NSString *const kFIREventLevelUp NS_SWIFT_NAME(AnalyticsEventLevelUp) = @"level_up"; + +/// Login event. Apps with a login feature can report this event to signify that a user has logged +/// in. +static NSString *const kFIREventLogin NS_SWIFT_NAME(AnalyticsEventLogin) = @"login"; + +/// Post Score event. Log this event when the user posts a score in your gaming app. This event can +/// help you understand how users are actually performing in your game and it can help you correlate +/// high scores with certain audiences or behaviors. Params: +/// +///
    +///
  • @c AnalyticsParameterScore (Int)
  • +///
  • @c AnalyticsParameterLevel (Int) (optional)
  • +///
  • @c AnalyticsParameterCharacter (String) (optional)
  • +///
+static NSString *const kFIREventPostScore NS_SWIFT_NAME(AnalyticsEventPostScore) = @"post_score"; + +/// E-Commerce Purchase event. This event signifies that an item(s) was purchased by a user. Note: +/// This is different from the in-app purchase event, which is reported automatically for App +/// Store-based apps. Note: If you supply the @c AnalyticsParameterValue parameter, you must also +/// supply the @c AnalyticsParameterCurrency parameter so that revenue metrics can be computed +/// accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterAffiliation (String) (optional)
  • +///
  • @c AnalyticsParameterCoupon (String) (optional)
  • +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterEndDate (String) (optional)
  • +///
  • @c AnalyticsParameterItemID (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterShipping (Double) (optional)
  • +///
  • @c AnalyticsParameterStartDate (String) (optional)
  • +///
  • @c AnalyticsParameterTax (Double) (optional)
  • +///
  • @c AnalyticsParameterTransactionID (String) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventPurchase NS_SWIFT_NAME(AnalyticsEventPurchase) = @"purchase"; + +/// E-Commerce Refund event. This event signifies that a refund was issued. Note: If you supply the +/// @c AnalyticsParameterValue parameter, you must also supply the @c AnalyticsParameterCurrency +/// parameter so that revenue metrics can be computed accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterAffiliation (String) (optional)
  • +///
  • @c AnalyticsParameterCoupon (String) (optional)
  • +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterShipping (Double) (optional)
  • +///
  • @c AnalyticsParameterTax (Double) (optional)
  • +///
  • @c AnalyticsParameterTransactionID (String) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventRefund NS_SWIFT_NAME(AnalyticsEventRefund) = @"refund"; + +/// E-Commerce Remove from Cart event. This event signifies that an item(s) was removed from a cart. +/// Note: If you supply the @c AnalyticsParameterValue parameter, you must also supply the @c +/// AnalyticsParameterCurrency parameter so that revenue metrics can be computed accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventRemoveFromCart NS_SWIFT_NAME(AnalyticsEventRemoveFromCart) = + @"remove_from_cart"; + +/// Screen View event. This event signifies a screen view. Use this when a screen transition occurs. +/// This event can be logged irrespective of whether automatic screen tracking is enabled. Params: +/// +///
    +///
  • @c AnalyticsParameterScreenClass (String) (optional)
  • +///
  • @c AnalyticsParameterScreenName (String) (optional)
  • +///
+static NSString *const kFIREventScreenView NS_SWIFT_NAME(AnalyticsEventScreenView) = @"screen_view"; + +/// Search event. Apps that support search features can use this event to contextualize search +/// operations by supplying the appropriate, corresponding parameters. This event can help you +/// identify the most popular content in your app. Params: +/// +///
    +///
  • @c AnalyticsParameterSearchTerm (String)
  • +///
  • @c AnalyticsParameterStartDate (String) (optional)
  • +///
  • @c AnalyticsParameterEndDate (String) (optional)
  • +///
  • @c AnalyticsParameterNumberOfNights (Int) (optional) for hotel bookings
  • +///
  • @c AnalyticsParameterNumberOfRooms (Int) (optional) for hotel bookings
  • +///
  • @c AnalyticsParameterNumberOfPassengers (Int) (optional) for travel bookings
  • +///
  • @c AnalyticsParameterOrigin (String) (optional)
  • +///
  • @c AnalyticsParameterDestination (String) (optional)
  • +///
  • @c AnalyticsParameterTravelClass (String) (optional) for travel bookings
  • +///
+static NSString *const kFIREventSearch NS_SWIFT_NAME(AnalyticsEventSearch) = @"search"; + +/// Select Content event. This general purpose event signifies that a user has selected some content +/// of a certain type in an app. The content can be any object in your app. This event can help you +/// identify popular content and categories of content in your app. Params: +/// +///
    +///
  • @c AnalyticsParameterContentType (String)
  • +///
  • @c AnalyticsParameterItemID (String)
  • +///
+static NSString *const kFIREventSelectContent NS_SWIFT_NAME(AnalyticsEventSelectContent) = + @"select_content"; + +/// Select Item event. This event signifies that an item was selected by a user from a list. Use the +/// appropriate parameters to contextualize the event. Use this event to discover the most popular +/// items selected. Params: +/// +///
    +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterItemListID (String) (optional)
  • +///
  • @c AnalyticsParameterItemListName (String) (optional)
  • +///
+static NSString *const kFIREventSelectItem NS_SWIFT_NAME(AnalyticsEventSelectItem) = @"select_item"; + +/// Select promotion event. This event signifies that a user has selected a promotion offer. Use the +/// appropriate parameters to contextualize the event, such as the item(s) for which the promotion +/// applies. Params: +/// +///
    +///
  • @c AnalyticsParameterCreativeName (String) (optional)
  • +///
  • @c AnalyticsParameterCreativeSlot (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterLocationID (String) (optional)
  • +///
  • @c AnalyticsParameterPromotionID (String) (optional)
  • +///
  • @c AnalyticsParameterPromotionName (String) (optional)
  • +///
+static NSString *const kFIREventSelectPromotion NS_SWIFT_NAME(AnalyticsEventSelectPromotion) = + @"select_promotion"; + +/// Share event. Apps with social features can log the Share event to identify the most viral +/// content. Params: +/// +///
    +///
  • @c AnalyticsParameterContentType (String)
  • +///
  • @c AnalyticsParameterItemID (String)
  • +///
+static NSString *const kFIREventShare NS_SWIFT_NAME(AnalyticsEventShare) = @"share"; + +/// Sign Up event. This event indicates that a user has signed up for an account in your app. The +/// parameter signifies the method by which the user signed up. Use this event to understand the +/// different behaviors between logged in and logged out users. Params: +/// +///
    +///
  • @c AnalyticsParameterMethod (String)
  • +///
+static NSString *const kFIREventSignUp NS_SWIFT_NAME(AnalyticsEventSignUp) = @"sign_up"; + +/// Spend Virtual Currency event. This event tracks the sale of virtual goods in your app and can +/// help you identify which virtual goods are the most popular objects of purchase. Params: +/// +///
    +///
  • @c AnalyticsParameterItemName (String)
  • +///
  • @c AnalyticsParameterVirtualCurrencyName (String)
  • +///
  • @c AnalyticsParameterValue (Int or Double)
  • +///
+static NSString *const kFIREventSpendVirtualCurrency + NS_SWIFT_NAME(AnalyticsEventSpendVirtualCurrency) = @"spend_virtual_currency"; + +/// Tutorial Begin event. This event signifies the start of the on-boarding process in your app. Use +/// this in a funnel with @c AnalyticsEventTutorialComplete to understand how many users complete +/// this process and move on to the full app experience. +static NSString *const kFIREventTutorialBegin NS_SWIFT_NAME(AnalyticsEventTutorialBegin) = + @"tutorial_begin"; + +/// Tutorial End event. Use this event to signify the user's completion of your app's on-boarding +/// process. Add this to a funnel with @c AnalyticsEventTutorialBegin to gauge the completion rate +/// of your on-boarding process. +static NSString *const kFIREventTutorialComplete NS_SWIFT_NAME(AnalyticsEventTutorialComplete) = + @"tutorial_complete"; + +/// Unlock Achievement event. Log this event when the user has unlocked an achievement in your +/// game. Since achievements generally represent the breadth of a gaming experience, this event can +/// help you understand how many users are experiencing all that your game has to offer. Params: +/// +///
    +///
  • @c AnalyticsParameterAchievementID (String)
  • +///
+static NSString *const kFIREventUnlockAchievement NS_SWIFT_NAME(AnalyticsEventUnlockAchievement) = + @"unlock_achievement"; + +/// E-commerce View Cart event. This event signifies that a user has viewed their cart. Use this to +/// analyze your purchase funnel. Note: If you supply the @c AnalyticsParameterValue parameter, you +/// must also supply the @c AnalyticsParameterCurrency parameter so that revenue metrics can be +/// computed accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventViewCart NS_SWIFT_NAME(AnalyticsEventViewCart) = @"view_cart"; + +/// View Item event. This event signifies that a user has viewed an item. Use the appropriate +/// parameters to contextualize the event. Use this event to discover the most popular items viewed +/// in your app. Note: If you supply the @c AnalyticsParameterValue parameter, you must also supply +/// the @c AnalyticsParameterCurrency parameter so that revenue metrics can be computed accurately. +/// Params: +/// +///
    +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventViewItem NS_SWIFT_NAME(AnalyticsEventViewItem) = @"view_item"; + +/// View Item List event. Log this event when a user sees a list of items or offerings. Params: +/// +///
    +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterItemListID (String) (optional)
  • +///
  • @c AnalyticsParameterItemListName (String) (optional)
  • +///
+static NSString *const kFIREventViewItemList NS_SWIFT_NAME(AnalyticsEventViewItemList) = + @"view_item_list"; + +/// View Promotion event. This event signifies that a promotion was shown to a user. Add this event +/// to a funnel with the @c AnalyticsEventAddToCart and @c AnalyticsEventPurchase to gauge your +/// conversion process. Params: +/// +///
    +///
  • @c AnalyticsParameterCreativeName (String) (optional)
  • +///
  • @c AnalyticsParameterCreativeSlot (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterLocationID (String) (optional)
  • +///
  • @c AnalyticsParameterPromotionID (String) (optional)
  • +///
  • @c AnalyticsParameterPromotionName (String) (optional)
  • +///
+static NSString *const kFIREventViewPromotion NS_SWIFT_NAME(AnalyticsEventViewPromotion) = + @"view_promotion"; + +/// View Search Results event. Log this event when the user has been presented with the results of a +/// search. Params: +/// +///
    +///
  • @c AnalyticsParameterSearchTerm (String)
  • +///
+static NSString *const kFIREventViewSearchResults NS_SWIFT_NAME(AnalyticsEventViewSearchResults) = + @"view_search_results"; diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/Headers/FIRParameterNames.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/Headers/FIRParameterNames.h new file mode 100644 index 0000000..f0e782a --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/Headers/FIRParameterNames.h @@ -0,0 +1,775 @@ +/// @file FIRParameterNames.h +/// +/// Predefined event parameter names. +/// +/// Params supply information that contextualize Events. You can associate up to 25 unique Params +/// with each Event type. Some Params are suggested below for certain common Events, but you are +/// not limited to these. You may supply extra Params for suggested Events or custom Params for +/// Custom events. Param names can be up to 40 characters long, may only contain alphanumeric +/// characters and underscores ("_"), and must start with an alphabetic character. Param values can +/// be up to 100 characters long for standard Google Analytics properties and up to 500 characters +/// long for Google Analytics 360 properties. The "firebase_", "google_", and "ga_" prefixes are +/// reserved and should not be used. + +#import + +/// Game achievement ID (String). +///
+///     let params = [
+///       AnalyticsParameterAchievementID : "10_matches_won",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterAchievementID NS_SWIFT_NAME(AnalyticsParameterAchievementID) = + @"achievement_id"; + +/// The ad format (e.g. Banner, Interstitial, Rewarded, Native, Rewarded Interstitial, Instream). +/// (String). +///
+///     let params = [
+///       AnalyticsParameterAdFormat : "Banner",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterAdFormat NS_SWIFT_NAME(AnalyticsParameterAdFormat) = + @"ad_format"; + +/// Ad Network Click ID (String). Used for network-specific click IDs which vary in format. +///
+///     let params = [
+///       AnalyticsParameterAdNetworkClickID : "1234567",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterAdNetworkClickID + NS_SWIFT_NAME(AnalyticsParameterAdNetworkClickID) = @"aclid"; + +/// The ad platform (e.g. MoPub, IronSource) (String). +///
+///     let params = [
+///       AnalyticsParameterAdPlatform : "MoPub",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterAdPlatform NS_SWIFT_NAME(AnalyticsParameterAdPlatform) = + @"ad_platform"; + +/// The ad source (e.g. AdColony) (String). +///
+///     let params = [
+///       AnalyticsParameterAdSource : "AdColony",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterAdSource NS_SWIFT_NAME(AnalyticsParameterAdSource) = + @"ad_source"; + +/// The ad unit name (e.g. Banner_03) (String). +///
+///     let params = [
+///       AnalyticsParameterAdUnitName : "Banner_03",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterAdUnitName NS_SWIFT_NAME(AnalyticsParameterAdUnitName) = + @"ad_unit_name"; + +/// A product affiliation to designate a supplying company or brick and mortar store location +/// (String).
+///     let params = [
+///       AnalyticsParameterAffiliation : "Google Store",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterAffiliation NS_SWIFT_NAME(AnalyticsParameterAffiliation) = + @"affiliation"; + +/// Campaign custom parameter (String). Used as a method of capturing custom data in a campaign. +/// Use varies by network. +///
+///     let params = [
+///       AnalyticsParameterCP1 : "custom_data",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCP1 NS_SWIFT_NAME(AnalyticsParameterCP1) = @"cp1"; + +/// The individual campaign name, slogan, promo code, etc. Some networks have pre-defined macro to +/// capture campaign information, otherwise can be populated by developer. Highly Recommended +/// (String). +///
+///     let params = [
+///       AnalyticsParameterCampaign : "winter_promotion",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCampaign NS_SWIFT_NAME(AnalyticsParameterCampaign) = + @"campaign"; + +/// Campaign ID (String). Used for keyword analysis to identify a specific product promotion or +/// strategic campaign. This is a required key for GA4 data import. +///
+///     let params = [
+///       AnalyticsParameterCampaignID : "7877652710",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCampaignID NS_SWIFT_NAME(AnalyticsParameterCampaignID) = + @"campaign_id"; + +/// Character used in game (String). +///
+///     let params = [
+///       AnalyticsParameterCharacter : "beat_boss",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCharacter NS_SWIFT_NAME(AnalyticsParameterCharacter) = + @"character"; + +/// Campaign content (String). +static NSString *const kFIRParameterContent NS_SWIFT_NAME(AnalyticsParameterContent) = @"content"; + +/// Type of content selected (String). +///
+///     let params = [
+///       AnalyticsParameterContentType : "news article",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterContentType NS_SWIFT_NAME(AnalyticsParameterContentType) = + @"content_type"; + +/// Coupon code used for a purchase (String). +///
+///     let params = [
+///       AnalyticsParameterCoupon : "SUMMER_FUN",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCoupon NS_SWIFT_NAME(AnalyticsParameterCoupon) = @"coupon"; + +/// Creative Format (String). Used to identify the high-level classification of the type of ad +/// served by a specific campaign. +///
+///     let params = [
+///       AnalyticsParameterCreativeFormat : "display",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCreativeFormat NS_SWIFT_NAME(AnalyticsParameterCreativeFormat) = + @"creative_format"; + +/// The name of a creative used in a promotional spot (String). +///
+///     let params = [
+///       AnalyticsParameterCreativeName : "Summer Sale",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCreativeName NS_SWIFT_NAME(AnalyticsParameterCreativeName) = + @"creative_name"; + +/// The name of a creative slot (String). +///
+///     let params = [
+///       AnalyticsParameterCreativeSlot : "summer_banner2",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCreativeSlot NS_SWIFT_NAME(AnalyticsParameterCreativeSlot) = + @"creative_slot"; + +/// Currency of the purchase or items associated with the event, in 3-letter +/// ISO_4217 format (String). +///
+///     let params = [
+///       AnalyticsParameterCurrency : "USD",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCurrency NS_SWIFT_NAME(AnalyticsParameterCurrency) = + @"currency"; + +/// Flight or Travel destination (String). +///
+///     let params = [
+///       AnalyticsParameterDestination : "Mountain View, CA",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterDestination NS_SWIFT_NAME(AnalyticsParameterDestination) = + @"destination"; + +/// Monetary value of discount associated with a purchase (Double). +///
+///     let params = [
+///       AnalyticsParameterDiscount : 2.0,
+///       AnalyticsParameterCurrency : "USD",  // e.g. $2.00 USD
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterDiscount NS_SWIFT_NAME(AnalyticsParameterDiscount) = + @"discount"; + +/// The arrival date, check-out date or rental end date for the item. This should be in +/// YYYY-MM-DD format (String). +///
+///     let params = [
+///       AnalyticsParameterEndDate : "2015-09-14",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterEndDate NS_SWIFT_NAME(AnalyticsParameterEndDate) = @"end_date"; + +/// Indicates that the associated event should either extend the current session or start a new +/// session if no session was active when the event was logged. Specify 1 to extend the current +/// session or to start a new session; any other value will not extend or start a session. +///
+///     let params = [
+///       AnalyticsParameterExtendSession : 1,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterExtendSession NS_SWIFT_NAME(AnalyticsParameterExtendSession) = + @"extend_session"; + +/// Flight number for travel events (String). +///
+///     let params = [
+///       AnalyticsParameterFlightNumber : "ZZ800",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterFlightNumber NS_SWIFT_NAME(AnalyticsParameterFlightNumber) = + @"flight_number"; + +/// Indicates if the user is on a free trial of a subscription. Specify 1 to indicate true and 0 to +/// indicate false (Int). +///
+///     let params = [
+///       AnalyticsParameterFreeTrial : 1,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterFreeTrial NS_SWIFT_NAME(AnalyticsParameterFreeTrial) = + @"free_trial"; + +/// Group/clan/guild ID (String). +///
+///     let params = [
+///       AnalyticsParameterGroupID : "g1",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterGroupID NS_SWIFT_NAME(AnalyticsParameterGroupID) = @"group_id"; + +/// The index of the item in a list (Int). +///
+///     let params = [
+///       AnalyticsParameterIndex : 5,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterIndex NS_SWIFT_NAME(AnalyticsParameterIndex) = @"index"; + +/// Item brand (String). +///
+///     let params = [
+///       AnalyticsParameterItemBrand : "Google",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemBrand NS_SWIFT_NAME(AnalyticsParameterItemBrand) = + @"item_brand"; + +/// Item category (context-specific) (String). +///
+///     let params = [
+///       AnalyticsParameterItemCategory : "pants",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemCategory NS_SWIFT_NAME(AnalyticsParameterItemCategory) = + @"item_category"; + +/// Item Category (context-specific) (String). +///
+///     let params = [
+///       AnalyticsParameterItemCategory2 : "pants",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemCategory2 NS_SWIFT_NAME(AnalyticsParameterItemCategory2) = + @"item_category2"; + +/// Item Category (context-specific) (String). +///
+///     let params = [
+///       AnalyticsParameterItemCategory3 : "pants",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemCategory3 NS_SWIFT_NAME(AnalyticsParameterItemCategory3) = + @"item_category3"; + +/// Item Category (context-specific) (String). +///
+///     let params = [
+///       AnalyticsParameterItemCategory4 : "pants",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemCategory4 NS_SWIFT_NAME(AnalyticsParameterItemCategory4) = + @"item_category4"; + +/// Item Category (context-specific) (String). +///
+///     let params = [
+///       AnalyticsParameterItemCategory5 : "pants",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemCategory5 NS_SWIFT_NAME(AnalyticsParameterItemCategory5) = + @"item_category5"; + +/// Item ID (context-specific) (String). +///
+///     let params = [
+///       AnalyticsParameterItemID : "SKU_12345",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemID NS_SWIFT_NAME(AnalyticsParameterItemID) = @"item_id"; + +/// The ID of the list in which the item was presented to the user (String). +///
+///     let params = [
+///       AnalyticsParameterItemListID : "ABC123",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemListID NS_SWIFT_NAME(AnalyticsParameterItemListID) = + @"item_list_id"; + +/// The name of the list in which the item was presented to the user (String). +///
+///     let params = [
+///       AnalyticsParameterItemListName : "Related products",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemListName NS_SWIFT_NAME(AnalyticsParameterItemListName) = + @"item_list_name"; + +/// Item Name (context-specific) (String). +///
+///     let params = [
+///       AnalyticsParameterItemName : "jeggings",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemName NS_SWIFT_NAME(AnalyticsParameterItemName) = + @"item_name"; + +/// Item variant (String). +///
+///     let params = [
+///       AnalyticsParameterItemVariant : "Black",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemVariant NS_SWIFT_NAME(AnalyticsParameterItemVariant) = + @"item_variant"; + +/// The list of items involved in the transaction expressed as `[[String: Any]]`. +///
+///     let params = [
+///       AnalyticsParameterItems : [
+///         [AnalyticsParameterItemName : "jeggings", AnalyticsParameterItemCategory : "pants"],
+///         [AnalyticsParameterItemName : "boots", AnalyticsParameterItemCategory : "shoes"],
+///       ],
+///     ]
+/// 
+static NSString *const kFIRParameterItems NS_SWIFT_NAME(AnalyticsParameterItems) = @"items"; + +/// Level in game (Int). +///
+///     let params = [
+///       AnalyticsParameterLevel : 42,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterLevel NS_SWIFT_NAME(AnalyticsParameterLevel) = @"level"; + +/// The name of a level in a game (String). +///
+///     let params = [
+///       AnalyticsParameterLevelName : "room_1",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterLevelName NS_SWIFT_NAME(AnalyticsParameterLevelName) = + @"level_name"; + +/// Location (String). The Google Place ID +/// that corresponds to the associated event. Alternatively, you can supply your own custom +/// Location ID. +///
+///     let params = [
+///       AnalyticsParameterLocation : "ChIJiyj437sx3YAR9kUWC8QkLzQ",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterLocation NS_SWIFT_NAME(AnalyticsParameterLocation) = + @"location"; + +/// The location associated with the event. Preferred to be the Google +/// Place ID that corresponds to the +/// associated item but could be overridden to a custom location ID string.(String). +///
+///     let params = [
+///       AnalyticsParameterLocationID : "ChIJiyj437sx3YAR9kUWC8QkLzQ",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterLocationID NS_SWIFT_NAME(AnalyticsParameterLocationID) = + @"location_id"; + +/// Marketing Tactic (String). Used to identify the targeting criteria applied to a specific +/// campaign. +///
+///     let params = [
+///       AnalyticsParameterMarketingTactic : "Remarketing",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterMarketingTactic + NS_SWIFT_NAME(AnalyticsParameterMarketingTactic) = @"marketing_tactic"; + +/// The advertising or marketing medium, for example: cpc, banner, email, push. Highly recommended +/// (String). +///
+///     let params = [
+///       AnalyticsParameterMedium : "email",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterMedium NS_SWIFT_NAME(AnalyticsParameterMedium) = @"medium"; + +/// A particular approach used in an operation; for example, "facebook" or "email" in the context +/// of a sign_up or login event. (String). +///
+///     let params = [
+///       AnalyticsParameterMethod : "google",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterMethod NS_SWIFT_NAME(AnalyticsParameterMethod) = @"method"; + +/// Number of nights staying at hotel (Int). +///
+///     let params = [
+///       AnalyticsParameterNumberOfNights : 3,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterNumberOfNights + NS_SWIFT_NAME(AnalyticsParameterNumberOfNights) = @"number_of_nights"; + +/// Number of passengers traveling (Int). +///
+///     let params = [
+///       AnalyticsParameterNumberOfPassengers : 11,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterNumberOfPassengers + NS_SWIFT_NAME(AnalyticsParameterNumberOfPassengers) = @"number_of_passengers"; + +/// Number of rooms for travel events (Int). +///
+///     let params = [
+///       AnalyticsParameterNumberOfRooms : 2,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterNumberOfRooms NS_SWIFT_NAME(AnalyticsParameterNumberOfRooms) = + @"number_of_rooms"; + +/// Flight or Travel origin (String). +///
+///     let params = [
+///       AnalyticsParameterOrigin : "Mountain View, CA",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterOrigin NS_SWIFT_NAME(AnalyticsParameterOrigin) = @"origin"; + +/// The chosen method of payment (String). +///
+///     let params = [
+///       AnalyticsParameterPaymentType : "Visa",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterPaymentType NS_SWIFT_NAME(AnalyticsParameterPaymentType) = + @"payment_type"; + +/// Purchase price (Double). +///
+///     let params = [
+///       AnalyticsParameterPrice : 1.0,
+///       AnalyticsParameterCurrency : "USD",  // e.g. $1.00 USD
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterPrice NS_SWIFT_NAME(AnalyticsParameterPrice) = @"price"; + +/// Indicates if an item's price is discounted. Specify 1 to indicate true and 0 to indicate false +/// (Int). +///
+///     let params = [
+///       AnalyticsParameterPriceIsDiscounted : 1,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterPriceIsDiscounted + NS_SWIFT_NAME(AnalyticsParameterPriceIsDiscounted) = @"price_is_discounted"; + +/// The ID of a product (String). +///
+///     let params = [
+///       AnalyticsParameterProductID : "PROD_12345",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterProductID NS_SWIFT_NAME(AnalyticsParameterProductID) = + @"product_id"; + +/// The name of a product (String). +///
+///     let params = [
+///       AnalyticsParameterProductName : "My Awesome Product",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterProductName NS_SWIFT_NAME(AnalyticsParameterProductName) = + @"product_name"; + +/// The ID of a product promotion (String). +///
+///     let params = [
+///       AnalyticsParameterPromotionID : "ABC123",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterPromotionID NS_SWIFT_NAME(AnalyticsParameterPromotionID) = + @"promotion_id"; + +/// The name of a product promotion (String). +///
+///     let params = [
+///       AnalyticsParameterPromotionName : "Summer Sale",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterPromotionName NS_SWIFT_NAME(AnalyticsParameterPromotionName) = + @"promotion_name"; + +/// Purchase quantity (Int). +///
+///     let params = [
+///       AnalyticsParameterQuantity : 1,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterQuantity NS_SWIFT_NAME(AnalyticsParameterQuantity) = + @"quantity"; + +/// Score in game (Int). +///
+///     let params = [
+///       AnalyticsParameterScore : 4200,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterScore NS_SWIFT_NAME(AnalyticsParameterScore) = @"score"; + +/// Current screen class, such as the class name of the UIViewController, logged with screen_view +/// event and added to every event (String). +///
+///     let params = [
+///       AnalyticsParameterScreenClass : "LoginViewController",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterScreenClass NS_SWIFT_NAME(AnalyticsParameterScreenClass) = + @"screen_class"; + +/// Current screen name, such as the name of the UIViewController, logged with screen_view event and +/// added to every event (String). +///
+///     let params = [
+///       AnalyticsParameterScreenName : "LoginView",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterScreenName NS_SWIFT_NAME(AnalyticsParameterScreenName) = + @"screen_name"; + +/// The search string/keywords used (String). +///
+///     let params = [
+///       AnalyticsParameterSearchTerm : "periodic table",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterSearchTerm NS_SWIFT_NAME(AnalyticsParameterSearchTerm) = + @"search_term"; + +/// Shipping cost associated with a transaction (Double). +///
+///     let params = [
+///       AnalyticsParameterShipping : 5.99,
+///       AnalyticsParameterCurrency : "USD",  // e.g. $5.99 USD
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterShipping NS_SWIFT_NAME(AnalyticsParameterShipping) = + @"shipping"; + +/// The shipping tier (e.g. Ground, Air, Next-day) selected for delivery of the purchased item +/// (String). +///
+///     let params = [
+///       AnalyticsParameterShippingTier : "Ground",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterShippingTier NS_SWIFT_NAME(AnalyticsParameterShippingTier) = + @"shipping_tier"; + +/// The origin of your traffic, such as an Ad network (for example, google) or partner (urban +/// airship). Identify the advertiser, site, publication, etc. that is sending traffic to your +/// property. Highly recommended (String). +///
+///     let params = [
+///       AnalyticsParameterSource : "InMobi",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterSource NS_SWIFT_NAME(AnalyticsParameterSource) = @"source"; + +/// Source Platform (String). Used to identify the platform responsible for directing traffic to a +/// given Analytics property (e.g., a buying platform where budgets, targeting criteria, etc. are +/// set, a platform for managing organic traffic data, etc.). +///
+///     let params = [
+///       AnalyticsParameterSourcePlatform : "sa360",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterSourcePlatform NS_SWIFT_NAME(AnalyticsParameterSourcePlatform) = + @"source_platform"; + +/// The departure date, check-in date or rental start date for the item. This should be in +/// YYYY-MM-DD format (String). +///
+///     let params = [
+///       AnalyticsParameterStartDate : "2015-09-14",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterStartDate NS_SWIFT_NAME(AnalyticsParameterStartDate) = + @"start_date"; + +/// Indicates if the purchase is a subscription. Specify 1 to indicate true and 0 to indicate false +/// (Int). +///
+///     let params = [
+///       AnalyticsParameterSubscription : 1,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterSubscription NS_SWIFT_NAME(AnalyticsParameterSubscription) = + @"subscription"; + +/// The result of an operation. Specify 1 to indicate success and 0 to indicate failure (Int). +///
+///     let params = [
+///       AnalyticsParameterSuccess : 1,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterSuccess NS_SWIFT_NAME(AnalyticsParameterSuccess) = @"success"; + +/// Tax cost associated with a transaction (Double). +///
+///     let params = [
+///       AnalyticsParameterTax : 2.43,
+///       AnalyticsParameterCurrency : "USD",  // e.g. $2.43 USD
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterTax NS_SWIFT_NAME(AnalyticsParameterTax) = @"tax"; + +/// If you're manually tagging keyword campaigns, you should use utm_term to specify the keyword +/// (String). +///
+///     let params = [
+///       AnalyticsParameterTerm : "game",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterTerm NS_SWIFT_NAME(AnalyticsParameterTerm) = @"term"; + +/// The unique identifier of a transaction (String). +///
+///     let params = [
+///       AnalyticsParameterTransactionID : "T12345",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterTransactionID NS_SWIFT_NAME(AnalyticsParameterTransactionID) = + @"transaction_id"; + +/// Travel class (String). +///
+///     let params = [
+///       AnalyticsParameterTravelClass : "business",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterTravelClass NS_SWIFT_NAME(AnalyticsParameterTravelClass) = + @"travel_class"; + +/// A context-specific numeric value which is accumulated automatically for each event type. This is +/// a general purpose parameter that is useful for accumulating a key metric that pertains to an +/// event. Examples include revenue, distance, time and points. Value should be specified as Int or +/// Double. +/// Notes: Values for pre-defined currency-related events (such as @c AnalyticsEventAddToCart) +/// should be supplied using Double and must be accompanied by a @c AnalyticsParameterCurrency +/// parameter. The valid range of accumulated values is +/// [-9,223,372,036,854.77, 9,223,372,036,854.77]. Supplying a non-numeric value, omitting the +/// corresponding @c AnalyticsParameterCurrency parameter, or supplying an invalid +/// currency code for conversion events will cause that +/// conversion to be omitted from reporting. +///
+///     let params = [
+///       AnalyticsParameterValue : 3.99,
+///       AnalyticsParameterCurrency : "USD",  // e.g. $3.99 USD
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterValue NS_SWIFT_NAME(AnalyticsParameterValue) = @"value"; + +/// Name of virtual currency type (String). +///
+///     let params = [
+///       AnalyticsParameterVirtualCurrencyName : "virtual_currency_name",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterVirtualCurrencyName + NS_SWIFT_NAME(AnalyticsParameterVirtualCurrencyName) = @"virtual_currency_name"; diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/Headers/FIRUserPropertyNames.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/Headers/FIRUserPropertyNames.h new file mode 100644 index 0000000..2442d8a --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/Headers/FIRUserPropertyNames.h @@ -0,0 +1,28 @@ +/// @file FIRUserPropertyNames.h +/// +/// Predefined user property names. +/// +/// A UserProperty is an attribute that describes the app-user. By supplying UserProperties, you can +/// later analyze different behaviors of various segments of your userbase. You may supply up to 25 +/// unique UserProperties per app, and you can use the name and value of your choosing for each one. +/// UserProperty names can be up to 24 characters long, may only contain alphanumeric characters and +/// underscores ("_"), and must start with an alphabetic character. UserProperty values can be up to +/// 36 characters long. The "firebase_", "google_", and "ga_" prefixes are reserved and should not +/// be used. + +#import + +/// Indicates whether events logged by Google Analytics can be used to personalize ads for the user. +/// Set to "YES" to enable, or "NO" to disable. Default is enabled. See the +/// documentation for +/// more details and information about related settings. +/// +///
+///     Analytics.setUserProperty("NO", forName: AnalyticsUserPropertyAllowAdPersonalizationSignals)
+/// 
+static NSString *const kFIRUserPropertyAllowAdPersonalizationSignals + NS_SWIFT_NAME(AnalyticsUserPropertyAllowAdPersonalizationSignals) = @"allow_personalized_ads"; + +/// The method used to sign in. For example, "google", "facebook" or "twitter". +static NSString *const kFIRUserPropertySignUpMethod + NS_SWIFT_NAME(AnalyticsUserPropertySignUpMethod) = @"sign_up_method"; diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/Headers/FirebaseAnalytics-Swift.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/Headers/FirebaseAnalytics-Swift.h new file mode 100644 index 0000000..0ead9a0 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/Headers/FirebaseAnalytics-Swift.h @@ -0,0 +1,316 @@ +#if 0 +#elif defined(__arm64__) && __arm64__ +// Generated by Apple Swift version 6.0.3 effective-5.10 (swiftlang-6.0.3.1.10 clang-1600.0.30.1) +#ifndef FIREBASEANALYTICS_SWIFT_H +#define FIREBASEANALYTICS_SWIFT_H +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgcc-compat" + +#if !defined(__has_include) +# define __has_include(x) 0 +#endif +#if !defined(__has_attribute) +# define __has_attribute(x) 0 +#endif +#if !defined(__has_feature) +# define __has_feature(x) 0 +#endif +#if !defined(__has_warning) +# define __has_warning(x) 0 +#endif + +#if __has_include() +# include +#endif + +#pragma clang diagnostic ignored "-Wauto-import" +#if defined(__OBJC__) +#include +#endif +#if defined(__cplusplus) +#include +#include +#include +#include +#include +#include +#include +#else +#include +#include +#include +#include +#endif +#if defined(__cplusplus) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wnon-modular-include-in-framework-module" +#if defined(__arm64e__) && __has_include() +# include +#else +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wreserved-macro-identifier" +# ifndef __ptrauth_swift_value_witness_function_pointer +# define __ptrauth_swift_value_witness_function_pointer(x) +# endif +# ifndef __ptrauth_swift_class_method_pointer +# define __ptrauth_swift_class_method_pointer(x) +# endif +#pragma clang diagnostic pop +#endif +#pragma clang diagnostic pop +#endif + +#if !defined(SWIFT_TYPEDEFS) +# define SWIFT_TYPEDEFS 1 +# if __has_include() +# include +# elif !defined(__cplusplus) +typedef uint_least16_t char16_t; +typedef uint_least32_t char32_t; +# endif +typedef float swift_float2 __attribute__((__ext_vector_type__(2))); +typedef float swift_float3 __attribute__((__ext_vector_type__(3))); +typedef float swift_float4 __attribute__((__ext_vector_type__(4))); +typedef double swift_double2 __attribute__((__ext_vector_type__(2))); +typedef double swift_double3 __attribute__((__ext_vector_type__(3))); +typedef double swift_double4 __attribute__((__ext_vector_type__(4))); +typedef int swift_int2 __attribute__((__ext_vector_type__(2))); +typedef int swift_int3 __attribute__((__ext_vector_type__(3))); +typedef int swift_int4 __attribute__((__ext_vector_type__(4))); +typedef unsigned int swift_uint2 __attribute__((__ext_vector_type__(2))); +typedef unsigned int swift_uint3 __attribute__((__ext_vector_type__(3))); +typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); +#endif + +#if !defined(SWIFT_PASTE) +# define SWIFT_PASTE_HELPER(x, y) x##y +# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y) +#endif +#if !defined(SWIFT_METATYPE) +# define SWIFT_METATYPE(X) Class +#endif +#if !defined(SWIFT_CLASS_PROPERTY) +# if __has_feature(objc_class_property) +# define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__ +# else +# define SWIFT_CLASS_PROPERTY(...) +# endif +#endif +#if !defined(SWIFT_RUNTIME_NAME) +# if __has_attribute(objc_runtime_name) +# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X))) +# else +# define SWIFT_RUNTIME_NAME(X) +# endif +#endif +#if !defined(SWIFT_COMPILE_NAME) +# if __has_attribute(swift_name) +# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X))) +# else +# define SWIFT_COMPILE_NAME(X) +# endif +#endif +#if !defined(SWIFT_METHOD_FAMILY) +# if __has_attribute(objc_method_family) +# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X))) +# else +# define SWIFT_METHOD_FAMILY(X) +# endif +#endif +#if !defined(SWIFT_NOESCAPE) +# if __has_attribute(noescape) +# define SWIFT_NOESCAPE __attribute__((noescape)) +# else +# define SWIFT_NOESCAPE +# endif +#endif +#if !defined(SWIFT_RELEASES_ARGUMENT) +# if __has_attribute(ns_consumed) +# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed)) +# else +# define SWIFT_RELEASES_ARGUMENT +# endif +#endif +#if !defined(SWIFT_WARN_UNUSED_RESULT) +# if __has_attribute(warn_unused_result) +# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) +# else +# define SWIFT_WARN_UNUSED_RESULT +# endif +#endif +#if !defined(SWIFT_NORETURN) +# if __has_attribute(noreturn) +# define SWIFT_NORETURN __attribute__((noreturn)) +# else +# define SWIFT_NORETURN +# endif +#endif +#if !defined(SWIFT_CLASS_EXTRA) +# define SWIFT_CLASS_EXTRA +#endif +#if !defined(SWIFT_PROTOCOL_EXTRA) +# define SWIFT_PROTOCOL_EXTRA +#endif +#if !defined(SWIFT_ENUM_EXTRA) +# define SWIFT_ENUM_EXTRA +#endif +#if !defined(SWIFT_CLASS) +# if __has_attribute(objc_subclassing_restricted) +# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA +# define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA +# else +# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA +# define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA +# endif +#endif +#if !defined(SWIFT_RESILIENT_CLASS) +# if __has_attribute(objc_class_stub) +# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) __attribute__((objc_class_stub)) +# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_class_stub)) SWIFT_CLASS_NAMED(SWIFT_NAME) +# else +# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) +# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) SWIFT_CLASS_NAMED(SWIFT_NAME) +# endif +#endif +#if !defined(SWIFT_PROTOCOL) +# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA +# define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA +#endif +#if !defined(SWIFT_EXTENSION) +# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__) +#endif +#if !defined(OBJC_DESIGNATED_INITIALIZER) +# if __has_attribute(objc_designated_initializer) +# define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) +# else +# define OBJC_DESIGNATED_INITIALIZER +# endif +#endif +#if !defined(SWIFT_ENUM_ATTR) +# if __has_attribute(enum_extensibility) +# define SWIFT_ENUM_ATTR(_extensibility) __attribute__((enum_extensibility(_extensibility))) +# else +# define SWIFT_ENUM_ATTR(_extensibility) +# endif +#endif +#if !defined(SWIFT_ENUM) +# define SWIFT_ENUM(_type, _name, _extensibility) enum _name : _type _name; enum SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type +# if __has_feature(generalized_swift_name) +# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type +# else +# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) SWIFT_ENUM(_type, _name, _extensibility) +# endif +#endif +#if !defined(SWIFT_UNAVAILABLE) +# define SWIFT_UNAVAILABLE __attribute__((unavailable)) +#endif +#if !defined(SWIFT_UNAVAILABLE_MSG) +# define SWIFT_UNAVAILABLE_MSG(msg) __attribute__((unavailable(msg))) +#endif +#if !defined(SWIFT_AVAILABILITY) +# define SWIFT_AVAILABILITY(plat, ...) __attribute__((availability(plat, __VA_ARGS__))) +#endif +#if !defined(SWIFT_WEAK_IMPORT) +# define SWIFT_WEAK_IMPORT __attribute__((weak_import)) +#endif +#if !defined(SWIFT_DEPRECATED) +# define SWIFT_DEPRECATED __attribute__((deprecated)) +#endif +#if !defined(SWIFT_DEPRECATED_MSG) +# define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__))) +#endif +#if !defined(SWIFT_DEPRECATED_OBJC) +# if __has_feature(attribute_diagnose_if_objc) +# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning"))) +# else +# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg) +# endif +#endif +#if defined(__OBJC__) +#if !defined(IBSegueAction) +# define IBSegueAction +#endif +#endif +#if !defined(SWIFT_EXTERN) +# if defined(__cplusplus) +# define SWIFT_EXTERN extern "C" +# else +# define SWIFT_EXTERN extern +# endif +#endif +#if !defined(SWIFT_CALL) +# define SWIFT_CALL __attribute__((swiftcall)) +#endif +#if !defined(SWIFT_INDIRECT_RESULT) +# define SWIFT_INDIRECT_RESULT __attribute__((swift_indirect_result)) +#endif +#if !defined(SWIFT_CONTEXT) +# define SWIFT_CONTEXT __attribute__((swift_context)) +#endif +#if !defined(SWIFT_ERROR_RESULT) +# define SWIFT_ERROR_RESULT __attribute__((swift_error_result)) +#endif +#if defined(__cplusplus) +# define SWIFT_NOEXCEPT noexcept +#else +# define SWIFT_NOEXCEPT +#endif +#if !defined(SWIFT_C_INLINE_THUNK) +# if __has_attribute(always_inline) +# if __has_attribute(nodebug) +# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) __attribute__((nodebug)) +# else +# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) +# endif +# else +# define SWIFT_C_INLINE_THUNK inline +# endif +#endif +#if defined(_WIN32) +#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) +# define SWIFT_IMPORT_STDLIB_SYMBOL __declspec(dllimport) +#endif +#else +#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) +# define SWIFT_IMPORT_STDLIB_SYMBOL +#endif +#endif +#if defined(__OBJC__) +#if __has_feature(objc_modules) +#if __has_warning("-Watimport-in-framework-header") +#pragma clang diagnostic ignored "-Watimport-in-framework-header" +#endif +#endif + +#endif +#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch" +#pragma clang diagnostic ignored "-Wduplicate-method-arg" +#if __has_warning("-Wpragma-clang-attribute") +# pragma clang diagnostic ignored "-Wpragma-clang-attribute" +#endif +#pragma clang diagnostic ignored "-Wunknown-pragmas" +#pragma clang diagnostic ignored "-Wnullability" +#pragma clang diagnostic ignored "-Wdollar-in-identifier-extension" +#pragma clang diagnostic ignored "-Wunsafe-buffer-usage" + +#if __has_attribute(external_source_symbol) +# pragma push_macro("any") +# undef any +# pragma clang attribute push(__attribute__((external_source_symbol(language="Swift", defined_in="FirebaseAnalytics",generated_declaration))), apply_to=any(function,enum,objc_interface,objc_category,objc_protocol)) +# pragma pop_macro("any") +#endif + +#if defined(__OBJC__) + +#endif +#if __has_attribute(external_source_symbol) +# pragma clang attribute pop +#endif +#if defined(__cplusplus) +#endif +#pragma clang diagnostic pop +#endif + +#else +#error unsupported Swift architecture +#endif diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/Headers/FirebaseAnalytics-umbrella.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/Headers/FirebaseAnalytics-umbrella.h new file mode 100644 index 0000000..ad84fbb --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/Headers/FirebaseAnalytics-umbrella.h @@ -0,0 +1,24 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + +#import "FIRAnalytics+AppDelegate.h" +#import "FIRAnalytics+Consent.h" +#import "FIRAnalytics+OnDevice.h" +#import "FIRAnalytics.h" +#import "FirebaseAnalytics.h" +#import "FIREventNames.h" +#import "FIRParameterNames.h" +#import "FIRUserPropertyNames.h" + +FOUNDATION_EXPORT double FirebaseAnalyticsVersionNumber; +FOUNDATION_EXPORT const unsigned char FirebaseAnalyticsVersionString[]; + diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/Headers/FirebaseAnalytics.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/Headers/FirebaseAnalytics.h new file mode 100644 index 0000000..351da20 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/Headers/FirebaseAnalytics.h @@ -0,0 +1,7 @@ +#import "FIRAnalytics+AppDelegate.h" +#import "FIRAnalytics+Consent.h" +#import "FIRAnalytics+OnDevice.h" +#import "FIRAnalytics.h" +#import "FIREventNames.h" +#import "FIRParameterNames.h" +#import "FIRUserPropertyNames.h" diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/Info.plist b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/Info.plist new file mode 100644 index 0000000..aa5badf --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/Info.plist @@ -0,0 +1,57 @@ + + + + + BuildMachineOSBuild + 24G231 + CFBundleDevelopmentRegion + en + CFBundleExecutable + FirebaseAnalytics + CFBundleIdentifier + org.cocoapods.FirebaseAnalytics + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + FirebaseAnalytics + CFBundlePackageType + FMWK + CFBundleShortVersionString + 12.5.0 + CFBundleSignature + ???? + CFBundleSupportedPlatforms + + iPhoneOS + + CFBundleVersion + 1 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + DTPlatformBuild + 22C146 + DTPlatformName + iphoneos + DTPlatformVersion + 18.2 + DTSDKBuild + 22C146 + DTSDKName + iphoneos18.2 + DTXcode + 1620 + DTXcodeBuild + 16C5032a + MinimumOSVersion + 100.0 + UIDeviceFamily + + 1 + 2 + + UIRequiredDeviceCapabilities + + arm64 + + + diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/Project/arm64-apple-ios.swiftsourceinfo b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/Project/arm64-apple-ios.swiftsourceinfo new file mode 100644 index 0000000..b660cd9 Binary files /dev/null and b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/Project/arm64-apple-ios.swiftsourceinfo differ diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios.abi.json b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios.abi.json new file mode 100644 index 0000000..476738a --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios.abi.json @@ -0,0 +1,281 @@ +{ + "ABIRoot": { + "kind": "Root", + "name": "FirebaseAnalytics", + "printedName": "FirebaseAnalytics", + "children": [ + { + "kind": "Import", + "name": "FirebaseAnalyticsPrivate", + "printedName": "FirebaseAnalyticsPrivate", + "declKind": "Import", + "moduleName": "FirebaseAnalytics", + "declAttributes": [ + "ImplementationOnly" + ] + }, + { + "kind": "Import", + "name": "StoreKit", + "printedName": "StoreKit", + "declKind": "Import", + "moduleName": "FirebaseAnalytics" + }, + { + "kind": "Import", + "name": "SwiftUI", + "printedName": "SwiftUI", + "declKind": "Import", + "moduleName": "FirebaseAnalytics" + }, + { + "kind": "TypeDecl", + "name": "Analytics", + "printedName": "Analytics", + "children": [ + { + "kind": "Function", + "name": "logTransaction", + "printedName": "logTransaction(_:)", + "children": [ + { + "kind": "TypeNominal", + "name": "Void", + "printedName": "()" + }, + { + "kind": "TypeNominal", + "name": "Transaction", + "printedName": "StoreKit.Transaction", + "usr": "s:8StoreKit11TransactionV" + } + ], + "declKind": "Func", + "usr": "s:So12FIRAnalyticsC17FirebaseAnalyticsE14logTransactionyy8StoreKit0E0VFZ", + "mangledName": "$sSo12FIRAnalyticsC17FirebaseAnalyticsE14logTransactionyy8StoreKit0E0VFZ", + "moduleName": "FirebaseAnalytics", + "static": true, + "declAttributes": [ + "Final", + "AccessControl", + "RawDocComment" + ], + "isFromExtension": true, + "funcSelfKind": "NonMutating" + } + ], + "declKind": "Class", + "usr": "c:objc(cs)FIRAnalytics", + "moduleName": "FirebaseAnalytics", + "isOpen": true, + "objc_name": "FIRAnalytics", + "declAttributes": [ + "ObjC", + "Dynamic" + ], + "superclassUsr": "c:objc(cs)NSObject", + "isExternal": true, + "inheritsConvenienceInitializers": true, + "superclassNames": [ + "ObjectiveC.NSObject" + ], + "conformances": [ + { + "kind": "Conformance", + "name": "Copyable", + "printedName": "Copyable", + "usr": "s:s8CopyableP", + "mangledName": "$ss8CopyableP" + }, + { + "kind": "Conformance", + "name": "Escapable", + "printedName": "Escapable", + "usr": "s:s9EscapableP", + "mangledName": "$ss9EscapableP" + }, + { + "kind": "Conformance", + "name": "Equatable", + "printedName": "Equatable", + "usr": "s:SQ", + "mangledName": "$sSQ" + }, + { + "kind": "Conformance", + "name": "Hashable", + "printedName": "Hashable", + "usr": "s:SH", + "mangledName": "$sSH" + }, + { + "kind": "Conformance", + "name": "CVarArg", + "printedName": "CVarArg", + "usr": "s:s7CVarArgP", + "mangledName": "$ss7CVarArgP" + }, + { + "kind": "Conformance", + "name": "_KeyValueCodingAndObservingPublishing", + "printedName": "_KeyValueCodingAndObservingPublishing", + "usr": "s:10Foundation37_KeyValueCodingAndObservingPublishingP", + "mangledName": "$s10Foundation37_KeyValueCodingAndObservingPublishingP" + }, + { + "kind": "Conformance", + "name": "_KeyValueCodingAndObserving", + "printedName": "_KeyValueCodingAndObserving", + "usr": "s:10Foundation27_KeyValueCodingAndObservingP", + "mangledName": "$s10Foundation27_KeyValueCodingAndObservingP" + }, + { + "kind": "Conformance", + "name": "CustomStringConvertible", + "printedName": "CustomStringConvertible", + "usr": "s:s23CustomStringConvertibleP", + "mangledName": "$ss23CustomStringConvertibleP" + }, + { + "kind": "Conformance", + "name": "CustomDebugStringConvertible", + "printedName": "CustomDebugStringConvertible", + "usr": "s:s28CustomDebugStringConvertibleP", + "mangledName": "$ss28CustomDebugStringConvertibleP" + } + ] + }, + { + "kind": "TypeDecl", + "name": "View", + "printedName": "View", + "children": [ + { + "kind": "Function", + "name": "analyticsScreen", + "printedName": "analyticsScreen(name:class:extraParameters:)", + "children": [ + { + "kind": "TypeNominal", + "name": "OpaqueTypeArchetype", + "printedName": "some SwiftUI.View", + "children": [ + { + "kind": "TypeNominal", + "name": "View", + "printedName": "SwiftUI.View", + "usr": "s:7SwiftUI4ViewP" + } + ] + }, + { + "kind": "TypeNominal", + "name": "String", + "printedName": "Swift.String", + "usr": "s:SS" + }, + { + "kind": "TypeNominal", + "name": "String", + "printedName": "Swift.String", + "hasDefaultArg": true, + "usr": "s:SS" + }, + { + "kind": "TypeNominal", + "name": "Dictionary", + "printedName": "[Swift.String : Any]", + "children": [ + { + "kind": "TypeNominal", + "name": "String", + "printedName": "Swift.String", + "usr": "s:SS" + }, + { + "kind": "TypeNominal", + "name": "ProtocolComposition", + "printedName": "Any" + } + ], + "hasDefaultArg": true, + "usr": "s:SD" + } + ], + "declKind": "Func", + "usr": "s:7SwiftUI4ViewP17FirebaseAnalyticsE15analyticsScreen4name5class15extraParametersQrSS_SSSDySSypGtF", + "mangledName": "$s7SwiftUI4ViewP17FirebaseAnalyticsE15analyticsScreen4name5class15extraParametersQrSS_SSSDySSypGtF", + "moduleName": "FirebaseAnalytics", + "genericSig": "<τ_0_0 where τ_0_0 : SwiftUI.View>", + "sugared_genericSig": "", + "declAttributes": [ + "Preconcurrency", + "Custom", + "AccessControl", + "RawDocComment" + ], + "isFromExtension": true, + "funcSelfKind": "NonMutating" + } + ], + "declKind": "Protocol", + "usr": "s:7SwiftUI4ViewP", + "mangledName": "$s7SwiftUI4ViewP", + "moduleName": "SwiftUICore", + "genericSig": "<τ_0_0.Body : SwiftUI.View>", + "sugared_genericSig": "", + "intro_Macosx": "10.15", + "intro_iOS": "13.0", + "intro_tvOS": "13.0", + "intro_watchOS": "6.0", + "declAttributes": [ + "Preconcurrency", + "TypeEraser", + "OriginallyDefinedIn", + "OriginallyDefinedIn", + "OriginallyDefinedIn", + "OriginallyDefinedIn", + "Available", + "Available", + "Available", + "Available", + "Custom" + ], + "isExternal": true, + "conformances": [ + { + "kind": "Conformance", + "name": "Escapable", + "printedName": "Escapable", + "usr": "s:s9EscapableP", + "mangledName": "$ss9EscapableP" + }, + { + "kind": "Conformance", + "name": "Copyable", + "printedName": "Copyable", + "usr": "s:s8CopyableP", + "mangledName": "$ss8CopyableP" + } + ] + } + ], + "json_format_version": 8 + }, + "ConstValues": [ + { + "filePath": "\/Volumes\/google\/src\/cloud\/hantran\/m172\/google3\/googlemac\/iPhone\/Firebase\/Analytics\/Sources\/Swift\/Analytics+SwiftUI.swift", + "kind": "StringLiteral", + "offset": 2654, + "length": 6, + "value": "\"View\"" + }, + { + "filePath": "\/Volumes\/google\/src\/cloud\/hantran\/m172\/google3\/googlemac\/iPhone\/Firebase\/Analytics\/Sources\/Swift\/Analytics+SwiftUI.swift", + "kind": "Dictionary", + "offset": 2701, + "length": 3, + "value": "[]" + } + ] +} \ No newline at end of file diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios.private.swiftinterface b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios.private.swiftinterface new file mode 100644 index 0000000..3e21b00 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios.private.swiftinterface @@ -0,0 +1,22 @@ +// swift-interface-format-version: 1.0 +// swift-compiler-version: Apple Swift version 6.0.3 effective-5.10 (swiftlang-6.0.3.1.10 clang-1600.0.30.1) +// swift-module-flags: -target arm64-apple-ios15.0 -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -O -enable-bare-slash-regex -module-name FirebaseAnalytics +// swift-module-flags-ignorable: -no-verify-emitted-module-interface +@_exported import FirebaseAnalytics +import StoreKit +import Swift +import SwiftUI +import _Concurrency +import _StringProcessing +import _SwiftConcurrencyShims +@available(iOS 15.0, macOS 12.0, macCatalyst 15.0, tvOS 15.0, *) +@available(watchOS, unavailable) +extension FirebaseAnalytics.Analytics { + public static func logTransaction(_ transaction: StoreKit.Transaction) +} +@available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, *) +@available(watchOS, unavailable) +extension SwiftUICore.View { + @_Concurrency.MainActor @preconcurrency public func analyticsScreen(name: Swift.String, class: Swift.String = "View", extraParameters: [Swift.String : Any] = [:]) -> some SwiftUICore.View + +} diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios.swiftdoc b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios.swiftdoc new file mode 100644 index 0000000..0bf1097 Binary files /dev/null and b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios.swiftdoc differ diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios.swiftinterface b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios.swiftinterface new file mode 100644 index 0000000..3e21b00 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios.swiftinterface @@ -0,0 +1,22 @@ +// swift-interface-format-version: 1.0 +// swift-compiler-version: Apple Swift version 6.0.3 effective-5.10 (swiftlang-6.0.3.1.10 clang-1600.0.30.1) +// swift-module-flags: -target arm64-apple-ios15.0 -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -O -enable-bare-slash-regex -module-name FirebaseAnalytics +// swift-module-flags-ignorable: -no-verify-emitted-module-interface +@_exported import FirebaseAnalytics +import StoreKit +import Swift +import SwiftUI +import _Concurrency +import _StringProcessing +import _SwiftConcurrencyShims +@available(iOS 15.0, macOS 12.0, macCatalyst 15.0, tvOS 15.0, *) +@available(watchOS, unavailable) +extension FirebaseAnalytics.Analytics { + public static func logTransaction(_ transaction: StoreKit.Transaction) +} +@available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, *) +@available(watchOS, unavailable) +extension SwiftUICore.View { + @_Concurrency.MainActor @preconcurrency public func analyticsScreen(name: Swift.String, class: Swift.String = "View", extraParameters: [Swift.String : Any] = [:]) -> some SwiftUICore.View + +} diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/Modules/module.modulemap b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/Modules/module.modulemap new file mode 100644 index 0000000..fa10817 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64/FirebaseAnalytics.framework/Modules/module.modulemap @@ -0,0 +1,16 @@ +framework module FirebaseAnalytics { +umbrella header "FirebaseAnalytics-umbrella.h" +export * +module * { export * } + link framework "Foundation" + link framework "Security" + link framework "SystemConfiguration" + link framework "UIKit" + link "c++" + link "sqlite3" + link "z" +} +module FirebaseAnalytics.Swift { + header "FirebaseAnalytics-Swift.h" + requires objc +} \ No newline at end of file diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/FirebaseAnalytics b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/FirebaseAnalytics new file mode 120000 index 0000000..82502e9 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/FirebaseAnalytics @@ -0,0 +1 @@ +Versions/Current/FirebaseAnalytics \ No newline at end of file diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Headers b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Headers new file mode 120000 index 0000000..a177d2a --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Headers @@ -0,0 +1 @@ +Versions/Current/Headers \ No newline at end of file diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Modules b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Modules new file mode 120000 index 0000000..5736f31 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Modules @@ -0,0 +1 @@ +Versions/Current/Modules \ No newline at end of file diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Resources b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Resources new file mode 120000 index 0000000..953ee36 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Resources @@ -0,0 +1 @@ +Versions/Current/Resources \ No newline at end of file diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/FirebaseAnalytics b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/FirebaseAnalytics new file mode 100644 index 0000000..09cb06b Binary files /dev/null and b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/FirebaseAnalytics differ diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Headers/FIRAnalytics+AppDelegate.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Headers/FIRAnalytics+AppDelegate.h new file mode 100644 index 0000000..cb1e407 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Headers/FIRAnalytics+AppDelegate.h @@ -0,0 +1,80 @@ +#import + +#import "FIRAnalytics.h" + +NS_ASSUME_NONNULL_BEGIN + +/// Provides App Delegate handlers to be used in your App Delegate. +/// +/// To save time integrating Firebase Analytics in an application, Firebase Analytics does not +/// require delegation implementation from the AppDelegate if neither SwiftUI nor UIScene lifecycle +/// is adopted. Instead this is automatically done by Firebase Analytics. Should you choose instead +/// to delegate manually, you can turn off the App Delegate Proxy by adding +/// FirebaseAppDelegateProxyEnabled into your app's Info.plist and setting it to boolean `NO`, and +/// adding the methods in this category to corresponding delegation handlers. +/// +/// To handle Universal Links, you must return `true` in +/// `UIApplicationDelegate.application(_:didFinishLaunchingWithOptions:)`. +@interface FIRAnalytics (AppDelegate) + +/// Handles events related to a URL session that are waiting to be processed. +/// +/// 1. If SwiftUI lifecycle is adopted, call this method from +/// `UIApplicationDelegate.application(_:handleEventsForBackgroundURLSession:completionHandler:)` +/// in your app delegate. +/// +/// 2. If SwiftUI lifecycle is not adopted, Firebase Analytics does not require delegation +/// implementation from the AppDelegate. If you choose instead to delegate manually, you can set +/// FirebaseAppDelegateProxyEnabled to boolean `NO` in your app's Info.plist and call this method +/// from +/// `UIApplicationDelegate.application(_:handleEventsForBackgroundURLSession:completionHandler:)` +/// in your app delegate. +/// +/// @param identifier The identifier of the URL session requiring attention. +/// @param completionHandler The completion handler to call when you finish processing the events. +/// Calling this completion handler lets the system know that your app's user interface is +/// updated and a new snapshot can be taken. ++ (void)handleEventsForBackgroundURLSession:(NSString *)identifier + completionHandler:(nullable void (^)(void))completionHandler; + +/// Handles the event when the app is launched by a URL (custom URL scheme or universal link). +/// +/// 1. If SwiftUI lifecycle is adopted, use `onOpenURL(perform:)` to register a handler and call +/// this method in the handler. +/// +/// 2. If UIScene lifecycle is adopted, call this method from +/// `UISceneDelegate.scene(_:willConnectTo:options:)` and +/// `UISceneDelegate.scene(_:openURLContexts:)` when the URL contexts are available. +/// +/// 3. If neither SwiftUI nor UIScene lifecycle is adopted, Firebase Analytics does not require +/// delegation implementation from the AppDelegate. If you choose instead to delegate manually, you +/// can set FirebaseAppDelegateProxyEnabled to boolean `NO` in your app's Info.plist and call this +/// method from `UIApplicationDelegate.application(_:open:options:)` in your app delegate. +/// +/// @param url The URL resource to open. This resource can be a network resource or a file. ++ (void)handleOpenURL:(NSURL *)url; + +/// Handles the event when the app receives data associated with user activity that includes a +/// Universal Link. +/// +/// 1. If SwiftUI lifecycle is adopted, use `onOpenURL(perform:)` to register a handler and call +/// `Analytics.handleOpen(_:)` instead in the handler. +/// +/// 2. If UIScene lifecycle is adopted, call this method from +/// `UISceneDelegate.scene(_:willConnectTo:options:)` and `UISceneDelegate.scene(_:continue:)` when +/// NSUserActivity is available. See the [Apple +/// doc](https://developer.apple.com/documentation/xcode/supporting-universal-links-in-your-app) for +/// more details. +/// +/// 3. If neither SwiftUI nor UIScene lifecycle is adopted, Firebase Analytics does not require +/// delegation implementation from the AppDelegate. If you choose instead to delegate manually, you +/// can set FirebaseAppDelegateProxyEnabled to boolean `NO` in your app's Info.plist and call this +/// method from `UIApplication.application(_:continue:restorationHandler:)` in your app delegate. +/// +/// @param userActivity The activity object containing the data associated with the task the user +/// was performing. ++ (void)handleUserActivity:(id)userActivity; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Headers/FIRAnalytics+Consent.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Headers/FIRAnalytics+Consent.h new file mode 100644 index 0000000..7758390 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Headers/FIRAnalytics+Consent.h @@ -0,0 +1,51 @@ +#import + +#import "FIRAnalytics.h" + +NS_ASSUME_NONNULL_BEGIN + +/// The type of consent to set. Supported consent types are `ConsentType.adStorage`, +/// `ConsentType.analyticsStorage`, `ConsentType.adUserData`, and `ConsentType.adPersonalization`. +/// Omitting a type retains its previous status. +typedef NSString *FIRConsentType NS_TYPED_ENUM NS_SWIFT_NAME(ConsentType); + +/// Enables storage (such as device identifiers) related to advertising. +extern FIRConsentType const FIRConsentTypeAdStorage; + +/// Enables storage (such as app identifiers) related to analytics, e.g. visit duration. +extern FIRConsentType const FIRConsentTypeAnalyticsStorage; + +/// Sets consent for sending user data to Google for advertising purposes. +extern FIRConsentType const FIRConsentTypeAdUserData; + +/// Sets consent for personalized advertising. +extern FIRConsentType const FIRConsentTypeAdPersonalization; + +/// The status value of the consent type. Supported statuses are `ConsentStatus.granted` and +/// `ConsentStatus.denied`. +typedef NSString *FIRConsentStatus NS_TYPED_ENUM NS_SWIFT_NAME(ConsentStatus); + +/// Consent status indicating consent is denied. For an overview of which data is sent when consent +/// is denied, see [SDK behavior with consent +/// mode](https://developers.google.com/tag-platform/security/concepts/consent-mode#tag-behavior). +extern FIRConsentStatus const FIRConsentStatusDenied; + +/// Consent status indicating consent is granted. +extern FIRConsentStatus const FIRConsentStatusGranted; + +/// Sets the applicable end user consent state. +@interface FIRAnalytics (Consent) + +/// Sets the applicable end user consent state (e.g. for device identifiers) for this app on this +/// device. Use the consent settings to specify individual consent type values. Settings are +/// persisted across app sessions. By default consent types are set to `ConsentStatus.granted`. +/// +/// @param consentSettings A Dictionary of consent types. Supported consent type keys are +/// `ConsentType.adStorage`, `ConsentType.analyticsStorage`, `ConsentType.adUserData`, and +/// `ConsentType.adPersonalization`. Valid values are `ConsentStatus.granted` and +/// `ConsentStatus.denied`. ++ (void)setConsent:(NSDictionary *)consentSettings; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Headers/FIRAnalytics+OnDevice.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Headers/FIRAnalytics+OnDevice.h new file mode 100644 index 0000000..5f87c0d --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Headers/FIRAnalytics+OnDevice.h @@ -0,0 +1,51 @@ +#import + +#import "FIRAnalytics.h" + +NS_ASSUME_NONNULL_BEGIN + +API_UNAVAILABLE(macCatalyst, macos, tvos, watchos) +@interface FIRAnalytics (OnDevice) + +/// Initiates on-device conversion measurement given a user email address. Requires dependency +/// GoogleAdsOnDeviceConversion from +/// https://github.com/googleads/google-ads-on-device-conversion-ios-sdk/ to be linked in, otherwise +/// it is a no-op. +/// @param emailAddress User email address. Include a domain name for all email addresses +/// (e.g. gmail.com or hotmail.co.jp). ++ (void)initiateOnDeviceConversionMeasurementWithEmailAddress:(NSString *)emailAddress + NS_SWIFT_NAME(initiateOnDeviceConversionMeasurement(emailAddress:)); + +/// Initiates on-device conversion measurement given a phone number in E.164 format. Requires +/// dependency GoogleAdsOnDeviceConversion from +/// https://github.com/googleads/google-ads-on-device-conversion-ios-sdk/ to be linked in, otherwise +/// it is a no-op. +/// @param phoneNumber User phone number. Must be in E.164 format, which means it must be +/// limited to a maximum of 15 digits and must include a plus sign (+) prefix and country code +/// with no dashes, parentheses, or spaces. ++ (void)initiateOnDeviceConversionMeasurementWithPhoneNumber:(NSString *)phoneNumber + NS_SWIFT_NAME(initiateOnDeviceConversionMeasurement(phoneNumber:)); + +/// Initiates on-device conversion measurement given a sha256-hashed user email address. Requires +/// dependency GoogleAdsOnDeviceConversion from +/// https://github.com/googleads/google-ads-on-device-conversion-ios-sdk/ to be linked in, otherwise +/// it is a no-op. +/// @param hashedEmailAddress User email address as a UTF8-encoded string normalized and hashed +/// according to the instructions at +/// https://firebase.google.com/docs/tutorials/ads-ios-on-device-measurement/step-3. ++ (void)initiateOnDeviceConversionMeasurementWithHashedEmailAddress:(NSData *)hashedEmailAddress + NS_SWIFT_NAME(initiateOnDeviceConversionMeasurement(hashedEmailAddress:)); + +/// Initiates on-device conversion measurement given a sha256-hashed phone number in E.164 format. +/// Requires dependency GoogleAdsOnDeviceConversion from +/// https://github.com/googleads/google-ads-on-device-conversion-ios-sdk/ to be linked in, otherwise +/// it is a no-op. +/// @param hashedPhoneNumber UTF8-encoded user phone number in E.164 format and then hashed +/// according to the instructions at +/// https://firebase.google.com/docs/tutorials/ads-ios-on-device-measurement/step-3. ++ (void)initiateOnDeviceConversionMeasurementWithHashedPhoneNumber:(NSData *)hashedPhoneNumber + NS_SWIFT_NAME(initiateOnDeviceConversionMeasurement(hashedPhoneNumber:)); + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Headers/FIRAnalytics.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Headers/FIRAnalytics.h new file mode 100644 index 0000000..ec88689 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Headers/FIRAnalytics.h @@ -0,0 +1,155 @@ +#import + +#import "FIREventNames.h" +#import "FIRParameterNames.h" +#import "FIRUserPropertyNames.h" + +NS_ASSUME_NONNULL_BEGIN + +/// The top level Firebase Analytics singleton that provides methods for logging events and setting +/// user properties. See the developer guides for general +/// information on using Firebase Analytics in your apps. +/// +/// @note The Analytics SDK uses SQLite to persist events and other app-specific data. Calling +/// certain thread-unsafe global SQLite methods like `sqlite3_shutdown()` can result in +/// unexpected crashes at runtime. +NS_SWIFT_NAME(Analytics) +@interface FIRAnalytics : NSObject + +/// Logs an app event. The event can have up to 25 parameters. Events with the same name must have +/// the same parameters. Up to 500 event names are supported. Using predefined events and/or +/// parameters is recommended for optimal reporting. +/// +/// The following event names are reserved - events with these names will be dropped, and instead an +/// error event will be logged: +///
    +///
  • ad_activeview
  • +///
  • ad_click
  • +///
  • ad_exposure
  • +///
  • ad_query
  • +///
  • ad_reward
  • +///
  • adunit_exposure
  • +///
  • app_clear_data
  • +///
  • app_exception
  • +///
  • app_remove
  • +///
  • app_store_refund
  • +///
  • app_store_subscription_cancel
  • +///
  • app_store_subscription_convert
  • +///
  • app_store_subscription_renew
  • +///
  • app_update
  • +///
  • app_upgrade
  • +///
  • dynamic_link_app_open
  • +///
  • dynamic_link_app_update
  • +///
  • dynamic_link_first_open
  • +///
  • error
  • +///
  • firebase_campaign
  • +///
  • first_open
  • +///
  • first_visit
  • +///
  • notification_dismiss
  • +///
  • notification_foreground
  • +///
  • notification_open
  • +///
  • notification_receive
  • +///
  • os_update
  • +///
  • session_start
  • +///
  • session_start_with_rollout
  • +///
  • user_engagement
  • +///
+/// +/// @param name The name of the event. Should contain 1 to 40 alphanumeric characters or +/// underscores. The name must start with an alphabetic character. Some event names are +/// reserved. See FIREventNames.h for the list of reserved event names. The "firebase_", +/// "google_", and "ga_" prefixes are reserved and should not be used. Note that event names are +/// case-sensitive and that logging two events whose names differ only in case will result in +/// two distinct events. To manually log screen view events, use the `screen_view` event name. +/// @param parameters The dictionary of event parameters. Passing `nil` indicates that the event has +/// no parameters. Parameter names can be up to 40 characters long and must start with an +/// alphabetic character and contain only alphanumeric characters and underscores. Only String, +/// Int, and Double parameter types are supported. String parameter values can be up to 100 +/// characters long for standard Google Analytics properties, and up to 500 characters long for +/// Google Analytics 360 properties. The "firebase_", "google_", and "ga_" prefixes are reserved +/// and should not be used for parameter names. ++ (void)logEventWithName:(NSString *)name + parameters:(nullable NSDictionary *)parameters + NS_SWIFT_NAME(logEvent(_:parameters:)); + +/// Sets a user property to a given value. Up to 25 user property names are supported. Once set, +/// user property values persist throughout the app lifecycle and across sessions. +/// +/// The following user property names are reserved and cannot be used: +///
    +///
  • first_open_time
  • +///
  • last_deep_link_referrer
  • +///
  • user_id
  • +///
+/// +/// @param value The value of the user property. Values can be up to 36 characters long. Setting the +/// value to `nil` removes the user property. +/// @param name The name of the user property to set. Should contain 1 to 24 alphanumeric characters +/// or underscores and must start with an alphabetic character. The "firebase_", "google_", and +/// "ga_" prefixes are reserved and should not be used for user property names. ++ (void)setUserPropertyString:(nullable NSString *)value forName:(NSString *)name + NS_SWIFT_NAME(setUserProperty(_:forName:)); + +/// Sets the user ID property. This feature must be used in accordance with +/// Google's Privacy Policy +/// +/// @param userID The user ID to ascribe to the user of this app on this device, which must be +/// non-empty and no more than 256 characters long. Setting userID to `nil` removes the user ID. ++ (void)setUserID:(nullable NSString *)userID; + +/// Sets whether analytics collection is enabled for this app on this device. This setting is +/// persisted across app sessions. By default it is enabled. +/// +/// @param analyticsCollectionEnabled A flag that enables or disables Analytics collection. ++ (void)setAnalyticsCollectionEnabled:(BOOL)analyticsCollectionEnabled; + +/// Sets the interval of inactivity in seconds that terminates the current session. The default +/// value is 1800 seconds (30 minutes). +/// +/// @param sessionTimeoutInterval The custom time of inactivity in seconds before the current +/// session terminates. ++ (void)setSessionTimeoutInterval:(NSTimeInterval)sessionTimeoutInterval; + +/// Asynchronously retrieves the identifier of the current app session. +/// +/// The session ID retrieval could fail due to Analytics collection disabled, app session expired, +/// etc. +/// +/// @param completion The completion handler to call when the session ID retrieval is complete. This +/// handler is executed on a system-defined global concurrent queue. +/// This completion handler takes the following parameters: +/// sessionID The identifier of the current app session. The value is undefined if the +/// request failed. +/// error An error object that indicates why the request failed, or `nil` if the request +/// was successful. ++ (void)sessionIDWithCompletion:(void (^)(int64_t sessionID, NSError *_Nullable error))completion; + +/// Returns the unique ID for this instance of the application or `nil` if +/// `ConsentType.analyticsStorage` has been set to `ConsentStatus.denied`. +/// +/// @see `FIRAnalytics+Consent.h` ++ (nullable NSString *)appInstanceID; + +/// Clears all analytics data for this instance from the device and resets the app instance ID. ++ (void)resetAnalyticsData; + +/// Adds parameters that will be set on every event logged from the SDK, including automatic ones. +/// The values passed in the parameters dictionary will be added to the dictionary of default event +/// parameters. These parameters persist across app runs. They are of lower precedence than event +/// parameters, so if an event parameter and a parameter set using this API have the same name, the +/// value of the event parameter will be used. The same limitations on event parameters apply to +/// default event parameters. +/// +/// @param parameters Parameters to be added to the dictionary of parameters added to every event. +/// They will be added to the dictionary of default event parameters, replacing any existing +/// parameter with the same name. Valid parameters are String, Int, and Double. Setting a key's +/// value to `NSNull()` will clear that parameter. Passing in a `nil` dictionary will clear all +/// parameters. ++ (void)setDefaultEventParameters:(nullable NSDictionary *)parameters; + +/// Unavailable. +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Headers/FIREventNames.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Headers/FIREventNames.h new file mode 100644 index 0000000..701ed88 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Headers/FIREventNames.h @@ -0,0 +1,438 @@ +/// @file FIREventNames.h +/// +/// Predefined event names. +/// +/// An Event is an important occurrence in your app that you want to measure. You can report up to +/// 500 different types of Events per app and you can associate up to 25 unique parameters with each +/// Event type. Some common events are suggested below, but you may also choose to specify custom +/// Event types that are associated with your specific app. Each event type is identified by a +/// unique name. Event names can be up to 40 characters long, may only contain alphanumeric +/// characters and underscores ("_"), and must start with an alphabetic character. The "firebase_", +/// "google_", and "ga_" prefixes are reserved and should not be used. + +#import + +/// Ad Impression event. This event signifies when a user sees an ad impression. Note: If you supply +/// the @c AnalyticsParameterValue parameter, you must also supply the @c AnalyticsParameterCurrency +/// parameter so that revenue metrics can be computed accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterAdPlatform (String) (optional)
  • +///
  • @c AnalyticsParameterAdFormat (String) (optional)
  • +///
  • @c AnalyticsParameterAdSource (String) (optional)
  • +///
  • @c AnalyticsParameterAdUnitName (String) (optional)
  • +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventAdImpression NS_SWIFT_NAME(AnalyticsEventAdImpression) = + @"ad_impression"; + +/// Add Payment Info event. This event signifies that a user has submitted their payment +/// information. Note: If you supply the @c AnalyticsParameterValue parameter, you must also supply +/// the @c AnalyticsParameterCurrency parameter so that revenue metrics can be computed accurately. +/// Params: +/// +///
    +///
  • @c AnalyticsParameterCoupon (String) (optional)
  • +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterPaymentType (String) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventAddPaymentInfo NS_SWIFT_NAME(AnalyticsEventAddPaymentInfo) = + @"add_payment_info"; + +/// Add Shipping Info event. This event signifies that a user has submitted their shipping +/// information. Note: If you supply the @c AnalyticsParameterValue parameter, you must also supply +/// the @c AnalyticsParameterCurrency parameter so that revenue metrics can be computed accurately. +/// Params: +/// +///
    +///
  • @c AnalyticsParameterCoupon (String) (optional)
  • +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterShippingTier (String) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventAddShippingInfo NS_SWIFT_NAME(AnalyticsEventAddShippingInfo) = + @"add_shipping_info"; + +/// E-Commerce Add To Cart event. This event signifies that an item(s) was added to a cart for +/// purchase. Add this event to a funnel with @c AnalyticsEventPurchase to gauge the effectiveness +/// of your checkout process. Note: If you supply the @c AnalyticsParameterValue parameter, you must +/// also supply the @c AnalyticsParameterCurrency parameter so that revenue metrics can be computed +/// accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventAddToCart NS_SWIFT_NAME(AnalyticsEventAddToCart) = @"add_to_cart"; + +/// E-Commerce Add To Wishlist event. This event signifies that an item was added to a wishlist. Use +/// this event to identify popular gift items. Note: If you supply the @c AnalyticsParameterValue +/// parameter, you must also supply the @c AnalyticsParameterCurrency parameter so that revenue +/// metrics can be computed accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventAddToWishlist NS_SWIFT_NAME(AnalyticsEventAddToWishlist) = + @"add_to_wishlist"; + +/// App Open event. By logging this event when an App becomes active, developers can understand how +/// often users leave and return during the course of a Session. Although Sessions are automatically +/// reported, this event can provide further clarification around the continuous engagement of +/// app-users. +static NSString *const kFIREventAppOpen NS_SWIFT_NAME(AnalyticsEventAppOpen) = @"app_open"; + +/// E-Commerce Begin Checkout event. This event signifies that a user has begun the process of +/// checking out. Add this event to a funnel with your @c AnalyticsEventPurchase event to gauge the +/// effectiveness of your checkout process. Note: If you supply the @c AnalyticsParameterValue +/// parameter, you must also supply the @c AnalyticsParameterCurrency parameter so that revenue +/// metrics can be computed accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterCoupon (String) (optional)
  • +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventBeginCheckout NS_SWIFT_NAME(AnalyticsEventBeginCheckout) = + @"begin_checkout"; + +/// Campaign Detail event. Log this event to supply the referral details of a re-engagement +/// campaign. Note: you must supply at least one of the required parameters +/// AnalyticsParameterSource, AnalyticsParameterMedium or AnalyticsParameterCampaign. Params: +/// +///
    +///
  • @c AnalyticsParameterSource (String)
  • +///
  • @c AnalyticsParameterMedium (String)
  • +///
  • @c AnalyticsParameterCampaign (String)
  • +///
  • @c AnalyticsParameterTerm (String) (optional)
  • +///
  • @c AnalyticsParameterContent (String) (optional)
  • +///
  • @c AnalyticsParameterAdNetworkClickID (String) (optional)
  • +///
  • @c AnalyticsParameterCP1 (String) (optional)
  • +///
  • @c AnalyticsParameterCampaignID (String) (optional)
  • +///
  • @c AnalyticsParameterCreativeFormat (String) (optional)
  • +///
  • @c AnalyticsParameterMarketingTactic (String) (optional)
  • +///
  • @c AnalyticsParameterSourcePlatform (String) (optional)
  • +///
+static NSString *const kFIREventCampaignDetails NS_SWIFT_NAME(AnalyticsEventCampaignDetails) = + @"campaign_details"; + +/// Earn Virtual Currency event. This event tracks the awarding of virtual currency in your app. Log +/// this along with @c AnalyticsEventSpendVirtualCurrency to better understand your virtual economy. +/// Params: +/// +///
    +///
  • @c AnalyticsParameterVirtualCurrencyName (String)
  • +///
  • @c AnalyticsParameterValue (Int or Double)
  • +///
+static NSString *const kFIREventEarnVirtualCurrency + NS_SWIFT_NAME(AnalyticsEventEarnVirtualCurrency) = @"earn_virtual_currency"; + +/// Generate Lead event. Log this event when a lead has been generated in the app to understand the +/// efficacy of your install and re-engagement campaigns. Note: If you supply the +/// @c AnalyticsParameterValue parameter, you must also supply the @c AnalyticsParameterCurrency +/// parameter so that revenue metrics can be computed accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventGenerateLead NS_SWIFT_NAME(AnalyticsEventGenerateLead) = + @"generate_lead"; + +/// In-App Purchase event. This event signifies that extra content or a subscription was purchased +/// by a user inside an app. Note: This is different from the ecommerce purchase event. Note: If you +/// supply the @c AnalyticsParameterValue parameter, you must also supply the +/// @c AnalyticsParameterCurrency parameter so that revenue metrics can be computed accurately. +/// Params: +/// +///
    +///
  • @c AnalyticsParameterCurrency (String)
  • +///
  • @c AnalyticsParameterFreeTrial (Int) (optional)
  • +///
  • @c AnalyticsParameterPrice (Double) (optional)
  • +///
  • @c AnalyticsParameterPriceIsDiscounted (Int) (optional)
  • +///
  • @c AnalyticsParameterProductID (String) (optional)
  • +///
  • @c AnalyticsParameterProductName (String) (optional)
  • +///
  • @c AnalyticsParameterQuantity (Int) (optional)
  • +///
  • @c AnalyticsParameterSubscription (Int) (optional)
  • +///
  • @c AnalyticsParameterValue (Double)
  • +///
+static NSString *const kFIREventInAppPurchase NS_SWIFT_NAME(AnalyticsEventInAppPurchase) = + @"in_app_purchase"; + +/// Join Group event. Log this event when a user joins a group such as a guild, team or family. Use +/// this event to analyze how popular certain groups or social features are in your app. Params: +/// +///
    +///
  • @c AnalyticsParameterGroupID (String)
  • +///
+static NSString *const kFIREventJoinGroup NS_SWIFT_NAME(AnalyticsEventJoinGroup) = @"join_group"; + +/// Level End event. Log this event when the user finishes a level. Params: +/// +///
    +///
  • @c AnalyticsParameterLevelName (String)
  • +///
  • @c AnalyticsParameterSuccess (String)
  • +///
+static NSString *const kFIREventLevelEnd NS_SWIFT_NAME(AnalyticsEventLevelEnd) = @"level_end"; + +/// Level Start event. Log this event when the user starts a new level. Params: +/// +///
    +///
  • @c AnalyticsParameterLevelName (String)
  • +///
+static NSString *const kFIREventLevelStart NS_SWIFT_NAME(AnalyticsEventLevelStart) = @"level_start"; + +/// Level Up event. This event signifies that a player has leveled up in your gaming app. It can +/// help you gauge the level distribution of your userbase and help you identify certain levels that +/// are difficult to pass. Params: +/// +///
    +///
  • @c AnalyticsParameterLevel (Int)
  • +///
  • @c AnalyticsParameterCharacter (String) (optional)
  • +///
+static NSString *const kFIREventLevelUp NS_SWIFT_NAME(AnalyticsEventLevelUp) = @"level_up"; + +/// Login event. Apps with a login feature can report this event to signify that a user has logged +/// in. +static NSString *const kFIREventLogin NS_SWIFT_NAME(AnalyticsEventLogin) = @"login"; + +/// Post Score event. Log this event when the user posts a score in your gaming app. This event can +/// help you understand how users are actually performing in your game and it can help you correlate +/// high scores with certain audiences or behaviors. Params: +/// +///
    +///
  • @c AnalyticsParameterScore (Int)
  • +///
  • @c AnalyticsParameterLevel (Int) (optional)
  • +///
  • @c AnalyticsParameterCharacter (String) (optional)
  • +///
+static NSString *const kFIREventPostScore NS_SWIFT_NAME(AnalyticsEventPostScore) = @"post_score"; + +/// E-Commerce Purchase event. This event signifies that an item(s) was purchased by a user. Note: +/// This is different from the in-app purchase event, which is reported automatically for App +/// Store-based apps. Note: If you supply the @c AnalyticsParameterValue parameter, you must also +/// supply the @c AnalyticsParameterCurrency parameter so that revenue metrics can be computed +/// accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterAffiliation (String) (optional)
  • +///
  • @c AnalyticsParameterCoupon (String) (optional)
  • +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterEndDate (String) (optional)
  • +///
  • @c AnalyticsParameterItemID (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterShipping (Double) (optional)
  • +///
  • @c AnalyticsParameterStartDate (String) (optional)
  • +///
  • @c AnalyticsParameterTax (Double) (optional)
  • +///
  • @c AnalyticsParameterTransactionID (String) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventPurchase NS_SWIFT_NAME(AnalyticsEventPurchase) = @"purchase"; + +/// E-Commerce Refund event. This event signifies that a refund was issued. Note: If you supply the +/// @c AnalyticsParameterValue parameter, you must also supply the @c AnalyticsParameterCurrency +/// parameter so that revenue metrics can be computed accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterAffiliation (String) (optional)
  • +///
  • @c AnalyticsParameterCoupon (String) (optional)
  • +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterShipping (Double) (optional)
  • +///
  • @c AnalyticsParameterTax (Double) (optional)
  • +///
  • @c AnalyticsParameterTransactionID (String) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventRefund NS_SWIFT_NAME(AnalyticsEventRefund) = @"refund"; + +/// E-Commerce Remove from Cart event. This event signifies that an item(s) was removed from a cart. +/// Note: If you supply the @c AnalyticsParameterValue parameter, you must also supply the @c +/// AnalyticsParameterCurrency parameter so that revenue metrics can be computed accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventRemoveFromCart NS_SWIFT_NAME(AnalyticsEventRemoveFromCart) = + @"remove_from_cart"; + +/// Screen View event. This event signifies a screen view. Use this when a screen transition occurs. +/// This event can be logged irrespective of whether automatic screen tracking is enabled. Params: +/// +///
    +///
  • @c AnalyticsParameterScreenClass (String) (optional)
  • +///
  • @c AnalyticsParameterScreenName (String) (optional)
  • +///
+static NSString *const kFIREventScreenView NS_SWIFT_NAME(AnalyticsEventScreenView) = @"screen_view"; + +/// Search event. Apps that support search features can use this event to contextualize search +/// operations by supplying the appropriate, corresponding parameters. This event can help you +/// identify the most popular content in your app. Params: +/// +///
    +///
  • @c AnalyticsParameterSearchTerm (String)
  • +///
  • @c AnalyticsParameterStartDate (String) (optional)
  • +///
  • @c AnalyticsParameterEndDate (String) (optional)
  • +///
  • @c AnalyticsParameterNumberOfNights (Int) (optional) for hotel bookings
  • +///
  • @c AnalyticsParameterNumberOfRooms (Int) (optional) for hotel bookings
  • +///
  • @c AnalyticsParameterNumberOfPassengers (Int) (optional) for travel bookings
  • +///
  • @c AnalyticsParameterOrigin (String) (optional)
  • +///
  • @c AnalyticsParameterDestination (String) (optional)
  • +///
  • @c AnalyticsParameterTravelClass (String) (optional) for travel bookings
  • +///
+static NSString *const kFIREventSearch NS_SWIFT_NAME(AnalyticsEventSearch) = @"search"; + +/// Select Content event. This general purpose event signifies that a user has selected some content +/// of a certain type in an app. The content can be any object in your app. This event can help you +/// identify popular content and categories of content in your app. Params: +/// +///
    +///
  • @c AnalyticsParameterContentType (String)
  • +///
  • @c AnalyticsParameterItemID (String)
  • +///
+static NSString *const kFIREventSelectContent NS_SWIFT_NAME(AnalyticsEventSelectContent) = + @"select_content"; + +/// Select Item event. This event signifies that an item was selected by a user from a list. Use the +/// appropriate parameters to contextualize the event. Use this event to discover the most popular +/// items selected. Params: +/// +///
    +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterItemListID (String) (optional)
  • +///
  • @c AnalyticsParameterItemListName (String) (optional)
  • +///
+static NSString *const kFIREventSelectItem NS_SWIFT_NAME(AnalyticsEventSelectItem) = @"select_item"; + +/// Select promotion event. This event signifies that a user has selected a promotion offer. Use the +/// appropriate parameters to contextualize the event, such as the item(s) for which the promotion +/// applies. Params: +/// +///
    +///
  • @c AnalyticsParameterCreativeName (String) (optional)
  • +///
  • @c AnalyticsParameterCreativeSlot (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterLocationID (String) (optional)
  • +///
  • @c AnalyticsParameterPromotionID (String) (optional)
  • +///
  • @c AnalyticsParameterPromotionName (String) (optional)
  • +///
+static NSString *const kFIREventSelectPromotion NS_SWIFT_NAME(AnalyticsEventSelectPromotion) = + @"select_promotion"; + +/// Share event. Apps with social features can log the Share event to identify the most viral +/// content. Params: +/// +///
    +///
  • @c AnalyticsParameterContentType (String)
  • +///
  • @c AnalyticsParameterItemID (String)
  • +///
+static NSString *const kFIREventShare NS_SWIFT_NAME(AnalyticsEventShare) = @"share"; + +/// Sign Up event. This event indicates that a user has signed up for an account in your app. The +/// parameter signifies the method by which the user signed up. Use this event to understand the +/// different behaviors between logged in and logged out users. Params: +/// +///
    +///
  • @c AnalyticsParameterMethod (String)
  • +///
+static NSString *const kFIREventSignUp NS_SWIFT_NAME(AnalyticsEventSignUp) = @"sign_up"; + +/// Spend Virtual Currency event. This event tracks the sale of virtual goods in your app and can +/// help you identify which virtual goods are the most popular objects of purchase. Params: +/// +///
    +///
  • @c AnalyticsParameterItemName (String)
  • +///
  • @c AnalyticsParameterVirtualCurrencyName (String)
  • +///
  • @c AnalyticsParameterValue (Int or Double)
  • +///
+static NSString *const kFIREventSpendVirtualCurrency + NS_SWIFT_NAME(AnalyticsEventSpendVirtualCurrency) = @"spend_virtual_currency"; + +/// Tutorial Begin event. This event signifies the start of the on-boarding process in your app. Use +/// this in a funnel with @c AnalyticsEventTutorialComplete to understand how many users complete +/// this process and move on to the full app experience. +static NSString *const kFIREventTutorialBegin NS_SWIFT_NAME(AnalyticsEventTutorialBegin) = + @"tutorial_begin"; + +/// Tutorial End event. Use this event to signify the user's completion of your app's on-boarding +/// process. Add this to a funnel with @c AnalyticsEventTutorialBegin to gauge the completion rate +/// of your on-boarding process. +static NSString *const kFIREventTutorialComplete NS_SWIFT_NAME(AnalyticsEventTutorialComplete) = + @"tutorial_complete"; + +/// Unlock Achievement event. Log this event when the user has unlocked an achievement in your +/// game. Since achievements generally represent the breadth of a gaming experience, this event can +/// help you understand how many users are experiencing all that your game has to offer. Params: +/// +///
    +///
  • @c AnalyticsParameterAchievementID (String)
  • +///
+static NSString *const kFIREventUnlockAchievement NS_SWIFT_NAME(AnalyticsEventUnlockAchievement) = + @"unlock_achievement"; + +/// E-commerce View Cart event. This event signifies that a user has viewed their cart. Use this to +/// analyze your purchase funnel. Note: If you supply the @c AnalyticsParameterValue parameter, you +/// must also supply the @c AnalyticsParameterCurrency parameter so that revenue metrics can be +/// computed accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventViewCart NS_SWIFT_NAME(AnalyticsEventViewCart) = @"view_cart"; + +/// View Item event. This event signifies that a user has viewed an item. Use the appropriate +/// parameters to contextualize the event. Use this event to discover the most popular items viewed +/// in your app. Note: If you supply the @c AnalyticsParameterValue parameter, you must also supply +/// the @c AnalyticsParameterCurrency parameter so that revenue metrics can be computed accurately. +/// Params: +/// +///
    +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventViewItem NS_SWIFT_NAME(AnalyticsEventViewItem) = @"view_item"; + +/// View Item List event. Log this event when a user sees a list of items or offerings. Params: +/// +///
    +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterItemListID (String) (optional)
  • +///
  • @c AnalyticsParameterItemListName (String) (optional)
  • +///
+static NSString *const kFIREventViewItemList NS_SWIFT_NAME(AnalyticsEventViewItemList) = + @"view_item_list"; + +/// View Promotion event. This event signifies that a promotion was shown to a user. Add this event +/// to a funnel with the @c AnalyticsEventAddToCart and @c AnalyticsEventPurchase to gauge your +/// conversion process. Params: +/// +///
    +///
  • @c AnalyticsParameterCreativeName (String) (optional)
  • +///
  • @c AnalyticsParameterCreativeSlot (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterLocationID (String) (optional)
  • +///
  • @c AnalyticsParameterPromotionID (String) (optional)
  • +///
  • @c AnalyticsParameterPromotionName (String) (optional)
  • +///
+static NSString *const kFIREventViewPromotion NS_SWIFT_NAME(AnalyticsEventViewPromotion) = + @"view_promotion"; + +/// View Search Results event. Log this event when the user has been presented with the results of a +/// search. Params: +/// +///
    +///
  • @c AnalyticsParameterSearchTerm (String)
  • +///
+static NSString *const kFIREventViewSearchResults NS_SWIFT_NAME(AnalyticsEventViewSearchResults) = + @"view_search_results"; diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Headers/FIRParameterNames.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Headers/FIRParameterNames.h new file mode 100644 index 0000000..f0e782a --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Headers/FIRParameterNames.h @@ -0,0 +1,775 @@ +/// @file FIRParameterNames.h +/// +/// Predefined event parameter names. +/// +/// Params supply information that contextualize Events. You can associate up to 25 unique Params +/// with each Event type. Some Params are suggested below for certain common Events, but you are +/// not limited to these. You may supply extra Params for suggested Events or custom Params for +/// Custom events. Param names can be up to 40 characters long, may only contain alphanumeric +/// characters and underscores ("_"), and must start with an alphabetic character. Param values can +/// be up to 100 characters long for standard Google Analytics properties and up to 500 characters +/// long for Google Analytics 360 properties. The "firebase_", "google_", and "ga_" prefixes are +/// reserved and should not be used. + +#import + +/// Game achievement ID (String). +///
+///     let params = [
+///       AnalyticsParameterAchievementID : "10_matches_won",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterAchievementID NS_SWIFT_NAME(AnalyticsParameterAchievementID) = + @"achievement_id"; + +/// The ad format (e.g. Banner, Interstitial, Rewarded, Native, Rewarded Interstitial, Instream). +/// (String). +///
+///     let params = [
+///       AnalyticsParameterAdFormat : "Banner",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterAdFormat NS_SWIFT_NAME(AnalyticsParameterAdFormat) = + @"ad_format"; + +/// Ad Network Click ID (String). Used for network-specific click IDs which vary in format. +///
+///     let params = [
+///       AnalyticsParameterAdNetworkClickID : "1234567",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterAdNetworkClickID + NS_SWIFT_NAME(AnalyticsParameterAdNetworkClickID) = @"aclid"; + +/// The ad platform (e.g. MoPub, IronSource) (String). +///
+///     let params = [
+///       AnalyticsParameterAdPlatform : "MoPub",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterAdPlatform NS_SWIFT_NAME(AnalyticsParameterAdPlatform) = + @"ad_platform"; + +/// The ad source (e.g. AdColony) (String). +///
+///     let params = [
+///       AnalyticsParameterAdSource : "AdColony",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterAdSource NS_SWIFT_NAME(AnalyticsParameterAdSource) = + @"ad_source"; + +/// The ad unit name (e.g. Banner_03) (String). +///
+///     let params = [
+///       AnalyticsParameterAdUnitName : "Banner_03",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterAdUnitName NS_SWIFT_NAME(AnalyticsParameterAdUnitName) = + @"ad_unit_name"; + +/// A product affiliation to designate a supplying company or brick and mortar store location +/// (String).
+///     let params = [
+///       AnalyticsParameterAffiliation : "Google Store",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterAffiliation NS_SWIFT_NAME(AnalyticsParameterAffiliation) = + @"affiliation"; + +/// Campaign custom parameter (String). Used as a method of capturing custom data in a campaign. +/// Use varies by network. +///
+///     let params = [
+///       AnalyticsParameterCP1 : "custom_data",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCP1 NS_SWIFT_NAME(AnalyticsParameterCP1) = @"cp1"; + +/// The individual campaign name, slogan, promo code, etc. Some networks have pre-defined macro to +/// capture campaign information, otherwise can be populated by developer. Highly Recommended +/// (String). +///
+///     let params = [
+///       AnalyticsParameterCampaign : "winter_promotion",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCampaign NS_SWIFT_NAME(AnalyticsParameterCampaign) = + @"campaign"; + +/// Campaign ID (String). Used for keyword analysis to identify a specific product promotion or +/// strategic campaign. This is a required key for GA4 data import. +///
+///     let params = [
+///       AnalyticsParameterCampaignID : "7877652710",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCampaignID NS_SWIFT_NAME(AnalyticsParameterCampaignID) = + @"campaign_id"; + +/// Character used in game (String). +///
+///     let params = [
+///       AnalyticsParameterCharacter : "beat_boss",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCharacter NS_SWIFT_NAME(AnalyticsParameterCharacter) = + @"character"; + +/// Campaign content (String). +static NSString *const kFIRParameterContent NS_SWIFT_NAME(AnalyticsParameterContent) = @"content"; + +/// Type of content selected (String). +///
+///     let params = [
+///       AnalyticsParameterContentType : "news article",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterContentType NS_SWIFT_NAME(AnalyticsParameterContentType) = + @"content_type"; + +/// Coupon code used for a purchase (String). +///
+///     let params = [
+///       AnalyticsParameterCoupon : "SUMMER_FUN",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCoupon NS_SWIFT_NAME(AnalyticsParameterCoupon) = @"coupon"; + +/// Creative Format (String). Used to identify the high-level classification of the type of ad +/// served by a specific campaign. +///
+///     let params = [
+///       AnalyticsParameterCreativeFormat : "display",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCreativeFormat NS_SWIFT_NAME(AnalyticsParameterCreativeFormat) = + @"creative_format"; + +/// The name of a creative used in a promotional spot (String). +///
+///     let params = [
+///       AnalyticsParameterCreativeName : "Summer Sale",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCreativeName NS_SWIFT_NAME(AnalyticsParameterCreativeName) = + @"creative_name"; + +/// The name of a creative slot (String). +///
+///     let params = [
+///       AnalyticsParameterCreativeSlot : "summer_banner2",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCreativeSlot NS_SWIFT_NAME(AnalyticsParameterCreativeSlot) = + @"creative_slot"; + +/// Currency of the purchase or items associated with the event, in 3-letter +/// ISO_4217 format (String). +///
+///     let params = [
+///       AnalyticsParameterCurrency : "USD",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCurrency NS_SWIFT_NAME(AnalyticsParameterCurrency) = + @"currency"; + +/// Flight or Travel destination (String). +///
+///     let params = [
+///       AnalyticsParameterDestination : "Mountain View, CA",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterDestination NS_SWIFT_NAME(AnalyticsParameterDestination) = + @"destination"; + +/// Monetary value of discount associated with a purchase (Double). +///
+///     let params = [
+///       AnalyticsParameterDiscount : 2.0,
+///       AnalyticsParameterCurrency : "USD",  // e.g. $2.00 USD
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterDiscount NS_SWIFT_NAME(AnalyticsParameterDiscount) = + @"discount"; + +/// The arrival date, check-out date or rental end date for the item. This should be in +/// YYYY-MM-DD format (String). +///
+///     let params = [
+///       AnalyticsParameterEndDate : "2015-09-14",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterEndDate NS_SWIFT_NAME(AnalyticsParameterEndDate) = @"end_date"; + +/// Indicates that the associated event should either extend the current session or start a new +/// session if no session was active when the event was logged. Specify 1 to extend the current +/// session or to start a new session; any other value will not extend or start a session. +///
+///     let params = [
+///       AnalyticsParameterExtendSession : 1,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterExtendSession NS_SWIFT_NAME(AnalyticsParameterExtendSession) = + @"extend_session"; + +/// Flight number for travel events (String). +///
+///     let params = [
+///       AnalyticsParameterFlightNumber : "ZZ800",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterFlightNumber NS_SWIFT_NAME(AnalyticsParameterFlightNumber) = + @"flight_number"; + +/// Indicates if the user is on a free trial of a subscription. Specify 1 to indicate true and 0 to +/// indicate false (Int). +///
+///     let params = [
+///       AnalyticsParameterFreeTrial : 1,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterFreeTrial NS_SWIFT_NAME(AnalyticsParameterFreeTrial) = + @"free_trial"; + +/// Group/clan/guild ID (String). +///
+///     let params = [
+///       AnalyticsParameterGroupID : "g1",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterGroupID NS_SWIFT_NAME(AnalyticsParameterGroupID) = @"group_id"; + +/// The index of the item in a list (Int). +///
+///     let params = [
+///       AnalyticsParameterIndex : 5,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterIndex NS_SWIFT_NAME(AnalyticsParameterIndex) = @"index"; + +/// Item brand (String). +///
+///     let params = [
+///       AnalyticsParameterItemBrand : "Google",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemBrand NS_SWIFT_NAME(AnalyticsParameterItemBrand) = + @"item_brand"; + +/// Item category (context-specific) (String). +///
+///     let params = [
+///       AnalyticsParameterItemCategory : "pants",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemCategory NS_SWIFT_NAME(AnalyticsParameterItemCategory) = + @"item_category"; + +/// Item Category (context-specific) (String). +///
+///     let params = [
+///       AnalyticsParameterItemCategory2 : "pants",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemCategory2 NS_SWIFT_NAME(AnalyticsParameterItemCategory2) = + @"item_category2"; + +/// Item Category (context-specific) (String). +///
+///     let params = [
+///       AnalyticsParameterItemCategory3 : "pants",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemCategory3 NS_SWIFT_NAME(AnalyticsParameterItemCategory3) = + @"item_category3"; + +/// Item Category (context-specific) (String). +///
+///     let params = [
+///       AnalyticsParameterItemCategory4 : "pants",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemCategory4 NS_SWIFT_NAME(AnalyticsParameterItemCategory4) = + @"item_category4"; + +/// Item Category (context-specific) (String). +///
+///     let params = [
+///       AnalyticsParameterItemCategory5 : "pants",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemCategory5 NS_SWIFT_NAME(AnalyticsParameterItemCategory5) = + @"item_category5"; + +/// Item ID (context-specific) (String). +///
+///     let params = [
+///       AnalyticsParameterItemID : "SKU_12345",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemID NS_SWIFT_NAME(AnalyticsParameterItemID) = @"item_id"; + +/// The ID of the list in which the item was presented to the user (String). +///
+///     let params = [
+///       AnalyticsParameterItemListID : "ABC123",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemListID NS_SWIFT_NAME(AnalyticsParameterItemListID) = + @"item_list_id"; + +/// The name of the list in which the item was presented to the user (String). +///
+///     let params = [
+///       AnalyticsParameterItemListName : "Related products",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemListName NS_SWIFT_NAME(AnalyticsParameterItemListName) = + @"item_list_name"; + +/// Item Name (context-specific) (String). +///
+///     let params = [
+///       AnalyticsParameterItemName : "jeggings",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemName NS_SWIFT_NAME(AnalyticsParameterItemName) = + @"item_name"; + +/// Item variant (String). +///
+///     let params = [
+///       AnalyticsParameterItemVariant : "Black",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemVariant NS_SWIFT_NAME(AnalyticsParameterItemVariant) = + @"item_variant"; + +/// The list of items involved in the transaction expressed as `[[String: Any]]`. +///
+///     let params = [
+///       AnalyticsParameterItems : [
+///         [AnalyticsParameterItemName : "jeggings", AnalyticsParameterItemCategory : "pants"],
+///         [AnalyticsParameterItemName : "boots", AnalyticsParameterItemCategory : "shoes"],
+///       ],
+///     ]
+/// 
+static NSString *const kFIRParameterItems NS_SWIFT_NAME(AnalyticsParameterItems) = @"items"; + +/// Level in game (Int). +///
+///     let params = [
+///       AnalyticsParameterLevel : 42,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterLevel NS_SWIFT_NAME(AnalyticsParameterLevel) = @"level"; + +/// The name of a level in a game (String). +///
+///     let params = [
+///       AnalyticsParameterLevelName : "room_1",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterLevelName NS_SWIFT_NAME(AnalyticsParameterLevelName) = + @"level_name"; + +/// Location (String). The Google Place ID +/// that corresponds to the associated event. Alternatively, you can supply your own custom +/// Location ID. +///
+///     let params = [
+///       AnalyticsParameterLocation : "ChIJiyj437sx3YAR9kUWC8QkLzQ",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterLocation NS_SWIFT_NAME(AnalyticsParameterLocation) = + @"location"; + +/// The location associated with the event. Preferred to be the Google +/// Place ID that corresponds to the +/// associated item but could be overridden to a custom location ID string.(String). +///
+///     let params = [
+///       AnalyticsParameterLocationID : "ChIJiyj437sx3YAR9kUWC8QkLzQ",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterLocationID NS_SWIFT_NAME(AnalyticsParameterLocationID) = + @"location_id"; + +/// Marketing Tactic (String). Used to identify the targeting criteria applied to a specific +/// campaign. +///
+///     let params = [
+///       AnalyticsParameterMarketingTactic : "Remarketing",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterMarketingTactic + NS_SWIFT_NAME(AnalyticsParameterMarketingTactic) = @"marketing_tactic"; + +/// The advertising or marketing medium, for example: cpc, banner, email, push. Highly recommended +/// (String). +///
+///     let params = [
+///       AnalyticsParameterMedium : "email",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterMedium NS_SWIFT_NAME(AnalyticsParameterMedium) = @"medium"; + +/// A particular approach used in an operation; for example, "facebook" or "email" in the context +/// of a sign_up or login event. (String). +///
+///     let params = [
+///       AnalyticsParameterMethod : "google",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterMethod NS_SWIFT_NAME(AnalyticsParameterMethod) = @"method"; + +/// Number of nights staying at hotel (Int). +///
+///     let params = [
+///       AnalyticsParameterNumberOfNights : 3,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterNumberOfNights + NS_SWIFT_NAME(AnalyticsParameterNumberOfNights) = @"number_of_nights"; + +/// Number of passengers traveling (Int). +///
+///     let params = [
+///       AnalyticsParameterNumberOfPassengers : 11,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterNumberOfPassengers + NS_SWIFT_NAME(AnalyticsParameterNumberOfPassengers) = @"number_of_passengers"; + +/// Number of rooms for travel events (Int). +///
+///     let params = [
+///       AnalyticsParameterNumberOfRooms : 2,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterNumberOfRooms NS_SWIFT_NAME(AnalyticsParameterNumberOfRooms) = + @"number_of_rooms"; + +/// Flight or Travel origin (String). +///
+///     let params = [
+///       AnalyticsParameterOrigin : "Mountain View, CA",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterOrigin NS_SWIFT_NAME(AnalyticsParameterOrigin) = @"origin"; + +/// The chosen method of payment (String). +///
+///     let params = [
+///       AnalyticsParameterPaymentType : "Visa",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterPaymentType NS_SWIFT_NAME(AnalyticsParameterPaymentType) = + @"payment_type"; + +/// Purchase price (Double). +///
+///     let params = [
+///       AnalyticsParameterPrice : 1.0,
+///       AnalyticsParameterCurrency : "USD",  // e.g. $1.00 USD
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterPrice NS_SWIFT_NAME(AnalyticsParameterPrice) = @"price"; + +/// Indicates if an item's price is discounted. Specify 1 to indicate true and 0 to indicate false +/// (Int). +///
+///     let params = [
+///       AnalyticsParameterPriceIsDiscounted : 1,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterPriceIsDiscounted + NS_SWIFT_NAME(AnalyticsParameterPriceIsDiscounted) = @"price_is_discounted"; + +/// The ID of a product (String). +///
+///     let params = [
+///       AnalyticsParameterProductID : "PROD_12345",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterProductID NS_SWIFT_NAME(AnalyticsParameterProductID) = + @"product_id"; + +/// The name of a product (String). +///
+///     let params = [
+///       AnalyticsParameterProductName : "My Awesome Product",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterProductName NS_SWIFT_NAME(AnalyticsParameterProductName) = + @"product_name"; + +/// The ID of a product promotion (String). +///
+///     let params = [
+///       AnalyticsParameterPromotionID : "ABC123",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterPromotionID NS_SWIFT_NAME(AnalyticsParameterPromotionID) = + @"promotion_id"; + +/// The name of a product promotion (String). +///
+///     let params = [
+///       AnalyticsParameterPromotionName : "Summer Sale",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterPromotionName NS_SWIFT_NAME(AnalyticsParameterPromotionName) = + @"promotion_name"; + +/// Purchase quantity (Int). +///
+///     let params = [
+///       AnalyticsParameterQuantity : 1,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterQuantity NS_SWIFT_NAME(AnalyticsParameterQuantity) = + @"quantity"; + +/// Score in game (Int). +///
+///     let params = [
+///       AnalyticsParameterScore : 4200,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterScore NS_SWIFT_NAME(AnalyticsParameterScore) = @"score"; + +/// Current screen class, such as the class name of the UIViewController, logged with screen_view +/// event and added to every event (String). +///
+///     let params = [
+///       AnalyticsParameterScreenClass : "LoginViewController",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterScreenClass NS_SWIFT_NAME(AnalyticsParameterScreenClass) = + @"screen_class"; + +/// Current screen name, such as the name of the UIViewController, logged with screen_view event and +/// added to every event (String). +///
+///     let params = [
+///       AnalyticsParameterScreenName : "LoginView",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterScreenName NS_SWIFT_NAME(AnalyticsParameterScreenName) = + @"screen_name"; + +/// The search string/keywords used (String). +///
+///     let params = [
+///       AnalyticsParameterSearchTerm : "periodic table",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterSearchTerm NS_SWIFT_NAME(AnalyticsParameterSearchTerm) = + @"search_term"; + +/// Shipping cost associated with a transaction (Double). +///
+///     let params = [
+///       AnalyticsParameterShipping : 5.99,
+///       AnalyticsParameterCurrency : "USD",  // e.g. $5.99 USD
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterShipping NS_SWIFT_NAME(AnalyticsParameterShipping) = + @"shipping"; + +/// The shipping tier (e.g. Ground, Air, Next-day) selected for delivery of the purchased item +/// (String). +///
+///     let params = [
+///       AnalyticsParameterShippingTier : "Ground",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterShippingTier NS_SWIFT_NAME(AnalyticsParameterShippingTier) = + @"shipping_tier"; + +/// The origin of your traffic, such as an Ad network (for example, google) or partner (urban +/// airship). Identify the advertiser, site, publication, etc. that is sending traffic to your +/// property. Highly recommended (String). +///
+///     let params = [
+///       AnalyticsParameterSource : "InMobi",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterSource NS_SWIFT_NAME(AnalyticsParameterSource) = @"source"; + +/// Source Platform (String). Used to identify the platform responsible for directing traffic to a +/// given Analytics property (e.g., a buying platform where budgets, targeting criteria, etc. are +/// set, a platform for managing organic traffic data, etc.). +///
+///     let params = [
+///       AnalyticsParameterSourcePlatform : "sa360",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterSourcePlatform NS_SWIFT_NAME(AnalyticsParameterSourcePlatform) = + @"source_platform"; + +/// The departure date, check-in date or rental start date for the item. This should be in +/// YYYY-MM-DD format (String). +///
+///     let params = [
+///       AnalyticsParameterStartDate : "2015-09-14",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterStartDate NS_SWIFT_NAME(AnalyticsParameterStartDate) = + @"start_date"; + +/// Indicates if the purchase is a subscription. Specify 1 to indicate true and 0 to indicate false +/// (Int). +///
+///     let params = [
+///       AnalyticsParameterSubscription : 1,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterSubscription NS_SWIFT_NAME(AnalyticsParameterSubscription) = + @"subscription"; + +/// The result of an operation. Specify 1 to indicate success and 0 to indicate failure (Int). +///
+///     let params = [
+///       AnalyticsParameterSuccess : 1,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterSuccess NS_SWIFT_NAME(AnalyticsParameterSuccess) = @"success"; + +/// Tax cost associated with a transaction (Double). +///
+///     let params = [
+///       AnalyticsParameterTax : 2.43,
+///       AnalyticsParameterCurrency : "USD",  // e.g. $2.43 USD
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterTax NS_SWIFT_NAME(AnalyticsParameterTax) = @"tax"; + +/// If you're manually tagging keyword campaigns, you should use utm_term to specify the keyword +/// (String). +///
+///     let params = [
+///       AnalyticsParameterTerm : "game",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterTerm NS_SWIFT_NAME(AnalyticsParameterTerm) = @"term"; + +/// The unique identifier of a transaction (String). +///
+///     let params = [
+///       AnalyticsParameterTransactionID : "T12345",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterTransactionID NS_SWIFT_NAME(AnalyticsParameterTransactionID) = + @"transaction_id"; + +/// Travel class (String). +///
+///     let params = [
+///       AnalyticsParameterTravelClass : "business",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterTravelClass NS_SWIFT_NAME(AnalyticsParameterTravelClass) = + @"travel_class"; + +/// A context-specific numeric value which is accumulated automatically for each event type. This is +/// a general purpose parameter that is useful for accumulating a key metric that pertains to an +/// event. Examples include revenue, distance, time and points. Value should be specified as Int or +/// Double. +/// Notes: Values for pre-defined currency-related events (such as @c AnalyticsEventAddToCart) +/// should be supplied using Double and must be accompanied by a @c AnalyticsParameterCurrency +/// parameter. The valid range of accumulated values is +/// [-9,223,372,036,854.77, 9,223,372,036,854.77]. Supplying a non-numeric value, omitting the +/// corresponding @c AnalyticsParameterCurrency parameter, or supplying an invalid +/// currency code for conversion events will cause that +/// conversion to be omitted from reporting. +///
+///     let params = [
+///       AnalyticsParameterValue : 3.99,
+///       AnalyticsParameterCurrency : "USD",  // e.g. $3.99 USD
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterValue NS_SWIFT_NAME(AnalyticsParameterValue) = @"value"; + +/// Name of virtual currency type (String). +///
+///     let params = [
+///       AnalyticsParameterVirtualCurrencyName : "virtual_currency_name",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterVirtualCurrencyName + NS_SWIFT_NAME(AnalyticsParameterVirtualCurrencyName) = @"virtual_currency_name"; diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Headers/FIRUserPropertyNames.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Headers/FIRUserPropertyNames.h new file mode 100644 index 0000000..2442d8a --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Headers/FIRUserPropertyNames.h @@ -0,0 +1,28 @@ +/// @file FIRUserPropertyNames.h +/// +/// Predefined user property names. +/// +/// A UserProperty is an attribute that describes the app-user. By supplying UserProperties, you can +/// later analyze different behaviors of various segments of your userbase. You may supply up to 25 +/// unique UserProperties per app, and you can use the name and value of your choosing for each one. +/// UserProperty names can be up to 24 characters long, may only contain alphanumeric characters and +/// underscores ("_"), and must start with an alphabetic character. UserProperty values can be up to +/// 36 characters long. The "firebase_", "google_", and "ga_" prefixes are reserved and should not +/// be used. + +#import + +/// Indicates whether events logged by Google Analytics can be used to personalize ads for the user. +/// Set to "YES" to enable, or "NO" to disable. Default is enabled. See the +/// documentation for +/// more details and information about related settings. +/// +///
+///     Analytics.setUserProperty("NO", forName: AnalyticsUserPropertyAllowAdPersonalizationSignals)
+/// 
+static NSString *const kFIRUserPropertyAllowAdPersonalizationSignals + NS_SWIFT_NAME(AnalyticsUserPropertyAllowAdPersonalizationSignals) = @"allow_personalized_ads"; + +/// The method used to sign in. For example, "google", "facebook" or "twitter". +static NSString *const kFIRUserPropertySignUpMethod + NS_SWIFT_NAME(AnalyticsUserPropertySignUpMethod) = @"sign_up_method"; diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Headers/FirebaseAnalytics-Swift.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Headers/FirebaseAnalytics-Swift.h new file mode 100644 index 0000000..b409e3a --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Headers/FirebaseAnalytics-Swift.h @@ -0,0 +1,628 @@ +#if 0 +#elif defined(__arm64__) && __arm64__ +// Generated by Apple Swift version 6.0.3 effective-5.10 (swiftlang-6.0.3.1.10 clang-1600.0.30.1) +#ifndef FIREBASEANALYTICS_SWIFT_H +#define FIREBASEANALYTICS_SWIFT_H +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgcc-compat" + +#if !defined(__has_include) +# define __has_include(x) 0 +#endif +#if !defined(__has_attribute) +# define __has_attribute(x) 0 +#endif +#if !defined(__has_feature) +# define __has_feature(x) 0 +#endif +#if !defined(__has_warning) +# define __has_warning(x) 0 +#endif + +#if __has_include() +# include +#endif + +#pragma clang diagnostic ignored "-Wauto-import" +#if defined(__OBJC__) +#include +#endif +#if defined(__cplusplus) +#include +#include +#include +#include +#include +#include +#include +#else +#include +#include +#include +#include +#endif +#if defined(__cplusplus) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wnon-modular-include-in-framework-module" +#if defined(__arm64e__) && __has_include() +# include +#else +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wreserved-macro-identifier" +# ifndef __ptrauth_swift_value_witness_function_pointer +# define __ptrauth_swift_value_witness_function_pointer(x) +# endif +# ifndef __ptrauth_swift_class_method_pointer +# define __ptrauth_swift_class_method_pointer(x) +# endif +#pragma clang diagnostic pop +#endif +#pragma clang diagnostic pop +#endif + +#if !defined(SWIFT_TYPEDEFS) +# define SWIFT_TYPEDEFS 1 +# if __has_include() +# include +# elif !defined(__cplusplus) +typedef uint_least16_t char16_t; +typedef uint_least32_t char32_t; +# endif +typedef float swift_float2 __attribute__((__ext_vector_type__(2))); +typedef float swift_float3 __attribute__((__ext_vector_type__(3))); +typedef float swift_float4 __attribute__((__ext_vector_type__(4))); +typedef double swift_double2 __attribute__((__ext_vector_type__(2))); +typedef double swift_double3 __attribute__((__ext_vector_type__(3))); +typedef double swift_double4 __attribute__((__ext_vector_type__(4))); +typedef int swift_int2 __attribute__((__ext_vector_type__(2))); +typedef int swift_int3 __attribute__((__ext_vector_type__(3))); +typedef int swift_int4 __attribute__((__ext_vector_type__(4))); +typedef unsigned int swift_uint2 __attribute__((__ext_vector_type__(2))); +typedef unsigned int swift_uint3 __attribute__((__ext_vector_type__(3))); +typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); +#endif + +#if !defined(SWIFT_PASTE) +# define SWIFT_PASTE_HELPER(x, y) x##y +# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y) +#endif +#if !defined(SWIFT_METATYPE) +# define SWIFT_METATYPE(X) Class +#endif +#if !defined(SWIFT_CLASS_PROPERTY) +# if __has_feature(objc_class_property) +# define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__ +# else +# define SWIFT_CLASS_PROPERTY(...) +# endif +#endif +#if !defined(SWIFT_RUNTIME_NAME) +# if __has_attribute(objc_runtime_name) +# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X))) +# else +# define SWIFT_RUNTIME_NAME(X) +# endif +#endif +#if !defined(SWIFT_COMPILE_NAME) +# if __has_attribute(swift_name) +# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X))) +# else +# define SWIFT_COMPILE_NAME(X) +# endif +#endif +#if !defined(SWIFT_METHOD_FAMILY) +# if __has_attribute(objc_method_family) +# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X))) +# else +# define SWIFT_METHOD_FAMILY(X) +# endif +#endif +#if !defined(SWIFT_NOESCAPE) +# if __has_attribute(noescape) +# define SWIFT_NOESCAPE __attribute__((noescape)) +# else +# define SWIFT_NOESCAPE +# endif +#endif +#if !defined(SWIFT_RELEASES_ARGUMENT) +# if __has_attribute(ns_consumed) +# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed)) +# else +# define SWIFT_RELEASES_ARGUMENT +# endif +#endif +#if !defined(SWIFT_WARN_UNUSED_RESULT) +# if __has_attribute(warn_unused_result) +# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) +# else +# define SWIFT_WARN_UNUSED_RESULT +# endif +#endif +#if !defined(SWIFT_NORETURN) +# if __has_attribute(noreturn) +# define SWIFT_NORETURN __attribute__((noreturn)) +# else +# define SWIFT_NORETURN +# endif +#endif +#if !defined(SWIFT_CLASS_EXTRA) +# define SWIFT_CLASS_EXTRA +#endif +#if !defined(SWIFT_PROTOCOL_EXTRA) +# define SWIFT_PROTOCOL_EXTRA +#endif +#if !defined(SWIFT_ENUM_EXTRA) +# define SWIFT_ENUM_EXTRA +#endif +#if !defined(SWIFT_CLASS) +# if __has_attribute(objc_subclassing_restricted) +# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA +# define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA +# else +# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA +# define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA +# endif +#endif +#if !defined(SWIFT_RESILIENT_CLASS) +# if __has_attribute(objc_class_stub) +# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) __attribute__((objc_class_stub)) +# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_class_stub)) SWIFT_CLASS_NAMED(SWIFT_NAME) +# else +# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) +# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) SWIFT_CLASS_NAMED(SWIFT_NAME) +# endif +#endif +#if !defined(SWIFT_PROTOCOL) +# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA +# define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA +#endif +#if !defined(SWIFT_EXTENSION) +# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__) +#endif +#if !defined(OBJC_DESIGNATED_INITIALIZER) +# if __has_attribute(objc_designated_initializer) +# define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) +# else +# define OBJC_DESIGNATED_INITIALIZER +# endif +#endif +#if !defined(SWIFT_ENUM_ATTR) +# if __has_attribute(enum_extensibility) +# define SWIFT_ENUM_ATTR(_extensibility) __attribute__((enum_extensibility(_extensibility))) +# else +# define SWIFT_ENUM_ATTR(_extensibility) +# endif +#endif +#if !defined(SWIFT_ENUM) +# define SWIFT_ENUM(_type, _name, _extensibility) enum _name : _type _name; enum SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type +# if __has_feature(generalized_swift_name) +# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type +# else +# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) SWIFT_ENUM(_type, _name, _extensibility) +# endif +#endif +#if !defined(SWIFT_UNAVAILABLE) +# define SWIFT_UNAVAILABLE __attribute__((unavailable)) +#endif +#if !defined(SWIFT_UNAVAILABLE_MSG) +# define SWIFT_UNAVAILABLE_MSG(msg) __attribute__((unavailable(msg))) +#endif +#if !defined(SWIFT_AVAILABILITY) +# define SWIFT_AVAILABILITY(plat, ...) __attribute__((availability(plat, __VA_ARGS__))) +#endif +#if !defined(SWIFT_WEAK_IMPORT) +# define SWIFT_WEAK_IMPORT __attribute__((weak_import)) +#endif +#if !defined(SWIFT_DEPRECATED) +# define SWIFT_DEPRECATED __attribute__((deprecated)) +#endif +#if !defined(SWIFT_DEPRECATED_MSG) +# define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__))) +#endif +#if !defined(SWIFT_DEPRECATED_OBJC) +# if __has_feature(attribute_diagnose_if_objc) +# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning"))) +# else +# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg) +# endif +#endif +#if defined(__OBJC__) +#if !defined(IBSegueAction) +# define IBSegueAction +#endif +#endif +#if !defined(SWIFT_EXTERN) +# if defined(__cplusplus) +# define SWIFT_EXTERN extern "C" +# else +# define SWIFT_EXTERN extern +# endif +#endif +#if !defined(SWIFT_CALL) +# define SWIFT_CALL __attribute__((swiftcall)) +#endif +#if !defined(SWIFT_INDIRECT_RESULT) +# define SWIFT_INDIRECT_RESULT __attribute__((swift_indirect_result)) +#endif +#if !defined(SWIFT_CONTEXT) +# define SWIFT_CONTEXT __attribute__((swift_context)) +#endif +#if !defined(SWIFT_ERROR_RESULT) +# define SWIFT_ERROR_RESULT __attribute__((swift_error_result)) +#endif +#if defined(__cplusplus) +# define SWIFT_NOEXCEPT noexcept +#else +# define SWIFT_NOEXCEPT +#endif +#if !defined(SWIFT_C_INLINE_THUNK) +# if __has_attribute(always_inline) +# if __has_attribute(nodebug) +# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) __attribute__((nodebug)) +# else +# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) +# endif +# else +# define SWIFT_C_INLINE_THUNK inline +# endif +#endif +#if defined(_WIN32) +#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) +# define SWIFT_IMPORT_STDLIB_SYMBOL __declspec(dllimport) +#endif +#else +#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) +# define SWIFT_IMPORT_STDLIB_SYMBOL +#endif +#endif +#if defined(__OBJC__) +#if __has_feature(objc_modules) +#if __has_warning("-Watimport-in-framework-header") +#pragma clang diagnostic ignored "-Watimport-in-framework-header" +#endif +#endif + +#endif +#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch" +#pragma clang diagnostic ignored "-Wduplicate-method-arg" +#if __has_warning("-Wpragma-clang-attribute") +# pragma clang diagnostic ignored "-Wpragma-clang-attribute" +#endif +#pragma clang diagnostic ignored "-Wunknown-pragmas" +#pragma clang diagnostic ignored "-Wnullability" +#pragma clang diagnostic ignored "-Wdollar-in-identifier-extension" +#pragma clang diagnostic ignored "-Wunsafe-buffer-usage" + +#if __has_attribute(external_source_symbol) +# pragma push_macro("any") +# undef any +# pragma clang attribute push(__attribute__((external_source_symbol(language="Swift", defined_in="FirebaseAnalytics",generated_declaration))), apply_to=any(function,enum,objc_interface,objc_category,objc_protocol)) +# pragma pop_macro("any") +#endif + +#if defined(__OBJC__) + +#endif +#if __has_attribute(external_source_symbol) +# pragma clang attribute pop +#endif +#if defined(__cplusplus) +#endif +#pragma clang diagnostic pop +#endif + +#elif defined(__x86_64__) && __x86_64__ +// Generated by Apple Swift version 6.0.3 effective-5.10 (swiftlang-6.0.3.1.10 clang-1600.0.30.1) +#ifndef FIREBASEANALYTICS_SWIFT_H +#define FIREBASEANALYTICS_SWIFT_H +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgcc-compat" + +#if !defined(__has_include) +# define __has_include(x) 0 +#endif +#if !defined(__has_attribute) +# define __has_attribute(x) 0 +#endif +#if !defined(__has_feature) +# define __has_feature(x) 0 +#endif +#if !defined(__has_warning) +# define __has_warning(x) 0 +#endif + +#if __has_include() +# include +#endif + +#pragma clang diagnostic ignored "-Wauto-import" +#if defined(__OBJC__) +#include +#endif +#if defined(__cplusplus) +#include +#include +#include +#include +#include +#include +#include +#else +#include +#include +#include +#include +#endif +#if defined(__cplusplus) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wnon-modular-include-in-framework-module" +#if defined(__arm64e__) && __has_include() +# include +#else +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wreserved-macro-identifier" +# ifndef __ptrauth_swift_value_witness_function_pointer +# define __ptrauth_swift_value_witness_function_pointer(x) +# endif +# ifndef __ptrauth_swift_class_method_pointer +# define __ptrauth_swift_class_method_pointer(x) +# endif +#pragma clang diagnostic pop +#endif +#pragma clang diagnostic pop +#endif + +#if !defined(SWIFT_TYPEDEFS) +# define SWIFT_TYPEDEFS 1 +# if __has_include() +# include +# elif !defined(__cplusplus) +typedef uint_least16_t char16_t; +typedef uint_least32_t char32_t; +# endif +typedef float swift_float2 __attribute__((__ext_vector_type__(2))); +typedef float swift_float3 __attribute__((__ext_vector_type__(3))); +typedef float swift_float4 __attribute__((__ext_vector_type__(4))); +typedef double swift_double2 __attribute__((__ext_vector_type__(2))); +typedef double swift_double3 __attribute__((__ext_vector_type__(3))); +typedef double swift_double4 __attribute__((__ext_vector_type__(4))); +typedef int swift_int2 __attribute__((__ext_vector_type__(2))); +typedef int swift_int3 __attribute__((__ext_vector_type__(3))); +typedef int swift_int4 __attribute__((__ext_vector_type__(4))); +typedef unsigned int swift_uint2 __attribute__((__ext_vector_type__(2))); +typedef unsigned int swift_uint3 __attribute__((__ext_vector_type__(3))); +typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); +#endif + +#if !defined(SWIFT_PASTE) +# define SWIFT_PASTE_HELPER(x, y) x##y +# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y) +#endif +#if !defined(SWIFT_METATYPE) +# define SWIFT_METATYPE(X) Class +#endif +#if !defined(SWIFT_CLASS_PROPERTY) +# if __has_feature(objc_class_property) +# define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__ +# else +# define SWIFT_CLASS_PROPERTY(...) +# endif +#endif +#if !defined(SWIFT_RUNTIME_NAME) +# if __has_attribute(objc_runtime_name) +# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X))) +# else +# define SWIFT_RUNTIME_NAME(X) +# endif +#endif +#if !defined(SWIFT_COMPILE_NAME) +# if __has_attribute(swift_name) +# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X))) +# else +# define SWIFT_COMPILE_NAME(X) +# endif +#endif +#if !defined(SWIFT_METHOD_FAMILY) +# if __has_attribute(objc_method_family) +# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X))) +# else +# define SWIFT_METHOD_FAMILY(X) +# endif +#endif +#if !defined(SWIFT_NOESCAPE) +# if __has_attribute(noescape) +# define SWIFT_NOESCAPE __attribute__((noescape)) +# else +# define SWIFT_NOESCAPE +# endif +#endif +#if !defined(SWIFT_RELEASES_ARGUMENT) +# if __has_attribute(ns_consumed) +# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed)) +# else +# define SWIFT_RELEASES_ARGUMENT +# endif +#endif +#if !defined(SWIFT_WARN_UNUSED_RESULT) +# if __has_attribute(warn_unused_result) +# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) +# else +# define SWIFT_WARN_UNUSED_RESULT +# endif +#endif +#if !defined(SWIFT_NORETURN) +# if __has_attribute(noreturn) +# define SWIFT_NORETURN __attribute__((noreturn)) +# else +# define SWIFT_NORETURN +# endif +#endif +#if !defined(SWIFT_CLASS_EXTRA) +# define SWIFT_CLASS_EXTRA +#endif +#if !defined(SWIFT_PROTOCOL_EXTRA) +# define SWIFT_PROTOCOL_EXTRA +#endif +#if !defined(SWIFT_ENUM_EXTRA) +# define SWIFT_ENUM_EXTRA +#endif +#if !defined(SWIFT_CLASS) +# if __has_attribute(objc_subclassing_restricted) +# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA +# define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA +# else +# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA +# define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA +# endif +#endif +#if !defined(SWIFT_RESILIENT_CLASS) +# if __has_attribute(objc_class_stub) +# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) __attribute__((objc_class_stub)) +# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_class_stub)) SWIFT_CLASS_NAMED(SWIFT_NAME) +# else +# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) +# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) SWIFT_CLASS_NAMED(SWIFT_NAME) +# endif +#endif +#if !defined(SWIFT_PROTOCOL) +# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA +# define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA +#endif +#if !defined(SWIFT_EXTENSION) +# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__) +#endif +#if !defined(OBJC_DESIGNATED_INITIALIZER) +# if __has_attribute(objc_designated_initializer) +# define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) +# else +# define OBJC_DESIGNATED_INITIALIZER +# endif +#endif +#if !defined(SWIFT_ENUM_ATTR) +# if __has_attribute(enum_extensibility) +# define SWIFT_ENUM_ATTR(_extensibility) __attribute__((enum_extensibility(_extensibility))) +# else +# define SWIFT_ENUM_ATTR(_extensibility) +# endif +#endif +#if !defined(SWIFT_ENUM) +# define SWIFT_ENUM(_type, _name, _extensibility) enum _name : _type _name; enum SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type +# if __has_feature(generalized_swift_name) +# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type +# else +# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) SWIFT_ENUM(_type, _name, _extensibility) +# endif +#endif +#if !defined(SWIFT_UNAVAILABLE) +# define SWIFT_UNAVAILABLE __attribute__((unavailable)) +#endif +#if !defined(SWIFT_UNAVAILABLE_MSG) +# define SWIFT_UNAVAILABLE_MSG(msg) __attribute__((unavailable(msg))) +#endif +#if !defined(SWIFT_AVAILABILITY) +# define SWIFT_AVAILABILITY(plat, ...) __attribute__((availability(plat, __VA_ARGS__))) +#endif +#if !defined(SWIFT_WEAK_IMPORT) +# define SWIFT_WEAK_IMPORT __attribute__((weak_import)) +#endif +#if !defined(SWIFT_DEPRECATED) +# define SWIFT_DEPRECATED __attribute__((deprecated)) +#endif +#if !defined(SWIFT_DEPRECATED_MSG) +# define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__))) +#endif +#if !defined(SWIFT_DEPRECATED_OBJC) +# if __has_feature(attribute_diagnose_if_objc) +# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning"))) +# else +# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg) +# endif +#endif +#if defined(__OBJC__) +#if !defined(IBSegueAction) +# define IBSegueAction +#endif +#endif +#if !defined(SWIFT_EXTERN) +# if defined(__cplusplus) +# define SWIFT_EXTERN extern "C" +# else +# define SWIFT_EXTERN extern +# endif +#endif +#if !defined(SWIFT_CALL) +# define SWIFT_CALL __attribute__((swiftcall)) +#endif +#if !defined(SWIFT_INDIRECT_RESULT) +# define SWIFT_INDIRECT_RESULT __attribute__((swift_indirect_result)) +#endif +#if !defined(SWIFT_CONTEXT) +# define SWIFT_CONTEXT __attribute__((swift_context)) +#endif +#if !defined(SWIFT_ERROR_RESULT) +# define SWIFT_ERROR_RESULT __attribute__((swift_error_result)) +#endif +#if defined(__cplusplus) +# define SWIFT_NOEXCEPT noexcept +#else +# define SWIFT_NOEXCEPT +#endif +#if !defined(SWIFT_C_INLINE_THUNK) +# if __has_attribute(always_inline) +# if __has_attribute(nodebug) +# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) __attribute__((nodebug)) +# else +# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) +# endif +# else +# define SWIFT_C_INLINE_THUNK inline +# endif +#endif +#if defined(_WIN32) +#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) +# define SWIFT_IMPORT_STDLIB_SYMBOL __declspec(dllimport) +#endif +#else +#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) +# define SWIFT_IMPORT_STDLIB_SYMBOL +#endif +#endif +#if defined(__OBJC__) +#if __has_feature(objc_modules) +#if __has_warning("-Watimport-in-framework-header") +#pragma clang diagnostic ignored "-Watimport-in-framework-header" +#endif +#endif + +#endif +#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch" +#pragma clang diagnostic ignored "-Wduplicate-method-arg" +#if __has_warning("-Wpragma-clang-attribute") +# pragma clang diagnostic ignored "-Wpragma-clang-attribute" +#endif +#pragma clang diagnostic ignored "-Wunknown-pragmas" +#pragma clang diagnostic ignored "-Wnullability" +#pragma clang diagnostic ignored "-Wdollar-in-identifier-extension" +#pragma clang diagnostic ignored "-Wunsafe-buffer-usage" + +#if __has_attribute(external_source_symbol) +# pragma push_macro("any") +# undef any +# pragma clang attribute push(__attribute__((external_source_symbol(language="Swift", defined_in="FirebaseAnalytics",generated_declaration))), apply_to=any(function,enum,objc_interface,objc_category,objc_protocol)) +# pragma pop_macro("any") +#endif + +#if defined(__OBJC__) + +#endif +#if __has_attribute(external_source_symbol) +# pragma clang attribute pop +#endif +#if defined(__cplusplus) +#endif +#pragma clang diagnostic pop +#endif + +#else +#error unsupported Swift architecture +#endif diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Headers/FirebaseAnalytics-umbrella.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Headers/FirebaseAnalytics-umbrella.h new file mode 100644 index 0000000..ad84fbb --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Headers/FirebaseAnalytics-umbrella.h @@ -0,0 +1,24 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + +#import "FIRAnalytics+AppDelegate.h" +#import "FIRAnalytics+Consent.h" +#import "FIRAnalytics+OnDevice.h" +#import "FIRAnalytics.h" +#import "FirebaseAnalytics.h" +#import "FIREventNames.h" +#import "FIRParameterNames.h" +#import "FIRUserPropertyNames.h" + +FOUNDATION_EXPORT double FirebaseAnalyticsVersionNumber; +FOUNDATION_EXPORT const unsigned char FirebaseAnalyticsVersionString[]; + diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Headers/FirebaseAnalytics.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Headers/FirebaseAnalytics.h new file mode 100644 index 0000000..351da20 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Headers/FirebaseAnalytics.h @@ -0,0 +1,7 @@ +#import "FIRAnalytics+AppDelegate.h" +#import "FIRAnalytics+Consent.h" +#import "FIRAnalytics+OnDevice.h" +#import "FIRAnalytics.h" +#import "FIREventNames.h" +#import "FIRParameterNames.h" +#import "FIRUserPropertyNames.h" diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/Project/arm64-apple-ios-macabi.swiftsourceinfo b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/Project/arm64-apple-ios-macabi.swiftsourceinfo new file mode 100644 index 0000000..ef59a96 Binary files /dev/null and b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/Project/arm64-apple-ios-macabi.swiftsourceinfo differ diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/Project/x86_64-apple-ios-macabi.swiftsourceinfo b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/Project/x86_64-apple-ios-macabi.swiftsourceinfo new file mode 100644 index 0000000..f0207d0 Binary files /dev/null and b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/Project/x86_64-apple-ios-macabi.swiftsourceinfo differ diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios-macabi.abi.json b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios-macabi.abi.json new file mode 100644 index 0000000..476738a --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios-macabi.abi.json @@ -0,0 +1,281 @@ +{ + "ABIRoot": { + "kind": "Root", + "name": "FirebaseAnalytics", + "printedName": "FirebaseAnalytics", + "children": [ + { + "kind": "Import", + "name": "FirebaseAnalyticsPrivate", + "printedName": "FirebaseAnalyticsPrivate", + "declKind": "Import", + "moduleName": "FirebaseAnalytics", + "declAttributes": [ + "ImplementationOnly" + ] + }, + { + "kind": "Import", + "name": "StoreKit", + "printedName": "StoreKit", + "declKind": "Import", + "moduleName": "FirebaseAnalytics" + }, + { + "kind": "Import", + "name": "SwiftUI", + "printedName": "SwiftUI", + "declKind": "Import", + "moduleName": "FirebaseAnalytics" + }, + { + "kind": "TypeDecl", + "name": "Analytics", + "printedName": "Analytics", + "children": [ + { + "kind": "Function", + "name": "logTransaction", + "printedName": "logTransaction(_:)", + "children": [ + { + "kind": "TypeNominal", + "name": "Void", + "printedName": "()" + }, + { + "kind": "TypeNominal", + "name": "Transaction", + "printedName": "StoreKit.Transaction", + "usr": "s:8StoreKit11TransactionV" + } + ], + "declKind": "Func", + "usr": "s:So12FIRAnalyticsC17FirebaseAnalyticsE14logTransactionyy8StoreKit0E0VFZ", + "mangledName": "$sSo12FIRAnalyticsC17FirebaseAnalyticsE14logTransactionyy8StoreKit0E0VFZ", + "moduleName": "FirebaseAnalytics", + "static": true, + "declAttributes": [ + "Final", + "AccessControl", + "RawDocComment" + ], + "isFromExtension": true, + "funcSelfKind": "NonMutating" + } + ], + "declKind": "Class", + "usr": "c:objc(cs)FIRAnalytics", + "moduleName": "FirebaseAnalytics", + "isOpen": true, + "objc_name": "FIRAnalytics", + "declAttributes": [ + "ObjC", + "Dynamic" + ], + "superclassUsr": "c:objc(cs)NSObject", + "isExternal": true, + "inheritsConvenienceInitializers": true, + "superclassNames": [ + "ObjectiveC.NSObject" + ], + "conformances": [ + { + "kind": "Conformance", + "name": "Copyable", + "printedName": "Copyable", + "usr": "s:s8CopyableP", + "mangledName": "$ss8CopyableP" + }, + { + "kind": "Conformance", + "name": "Escapable", + "printedName": "Escapable", + "usr": "s:s9EscapableP", + "mangledName": "$ss9EscapableP" + }, + { + "kind": "Conformance", + "name": "Equatable", + "printedName": "Equatable", + "usr": "s:SQ", + "mangledName": "$sSQ" + }, + { + "kind": "Conformance", + "name": "Hashable", + "printedName": "Hashable", + "usr": "s:SH", + "mangledName": "$sSH" + }, + { + "kind": "Conformance", + "name": "CVarArg", + "printedName": "CVarArg", + "usr": "s:s7CVarArgP", + "mangledName": "$ss7CVarArgP" + }, + { + "kind": "Conformance", + "name": "_KeyValueCodingAndObservingPublishing", + "printedName": "_KeyValueCodingAndObservingPublishing", + "usr": "s:10Foundation37_KeyValueCodingAndObservingPublishingP", + "mangledName": "$s10Foundation37_KeyValueCodingAndObservingPublishingP" + }, + { + "kind": "Conformance", + "name": "_KeyValueCodingAndObserving", + "printedName": "_KeyValueCodingAndObserving", + "usr": "s:10Foundation27_KeyValueCodingAndObservingP", + "mangledName": "$s10Foundation27_KeyValueCodingAndObservingP" + }, + { + "kind": "Conformance", + "name": "CustomStringConvertible", + "printedName": "CustomStringConvertible", + "usr": "s:s23CustomStringConvertibleP", + "mangledName": "$ss23CustomStringConvertibleP" + }, + { + "kind": "Conformance", + "name": "CustomDebugStringConvertible", + "printedName": "CustomDebugStringConvertible", + "usr": "s:s28CustomDebugStringConvertibleP", + "mangledName": "$ss28CustomDebugStringConvertibleP" + } + ] + }, + { + "kind": "TypeDecl", + "name": "View", + "printedName": "View", + "children": [ + { + "kind": "Function", + "name": "analyticsScreen", + "printedName": "analyticsScreen(name:class:extraParameters:)", + "children": [ + { + "kind": "TypeNominal", + "name": "OpaqueTypeArchetype", + "printedName": "some SwiftUI.View", + "children": [ + { + "kind": "TypeNominal", + "name": "View", + "printedName": "SwiftUI.View", + "usr": "s:7SwiftUI4ViewP" + } + ] + }, + { + "kind": "TypeNominal", + "name": "String", + "printedName": "Swift.String", + "usr": "s:SS" + }, + { + "kind": "TypeNominal", + "name": "String", + "printedName": "Swift.String", + "hasDefaultArg": true, + "usr": "s:SS" + }, + { + "kind": "TypeNominal", + "name": "Dictionary", + "printedName": "[Swift.String : Any]", + "children": [ + { + "kind": "TypeNominal", + "name": "String", + "printedName": "Swift.String", + "usr": "s:SS" + }, + { + "kind": "TypeNominal", + "name": "ProtocolComposition", + "printedName": "Any" + } + ], + "hasDefaultArg": true, + "usr": "s:SD" + } + ], + "declKind": "Func", + "usr": "s:7SwiftUI4ViewP17FirebaseAnalyticsE15analyticsScreen4name5class15extraParametersQrSS_SSSDySSypGtF", + "mangledName": "$s7SwiftUI4ViewP17FirebaseAnalyticsE15analyticsScreen4name5class15extraParametersQrSS_SSSDySSypGtF", + "moduleName": "FirebaseAnalytics", + "genericSig": "<τ_0_0 where τ_0_0 : SwiftUI.View>", + "sugared_genericSig": "", + "declAttributes": [ + "Preconcurrency", + "Custom", + "AccessControl", + "RawDocComment" + ], + "isFromExtension": true, + "funcSelfKind": "NonMutating" + } + ], + "declKind": "Protocol", + "usr": "s:7SwiftUI4ViewP", + "mangledName": "$s7SwiftUI4ViewP", + "moduleName": "SwiftUICore", + "genericSig": "<τ_0_0.Body : SwiftUI.View>", + "sugared_genericSig": "", + "intro_Macosx": "10.15", + "intro_iOS": "13.0", + "intro_tvOS": "13.0", + "intro_watchOS": "6.0", + "declAttributes": [ + "Preconcurrency", + "TypeEraser", + "OriginallyDefinedIn", + "OriginallyDefinedIn", + "OriginallyDefinedIn", + "OriginallyDefinedIn", + "Available", + "Available", + "Available", + "Available", + "Custom" + ], + "isExternal": true, + "conformances": [ + { + "kind": "Conformance", + "name": "Escapable", + "printedName": "Escapable", + "usr": "s:s9EscapableP", + "mangledName": "$ss9EscapableP" + }, + { + "kind": "Conformance", + "name": "Copyable", + "printedName": "Copyable", + "usr": "s:s8CopyableP", + "mangledName": "$ss8CopyableP" + } + ] + } + ], + "json_format_version": 8 + }, + "ConstValues": [ + { + "filePath": "\/Volumes\/google\/src\/cloud\/hantran\/m172\/google3\/googlemac\/iPhone\/Firebase\/Analytics\/Sources\/Swift\/Analytics+SwiftUI.swift", + "kind": "StringLiteral", + "offset": 2654, + "length": 6, + "value": "\"View\"" + }, + { + "filePath": "\/Volumes\/google\/src\/cloud\/hantran\/m172\/google3\/googlemac\/iPhone\/Firebase\/Analytics\/Sources\/Swift\/Analytics+SwiftUI.swift", + "kind": "Dictionary", + "offset": 2701, + "length": 3, + "value": "[]" + } + ] +} \ No newline at end of file diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios-macabi.private.swiftinterface b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios-macabi.private.swiftinterface new file mode 100644 index 0000000..2f0b81d --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios-macabi.private.swiftinterface @@ -0,0 +1,22 @@ +// swift-interface-format-version: 1.0 +// swift-compiler-version: Apple Swift version 6.0.3 effective-5.10 (swiftlang-6.0.3.1.10 clang-1600.0.30.1) +// swift-module-flags: -target arm64-apple-ios15.0-macabi -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -O -enable-bare-slash-regex -module-name FirebaseAnalytics +// swift-module-flags-ignorable: -no-verify-emitted-module-interface +@_exported import FirebaseAnalytics +import StoreKit +import Swift +import SwiftUI +import _Concurrency +import _StringProcessing +import _SwiftConcurrencyShims +@available(iOS 15.0, macOS 12.0, macCatalyst 15.0, tvOS 15.0, *) +@available(watchOS, unavailable) +extension FirebaseAnalytics.Analytics { + public static func logTransaction(_ transaction: StoreKit.Transaction) +} +@available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, *) +@available(watchOS, unavailable) +extension SwiftUICore.View { + @_Concurrency.MainActor @preconcurrency public func analyticsScreen(name: Swift.String, class: Swift.String = "View", extraParameters: [Swift.String : Any] = [:]) -> some SwiftUICore.View + +} diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios-macabi.swiftdoc b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios-macabi.swiftdoc new file mode 100644 index 0000000..a1cae2d Binary files /dev/null and b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios-macabi.swiftdoc differ diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios-macabi.swiftinterface b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios-macabi.swiftinterface new file mode 100644 index 0000000..2f0b81d --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios-macabi.swiftinterface @@ -0,0 +1,22 @@ +// swift-interface-format-version: 1.0 +// swift-compiler-version: Apple Swift version 6.0.3 effective-5.10 (swiftlang-6.0.3.1.10 clang-1600.0.30.1) +// swift-module-flags: -target arm64-apple-ios15.0-macabi -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -O -enable-bare-slash-regex -module-name FirebaseAnalytics +// swift-module-flags-ignorable: -no-verify-emitted-module-interface +@_exported import FirebaseAnalytics +import StoreKit +import Swift +import SwiftUI +import _Concurrency +import _StringProcessing +import _SwiftConcurrencyShims +@available(iOS 15.0, macOS 12.0, macCatalyst 15.0, tvOS 15.0, *) +@available(watchOS, unavailable) +extension FirebaseAnalytics.Analytics { + public static func logTransaction(_ transaction: StoreKit.Transaction) +} +@available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, *) +@available(watchOS, unavailable) +extension SwiftUICore.View { + @_Concurrency.MainActor @preconcurrency public func analyticsScreen(name: Swift.String, class: Swift.String = "View", extraParameters: [Swift.String : Any] = [:]) -> some SwiftUICore.View + +} diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-ios-macabi.abi.json b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-ios-macabi.abi.json new file mode 100644 index 0000000..476738a --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-ios-macabi.abi.json @@ -0,0 +1,281 @@ +{ + "ABIRoot": { + "kind": "Root", + "name": "FirebaseAnalytics", + "printedName": "FirebaseAnalytics", + "children": [ + { + "kind": "Import", + "name": "FirebaseAnalyticsPrivate", + "printedName": "FirebaseAnalyticsPrivate", + "declKind": "Import", + "moduleName": "FirebaseAnalytics", + "declAttributes": [ + "ImplementationOnly" + ] + }, + { + "kind": "Import", + "name": "StoreKit", + "printedName": "StoreKit", + "declKind": "Import", + "moduleName": "FirebaseAnalytics" + }, + { + "kind": "Import", + "name": "SwiftUI", + "printedName": "SwiftUI", + "declKind": "Import", + "moduleName": "FirebaseAnalytics" + }, + { + "kind": "TypeDecl", + "name": "Analytics", + "printedName": "Analytics", + "children": [ + { + "kind": "Function", + "name": "logTransaction", + "printedName": "logTransaction(_:)", + "children": [ + { + "kind": "TypeNominal", + "name": "Void", + "printedName": "()" + }, + { + "kind": "TypeNominal", + "name": "Transaction", + "printedName": "StoreKit.Transaction", + "usr": "s:8StoreKit11TransactionV" + } + ], + "declKind": "Func", + "usr": "s:So12FIRAnalyticsC17FirebaseAnalyticsE14logTransactionyy8StoreKit0E0VFZ", + "mangledName": "$sSo12FIRAnalyticsC17FirebaseAnalyticsE14logTransactionyy8StoreKit0E0VFZ", + "moduleName": "FirebaseAnalytics", + "static": true, + "declAttributes": [ + "Final", + "AccessControl", + "RawDocComment" + ], + "isFromExtension": true, + "funcSelfKind": "NonMutating" + } + ], + "declKind": "Class", + "usr": "c:objc(cs)FIRAnalytics", + "moduleName": "FirebaseAnalytics", + "isOpen": true, + "objc_name": "FIRAnalytics", + "declAttributes": [ + "ObjC", + "Dynamic" + ], + "superclassUsr": "c:objc(cs)NSObject", + "isExternal": true, + "inheritsConvenienceInitializers": true, + "superclassNames": [ + "ObjectiveC.NSObject" + ], + "conformances": [ + { + "kind": "Conformance", + "name": "Copyable", + "printedName": "Copyable", + "usr": "s:s8CopyableP", + "mangledName": "$ss8CopyableP" + }, + { + "kind": "Conformance", + "name": "Escapable", + "printedName": "Escapable", + "usr": "s:s9EscapableP", + "mangledName": "$ss9EscapableP" + }, + { + "kind": "Conformance", + "name": "Equatable", + "printedName": "Equatable", + "usr": "s:SQ", + "mangledName": "$sSQ" + }, + { + "kind": "Conformance", + "name": "Hashable", + "printedName": "Hashable", + "usr": "s:SH", + "mangledName": "$sSH" + }, + { + "kind": "Conformance", + "name": "CVarArg", + "printedName": "CVarArg", + "usr": "s:s7CVarArgP", + "mangledName": "$ss7CVarArgP" + }, + { + "kind": "Conformance", + "name": "_KeyValueCodingAndObservingPublishing", + "printedName": "_KeyValueCodingAndObservingPublishing", + "usr": "s:10Foundation37_KeyValueCodingAndObservingPublishingP", + "mangledName": "$s10Foundation37_KeyValueCodingAndObservingPublishingP" + }, + { + "kind": "Conformance", + "name": "_KeyValueCodingAndObserving", + "printedName": "_KeyValueCodingAndObserving", + "usr": "s:10Foundation27_KeyValueCodingAndObservingP", + "mangledName": "$s10Foundation27_KeyValueCodingAndObservingP" + }, + { + "kind": "Conformance", + "name": "CustomStringConvertible", + "printedName": "CustomStringConvertible", + "usr": "s:s23CustomStringConvertibleP", + "mangledName": "$ss23CustomStringConvertibleP" + }, + { + "kind": "Conformance", + "name": "CustomDebugStringConvertible", + "printedName": "CustomDebugStringConvertible", + "usr": "s:s28CustomDebugStringConvertibleP", + "mangledName": "$ss28CustomDebugStringConvertibleP" + } + ] + }, + { + "kind": "TypeDecl", + "name": "View", + "printedName": "View", + "children": [ + { + "kind": "Function", + "name": "analyticsScreen", + "printedName": "analyticsScreen(name:class:extraParameters:)", + "children": [ + { + "kind": "TypeNominal", + "name": "OpaqueTypeArchetype", + "printedName": "some SwiftUI.View", + "children": [ + { + "kind": "TypeNominal", + "name": "View", + "printedName": "SwiftUI.View", + "usr": "s:7SwiftUI4ViewP" + } + ] + }, + { + "kind": "TypeNominal", + "name": "String", + "printedName": "Swift.String", + "usr": "s:SS" + }, + { + "kind": "TypeNominal", + "name": "String", + "printedName": "Swift.String", + "hasDefaultArg": true, + "usr": "s:SS" + }, + { + "kind": "TypeNominal", + "name": "Dictionary", + "printedName": "[Swift.String : Any]", + "children": [ + { + "kind": "TypeNominal", + "name": "String", + "printedName": "Swift.String", + "usr": "s:SS" + }, + { + "kind": "TypeNominal", + "name": "ProtocolComposition", + "printedName": "Any" + } + ], + "hasDefaultArg": true, + "usr": "s:SD" + } + ], + "declKind": "Func", + "usr": "s:7SwiftUI4ViewP17FirebaseAnalyticsE15analyticsScreen4name5class15extraParametersQrSS_SSSDySSypGtF", + "mangledName": "$s7SwiftUI4ViewP17FirebaseAnalyticsE15analyticsScreen4name5class15extraParametersQrSS_SSSDySSypGtF", + "moduleName": "FirebaseAnalytics", + "genericSig": "<τ_0_0 where τ_0_0 : SwiftUI.View>", + "sugared_genericSig": "", + "declAttributes": [ + "Preconcurrency", + "Custom", + "AccessControl", + "RawDocComment" + ], + "isFromExtension": true, + "funcSelfKind": "NonMutating" + } + ], + "declKind": "Protocol", + "usr": "s:7SwiftUI4ViewP", + "mangledName": "$s7SwiftUI4ViewP", + "moduleName": "SwiftUICore", + "genericSig": "<τ_0_0.Body : SwiftUI.View>", + "sugared_genericSig": "", + "intro_Macosx": "10.15", + "intro_iOS": "13.0", + "intro_tvOS": "13.0", + "intro_watchOS": "6.0", + "declAttributes": [ + "Preconcurrency", + "TypeEraser", + "OriginallyDefinedIn", + "OriginallyDefinedIn", + "OriginallyDefinedIn", + "OriginallyDefinedIn", + "Available", + "Available", + "Available", + "Available", + "Custom" + ], + "isExternal": true, + "conformances": [ + { + "kind": "Conformance", + "name": "Escapable", + "printedName": "Escapable", + "usr": "s:s9EscapableP", + "mangledName": "$ss9EscapableP" + }, + { + "kind": "Conformance", + "name": "Copyable", + "printedName": "Copyable", + "usr": "s:s8CopyableP", + "mangledName": "$ss8CopyableP" + } + ] + } + ], + "json_format_version": 8 + }, + "ConstValues": [ + { + "filePath": "\/Volumes\/google\/src\/cloud\/hantran\/m172\/google3\/googlemac\/iPhone\/Firebase\/Analytics\/Sources\/Swift\/Analytics+SwiftUI.swift", + "kind": "StringLiteral", + "offset": 2654, + "length": 6, + "value": "\"View\"" + }, + { + "filePath": "\/Volumes\/google\/src\/cloud\/hantran\/m172\/google3\/googlemac\/iPhone\/Firebase\/Analytics\/Sources\/Swift\/Analytics+SwiftUI.swift", + "kind": "Dictionary", + "offset": 2701, + "length": 3, + "value": "[]" + } + ] +} \ No newline at end of file diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-ios-macabi.private.swiftinterface b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-ios-macabi.private.swiftinterface new file mode 100644 index 0000000..88b5064 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-ios-macabi.private.swiftinterface @@ -0,0 +1,22 @@ +// swift-interface-format-version: 1.0 +// swift-compiler-version: Apple Swift version 6.0.3 effective-5.10 (swiftlang-6.0.3.1.10 clang-1600.0.30.1) +// swift-module-flags: -target x86_64-apple-ios15.0-macabi -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -O -enable-bare-slash-regex -module-name FirebaseAnalytics +// swift-module-flags-ignorable: -no-verify-emitted-module-interface +@_exported import FirebaseAnalytics +import StoreKit +import Swift +import SwiftUI +import _Concurrency +import _StringProcessing +import _SwiftConcurrencyShims +@available(iOS 15.0, macOS 12.0, macCatalyst 15.0, tvOS 15.0, *) +@available(watchOS, unavailable) +extension FirebaseAnalytics.Analytics { + public static func logTransaction(_ transaction: StoreKit.Transaction) +} +@available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, *) +@available(watchOS, unavailable) +extension SwiftUICore.View { + @_Concurrency.MainActor @preconcurrency public func analyticsScreen(name: Swift.String, class: Swift.String = "View", extraParameters: [Swift.String : Any] = [:]) -> some SwiftUICore.View + +} diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-ios-macabi.swiftdoc b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-ios-macabi.swiftdoc new file mode 100644 index 0000000..e41ca01 Binary files /dev/null and b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-ios-macabi.swiftdoc differ diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-ios-macabi.swiftinterface b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-ios-macabi.swiftinterface new file mode 100644 index 0000000..88b5064 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-ios-macabi.swiftinterface @@ -0,0 +1,22 @@ +// swift-interface-format-version: 1.0 +// swift-compiler-version: Apple Swift version 6.0.3 effective-5.10 (swiftlang-6.0.3.1.10 clang-1600.0.30.1) +// swift-module-flags: -target x86_64-apple-ios15.0-macabi -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -O -enable-bare-slash-regex -module-name FirebaseAnalytics +// swift-module-flags-ignorable: -no-verify-emitted-module-interface +@_exported import FirebaseAnalytics +import StoreKit +import Swift +import SwiftUI +import _Concurrency +import _StringProcessing +import _SwiftConcurrencyShims +@available(iOS 15.0, macOS 12.0, macCatalyst 15.0, tvOS 15.0, *) +@available(watchOS, unavailable) +extension FirebaseAnalytics.Analytics { + public static func logTransaction(_ transaction: StoreKit.Transaction) +} +@available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, *) +@available(watchOS, unavailable) +extension SwiftUICore.View { + @_Concurrency.MainActor @preconcurrency public func analyticsScreen(name: Swift.String, class: Swift.String = "View", extraParameters: [Swift.String : Any] = [:]) -> some SwiftUICore.View + +} diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/module.modulemap b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/module.modulemap new file mode 100644 index 0000000..fa10817 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Modules/module.modulemap @@ -0,0 +1,16 @@ +framework module FirebaseAnalytics { +umbrella header "FirebaseAnalytics-umbrella.h" +export * +module * { export * } + link framework "Foundation" + link framework "Security" + link framework "SystemConfiguration" + link framework "UIKit" + link "c++" + link "sqlite3" + link "z" +} +module FirebaseAnalytics.Swift { + header "FirebaseAnalytics-Swift.h" + requires objc +} \ No newline at end of file diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Resources/Info.plist b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Resources/Info.plist new file mode 100644 index 0000000..706950d --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/A/Resources/Info.plist @@ -0,0 +1,54 @@ + + + + + BuildMachineOSBuild + 24G231 + CFBundleDevelopmentRegion + en + CFBundleExecutable + FirebaseAnalytics + CFBundleIdentifier + org.cocoapods.FirebaseAnalytics + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + FirebaseAnalytics + CFBundlePackageType + FMWK + CFBundleShortVersionString + 12.5.0 + CFBundleSignature + ???? + CFBundleSupportedPlatforms + + MacOSX + + CFBundleVersion + 1 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + DTPlatformBuild + 24C94 + DTPlatformName + macosx + DTPlatformVersion + 15.2 + DTSDKBuild + 24C94 + DTSDKName + macosx15.2 + DTXcode + 1620 + DTXcodeBuild + 16C5032a + LSMinimumSystemVersion + 12.0 + MinimumOSVersion + 100.0 + UIDeviceFamily + + 2 + + + diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/Current b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/Current new file mode 120000 index 0000000..8c7e5a6 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst/FirebaseAnalytics.framework/Versions/Current @@ -0,0 +1 @@ +A \ No newline at end of file diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/FirebaseAnalytics b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/FirebaseAnalytics new file mode 100644 index 0000000..2ec8382 Binary files /dev/null and b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/FirebaseAnalytics differ diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRAnalytics+AppDelegate.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRAnalytics+AppDelegate.h new file mode 100644 index 0000000..cb1e407 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRAnalytics+AppDelegate.h @@ -0,0 +1,80 @@ +#import + +#import "FIRAnalytics.h" + +NS_ASSUME_NONNULL_BEGIN + +/// Provides App Delegate handlers to be used in your App Delegate. +/// +/// To save time integrating Firebase Analytics in an application, Firebase Analytics does not +/// require delegation implementation from the AppDelegate if neither SwiftUI nor UIScene lifecycle +/// is adopted. Instead this is automatically done by Firebase Analytics. Should you choose instead +/// to delegate manually, you can turn off the App Delegate Proxy by adding +/// FirebaseAppDelegateProxyEnabled into your app's Info.plist and setting it to boolean `NO`, and +/// adding the methods in this category to corresponding delegation handlers. +/// +/// To handle Universal Links, you must return `true` in +/// `UIApplicationDelegate.application(_:didFinishLaunchingWithOptions:)`. +@interface FIRAnalytics (AppDelegate) + +/// Handles events related to a URL session that are waiting to be processed. +/// +/// 1. If SwiftUI lifecycle is adopted, call this method from +/// `UIApplicationDelegate.application(_:handleEventsForBackgroundURLSession:completionHandler:)` +/// in your app delegate. +/// +/// 2. If SwiftUI lifecycle is not adopted, Firebase Analytics does not require delegation +/// implementation from the AppDelegate. If you choose instead to delegate manually, you can set +/// FirebaseAppDelegateProxyEnabled to boolean `NO` in your app's Info.plist and call this method +/// from +/// `UIApplicationDelegate.application(_:handleEventsForBackgroundURLSession:completionHandler:)` +/// in your app delegate. +/// +/// @param identifier The identifier of the URL session requiring attention. +/// @param completionHandler The completion handler to call when you finish processing the events. +/// Calling this completion handler lets the system know that your app's user interface is +/// updated and a new snapshot can be taken. ++ (void)handleEventsForBackgroundURLSession:(NSString *)identifier + completionHandler:(nullable void (^)(void))completionHandler; + +/// Handles the event when the app is launched by a URL (custom URL scheme or universal link). +/// +/// 1. If SwiftUI lifecycle is adopted, use `onOpenURL(perform:)` to register a handler and call +/// this method in the handler. +/// +/// 2. If UIScene lifecycle is adopted, call this method from +/// `UISceneDelegate.scene(_:willConnectTo:options:)` and +/// `UISceneDelegate.scene(_:openURLContexts:)` when the URL contexts are available. +/// +/// 3. If neither SwiftUI nor UIScene lifecycle is adopted, Firebase Analytics does not require +/// delegation implementation from the AppDelegate. If you choose instead to delegate manually, you +/// can set FirebaseAppDelegateProxyEnabled to boolean `NO` in your app's Info.plist and call this +/// method from `UIApplicationDelegate.application(_:open:options:)` in your app delegate. +/// +/// @param url The URL resource to open. This resource can be a network resource or a file. ++ (void)handleOpenURL:(NSURL *)url; + +/// Handles the event when the app receives data associated with user activity that includes a +/// Universal Link. +/// +/// 1. If SwiftUI lifecycle is adopted, use `onOpenURL(perform:)` to register a handler and call +/// `Analytics.handleOpen(_:)` instead in the handler. +/// +/// 2. If UIScene lifecycle is adopted, call this method from +/// `UISceneDelegate.scene(_:willConnectTo:options:)` and `UISceneDelegate.scene(_:continue:)` when +/// NSUserActivity is available. See the [Apple +/// doc](https://developer.apple.com/documentation/xcode/supporting-universal-links-in-your-app) for +/// more details. +/// +/// 3. If neither SwiftUI nor UIScene lifecycle is adopted, Firebase Analytics does not require +/// delegation implementation from the AppDelegate. If you choose instead to delegate manually, you +/// can set FirebaseAppDelegateProxyEnabled to boolean `NO` in your app's Info.plist and call this +/// method from `UIApplication.application(_:continue:restorationHandler:)` in your app delegate. +/// +/// @param userActivity The activity object containing the data associated with the task the user +/// was performing. ++ (void)handleUserActivity:(id)userActivity; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRAnalytics+Consent.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRAnalytics+Consent.h new file mode 100644 index 0000000..7758390 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRAnalytics+Consent.h @@ -0,0 +1,51 @@ +#import + +#import "FIRAnalytics.h" + +NS_ASSUME_NONNULL_BEGIN + +/// The type of consent to set. Supported consent types are `ConsentType.adStorage`, +/// `ConsentType.analyticsStorage`, `ConsentType.adUserData`, and `ConsentType.adPersonalization`. +/// Omitting a type retains its previous status. +typedef NSString *FIRConsentType NS_TYPED_ENUM NS_SWIFT_NAME(ConsentType); + +/// Enables storage (such as device identifiers) related to advertising. +extern FIRConsentType const FIRConsentTypeAdStorage; + +/// Enables storage (such as app identifiers) related to analytics, e.g. visit duration. +extern FIRConsentType const FIRConsentTypeAnalyticsStorage; + +/// Sets consent for sending user data to Google for advertising purposes. +extern FIRConsentType const FIRConsentTypeAdUserData; + +/// Sets consent for personalized advertising. +extern FIRConsentType const FIRConsentTypeAdPersonalization; + +/// The status value of the consent type. Supported statuses are `ConsentStatus.granted` and +/// `ConsentStatus.denied`. +typedef NSString *FIRConsentStatus NS_TYPED_ENUM NS_SWIFT_NAME(ConsentStatus); + +/// Consent status indicating consent is denied. For an overview of which data is sent when consent +/// is denied, see [SDK behavior with consent +/// mode](https://developers.google.com/tag-platform/security/concepts/consent-mode#tag-behavior). +extern FIRConsentStatus const FIRConsentStatusDenied; + +/// Consent status indicating consent is granted. +extern FIRConsentStatus const FIRConsentStatusGranted; + +/// Sets the applicable end user consent state. +@interface FIRAnalytics (Consent) + +/// Sets the applicable end user consent state (e.g. for device identifiers) for this app on this +/// device. Use the consent settings to specify individual consent type values. Settings are +/// persisted across app sessions. By default consent types are set to `ConsentStatus.granted`. +/// +/// @param consentSettings A Dictionary of consent types. Supported consent type keys are +/// `ConsentType.adStorage`, `ConsentType.analyticsStorage`, `ConsentType.adUserData`, and +/// `ConsentType.adPersonalization`. Valid values are `ConsentStatus.granted` and +/// `ConsentStatus.denied`. ++ (void)setConsent:(NSDictionary *)consentSettings; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRAnalytics+OnDevice.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRAnalytics+OnDevice.h new file mode 100644 index 0000000..5f87c0d --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRAnalytics+OnDevice.h @@ -0,0 +1,51 @@ +#import + +#import "FIRAnalytics.h" + +NS_ASSUME_NONNULL_BEGIN + +API_UNAVAILABLE(macCatalyst, macos, tvos, watchos) +@interface FIRAnalytics (OnDevice) + +/// Initiates on-device conversion measurement given a user email address. Requires dependency +/// GoogleAdsOnDeviceConversion from +/// https://github.com/googleads/google-ads-on-device-conversion-ios-sdk/ to be linked in, otherwise +/// it is a no-op. +/// @param emailAddress User email address. Include a domain name for all email addresses +/// (e.g. gmail.com or hotmail.co.jp). ++ (void)initiateOnDeviceConversionMeasurementWithEmailAddress:(NSString *)emailAddress + NS_SWIFT_NAME(initiateOnDeviceConversionMeasurement(emailAddress:)); + +/// Initiates on-device conversion measurement given a phone number in E.164 format. Requires +/// dependency GoogleAdsOnDeviceConversion from +/// https://github.com/googleads/google-ads-on-device-conversion-ios-sdk/ to be linked in, otherwise +/// it is a no-op. +/// @param phoneNumber User phone number. Must be in E.164 format, which means it must be +/// limited to a maximum of 15 digits and must include a plus sign (+) prefix and country code +/// with no dashes, parentheses, or spaces. ++ (void)initiateOnDeviceConversionMeasurementWithPhoneNumber:(NSString *)phoneNumber + NS_SWIFT_NAME(initiateOnDeviceConversionMeasurement(phoneNumber:)); + +/// Initiates on-device conversion measurement given a sha256-hashed user email address. Requires +/// dependency GoogleAdsOnDeviceConversion from +/// https://github.com/googleads/google-ads-on-device-conversion-ios-sdk/ to be linked in, otherwise +/// it is a no-op. +/// @param hashedEmailAddress User email address as a UTF8-encoded string normalized and hashed +/// according to the instructions at +/// https://firebase.google.com/docs/tutorials/ads-ios-on-device-measurement/step-3. ++ (void)initiateOnDeviceConversionMeasurementWithHashedEmailAddress:(NSData *)hashedEmailAddress + NS_SWIFT_NAME(initiateOnDeviceConversionMeasurement(hashedEmailAddress:)); + +/// Initiates on-device conversion measurement given a sha256-hashed phone number in E.164 format. +/// Requires dependency GoogleAdsOnDeviceConversion from +/// https://github.com/googleads/google-ads-on-device-conversion-ios-sdk/ to be linked in, otherwise +/// it is a no-op. +/// @param hashedPhoneNumber UTF8-encoded user phone number in E.164 format and then hashed +/// according to the instructions at +/// https://firebase.google.com/docs/tutorials/ads-ios-on-device-measurement/step-3. ++ (void)initiateOnDeviceConversionMeasurementWithHashedPhoneNumber:(NSData *)hashedPhoneNumber + NS_SWIFT_NAME(initiateOnDeviceConversionMeasurement(hashedPhoneNumber:)); + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRAnalytics.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRAnalytics.h new file mode 100644 index 0000000..ec88689 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRAnalytics.h @@ -0,0 +1,155 @@ +#import + +#import "FIREventNames.h" +#import "FIRParameterNames.h" +#import "FIRUserPropertyNames.h" + +NS_ASSUME_NONNULL_BEGIN + +/// The top level Firebase Analytics singleton that provides methods for logging events and setting +/// user properties. See the developer guides for general +/// information on using Firebase Analytics in your apps. +/// +/// @note The Analytics SDK uses SQLite to persist events and other app-specific data. Calling +/// certain thread-unsafe global SQLite methods like `sqlite3_shutdown()` can result in +/// unexpected crashes at runtime. +NS_SWIFT_NAME(Analytics) +@interface FIRAnalytics : NSObject + +/// Logs an app event. The event can have up to 25 parameters. Events with the same name must have +/// the same parameters. Up to 500 event names are supported. Using predefined events and/or +/// parameters is recommended for optimal reporting. +/// +/// The following event names are reserved - events with these names will be dropped, and instead an +/// error event will be logged: +///
    +///
  • ad_activeview
  • +///
  • ad_click
  • +///
  • ad_exposure
  • +///
  • ad_query
  • +///
  • ad_reward
  • +///
  • adunit_exposure
  • +///
  • app_clear_data
  • +///
  • app_exception
  • +///
  • app_remove
  • +///
  • app_store_refund
  • +///
  • app_store_subscription_cancel
  • +///
  • app_store_subscription_convert
  • +///
  • app_store_subscription_renew
  • +///
  • app_update
  • +///
  • app_upgrade
  • +///
  • dynamic_link_app_open
  • +///
  • dynamic_link_app_update
  • +///
  • dynamic_link_first_open
  • +///
  • error
  • +///
  • firebase_campaign
  • +///
  • first_open
  • +///
  • first_visit
  • +///
  • notification_dismiss
  • +///
  • notification_foreground
  • +///
  • notification_open
  • +///
  • notification_receive
  • +///
  • os_update
  • +///
  • session_start
  • +///
  • session_start_with_rollout
  • +///
  • user_engagement
  • +///
+/// +/// @param name The name of the event. Should contain 1 to 40 alphanumeric characters or +/// underscores. The name must start with an alphabetic character. Some event names are +/// reserved. See FIREventNames.h for the list of reserved event names. The "firebase_", +/// "google_", and "ga_" prefixes are reserved and should not be used. Note that event names are +/// case-sensitive and that logging two events whose names differ only in case will result in +/// two distinct events. To manually log screen view events, use the `screen_view` event name. +/// @param parameters The dictionary of event parameters. Passing `nil` indicates that the event has +/// no parameters. Parameter names can be up to 40 characters long and must start with an +/// alphabetic character and contain only alphanumeric characters and underscores. Only String, +/// Int, and Double parameter types are supported. String parameter values can be up to 100 +/// characters long for standard Google Analytics properties, and up to 500 characters long for +/// Google Analytics 360 properties. The "firebase_", "google_", and "ga_" prefixes are reserved +/// and should not be used for parameter names. ++ (void)logEventWithName:(NSString *)name + parameters:(nullable NSDictionary *)parameters + NS_SWIFT_NAME(logEvent(_:parameters:)); + +/// Sets a user property to a given value. Up to 25 user property names are supported. Once set, +/// user property values persist throughout the app lifecycle and across sessions. +/// +/// The following user property names are reserved and cannot be used: +///
    +///
  • first_open_time
  • +///
  • last_deep_link_referrer
  • +///
  • user_id
  • +///
+/// +/// @param value The value of the user property. Values can be up to 36 characters long. Setting the +/// value to `nil` removes the user property. +/// @param name The name of the user property to set. Should contain 1 to 24 alphanumeric characters +/// or underscores and must start with an alphabetic character. The "firebase_", "google_", and +/// "ga_" prefixes are reserved and should not be used for user property names. ++ (void)setUserPropertyString:(nullable NSString *)value forName:(NSString *)name + NS_SWIFT_NAME(setUserProperty(_:forName:)); + +/// Sets the user ID property. This feature must be used in accordance with +/// Google's Privacy Policy +/// +/// @param userID The user ID to ascribe to the user of this app on this device, which must be +/// non-empty and no more than 256 characters long. Setting userID to `nil` removes the user ID. ++ (void)setUserID:(nullable NSString *)userID; + +/// Sets whether analytics collection is enabled for this app on this device. This setting is +/// persisted across app sessions. By default it is enabled. +/// +/// @param analyticsCollectionEnabled A flag that enables or disables Analytics collection. ++ (void)setAnalyticsCollectionEnabled:(BOOL)analyticsCollectionEnabled; + +/// Sets the interval of inactivity in seconds that terminates the current session. The default +/// value is 1800 seconds (30 minutes). +/// +/// @param sessionTimeoutInterval The custom time of inactivity in seconds before the current +/// session terminates. ++ (void)setSessionTimeoutInterval:(NSTimeInterval)sessionTimeoutInterval; + +/// Asynchronously retrieves the identifier of the current app session. +/// +/// The session ID retrieval could fail due to Analytics collection disabled, app session expired, +/// etc. +/// +/// @param completion The completion handler to call when the session ID retrieval is complete. This +/// handler is executed on a system-defined global concurrent queue. +/// This completion handler takes the following parameters: +/// sessionID The identifier of the current app session. The value is undefined if the +/// request failed. +/// error An error object that indicates why the request failed, or `nil` if the request +/// was successful. ++ (void)sessionIDWithCompletion:(void (^)(int64_t sessionID, NSError *_Nullable error))completion; + +/// Returns the unique ID for this instance of the application or `nil` if +/// `ConsentType.analyticsStorage` has been set to `ConsentStatus.denied`. +/// +/// @see `FIRAnalytics+Consent.h` ++ (nullable NSString *)appInstanceID; + +/// Clears all analytics data for this instance from the device and resets the app instance ID. ++ (void)resetAnalyticsData; + +/// Adds parameters that will be set on every event logged from the SDK, including automatic ones. +/// The values passed in the parameters dictionary will be added to the dictionary of default event +/// parameters. These parameters persist across app runs. They are of lower precedence than event +/// parameters, so if an event parameter and a parameter set using this API have the same name, the +/// value of the event parameter will be used. The same limitations on event parameters apply to +/// default event parameters. +/// +/// @param parameters Parameters to be added to the dictionary of parameters added to every event. +/// They will be added to the dictionary of default event parameters, replacing any existing +/// parameter with the same name. Valid parameters are String, Int, and Double. Setting a key's +/// value to `NSNull()` will clear that parameter. Passing in a `nil` dictionary will clear all +/// parameters. ++ (void)setDefaultEventParameters:(nullable NSDictionary *)parameters; + +/// Unavailable. +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIREventNames.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIREventNames.h new file mode 100644 index 0000000..701ed88 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIREventNames.h @@ -0,0 +1,438 @@ +/// @file FIREventNames.h +/// +/// Predefined event names. +/// +/// An Event is an important occurrence in your app that you want to measure. You can report up to +/// 500 different types of Events per app and you can associate up to 25 unique parameters with each +/// Event type. Some common events are suggested below, but you may also choose to specify custom +/// Event types that are associated with your specific app. Each event type is identified by a +/// unique name. Event names can be up to 40 characters long, may only contain alphanumeric +/// characters and underscores ("_"), and must start with an alphabetic character. The "firebase_", +/// "google_", and "ga_" prefixes are reserved and should not be used. + +#import + +/// Ad Impression event. This event signifies when a user sees an ad impression. Note: If you supply +/// the @c AnalyticsParameterValue parameter, you must also supply the @c AnalyticsParameterCurrency +/// parameter so that revenue metrics can be computed accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterAdPlatform (String) (optional)
  • +///
  • @c AnalyticsParameterAdFormat (String) (optional)
  • +///
  • @c AnalyticsParameterAdSource (String) (optional)
  • +///
  • @c AnalyticsParameterAdUnitName (String) (optional)
  • +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventAdImpression NS_SWIFT_NAME(AnalyticsEventAdImpression) = + @"ad_impression"; + +/// Add Payment Info event. This event signifies that a user has submitted their payment +/// information. Note: If you supply the @c AnalyticsParameterValue parameter, you must also supply +/// the @c AnalyticsParameterCurrency parameter so that revenue metrics can be computed accurately. +/// Params: +/// +///
    +///
  • @c AnalyticsParameterCoupon (String) (optional)
  • +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterPaymentType (String) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventAddPaymentInfo NS_SWIFT_NAME(AnalyticsEventAddPaymentInfo) = + @"add_payment_info"; + +/// Add Shipping Info event. This event signifies that a user has submitted their shipping +/// information. Note: If you supply the @c AnalyticsParameterValue parameter, you must also supply +/// the @c AnalyticsParameterCurrency parameter so that revenue metrics can be computed accurately. +/// Params: +/// +///
    +///
  • @c AnalyticsParameterCoupon (String) (optional)
  • +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterShippingTier (String) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventAddShippingInfo NS_SWIFT_NAME(AnalyticsEventAddShippingInfo) = + @"add_shipping_info"; + +/// E-Commerce Add To Cart event. This event signifies that an item(s) was added to a cart for +/// purchase. Add this event to a funnel with @c AnalyticsEventPurchase to gauge the effectiveness +/// of your checkout process. Note: If you supply the @c AnalyticsParameterValue parameter, you must +/// also supply the @c AnalyticsParameterCurrency parameter so that revenue metrics can be computed +/// accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventAddToCart NS_SWIFT_NAME(AnalyticsEventAddToCart) = @"add_to_cart"; + +/// E-Commerce Add To Wishlist event. This event signifies that an item was added to a wishlist. Use +/// this event to identify popular gift items. Note: If you supply the @c AnalyticsParameterValue +/// parameter, you must also supply the @c AnalyticsParameterCurrency parameter so that revenue +/// metrics can be computed accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventAddToWishlist NS_SWIFT_NAME(AnalyticsEventAddToWishlist) = + @"add_to_wishlist"; + +/// App Open event. By logging this event when an App becomes active, developers can understand how +/// often users leave and return during the course of a Session. Although Sessions are automatically +/// reported, this event can provide further clarification around the continuous engagement of +/// app-users. +static NSString *const kFIREventAppOpen NS_SWIFT_NAME(AnalyticsEventAppOpen) = @"app_open"; + +/// E-Commerce Begin Checkout event. This event signifies that a user has begun the process of +/// checking out. Add this event to a funnel with your @c AnalyticsEventPurchase event to gauge the +/// effectiveness of your checkout process. Note: If you supply the @c AnalyticsParameterValue +/// parameter, you must also supply the @c AnalyticsParameterCurrency parameter so that revenue +/// metrics can be computed accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterCoupon (String) (optional)
  • +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventBeginCheckout NS_SWIFT_NAME(AnalyticsEventBeginCheckout) = + @"begin_checkout"; + +/// Campaign Detail event. Log this event to supply the referral details of a re-engagement +/// campaign. Note: you must supply at least one of the required parameters +/// AnalyticsParameterSource, AnalyticsParameterMedium or AnalyticsParameterCampaign. Params: +/// +///
    +///
  • @c AnalyticsParameterSource (String)
  • +///
  • @c AnalyticsParameterMedium (String)
  • +///
  • @c AnalyticsParameterCampaign (String)
  • +///
  • @c AnalyticsParameterTerm (String) (optional)
  • +///
  • @c AnalyticsParameterContent (String) (optional)
  • +///
  • @c AnalyticsParameterAdNetworkClickID (String) (optional)
  • +///
  • @c AnalyticsParameterCP1 (String) (optional)
  • +///
  • @c AnalyticsParameterCampaignID (String) (optional)
  • +///
  • @c AnalyticsParameterCreativeFormat (String) (optional)
  • +///
  • @c AnalyticsParameterMarketingTactic (String) (optional)
  • +///
  • @c AnalyticsParameterSourcePlatform (String) (optional)
  • +///
+static NSString *const kFIREventCampaignDetails NS_SWIFT_NAME(AnalyticsEventCampaignDetails) = + @"campaign_details"; + +/// Earn Virtual Currency event. This event tracks the awarding of virtual currency in your app. Log +/// this along with @c AnalyticsEventSpendVirtualCurrency to better understand your virtual economy. +/// Params: +/// +///
    +///
  • @c AnalyticsParameterVirtualCurrencyName (String)
  • +///
  • @c AnalyticsParameterValue (Int or Double)
  • +///
+static NSString *const kFIREventEarnVirtualCurrency + NS_SWIFT_NAME(AnalyticsEventEarnVirtualCurrency) = @"earn_virtual_currency"; + +/// Generate Lead event. Log this event when a lead has been generated in the app to understand the +/// efficacy of your install and re-engagement campaigns. Note: If you supply the +/// @c AnalyticsParameterValue parameter, you must also supply the @c AnalyticsParameterCurrency +/// parameter so that revenue metrics can be computed accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventGenerateLead NS_SWIFT_NAME(AnalyticsEventGenerateLead) = + @"generate_lead"; + +/// In-App Purchase event. This event signifies that extra content or a subscription was purchased +/// by a user inside an app. Note: This is different from the ecommerce purchase event. Note: If you +/// supply the @c AnalyticsParameterValue parameter, you must also supply the +/// @c AnalyticsParameterCurrency parameter so that revenue metrics can be computed accurately. +/// Params: +/// +///
    +///
  • @c AnalyticsParameterCurrency (String)
  • +///
  • @c AnalyticsParameterFreeTrial (Int) (optional)
  • +///
  • @c AnalyticsParameterPrice (Double) (optional)
  • +///
  • @c AnalyticsParameterPriceIsDiscounted (Int) (optional)
  • +///
  • @c AnalyticsParameterProductID (String) (optional)
  • +///
  • @c AnalyticsParameterProductName (String) (optional)
  • +///
  • @c AnalyticsParameterQuantity (Int) (optional)
  • +///
  • @c AnalyticsParameterSubscription (Int) (optional)
  • +///
  • @c AnalyticsParameterValue (Double)
  • +///
+static NSString *const kFIREventInAppPurchase NS_SWIFT_NAME(AnalyticsEventInAppPurchase) = + @"in_app_purchase"; + +/// Join Group event. Log this event when a user joins a group such as a guild, team or family. Use +/// this event to analyze how popular certain groups or social features are in your app. Params: +/// +///
    +///
  • @c AnalyticsParameterGroupID (String)
  • +///
+static NSString *const kFIREventJoinGroup NS_SWIFT_NAME(AnalyticsEventJoinGroup) = @"join_group"; + +/// Level End event. Log this event when the user finishes a level. Params: +/// +///
    +///
  • @c AnalyticsParameterLevelName (String)
  • +///
  • @c AnalyticsParameterSuccess (String)
  • +///
+static NSString *const kFIREventLevelEnd NS_SWIFT_NAME(AnalyticsEventLevelEnd) = @"level_end"; + +/// Level Start event. Log this event when the user starts a new level. Params: +/// +///
    +///
  • @c AnalyticsParameterLevelName (String)
  • +///
+static NSString *const kFIREventLevelStart NS_SWIFT_NAME(AnalyticsEventLevelStart) = @"level_start"; + +/// Level Up event. This event signifies that a player has leveled up in your gaming app. It can +/// help you gauge the level distribution of your userbase and help you identify certain levels that +/// are difficult to pass. Params: +/// +///
    +///
  • @c AnalyticsParameterLevel (Int)
  • +///
  • @c AnalyticsParameterCharacter (String) (optional)
  • +///
+static NSString *const kFIREventLevelUp NS_SWIFT_NAME(AnalyticsEventLevelUp) = @"level_up"; + +/// Login event. Apps with a login feature can report this event to signify that a user has logged +/// in. +static NSString *const kFIREventLogin NS_SWIFT_NAME(AnalyticsEventLogin) = @"login"; + +/// Post Score event. Log this event when the user posts a score in your gaming app. This event can +/// help you understand how users are actually performing in your game and it can help you correlate +/// high scores with certain audiences or behaviors. Params: +/// +///
    +///
  • @c AnalyticsParameterScore (Int)
  • +///
  • @c AnalyticsParameterLevel (Int) (optional)
  • +///
  • @c AnalyticsParameterCharacter (String) (optional)
  • +///
+static NSString *const kFIREventPostScore NS_SWIFT_NAME(AnalyticsEventPostScore) = @"post_score"; + +/// E-Commerce Purchase event. This event signifies that an item(s) was purchased by a user. Note: +/// This is different from the in-app purchase event, which is reported automatically for App +/// Store-based apps. Note: If you supply the @c AnalyticsParameterValue parameter, you must also +/// supply the @c AnalyticsParameterCurrency parameter so that revenue metrics can be computed +/// accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterAffiliation (String) (optional)
  • +///
  • @c AnalyticsParameterCoupon (String) (optional)
  • +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterEndDate (String) (optional)
  • +///
  • @c AnalyticsParameterItemID (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterShipping (Double) (optional)
  • +///
  • @c AnalyticsParameterStartDate (String) (optional)
  • +///
  • @c AnalyticsParameterTax (Double) (optional)
  • +///
  • @c AnalyticsParameterTransactionID (String) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventPurchase NS_SWIFT_NAME(AnalyticsEventPurchase) = @"purchase"; + +/// E-Commerce Refund event. This event signifies that a refund was issued. Note: If you supply the +/// @c AnalyticsParameterValue parameter, you must also supply the @c AnalyticsParameterCurrency +/// parameter so that revenue metrics can be computed accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterAffiliation (String) (optional)
  • +///
  • @c AnalyticsParameterCoupon (String) (optional)
  • +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterShipping (Double) (optional)
  • +///
  • @c AnalyticsParameterTax (Double) (optional)
  • +///
  • @c AnalyticsParameterTransactionID (String) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventRefund NS_SWIFT_NAME(AnalyticsEventRefund) = @"refund"; + +/// E-Commerce Remove from Cart event. This event signifies that an item(s) was removed from a cart. +/// Note: If you supply the @c AnalyticsParameterValue parameter, you must also supply the @c +/// AnalyticsParameterCurrency parameter so that revenue metrics can be computed accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventRemoveFromCart NS_SWIFT_NAME(AnalyticsEventRemoveFromCart) = + @"remove_from_cart"; + +/// Screen View event. This event signifies a screen view. Use this when a screen transition occurs. +/// This event can be logged irrespective of whether automatic screen tracking is enabled. Params: +/// +///
    +///
  • @c AnalyticsParameterScreenClass (String) (optional)
  • +///
  • @c AnalyticsParameterScreenName (String) (optional)
  • +///
+static NSString *const kFIREventScreenView NS_SWIFT_NAME(AnalyticsEventScreenView) = @"screen_view"; + +/// Search event. Apps that support search features can use this event to contextualize search +/// operations by supplying the appropriate, corresponding parameters. This event can help you +/// identify the most popular content in your app. Params: +/// +///
    +///
  • @c AnalyticsParameterSearchTerm (String)
  • +///
  • @c AnalyticsParameterStartDate (String) (optional)
  • +///
  • @c AnalyticsParameterEndDate (String) (optional)
  • +///
  • @c AnalyticsParameterNumberOfNights (Int) (optional) for hotel bookings
  • +///
  • @c AnalyticsParameterNumberOfRooms (Int) (optional) for hotel bookings
  • +///
  • @c AnalyticsParameterNumberOfPassengers (Int) (optional) for travel bookings
  • +///
  • @c AnalyticsParameterOrigin (String) (optional)
  • +///
  • @c AnalyticsParameterDestination (String) (optional)
  • +///
  • @c AnalyticsParameterTravelClass (String) (optional) for travel bookings
  • +///
+static NSString *const kFIREventSearch NS_SWIFT_NAME(AnalyticsEventSearch) = @"search"; + +/// Select Content event. This general purpose event signifies that a user has selected some content +/// of a certain type in an app. The content can be any object in your app. This event can help you +/// identify popular content and categories of content in your app. Params: +/// +///
    +///
  • @c AnalyticsParameterContentType (String)
  • +///
  • @c AnalyticsParameterItemID (String)
  • +///
+static NSString *const kFIREventSelectContent NS_SWIFT_NAME(AnalyticsEventSelectContent) = + @"select_content"; + +/// Select Item event. This event signifies that an item was selected by a user from a list. Use the +/// appropriate parameters to contextualize the event. Use this event to discover the most popular +/// items selected. Params: +/// +///
    +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterItemListID (String) (optional)
  • +///
  • @c AnalyticsParameterItemListName (String) (optional)
  • +///
+static NSString *const kFIREventSelectItem NS_SWIFT_NAME(AnalyticsEventSelectItem) = @"select_item"; + +/// Select promotion event. This event signifies that a user has selected a promotion offer. Use the +/// appropriate parameters to contextualize the event, such as the item(s) for which the promotion +/// applies. Params: +/// +///
    +///
  • @c AnalyticsParameterCreativeName (String) (optional)
  • +///
  • @c AnalyticsParameterCreativeSlot (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterLocationID (String) (optional)
  • +///
  • @c AnalyticsParameterPromotionID (String) (optional)
  • +///
  • @c AnalyticsParameterPromotionName (String) (optional)
  • +///
+static NSString *const kFIREventSelectPromotion NS_SWIFT_NAME(AnalyticsEventSelectPromotion) = + @"select_promotion"; + +/// Share event. Apps with social features can log the Share event to identify the most viral +/// content. Params: +/// +///
    +///
  • @c AnalyticsParameterContentType (String)
  • +///
  • @c AnalyticsParameterItemID (String)
  • +///
+static NSString *const kFIREventShare NS_SWIFT_NAME(AnalyticsEventShare) = @"share"; + +/// Sign Up event. This event indicates that a user has signed up for an account in your app. The +/// parameter signifies the method by which the user signed up. Use this event to understand the +/// different behaviors between logged in and logged out users. Params: +/// +///
    +///
  • @c AnalyticsParameterMethod (String)
  • +///
+static NSString *const kFIREventSignUp NS_SWIFT_NAME(AnalyticsEventSignUp) = @"sign_up"; + +/// Spend Virtual Currency event. This event tracks the sale of virtual goods in your app and can +/// help you identify which virtual goods are the most popular objects of purchase. Params: +/// +///
    +///
  • @c AnalyticsParameterItemName (String)
  • +///
  • @c AnalyticsParameterVirtualCurrencyName (String)
  • +///
  • @c AnalyticsParameterValue (Int or Double)
  • +///
+static NSString *const kFIREventSpendVirtualCurrency + NS_SWIFT_NAME(AnalyticsEventSpendVirtualCurrency) = @"spend_virtual_currency"; + +/// Tutorial Begin event. This event signifies the start of the on-boarding process in your app. Use +/// this in a funnel with @c AnalyticsEventTutorialComplete to understand how many users complete +/// this process and move on to the full app experience. +static NSString *const kFIREventTutorialBegin NS_SWIFT_NAME(AnalyticsEventTutorialBegin) = + @"tutorial_begin"; + +/// Tutorial End event. Use this event to signify the user's completion of your app's on-boarding +/// process. Add this to a funnel with @c AnalyticsEventTutorialBegin to gauge the completion rate +/// of your on-boarding process. +static NSString *const kFIREventTutorialComplete NS_SWIFT_NAME(AnalyticsEventTutorialComplete) = + @"tutorial_complete"; + +/// Unlock Achievement event. Log this event when the user has unlocked an achievement in your +/// game. Since achievements generally represent the breadth of a gaming experience, this event can +/// help you understand how many users are experiencing all that your game has to offer. Params: +/// +///
    +///
  • @c AnalyticsParameterAchievementID (String)
  • +///
+static NSString *const kFIREventUnlockAchievement NS_SWIFT_NAME(AnalyticsEventUnlockAchievement) = + @"unlock_achievement"; + +/// E-commerce View Cart event. This event signifies that a user has viewed their cart. Use this to +/// analyze your purchase funnel. Note: If you supply the @c AnalyticsParameterValue parameter, you +/// must also supply the @c AnalyticsParameterCurrency parameter so that revenue metrics can be +/// computed accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventViewCart NS_SWIFT_NAME(AnalyticsEventViewCart) = @"view_cart"; + +/// View Item event. This event signifies that a user has viewed an item. Use the appropriate +/// parameters to contextualize the event. Use this event to discover the most popular items viewed +/// in your app. Note: If you supply the @c AnalyticsParameterValue parameter, you must also supply +/// the @c AnalyticsParameterCurrency parameter so that revenue metrics can be computed accurately. +/// Params: +/// +///
    +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventViewItem NS_SWIFT_NAME(AnalyticsEventViewItem) = @"view_item"; + +/// View Item List event. Log this event when a user sees a list of items or offerings. Params: +/// +///
    +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterItemListID (String) (optional)
  • +///
  • @c AnalyticsParameterItemListName (String) (optional)
  • +///
+static NSString *const kFIREventViewItemList NS_SWIFT_NAME(AnalyticsEventViewItemList) = + @"view_item_list"; + +/// View Promotion event. This event signifies that a promotion was shown to a user. Add this event +/// to a funnel with the @c AnalyticsEventAddToCart and @c AnalyticsEventPurchase to gauge your +/// conversion process. Params: +/// +///
    +///
  • @c AnalyticsParameterCreativeName (String) (optional)
  • +///
  • @c AnalyticsParameterCreativeSlot (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterLocationID (String) (optional)
  • +///
  • @c AnalyticsParameterPromotionID (String) (optional)
  • +///
  • @c AnalyticsParameterPromotionName (String) (optional)
  • +///
+static NSString *const kFIREventViewPromotion NS_SWIFT_NAME(AnalyticsEventViewPromotion) = + @"view_promotion"; + +/// View Search Results event. Log this event when the user has been presented with the results of a +/// search. Params: +/// +///
    +///
  • @c AnalyticsParameterSearchTerm (String)
  • +///
+static NSString *const kFIREventViewSearchResults NS_SWIFT_NAME(AnalyticsEventViewSearchResults) = + @"view_search_results"; diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRParameterNames.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRParameterNames.h new file mode 100644 index 0000000..f0e782a --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRParameterNames.h @@ -0,0 +1,775 @@ +/// @file FIRParameterNames.h +/// +/// Predefined event parameter names. +/// +/// Params supply information that contextualize Events. You can associate up to 25 unique Params +/// with each Event type. Some Params are suggested below for certain common Events, but you are +/// not limited to these. You may supply extra Params for suggested Events or custom Params for +/// Custom events. Param names can be up to 40 characters long, may only contain alphanumeric +/// characters and underscores ("_"), and must start with an alphabetic character. Param values can +/// be up to 100 characters long for standard Google Analytics properties and up to 500 characters +/// long for Google Analytics 360 properties. The "firebase_", "google_", and "ga_" prefixes are +/// reserved and should not be used. + +#import + +/// Game achievement ID (String). +///
+///     let params = [
+///       AnalyticsParameterAchievementID : "10_matches_won",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterAchievementID NS_SWIFT_NAME(AnalyticsParameterAchievementID) = + @"achievement_id"; + +/// The ad format (e.g. Banner, Interstitial, Rewarded, Native, Rewarded Interstitial, Instream). +/// (String). +///
+///     let params = [
+///       AnalyticsParameterAdFormat : "Banner",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterAdFormat NS_SWIFT_NAME(AnalyticsParameterAdFormat) = + @"ad_format"; + +/// Ad Network Click ID (String). Used for network-specific click IDs which vary in format. +///
+///     let params = [
+///       AnalyticsParameterAdNetworkClickID : "1234567",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterAdNetworkClickID + NS_SWIFT_NAME(AnalyticsParameterAdNetworkClickID) = @"aclid"; + +/// The ad platform (e.g. MoPub, IronSource) (String). +///
+///     let params = [
+///       AnalyticsParameterAdPlatform : "MoPub",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterAdPlatform NS_SWIFT_NAME(AnalyticsParameterAdPlatform) = + @"ad_platform"; + +/// The ad source (e.g. AdColony) (String). +///
+///     let params = [
+///       AnalyticsParameterAdSource : "AdColony",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterAdSource NS_SWIFT_NAME(AnalyticsParameterAdSource) = + @"ad_source"; + +/// The ad unit name (e.g. Banner_03) (String). +///
+///     let params = [
+///       AnalyticsParameterAdUnitName : "Banner_03",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterAdUnitName NS_SWIFT_NAME(AnalyticsParameterAdUnitName) = + @"ad_unit_name"; + +/// A product affiliation to designate a supplying company or brick and mortar store location +/// (String).
+///     let params = [
+///       AnalyticsParameterAffiliation : "Google Store",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterAffiliation NS_SWIFT_NAME(AnalyticsParameterAffiliation) = + @"affiliation"; + +/// Campaign custom parameter (String). Used as a method of capturing custom data in a campaign. +/// Use varies by network. +///
+///     let params = [
+///       AnalyticsParameterCP1 : "custom_data",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCP1 NS_SWIFT_NAME(AnalyticsParameterCP1) = @"cp1"; + +/// The individual campaign name, slogan, promo code, etc. Some networks have pre-defined macro to +/// capture campaign information, otherwise can be populated by developer. Highly Recommended +/// (String). +///
+///     let params = [
+///       AnalyticsParameterCampaign : "winter_promotion",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCampaign NS_SWIFT_NAME(AnalyticsParameterCampaign) = + @"campaign"; + +/// Campaign ID (String). Used for keyword analysis to identify a specific product promotion or +/// strategic campaign. This is a required key for GA4 data import. +///
+///     let params = [
+///       AnalyticsParameterCampaignID : "7877652710",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCampaignID NS_SWIFT_NAME(AnalyticsParameterCampaignID) = + @"campaign_id"; + +/// Character used in game (String). +///
+///     let params = [
+///       AnalyticsParameterCharacter : "beat_boss",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCharacter NS_SWIFT_NAME(AnalyticsParameterCharacter) = + @"character"; + +/// Campaign content (String). +static NSString *const kFIRParameterContent NS_SWIFT_NAME(AnalyticsParameterContent) = @"content"; + +/// Type of content selected (String). +///
+///     let params = [
+///       AnalyticsParameterContentType : "news article",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterContentType NS_SWIFT_NAME(AnalyticsParameterContentType) = + @"content_type"; + +/// Coupon code used for a purchase (String). +///
+///     let params = [
+///       AnalyticsParameterCoupon : "SUMMER_FUN",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCoupon NS_SWIFT_NAME(AnalyticsParameterCoupon) = @"coupon"; + +/// Creative Format (String). Used to identify the high-level classification of the type of ad +/// served by a specific campaign. +///
+///     let params = [
+///       AnalyticsParameterCreativeFormat : "display",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCreativeFormat NS_SWIFT_NAME(AnalyticsParameterCreativeFormat) = + @"creative_format"; + +/// The name of a creative used in a promotional spot (String). +///
+///     let params = [
+///       AnalyticsParameterCreativeName : "Summer Sale",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCreativeName NS_SWIFT_NAME(AnalyticsParameterCreativeName) = + @"creative_name"; + +/// The name of a creative slot (String). +///
+///     let params = [
+///       AnalyticsParameterCreativeSlot : "summer_banner2",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCreativeSlot NS_SWIFT_NAME(AnalyticsParameterCreativeSlot) = + @"creative_slot"; + +/// Currency of the purchase or items associated with the event, in 3-letter +/// ISO_4217 format (String). +///
+///     let params = [
+///       AnalyticsParameterCurrency : "USD",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCurrency NS_SWIFT_NAME(AnalyticsParameterCurrency) = + @"currency"; + +/// Flight or Travel destination (String). +///
+///     let params = [
+///       AnalyticsParameterDestination : "Mountain View, CA",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterDestination NS_SWIFT_NAME(AnalyticsParameterDestination) = + @"destination"; + +/// Monetary value of discount associated with a purchase (Double). +///
+///     let params = [
+///       AnalyticsParameterDiscount : 2.0,
+///       AnalyticsParameterCurrency : "USD",  // e.g. $2.00 USD
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterDiscount NS_SWIFT_NAME(AnalyticsParameterDiscount) = + @"discount"; + +/// The arrival date, check-out date or rental end date for the item. This should be in +/// YYYY-MM-DD format (String). +///
+///     let params = [
+///       AnalyticsParameterEndDate : "2015-09-14",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterEndDate NS_SWIFT_NAME(AnalyticsParameterEndDate) = @"end_date"; + +/// Indicates that the associated event should either extend the current session or start a new +/// session if no session was active when the event was logged. Specify 1 to extend the current +/// session or to start a new session; any other value will not extend or start a session. +///
+///     let params = [
+///       AnalyticsParameterExtendSession : 1,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterExtendSession NS_SWIFT_NAME(AnalyticsParameterExtendSession) = + @"extend_session"; + +/// Flight number for travel events (String). +///
+///     let params = [
+///       AnalyticsParameterFlightNumber : "ZZ800",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterFlightNumber NS_SWIFT_NAME(AnalyticsParameterFlightNumber) = + @"flight_number"; + +/// Indicates if the user is on a free trial of a subscription. Specify 1 to indicate true and 0 to +/// indicate false (Int). +///
+///     let params = [
+///       AnalyticsParameterFreeTrial : 1,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterFreeTrial NS_SWIFT_NAME(AnalyticsParameterFreeTrial) = + @"free_trial"; + +/// Group/clan/guild ID (String). +///
+///     let params = [
+///       AnalyticsParameterGroupID : "g1",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterGroupID NS_SWIFT_NAME(AnalyticsParameterGroupID) = @"group_id"; + +/// The index of the item in a list (Int). +///
+///     let params = [
+///       AnalyticsParameterIndex : 5,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterIndex NS_SWIFT_NAME(AnalyticsParameterIndex) = @"index"; + +/// Item brand (String). +///
+///     let params = [
+///       AnalyticsParameterItemBrand : "Google",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemBrand NS_SWIFT_NAME(AnalyticsParameterItemBrand) = + @"item_brand"; + +/// Item category (context-specific) (String). +///
+///     let params = [
+///       AnalyticsParameterItemCategory : "pants",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemCategory NS_SWIFT_NAME(AnalyticsParameterItemCategory) = + @"item_category"; + +/// Item Category (context-specific) (String). +///
+///     let params = [
+///       AnalyticsParameterItemCategory2 : "pants",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemCategory2 NS_SWIFT_NAME(AnalyticsParameterItemCategory2) = + @"item_category2"; + +/// Item Category (context-specific) (String). +///
+///     let params = [
+///       AnalyticsParameterItemCategory3 : "pants",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemCategory3 NS_SWIFT_NAME(AnalyticsParameterItemCategory3) = + @"item_category3"; + +/// Item Category (context-specific) (String). +///
+///     let params = [
+///       AnalyticsParameterItemCategory4 : "pants",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemCategory4 NS_SWIFT_NAME(AnalyticsParameterItemCategory4) = + @"item_category4"; + +/// Item Category (context-specific) (String). +///
+///     let params = [
+///       AnalyticsParameterItemCategory5 : "pants",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemCategory5 NS_SWIFT_NAME(AnalyticsParameterItemCategory5) = + @"item_category5"; + +/// Item ID (context-specific) (String). +///
+///     let params = [
+///       AnalyticsParameterItemID : "SKU_12345",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemID NS_SWIFT_NAME(AnalyticsParameterItemID) = @"item_id"; + +/// The ID of the list in which the item was presented to the user (String). +///
+///     let params = [
+///       AnalyticsParameterItemListID : "ABC123",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemListID NS_SWIFT_NAME(AnalyticsParameterItemListID) = + @"item_list_id"; + +/// The name of the list in which the item was presented to the user (String). +///
+///     let params = [
+///       AnalyticsParameterItemListName : "Related products",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemListName NS_SWIFT_NAME(AnalyticsParameterItemListName) = + @"item_list_name"; + +/// Item Name (context-specific) (String). +///
+///     let params = [
+///       AnalyticsParameterItemName : "jeggings",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemName NS_SWIFT_NAME(AnalyticsParameterItemName) = + @"item_name"; + +/// Item variant (String). +///
+///     let params = [
+///       AnalyticsParameterItemVariant : "Black",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemVariant NS_SWIFT_NAME(AnalyticsParameterItemVariant) = + @"item_variant"; + +/// The list of items involved in the transaction expressed as `[[String: Any]]`. +///
+///     let params = [
+///       AnalyticsParameterItems : [
+///         [AnalyticsParameterItemName : "jeggings", AnalyticsParameterItemCategory : "pants"],
+///         [AnalyticsParameterItemName : "boots", AnalyticsParameterItemCategory : "shoes"],
+///       ],
+///     ]
+/// 
+static NSString *const kFIRParameterItems NS_SWIFT_NAME(AnalyticsParameterItems) = @"items"; + +/// Level in game (Int). +///
+///     let params = [
+///       AnalyticsParameterLevel : 42,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterLevel NS_SWIFT_NAME(AnalyticsParameterLevel) = @"level"; + +/// The name of a level in a game (String). +///
+///     let params = [
+///       AnalyticsParameterLevelName : "room_1",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterLevelName NS_SWIFT_NAME(AnalyticsParameterLevelName) = + @"level_name"; + +/// Location (String). The Google Place ID +/// that corresponds to the associated event. Alternatively, you can supply your own custom +/// Location ID. +///
+///     let params = [
+///       AnalyticsParameterLocation : "ChIJiyj437sx3YAR9kUWC8QkLzQ",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterLocation NS_SWIFT_NAME(AnalyticsParameterLocation) = + @"location"; + +/// The location associated with the event. Preferred to be the Google +/// Place ID that corresponds to the +/// associated item but could be overridden to a custom location ID string.(String). +///
+///     let params = [
+///       AnalyticsParameterLocationID : "ChIJiyj437sx3YAR9kUWC8QkLzQ",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterLocationID NS_SWIFT_NAME(AnalyticsParameterLocationID) = + @"location_id"; + +/// Marketing Tactic (String). Used to identify the targeting criteria applied to a specific +/// campaign. +///
+///     let params = [
+///       AnalyticsParameterMarketingTactic : "Remarketing",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterMarketingTactic + NS_SWIFT_NAME(AnalyticsParameterMarketingTactic) = @"marketing_tactic"; + +/// The advertising or marketing medium, for example: cpc, banner, email, push. Highly recommended +/// (String). +///
+///     let params = [
+///       AnalyticsParameterMedium : "email",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterMedium NS_SWIFT_NAME(AnalyticsParameterMedium) = @"medium"; + +/// A particular approach used in an operation; for example, "facebook" or "email" in the context +/// of a sign_up or login event. (String). +///
+///     let params = [
+///       AnalyticsParameterMethod : "google",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterMethod NS_SWIFT_NAME(AnalyticsParameterMethod) = @"method"; + +/// Number of nights staying at hotel (Int). +///
+///     let params = [
+///       AnalyticsParameterNumberOfNights : 3,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterNumberOfNights + NS_SWIFT_NAME(AnalyticsParameterNumberOfNights) = @"number_of_nights"; + +/// Number of passengers traveling (Int). +///
+///     let params = [
+///       AnalyticsParameterNumberOfPassengers : 11,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterNumberOfPassengers + NS_SWIFT_NAME(AnalyticsParameterNumberOfPassengers) = @"number_of_passengers"; + +/// Number of rooms for travel events (Int). +///
+///     let params = [
+///       AnalyticsParameterNumberOfRooms : 2,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterNumberOfRooms NS_SWIFT_NAME(AnalyticsParameterNumberOfRooms) = + @"number_of_rooms"; + +/// Flight or Travel origin (String). +///
+///     let params = [
+///       AnalyticsParameterOrigin : "Mountain View, CA",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterOrigin NS_SWIFT_NAME(AnalyticsParameterOrigin) = @"origin"; + +/// The chosen method of payment (String). +///
+///     let params = [
+///       AnalyticsParameterPaymentType : "Visa",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterPaymentType NS_SWIFT_NAME(AnalyticsParameterPaymentType) = + @"payment_type"; + +/// Purchase price (Double). +///
+///     let params = [
+///       AnalyticsParameterPrice : 1.0,
+///       AnalyticsParameterCurrency : "USD",  // e.g. $1.00 USD
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterPrice NS_SWIFT_NAME(AnalyticsParameterPrice) = @"price"; + +/// Indicates if an item's price is discounted. Specify 1 to indicate true and 0 to indicate false +/// (Int). +///
+///     let params = [
+///       AnalyticsParameterPriceIsDiscounted : 1,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterPriceIsDiscounted + NS_SWIFT_NAME(AnalyticsParameterPriceIsDiscounted) = @"price_is_discounted"; + +/// The ID of a product (String). +///
+///     let params = [
+///       AnalyticsParameterProductID : "PROD_12345",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterProductID NS_SWIFT_NAME(AnalyticsParameterProductID) = + @"product_id"; + +/// The name of a product (String). +///
+///     let params = [
+///       AnalyticsParameterProductName : "My Awesome Product",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterProductName NS_SWIFT_NAME(AnalyticsParameterProductName) = + @"product_name"; + +/// The ID of a product promotion (String). +///
+///     let params = [
+///       AnalyticsParameterPromotionID : "ABC123",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterPromotionID NS_SWIFT_NAME(AnalyticsParameterPromotionID) = + @"promotion_id"; + +/// The name of a product promotion (String). +///
+///     let params = [
+///       AnalyticsParameterPromotionName : "Summer Sale",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterPromotionName NS_SWIFT_NAME(AnalyticsParameterPromotionName) = + @"promotion_name"; + +/// Purchase quantity (Int). +///
+///     let params = [
+///       AnalyticsParameterQuantity : 1,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterQuantity NS_SWIFT_NAME(AnalyticsParameterQuantity) = + @"quantity"; + +/// Score in game (Int). +///
+///     let params = [
+///       AnalyticsParameterScore : 4200,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterScore NS_SWIFT_NAME(AnalyticsParameterScore) = @"score"; + +/// Current screen class, such as the class name of the UIViewController, logged with screen_view +/// event and added to every event (String). +///
+///     let params = [
+///       AnalyticsParameterScreenClass : "LoginViewController",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterScreenClass NS_SWIFT_NAME(AnalyticsParameterScreenClass) = + @"screen_class"; + +/// Current screen name, such as the name of the UIViewController, logged with screen_view event and +/// added to every event (String). +///
+///     let params = [
+///       AnalyticsParameterScreenName : "LoginView",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterScreenName NS_SWIFT_NAME(AnalyticsParameterScreenName) = + @"screen_name"; + +/// The search string/keywords used (String). +///
+///     let params = [
+///       AnalyticsParameterSearchTerm : "periodic table",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterSearchTerm NS_SWIFT_NAME(AnalyticsParameterSearchTerm) = + @"search_term"; + +/// Shipping cost associated with a transaction (Double). +///
+///     let params = [
+///       AnalyticsParameterShipping : 5.99,
+///       AnalyticsParameterCurrency : "USD",  // e.g. $5.99 USD
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterShipping NS_SWIFT_NAME(AnalyticsParameterShipping) = + @"shipping"; + +/// The shipping tier (e.g. Ground, Air, Next-day) selected for delivery of the purchased item +/// (String). +///
+///     let params = [
+///       AnalyticsParameterShippingTier : "Ground",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterShippingTier NS_SWIFT_NAME(AnalyticsParameterShippingTier) = + @"shipping_tier"; + +/// The origin of your traffic, such as an Ad network (for example, google) or partner (urban +/// airship). Identify the advertiser, site, publication, etc. that is sending traffic to your +/// property. Highly recommended (String). +///
+///     let params = [
+///       AnalyticsParameterSource : "InMobi",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterSource NS_SWIFT_NAME(AnalyticsParameterSource) = @"source"; + +/// Source Platform (String). Used to identify the platform responsible for directing traffic to a +/// given Analytics property (e.g., a buying platform where budgets, targeting criteria, etc. are +/// set, a platform for managing organic traffic data, etc.). +///
+///     let params = [
+///       AnalyticsParameterSourcePlatform : "sa360",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterSourcePlatform NS_SWIFT_NAME(AnalyticsParameterSourcePlatform) = + @"source_platform"; + +/// The departure date, check-in date or rental start date for the item. This should be in +/// YYYY-MM-DD format (String). +///
+///     let params = [
+///       AnalyticsParameterStartDate : "2015-09-14",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterStartDate NS_SWIFT_NAME(AnalyticsParameterStartDate) = + @"start_date"; + +/// Indicates if the purchase is a subscription. Specify 1 to indicate true and 0 to indicate false +/// (Int). +///
+///     let params = [
+///       AnalyticsParameterSubscription : 1,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterSubscription NS_SWIFT_NAME(AnalyticsParameterSubscription) = + @"subscription"; + +/// The result of an operation. Specify 1 to indicate success and 0 to indicate failure (Int). +///
+///     let params = [
+///       AnalyticsParameterSuccess : 1,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterSuccess NS_SWIFT_NAME(AnalyticsParameterSuccess) = @"success"; + +/// Tax cost associated with a transaction (Double). +///
+///     let params = [
+///       AnalyticsParameterTax : 2.43,
+///       AnalyticsParameterCurrency : "USD",  // e.g. $2.43 USD
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterTax NS_SWIFT_NAME(AnalyticsParameterTax) = @"tax"; + +/// If you're manually tagging keyword campaigns, you should use utm_term to specify the keyword +/// (String). +///
+///     let params = [
+///       AnalyticsParameterTerm : "game",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterTerm NS_SWIFT_NAME(AnalyticsParameterTerm) = @"term"; + +/// The unique identifier of a transaction (String). +///
+///     let params = [
+///       AnalyticsParameterTransactionID : "T12345",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterTransactionID NS_SWIFT_NAME(AnalyticsParameterTransactionID) = + @"transaction_id"; + +/// Travel class (String). +///
+///     let params = [
+///       AnalyticsParameterTravelClass : "business",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterTravelClass NS_SWIFT_NAME(AnalyticsParameterTravelClass) = + @"travel_class"; + +/// A context-specific numeric value which is accumulated automatically for each event type. This is +/// a general purpose parameter that is useful for accumulating a key metric that pertains to an +/// event. Examples include revenue, distance, time and points. Value should be specified as Int or +/// Double. +/// Notes: Values for pre-defined currency-related events (such as @c AnalyticsEventAddToCart) +/// should be supplied using Double and must be accompanied by a @c AnalyticsParameterCurrency +/// parameter. The valid range of accumulated values is +/// [-9,223,372,036,854.77, 9,223,372,036,854.77]. Supplying a non-numeric value, omitting the +/// corresponding @c AnalyticsParameterCurrency parameter, or supplying an invalid +/// currency code for conversion events will cause that +/// conversion to be omitted from reporting. +///
+///     let params = [
+///       AnalyticsParameterValue : 3.99,
+///       AnalyticsParameterCurrency : "USD",  // e.g. $3.99 USD
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterValue NS_SWIFT_NAME(AnalyticsParameterValue) = @"value"; + +/// Name of virtual currency type (String). +///
+///     let params = [
+///       AnalyticsParameterVirtualCurrencyName : "virtual_currency_name",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterVirtualCurrencyName + NS_SWIFT_NAME(AnalyticsParameterVirtualCurrencyName) = @"virtual_currency_name"; diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRUserPropertyNames.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRUserPropertyNames.h new file mode 100644 index 0000000..2442d8a --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRUserPropertyNames.h @@ -0,0 +1,28 @@ +/// @file FIRUserPropertyNames.h +/// +/// Predefined user property names. +/// +/// A UserProperty is an attribute that describes the app-user. By supplying UserProperties, you can +/// later analyze different behaviors of various segments of your userbase. You may supply up to 25 +/// unique UserProperties per app, and you can use the name and value of your choosing for each one. +/// UserProperty names can be up to 24 characters long, may only contain alphanumeric characters and +/// underscores ("_"), and must start with an alphabetic character. UserProperty values can be up to +/// 36 characters long. The "firebase_", "google_", and "ga_" prefixes are reserved and should not +/// be used. + +#import + +/// Indicates whether events logged by Google Analytics can be used to personalize ads for the user. +/// Set to "YES" to enable, or "NO" to disable. Default is enabled. See the +/// documentation for +/// more details and information about related settings. +/// +///
+///     Analytics.setUserProperty("NO", forName: AnalyticsUserPropertyAllowAdPersonalizationSignals)
+/// 
+static NSString *const kFIRUserPropertyAllowAdPersonalizationSignals + NS_SWIFT_NAME(AnalyticsUserPropertyAllowAdPersonalizationSignals) = @"allow_personalized_ads"; + +/// The method used to sign in. For example, "google", "facebook" or "twitter". +static NSString *const kFIRUserPropertySignUpMethod + NS_SWIFT_NAME(AnalyticsUserPropertySignUpMethod) = @"sign_up_method"; diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FirebaseAnalytics-Swift.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FirebaseAnalytics-Swift.h new file mode 100644 index 0000000..b409e3a --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FirebaseAnalytics-Swift.h @@ -0,0 +1,628 @@ +#if 0 +#elif defined(__arm64__) && __arm64__ +// Generated by Apple Swift version 6.0.3 effective-5.10 (swiftlang-6.0.3.1.10 clang-1600.0.30.1) +#ifndef FIREBASEANALYTICS_SWIFT_H +#define FIREBASEANALYTICS_SWIFT_H +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgcc-compat" + +#if !defined(__has_include) +# define __has_include(x) 0 +#endif +#if !defined(__has_attribute) +# define __has_attribute(x) 0 +#endif +#if !defined(__has_feature) +# define __has_feature(x) 0 +#endif +#if !defined(__has_warning) +# define __has_warning(x) 0 +#endif + +#if __has_include() +# include +#endif + +#pragma clang diagnostic ignored "-Wauto-import" +#if defined(__OBJC__) +#include +#endif +#if defined(__cplusplus) +#include +#include +#include +#include +#include +#include +#include +#else +#include +#include +#include +#include +#endif +#if defined(__cplusplus) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wnon-modular-include-in-framework-module" +#if defined(__arm64e__) && __has_include() +# include +#else +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wreserved-macro-identifier" +# ifndef __ptrauth_swift_value_witness_function_pointer +# define __ptrauth_swift_value_witness_function_pointer(x) +# endif +# ifndef __ptrauth_swift_class_method_pointer +# define __ptrauth_swift_class_method_pointer(x) +# endif +#pragma clang diagnostic pop +#endif +#pragma clang diagnostic pop +#endif + +#if !defined(SWIFT_TYPEDEFS) +# define SWIFT_TYPEDEFS 1 +# if __has_include() +# include +# elif !defined(__cplusplus) +typedef uint_least16_t char16_t; +typedef uint_least32_t char32_t; +# endif +typedef float swift_float2 __attribute__((__ext_vector_type__(2))); +typedef float swift_float3 __attribute__((__ext_vector_type__(3))); +typedef float swift_float4 __attribute__((__ext_vector_type__(4))); +typedef double swift_double2 __attribute__((__ext_vector_type__(2))); +typedef double swift_double3 __attribute__((__ext_vector_type__(3))); +typedef double swift_double4 __attribute__((__ext_vector_type__(4))); +typedef int swift_int2 __attribute__((__ext_vector_type__(2))); +typedef int swift_int3 __attribute__((__ext_vector_type__(3))); +typedef int swift_int4 __attribute__((__ext_vector_type__(4))); +typedef unsigned int swift_uint2 __attribute__((__ext_vector_type__(2))); +typedef unsigned int swift_uint3 __attribute__((__ext_vector_type__(3))); +typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); +#endif + +#if !defined(SWIFT_PASTE) +# define SWIFT_PASTE_HELPER(x, y) x##y +# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y) +#endif +#if !defined(SWIFT_METATYPE) +# define SWIFT_METATYPE(X) Class +#endif +#if !defined(SWIFT_CLASS_PROPERTY) +# if __has_feature(objc_class_property) +# define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__ +# else +# define SWIFT_CLASS_PROPERTY(...) +# endif +#endif +#if !defined(SWIFT_RUNTIME_NAME) +# if __has_attribute(objc_runtime_name) +# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X))) +# else +# define SWIFT_RUNTIME_NAME(X) +# endif +#endif +#if !defined(SWIFT_COMPILE_NAME) +# if __has_attribute(swift_name) +# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X))) +# else +# define SWIFT_COMPILE_NAME(X) +# endif +#endif +#if !defined(SWIFT_METHOD_FAMILY) +# if __has_attribute(objc_method_family) +# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X))) +# else +# define SWIFT_METHOD_FAMILY(X) +# endif +#endif +#if !defined(SWIFT_NOESCAPE) +# if __has_attribute(noescape) +# define SWIFT_NOESCAPE __attribute__((noescape)) +# else +# define SWIFT_NOESCAPE +# endif +#endif +#if !defined(SWIFT_RELEASES_ARGUMENT) +# if __has_attribute(ns_consumed) +# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed)) +# else +# define SWIFT_RELEASES_ARGUMENT +# endif +#endif +#if !defined(SWIFT_WARN_UNUSED_RESULT) +# if __has_attribute(warn_unused_result) +# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) +# else +# define SWIFT_WARN_UNUSED_RESULT +# endif +#endif +#if !defined(SWIFT_NORETURN) +# if __has_attribute(noreturn) +# define SWIFT_NORETURN __attribute__((noreturn)) +# else +# define SWIFT_NORETURN +# endif +#endif +#if !defined(SWIFT_CLASS_EXTRA) +# define SWIFT_CLASS_EXTRA +#endif +#if !defined(SWIFT_PROTOCOL_EXTRA) +# define SWIFT_PROTOCOL_EXTRA +#endif +#if !defined(SWIFT_ENUM_EXTRA) +# define SWIFT_ENUM_EXTRA +#endif +#if !defined(SWIFT_CLASS) +# if __has_attribute(objc_subclassing_restricted) +# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA +# define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA +# else +# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA +# define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA +# endif +#endif +#if !defined(SWIFT_RESILIENT_CLASS) +# if __has_attribute(objc_class_stub) +# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) __attribute__((objc_class_stub)) +# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_class_stub)) SWIFT_CLASS_NAMED(SWIFT_NAME) +# else +# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) +# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) SWIFT_CLASS_NAMED(SWIFT_NAME) +# endif +#endif +#if !defined(SWIFT_PROTOCOL) +# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA +# define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA +#endif +#if !defined(SWIFT_EXTENSION) +# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__) +#endif +#if !defined(OBJC_DESIGNATED_INITIALIZER) +# if __has_attribute(objc_designated_initializer) +# define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) +# else +# define OBJC_DESIGNATED_INITIALIZER +# endif +#endif +#if !defined(SWIFT_ENUM_ATTR) +# if __has_attribute(enum_extensibility) +# define SWIFT_ENUM_ATTR(_extensibility) __attribute__((enum_extensibility(_extensibility))) +# else +# define SWIFT_ENUM_ATTR(_extensibility) +# endif +#endif +#if !defined(SWIFT_ENUM) +# define SWIFT_ENUM(_type, _name, _extensibility) enum _name : _type _name; enum SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type +# if __has_feature(generalized_swift_name) +# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type +# else +# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) SWIFT_ENUM(_type, _name, _extensibility) +# endif +#endif +#if !defined(SWIFT_UNAVAILABLE) +# define SWIFT_UNAVAILABLE __attribute__((unavailable)) +#endif +#if !defined(SWIFT_UNAVAILABLE_MSG) +# define SWIFT_UNAVAILABLE_MSG(msg) __attribute__((unavailable(msg))) +#endif +#if !defined(SWIFT_AVAILABILITY) +# define SWIFT_AVAILABILITY(plat, ...) __attribute__((availability(plat, __VA_ARGS__))) +#endif +#if !defined(SWIFT_WEAK_IMPORT) +# define SWIFT_WEAK_IMPORT __attribute__((weak_import)) +#endif +#if !defined(SWIFT_DEPRECATED) +# define SWIFT_DEPRECATED __attribute__((deprecated)) +#endif +#if !defined(SWIFT_DEPRECATED_MSG) +# define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__))) +#endif +#if !defined(SWIFT_DEPRECATED_OBJC) +# if __has_feature(attribute_diagnose_if_objc) +# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning"))) +# else +# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg) +# endif +#endif +#if defined(__OBJC__) +#if !defined(IBSegueAction) +# define IBSegueAction +#endif +#endif +#if !defined(SWIFT_EXTERN) +# if defined(__cplusplus) +# define SWIFT_EXTERN extern "C" +# else +# define SWIFT_EXTERN extern +# endif +#endif +#if !defined(SWIFT_CALL) +# define SWIFT_CALL __attribute__((swiftcall)) +#endif +#if !defined(SWIFT_INDIRECT_RESULT) +# define SWIFT_INDIRECT_RESULT __attribute__((swift_indirect_result)) +#endif +#if !defined(SWIFT_CONTEXT) +# define SWIFT_CONTEXT __attribute__((swift_context)) +#endif +#if !defined(SWIFT_ERROR_RESULT) +# define SWIFT_ERROR_RESULT __attribute__((swift_error_result)) +#endif +#if defined(__cplusplus) +# define SWIFT_NOEXCEPT noexcept +#else +# define SWIFT_NOEXCEPT +#endif +#if !defined(SWIFT_C_INLINE_THUNK) +# if __has_attribute(always_inline) +# if __has_attribute(nodebug) +# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) __attribute__((nodebug)) +# else +# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) +# endif +# else +# define SWIFT_C_INLINE_THUNK inline +# endif +#endif +#if defined(_WIN32) +#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) +# define SWIFT_IMPORT_STDLIB_SYMBOL __declspec(dllimport) +#endif +#else +#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) +# define SWIFT_IMPORT_STDLIB_SYMBOL +#endif +#endif +#if defined(__OBJC__) +#if __has_feature(objc_modules) +#if __has_warning("-Watimport-in-framework-header") +#pragma clang diagnostic ignored "-Watimport-in-framework-header" +#endif +#endif + +#endif +#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch" +#pragma clang diagnostic ignored "-Wduplicate-method-arg" +#if __has_warning("-Wpragma-clang-attribute") +# pragma clang diagnostic ignored "-Wpragma-clang-attribute" +#endif +#pragma clang diagnostic ignored "-Wunknown-pragmas" +#pragma clang diagnostic ignored "-Wnullability" +#pragma clang diagnostic ignored "-Wdollar-in-identifier-extension" +#pragma clang diagnostic ignored "-Wunsafe-buffer-usage" + +#if __has_attribute(external_source_symbol) +# pragma push_macro("any") +# undef any +# pragma clang attribute push(__attribute__((external_source_symbol(language="Swift", defined_in="FirebaseAnalytics",generated_declaration))), apply_to=any(function,enum,objc_interface,objc_category,objc_protocol)) +# pragma pop_macro("any") +#endif + +#if defined(__OBJC__) + +#endif +#if __has_attribute(external_source_symbol) +# pragma clang attribute pop +#endif +#if defined(__cplusplus) +#endif +#pragma clang diagnostic pop +#endif + +#elif defined(__x86_64__) && __x86_64__ +// Generated by Apple Swift version 6.0.3 effective-5.10 (swiftlang-6.0.3.1.10 clang-1600.0.30.1) +#ifndef FIREBASEANALYTICS_SWIFT_H +#define FIREBASEANALYTICS_SWIFT_H +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgcc-compat" + +#if !defined(__has_include) +# define __has_include(x) 0 +#endif +#if !defined(__has_attribute) +# define __has_attribute(x) 0 +#endif +#if !defined(__has_feature) +# define __has_feature(x) 0 +#endif +#if !defined(__has_warning) +# define __has_warning(x) 0 +#endif + +#if __has_include() +# include +#endif + +#pragma clang diagnostic ignored "-Wauto-import" +#if defined(__OBJC__) +#include +#endif +#if defined(__cplusplus) +#include +#include +#include +#include +#include +#include +#include +#else +#include +#include +#include +#include +#endif +#if defined(__cplusplus) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wnon-modular-include-in-framework-module" +#if defined(__arm64e__) && __has_include() +# include +#else +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wreserved-macro-identifier" +# ifndef __ptrauth_swift_value_witness_function_pointer +# define __ptrauth_swift_value_witness_function_pointer(x) +# endif +# ifndef __ptrauth_swift_class_method_pointer +# define __ptrauth_swift_class_method_pointer(x) +# endif +#pragma clang diagnostic pop +#endif +#pragma clang diagnostic pop +#endif + +#if !defined(SWIFT_TYPEDEFS) +# define SWIFT_TYPEDEFS 1 +# if __has_include() +# include +# elif !defined(__cplusplus) +typedef uint_least16_t char16_t; +typedef uint_least32_t char32_t; +# endif +typedef float swift_float2 __attribute__((__ext_vector_type__(2))); +typedef float swift_float3 __attribute__((__ext_vector_type__(3))); +typedef float swift_float4 __attribute__((__ext_vector_type__(4))); +typedef double swift_double2 __attribute__((__ext_vector_type__(2))); +typedef double swift_double3 __attribute__((__ext_vector_type__(3))); +typedef double swift_double4 __attribute__((__ext_vector_type__(4))); +typedef int swift_int2 __attribute__((__ext_vector_type__(2))); +typedef int swift_int3 __attribute__((__ext_vector_type__(3))); +typedef int swift_int4 __attribute__((__ext_vector_type__(4))); +typedef unsigned int swift_uint2 __attribute__((__ext_vector_type__(2))); +typedef unsigned int swift_uint3 __attribute__((__ext_vector_type__(3))); +typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); +#endif + +#if !defined(SWIFT_PASTE) +# define SWIFT_PASTE_HELPER(x, y) x##y +# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y) +#endif +#if !defined(SWIFT_METATYPE) +# define SWIFT_METATYPE(X) Class +#endif +#if !defined(SWIFT_CLASS_PROPERTY) +# if __has_feature(objc_class_property) +# define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__ +# else +# define SWIFT_CLASS_PROPERTY(...) +# endif +#endif +#if !defined(SWIFT_RUNTIME_NAME) +# if __has_attribute(objc_runtime_name) +# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X))) +# else +# define SWIFT_RUNTIME_NAME(X) +# endif +#endif +#if !defined(SWIFT_COMPILE_NAME) +# if __has_attribute(swift_name) +# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X))) +# else +# define SWIFT_COMPILE_NAME(X) +# endif +#endif +#if !defined(SWIFT_METHOD_FAMILY) +# if __has_attribute(objc_method_family) +# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X))) +# else +# define SWIFT_METHOD_FAMILY(X) +# endif +#endif +#if !defined(SWIFT_NOESCAPE) +# if __has_attribute(noescape) +# define SWIFT_NOESCAPE __attribute__((noescape)) +# else +# define SWIFT_NOESCAPE +# endif +#endif +#if !defined(SWIFT_RELEASES_ARGUMENT) +# if __has_attribute(ns_consumed) +# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed)) +# else +# define SWIFT_RELEASES_ARGUMENT +# endif +#endif +#if !defined(SWIFT_WARN_UNUSED_RESULT) +# if __has_attribute(warn_unused_result) +# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) +# else +# define SWIFT_WARN_UNUSED_RESULT +# endif +#endif +#if !defined(SWIFT_NORETURN) +# if __has_attribute(noreturn) +# define SWIFT_NORETURN __attribute__((noreturn)) +# else +# define SWIFT_NORETURN +# endif +#endif +#if !defined(SWIFT_CLASS_EXTRA) +# define SWIFT_CLASS_EXTRA +#endif +#if !defined(SWIFT_PROTOCOL_EXTRA) +# define SWIFT_PROTOCOL_EXTRA +#endif +#if !defined(SWIFT_ENUM_EXTRA) +# define SWIFT_ENUM_EXTRA +#endif +#if !defined(SWIFT_CLASS) +# if __has_attribute(objc_subclassing_restricted) +# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA +# define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA +# else +# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA +# define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA +# endif +#endif +#if !defined(SWIFT_RESILIENT_CLASS) +# if __has_attribute(objc_class_stub) +# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) __attribute__((objc_class_stub)) +# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_class_stub)) SWIFT_CLASS_NAMED(SWIFT_NAME) +# else +# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) +# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) SWIFT_CLASS_NAMED(SWIFT_NAME) +# endif +#endif +#if !defined(SWIFT_PROTOCOL) +# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA +# define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA +#endif +#if !defined(SWIFT_EXTENSION) +# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__) +#endif +#if !defined(OBJC_DESIGNATED_INITIALIZER) +# if __has_attribute(objc_designated_initializer) +# define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) +# else +# define OBJC_DESIGNATED_INITIALIZER +# endif +#endif +#if !defined(SWIFT_ENUM_ATTR) +# if __has_attribute(enum_extensibility) +# define SWIFT_ENUM_ATTR(_extensibility) __attribute__((enum_extensibility(_extensibility))) +# else +# define SWIFT_ENUM_ATTR(_extensibility) +# endif +#endif +#if !defined(SWIFT_ENUM) +# define SWIFT_ENUM(_type, _name, _extensibility) enum _name : _type _name; enum SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type +# if __has_feature(generalized_swift_name) +# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type +# else +# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) SWIFT_ENUM(_type, _name, _extensibility) +# endif +#endif +#if !defined(SWIFT_UNAVAILABLE) +# define SWIFT_UNAVAILABLE __attribute__((unavailable)) +#endif +#if !defined(SWIFT_UNAVAILABLE_MSG) +# define SWIFT_UNAVAILABLE_MSG(msg) __attribute__((unavailable(msg))) +#endif +#if !defined(SWIFT_AVAILABILITY) +# define SWIFT_AVAILABILITY(plat, ...) __attribute__((availability(plat, __VA_ARGS__))) +#endif +#if !defined(SWIFT_WEAK_IMPORT) +# define SWIFT_WEAK_IMPORT __attribute__((weak_import)) +#endif +#if !defined(SWIFT_DEPRECATED) +# define SWIFT_DEPRECATED __attribute__((deprecated)) +#endif +#if !defined(SWIFT_DEPRECATED_MSG) +# define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__))) +#endif +#if !defined(SWIFT_DEPRECATED_OBJC) +# if __has_feature(attribute_diagnose_if_objc) +# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning"))) +# else +# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg) +# endif +#endif +#if defined(__OBJC__) +#if !defined(IBSegueAction) +# define IBSegueAction +#endif +#endif +#if !defined(SWIFT_EXTERN) +# if defined(__cplusplus) +# define SWIFT_EXTERN extern "C" +# else +# define SWIFT_EXTERN extern +# endif +#endif +#if !defined(SWIFT_CALL) +# define SWIFT_CALL __attribute__((swiftcall)) +#endif +#if !defined(SWIFT_INDIRECT_RESULT) +# define SWIFT_INDIRECT_RESULT __attribute__((swift_indirect_result)) +#endif +#if !defined(SWIFT_CONTEXT) +# define SWIFT_CONTEXT __attribute__((swift_context)) +#endif +#if !defined(SWIFT_ERROR_RESULT) +# define SWIFT_ERROR_RESULT __attribute__((swift_error_result)) +#endif +#if defined(__cplusplus) +# define SWIFT_NOEXCEPT noexcept +#else +# define SWIFT_NOEXCEPT +#endif +#if !defined(SWIFT_C_INLINE_THUNK) +# if __has_attribute(always_inline) +# if __has_attribute(nodebug) +# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) __attribute__((nodebug)) +# else +# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) +# endif +# else +# define SWIFT_C_INLINE_THUNK inline +# endif +#endif +#if defined(_WIN32) +#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) +# define SWIFT_IMPORT_STDLIB_SYMBOL __declspec(dllimport) +#endif +#else +#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) +# define SWIFT_IMPORT_STDLIB_SYMBOL +#endif +#endif +#if defined(__OBJC__) +#if __has_feature(objc_modules) +#if __has_warning("-Watimport-in-framework-header") +#pragma clang diagnostic ignored "-Watimport-in-framework-header" +#endif +#endif + +#endif +#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch" +#pragma clang diagnostic ignored "-Wduplicate-method-arg" +#if __has_warning("-Wpragma-clang-attribute") +# pragma clang diagnostic ignored "-Wpragma-clang-attribute" +#endif +#pragma clang diagnostic ignored "-Wunknown-pragmas" +#pragma clang diagnostic ignored "-Wnullability" +#pragma clang diagnostic ignored "-Wdollar-in-identifier-extension" +#pragma clang diagnostic ignored "-Wunsafe-buffer-usage" + +#if __has_attribute(external_source_symbol) +# pragma push_macro("any") +# undef any +# pragma clang attribute push(__attribute__((external_source_symbol(language="Swift", defined_in="FirebaseAnalytics",generated_declaration))), apply_to=any(function,enum,objc_interface,objc_category,objc_protocol)) +# pragma pop_macro("any") +#endif + +#if defined(__OBJC__) + +#endif +#if __has_attribute(external_source_symbol) +# pragma clang attribute pop +#endif +#if defined(__cplusplus) +#endif +#pragma clang diagnostic pop +#endif + +#else +#error unsupported Swift architecture +#endif diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FirebaseAnalytics-umbrella.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FirebaseAnalytics-umbrella.h new file mode 100644 index 0000000..ad84fbb --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FirebaseAnalytics-umbrella.h @@ -0,0 +1,24 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + +#import "FIRAnalytics+AppDelegate.h" +#import "FIRAnalytics+Consent.h" +#import "FIRAnalytics+OnDevice.h" +#import "FIRAnalytics.h" +#import "FirebaseAnalytics.h" +#import "FIREventNames.h" +#import "FIRParameterNames.h" +#import "FIRUserPropertyNames.h" + +FOUNDATION_EXPORT double FirebaseAnalyticsVersionNumber; +FOUNDATION_EXPORT const unsigned char FirebaseAnalyticsVersionString[]; + diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FirebaseAnalytics.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FirebaseAnalytics.h new file mode 100644 index 0000000..351da20 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FirebaseAnalytics.h @@ -0,0 +1,7 @@ +#import "FIRAnalytics+AppDelegate.h" +#import "FIRAnalytics+Consent.h" +#import "FIRAnalytics+OnDevice.h" +#import "FIRAnalytics.h" +#import "FIREventNames.h" +#import "FIRParameterNames.h" +#import "FIRUserPropertyNames.h" diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Info.plist b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Info.plist new file mode 100644 index 0000000..bdba59d --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Info.plist @@ -0,0 +1,53 @@ + + + + + BuildMachineOSBuild + 24G231 + CFBundleDevelopmentRegion + en + CFBundleExecutable + FirebaseAnalytics + CFBundleIdentifier + org.cocoapods.FirebaseAnalytics + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + FirebaseAnalytics + CFBundlePackageType + FMWK + CFBundleShortVersionString + 12.5.0 + CFBundleSignature + ???? + CFBundleSupportedPlatforms + + iPhoneSimulator + + CFBundleVersion + 1 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + DTPlatformBuild + 22C146 + DTPlatformName + iphonesimulator + DTPlatformVersion + 18.2 + DTSDKBuild + 22C146 + DTSDKName + iphonesimulator18.2 + DTXcode + 1620 + DTXcodeBuild + 16C5032a + MinimumOSVersion + 100.0 + UIDeviceFamily + + 1 + 2 + + + diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/Project/arm64-apple-ios-simulator.swiftsourceinfo b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/Project/arm64-apple-ios-simulator.swiftsourceinfo new file mode 100644 index 0000000..e747924 Binary files /dev/null and b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/Project/arm64-apple-ios-simulator.swiftsourceinfo differ diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/Project/x86_64-apple-ios-simulator.swiftsourceinfo b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/Project/x86_64-apple-ios-simulator.swiftsourceinfo new file mode 100644 index 0000000..cf0ec48 Binary files /dev/null and b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/Project/x86_64-apple-ios-simulator.swiftsourceinfo differ diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios-simulator.abi.json b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios-simulator.abi.json new file mode 100644 index 0000000..476738a --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios-simulator.abi.json @@ -0,0 +1,281 @@ +{ + "ABIRoot": { + "kind": "Root", + "name": "FirebaseAnalytics", + "printedName": "FirebaseAnalytics", + "children": [ + { + "kind": "Import", + "name": "FirebaseAnalyticsPrivate", + "printedName": "FirebaseAnalyticsPrivate", + "declKind": "Import", + "moduleName": "FirebaseAnalytics", + "declAttributes": [ + "ImplementationOnly" + ] + }, + { + "kind": "Import", + "name": "StoreKit", + "printedName": "StoreKit", + "declKind": "Import", + "moduleName": "FirebaseAnalytics" + }, + { + "kind": "Import", + "name": "SwiftUI", + "printedName": "SwiftUI", + "declKind": "Import", + "moduleName": "FirebaseAnalytics" + }, + { + "kind": "TypeDecl", + "name": "Analytics", + "printedName": "Analytics", + "children": [ + { + "kind": "Function", + "name": "logTransaction", + "printedName": "logTransaction(_:)", + "children": [ + { + "kind": "TypeNominal", + "name": "Void", + "printedName": "()" + }, + { + "kind": "TypeNominal", + "name": "Transaction", + "printedName": "StoreKit.Transaction", + "usr": "s:8StoreKit11TransactionV" + } + ], + "declKind": "Func", + "usr": "s:So12FIRAnalyticsC17FirebaseAnalyticsE14logTransactionyy8StoreKit0E0VFZ", + "mangledName": "$sSo12FIRAnalyticsC17FirebaseAnalyticsE14logTransactionyy8StoreKit0E0VFZ", + "moduleName": "FirebaseAnalytics", + "static": true, + "declAttributes": [ + "Final", + "AccessControl", + "RawDocComment" + ], + "isFromExtension": true, + "funcSelfKind": "NonMutating" + } + ], + "declKind": "Class", + "usr": "c:objc(cs)FIRAnalytics", + "moduleName": "FirebaseAnalytics", + "isOpen": true, + "objc_name": "FIRAnalytics", + "declAttributes": [ + "ObjC", + "Dynamic" + ], + "superclassUsr": "c:objc(cs)NSObject", + "isExternal": true, + "inheritsConvenienceInitializers": true, + "superclassNames": [ + "ObjectiveC.NSObject" + ], + "conformances": [ + { + "kind": "Conformance", + "name": "Copyable", + "printedName": "Copyable", + "usr": "s:s8CopyableP", + "mangledName": "$ss8CopyableP" + }, + { + "kind": "Conformance", + "name": "Escapable", + "printedName": "Escapable", + "usr": "s:s9EscapableP", + "mangledName": "$ss9EscapableP" + }, + { + "kind": "Conformance", + "name": "Equatable", + "printedName": "Equatable", + "usr": "s:SQ", + "mangledName": "$sSQ" + }, + { + "kind": "Conformance", + "name": "Hashable", + "printedName": "Hashable", + "usr": "s:SH", + "mangledName": "$sSH" + }, + { + "kind": "Conformance", + "name": "CVarArg", + "printedName": "CVarArg", + "usr": "s:s7CVarArgP", + "mangledName": "$ss7CVarArgP" + }, + { + "kind": "Conformance", + "name": "_KeyValueCodingAndObservingPublishing", + "printedName": "_KeyValueCodingAndObservingPublishing", + "usr": "s:10Foundation37_KeyValueCodingAndObservingPublishingP", + "mangledName": "$s10Foundation37_KeyValueCodingAndObservingPublishingP" + }, + { + "kind": "Conformance", + "name": "_KeyValueCodingAndObserving", + "printedName": "_KeyValueCodingAndObserving", + "usr": "s:10Foundation27_KeyValueCodingAndObservingP", + "mangledName": "$s10Foundation27_KeyValueCodingAndObservingP" + }, + { + "kind": "Conformance", + "name": "CustomStringConvertible", + "printedName": "CustomStringConvertible", + "usr": "s:s23CustomStringConvertibleP", + "mangledName": "$ss23CustomStringConvertibleP" + }, + { + "kind": "Conformance", + "name": "CustomDebugStringConvertible", + "printedName": "CustomDebugStringConvertible", + "usr": "s:s28CustomDebugStringConvertibleP", + "mangledName": "$ss28CustomDebugStringConvertibleP" + } + ] + }, + { + "kind": "TypeDecl", + "name": "View", + "printedName": "View", + "children": [ + { + "kind": "Function", + "name": "analyticsScreen", + "printedName": "analyticsScreen(name:class:extraParameters:)", + "children": [ + { + "kind": "TypeNominal", + "name": "OpaqueTypeArchetype", + "printedName": "some SwiftUI.View", + "children": [ + { + "kind": "TypeNominal", + "name": "View", + "printedName": "SwiftUI.View", + "usr": "s:7SwiftUI4ViewP" + } + ] + }, + { + "kind": "TypeNominal", + "name": "String", + "printedName": "Swift.String", + "usr": "s:SS" + }, + { + "kind": "TypeNominal", + "name": "String", + "printedName": "Swift.String", + "hasDefaultArg": true, + "usr": "s:SS" + }, + { + "kind": "TypeNominal", + "name": "Dictionary", + "printedName": "[Swift.String : Any]", + "children": [ + { + "kind": "TypeNominal", + "name": "String", + "printedName": "Swift.String", + "usr": "s:SS" + }, + { + "kind": "TypeNominal", + "name": "ProtocolComposition", + "printedName": "Any" + } + ], + "hasDefaultArg": true, + "usr": "s:SD" + } + ], + "declKind": "Func", + "usr": "s:7SwiftUI4ViewP17FirebaseAnalyticsE15analyticsScreen4name5class15extraParametersQrSS_SSSDySSypGtF", + "mangledName": "$s7SwiftUI4ViewP17FirebaseAnalyticsE15analyticsScreen4name5class15extraParametersQrSS_SSSDySSypGtF", + "moduleName": "FirebaseAnalytics", + "genericSig": "<τ_0_0 where τ_0_0 : SwiftUI.View>", + "sugared_genericSig": "", + "declAttributes": [ + "Preconcurrency", + "Custom", + "AccessControl", + "RawDocComment" + ], + "isFromExtension": true, + "funcSelfKind": "NonMutating" + } + ], + "declKind": "Protocol", + "usr": "s:7SwiftUI4ViewP", + "mangledName": "$s7SwiftUI4ViewP", + "moduleName": "SwiftUICore", + "genericSig": "<τ_0_0.Body : SwiftUI.View>", + "sugared_genericSig": "", + "intro_Macosx": "10.15", + "intro_iOS": "13.0", + "intro_tvOS": "13.0", + "intro_watchOS": "6.0", + "declAttributes": [ + "Preconcurrency", + "TypeEraser", + "OriginallyDefinedIn", + "OriginallyDefinedIn", + "OriginallyDefinedIn", + "OriginallyDefinedIn", + "Available", + "Available", + "Available", + "Available", + "Custom" + ], + "isExternal": true, + "conformances": [ + { + "kind": "Conformance", + "name": "Escapable", + "printedName": "Escapable", + "usr": "s:s9EscapableP", + "mangledName": "$ss9EscapableP" + }, + { + "kind": "Conformance", + "name": "Copyable", + "printedName": "Copyable", + "usr": "s:s8CopyableP", + "mangledName": "$ss8CopyableP" + } + ] + } + ], + "json_format_version": 8 + }, + "ConstValues": [ + { + "filePath": "\/Volumes\/google\/src\/cloud\/hantran\/m172\/google3\/googlemac\/iPhone\/Firebase\/Analytics\/Sources\/Swift\/Analytics+SwiftUI.swift", + "kind": "StringLiteral", + "offset": 2654, + "length": 6, + "value": "\"View\"" + }, + { + "filePath": "\/Volumes\/google\/src\/cloud\/hantran\/m172\/google3\/googlemac\/iPhone\/Firebase\/Analytics\/Sources\/Swift\/Analytics+SwiftUI.swift", + "kind": "Dictionary", + "offset": 2701, + "length": 3, + "value": "[]" + } + ] +} \ No newline at end of file diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios-simulator.private.swiftinterface b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios-simulator.private.swiftinterface new file mode 100644 index 0000000..784037e --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios-simulator.private.swiftinterface @@ -0,0 +1,22 @@ +// swift-interface-format-version: 1.0 +// swift-compiler-version: Apple Swift version 6.0.3 effective-5.10 (swiftlang-6.0.3.1.10 clang-1600.0.30.1) +// swift-module-flags: -target arm64-apple-ios15.0-simulator -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -O -enable-bare-slash-regex -module-name FirebaseAnalytics +// swift-module-flags-ignorable: -no-verify-emitted-module-interface +@_exported import FirebaseAnalytics +import StoreKit +import Swift +import SwiftUI +import _Concurrency +import _StringProcessing +import _SwiftConcurrencyShims +@available(iOS 15.0, macOS 12.0, macCatalyst 15.0, tvOS 15.0, *) +@available(watchOS, unavailable) +extension FirebaseAnalytics.Analytics { + public static func logTransaction(_ transaction: StoreKit.Transaction) +} +@available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, *) +@available(watchOS, unavailable) +extension SwiftUICore.View { + @_Concurrency.MainActor @preconcurrency public func analyticsScreen(name: Swift.String, class: Swift.String = "View", extraParameters: [Swift.String : Any] = [:]) -> some SwiftUICore.View + +} diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios-simulator.swiftdoc b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios-simulator.swiftdoc new file mode 100644 index 0000000..e9ab670 Binary files /dev/null and b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios-simulator.swiftdoc differ diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios-simulator.swiftinterface b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios-simulator.swiftinterface new file mode 100644 index 0000000..784037e --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-ios-simulator.swiftinterface @@ -0,0 +1,22 @@ +// swift-interface-format-version: 1.0 +// swift-compiler-version: Apple Swift version 6.0.3 effective-5.10 (swiftlang-6.0.3.1.10 clang-1600.0.30.1) +// swift-module-flags: -target arm64-apple-ios15.0-simulator -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -O -enable-bare-slash-regex -module-name FirebaseAnalytics +// swift-module-flags-ignorable: -no-verify-emitted-module-interface +@_exported import FirebaseAnalytics +import StoreKit +import Swift +import SwiftUI +import _Concurrency +import _StringProcessing +import _SwiftConcurrencyShims +@available(iOS 15.0, macOS 12.0, macCatalyst 15.0, tvOS 15.0, *) +@available(watchOS, unavailable) +extension FirebaseAnalytics.Analytics { + public static func logTransaction(_ transaction: StoreKit.Transaction) +} +@available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, *) +@available(watchOS, unavailable) +extension SwiftUICore.View { + @_Concurrency.MainActor @preconcurrency public func analyticsScreen(name: Swift.String, class: Swift.String = "View", extraParameters: [Swift.String : Any] = [:]) -> some SwiftUICore.View + +} diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-ios-simulator.abi.json b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-ios-simulator.abi.json new file mode 100644 index 0000000..476738a --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-ios-simulator.abi.json @@ -0,0 +1,281 @@ +{ + "ABIRoot": { + "kind": "Root", + "name": "FirebaseAnalytics", + "printedName": "FirebaseAnalytics", + "children": [ + { + "kind": "Import", + "name": "FirebaseAnalyticsPrivate", + "printedName": "FirebaseAnalyticsPrivate", + "declKind": "Import", + "moduleName": "FirebaseAnalytics", + "declAttributes": [ + "ImplementationOnly" + ] + }, + { + "kind": "Import", + "name": "StoreKit", + "printedName": "StoreKit", + "declKind": "Import", + "moduleName": "FirebaseAnalytics" + }, + { + "kind": "Import", + "name": "SwiftUI", + "printedName": "SwiftUI", + "declKind": "Import", + "moduleName": "FirebaseAnalytics" + }, + { + "kind": "TypeDecl", + "name": "Analytics", + "printedName": "Analytics", + "children": [ + { + "kind": "Function", + "name": "logTransaction", + "printedName": "logTransaction(_:)", + "children": [ + { + "kind": "TypeNominal", + "name": "Void", + "printedName": "()" + }, + { + "kind": "TypeNominal", + "name": "Transaction", + "printedName": "StoreKit.Transaction", + "usr": "s:8StoreKit11TransactionV" + } + ], + "declKind": "Func", + "usr": "s:So12FIRAnalyticsC17FirebaseAnalyticsE14logTransactionyy8StoreKit0E0VFZ", + "mangledName": "$sSo12FIRAnalyticsC17FirebaseAnalyticsE14logTransactionyy8StoreKit0E0VFZ", + "moduleName": "FirebaseAnalytics", + "static": true, + "declAttributes": [ + "Final", + "AccessControl", + "RawDocComment" + ], + "isFromExtension": true, + "funcSelfKind": "NonMutating" + } + ], + "declKind": "Class", + "usr": "c:objc(cs)FIRAnalytics", + "moduleName": "FirebaseAnalytics", + "isOpen": true, + "objc_name": "FIRAnalytics", + "declAttributes": [ + "ObjC", + "Dynamic" + ], + "superclassUsr": "c:objc(cs)NSObject", + "isExternal": true, + "inheritsConvenienceInitializers": true, + "superclassNames": [ + "ObjectiveC.NSObject" + ], + "conformances": [ + { + "kind": "Conformance", + "name": "Copyable", + "printedName": "Copyable", + "usr": "s:s8CopyableP", + "mangledName": "$ss8CopyableP" + }, + { + "kind": "Conformance", + "name": "Escapable", + "printedName": "Escapable", + "usr": "s:s9EscapableP", + "mangledName": "$ss9EscapableP" + }, + { + "kind": "Conformance", + "name": "Equatable", + "printedName": "Equatable", + "usr": "s:SQ", + "mangledName": "$sSQ" + }, + { + "kind": "Conformance", + "name": "Hashable", + "printedName": "Hashable", + "usr": "s:SH", + "mangledName": "$sSH" + }, + { + "kind": "Conformance", + "name": "CVarArg", + "printedName": "CVarArg", + "usr": "s:s7CVarArgP", + "mangledName": "$ss7CVarArgP" + }, + { + "kind": "Conformance", + "name": "_KeyValueCodingAndObservingPublishing", + "printedName": "_KeyValueCodingAndObservingPublishing", + "usr": "s:10Foundation37_KeyValueCodingAndObservingPublishingP", + "mangledName": "$s10Foundation37_KeyValueCodingAndObservingPublishingP" + }, + { + "kind": "Conformance", + "name": "_KeyValueCodingAndObserving", + "printedName": "_KeyValueCodingAndObserving", + "usr": "s:10Foundation27_KeyValueCodingAndObservingP", + "mangledName": "$s10Foundation27_KeyValueCodingAndObservingP" + }, + { + "kind": "Conformance", + "name": "CustomStringConvertible", + "printedName": "CustomStringConvertible", + "usr": "s:s23CustomStringConvertibleP", + "mangledName": "$ss23CustomStringConvertibleP" + }, + { + "kind": "Conformance", + "name": "CustomDebugStringConvertible", + "printedName": "CustomDebugStringConvertible", + "usr": "s:s28CustomDebugStringConvertibleP", + "mangledName": "$ss28CustomDebugStringConvertibleP" + } + ] + }, + { + "kind": "TypeDecl", + "name": "View", + "printedName": "View", + "children": [ + { + "kind": "Function", + "name": "analyticsScreen", + "printedName": "analyticsScreen(name:class:extraParameters:)", + "children": [ + { + "kind": "TypeNominal", + "name": "OpaqueTypeArchetype", + "printedName": "some SwiftUI.View", + "children": [ + { + "kind": "TypeNominal", + "name": "View", + "printedName": "SwiftUI.View", + "usr": "s:7SwiftUI4ViewP" + } + ] + }, + { + "kind": "TypeNominal", + "name": "String", + "printedName": "Swift.String", + "usr": "s:SS" + }, + { + "kind": "TypeNominal", + "name": "String", + "printedName": "Swift.String", + "hasDefaultArg": true, + "usr": "s:SS" + }, + { + "kind": "TypeNominal", + "name": "Dictionary", + "printedName": "[Swift.String : Any]", + "children": [ + { + "kind": "TypeNominal", + "name": "String", + "printedName": "Swift.String", + "usr": "s:SS" + }, + { + "kind": "TypeNominal", + "name": "ProtocolComposition", + "printedName": "Any" + } + ], + "hasDefaultArg": true, + "usr": "s:SD" + } + ], + "declKind": "Func", + "usr": "s:7SwiftUI4ViewP17FirebaseAnalyticsE15analyticsScreen4name5class15extraParametersQrSS_SSSDySSypGtF", + "mangledName": "$s7SwiftUI4ViewP17FirebaseAnalyticsE15analyticsScreen4name5class15extraParametersQrSS_SSSDySSypGtF", + "moduleName": "FirebaseAnalytics", + "genericSig": "<τ_0_0 where τ_0_0 : SwiftUI.View>", + "sugared_genericSig": "", + "declAttributes": [ + "Preconcurrency", + "Custom", + "AccessControl", + "RawDocComment" + ], + "isFromExtension": true, + "funcSelfKind": "NonMutating" + } + ], + "declKind": "Protocol", + "usr": "s:7SwiftUI4ViewP", + "mangledName": "$s7SwiftUI4ViewP", + "moduleName": "SwiftUICore", + "genericSig": "<τ_0_0.Body : SwiftUI.View>", + "sugared_genericSig": "", + "intro_Macosx": "10.15", + "intro_iOS": "13.0", + "intro_tvOS": "13.0", + "intro_watchOS": "6.0", + "declAttributes": [ + "Preconcurrency", + "TypeEraser", + "OriginallyDefinedIn", + "OriginallyDefinedIn", + "OriginallyDefinedIn", + "OriginallyDefinedIn", + "Available", + "Available", + "Available", + "Available", + "Custom" + ], + "isExternal": true, + "conformances": [ + { + "kind": "Conformance", + "name": "Escapable", + "printedName": "Escapable", + "usr": "s:s9EscapableP", + "mangledName": "$ss9EscapableP" + }, + { + "kind": "Conformance", + "name": "Copyable", + "printedName": "Copyable", + "usr": "s:s8CopyableP", + "mangledName": "$ss8CopyableP" + } + ] + } + ], + "json_format_version": 8 + }, + "ConstValues": [ + { + "filePath": "\/Volumes\/google\/src\/cloud\/hantran\/m172\/google3\/googlemac\/iPhone\/Firebase\/Analytics\/Sources\/Swift\/Analytics+SwiftUI.swift", + "kind": "StringLiteral", + "offset": 2654, + "length": 6, + "value": "\"View\"" + }, + { + "filePath": "\/Volumes\/google\/src\/cloud\/hantran\/m172\/google3\/googlemac\/iPhone\/Firebase\/Analytics\/Sources\/Swift\/Analytics+SwiftUI.swift", + "kind": "Dictionary", + "offset": 2701, + "length": 3, + "value": "[]" + } + ] +} \ No newline at end of file diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-ios-simulator.private.swiftinterface b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-ios-simulator.private.swiftinterface new file mode 100644 index 0000000..d8efa3e --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-ios-simulator.private.swiftinterface @@ -0,0 +1,22 @@ +// swift-interface-format-version: 1.0 +// swift-compiler-version: Apple Swift version 6.0.3 effective-5.10 (swiftlang-6.0.3.1.10 clang-1600.0.30.1) +// swift-module-flags: -target x86_64-apple-ios15.0-simulator -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -O -enable-bare-slash-regex -module-name FirebaseAnalytics +// swift-module-flags-ignorable: -no-verify-emitted-module-interface +@_exported import FirebaseAnalytics +import StoreKit +import Swift +import SwiftUI +import _Concurrency +import _StringProcessing +import _SwiftConcurrencyShims +@available(iOS 15.0, macOS 12.0, macCatalyst 15.0, tvOS 15.0, *) +@available(watchOS, unavailable) +extension FirebaseAnalytics.Analytics { + public static func logTransaction(_ transaction: StoreKit.Transaction) +} +@available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, *) +@available(watchOS, unavailable) +extension SwiftUICore.View { + @_Concurrency.MainActor @preconcurrency public func analyticsScreen(name: Swift.String, class: Swift.String = "View", extraParameters: [Swift.String : Any] = [:]) -> some SwiftUICore.View + +} diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-ios-simulator.swiftdoc b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-ios-simulator.swiftdoc new file mode 100644 index 0000000..7a2b2cd Binary files /dev/null and b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-ios-simulator.swiftdoc differ diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-ios-simulator.swiftinterface b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-ios-simulator.swiftinterface new file mode 100644 index 0000000..d8efa3e --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-ios-simulator.swiftinterface @@ -0,0 +1,22 @@ +// swift-interface-format-version: 1.0 +// swift-compiler-version: Apple Swift version 6.0.3 effective-5.10 (swiftlang-6.0.3.1.10 clang-1600.0.30.1) +// swift-module-flags: -target x86_64-apple-ios15.0-simulator -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -O -enable-bare-slash-regex -module-name FirebaseAnalytics +// swift-module-flags-ignorable: -no-verify-emitted-module-interface +@_exported import FirebaseAnalytics +import StoreKit +import Swift +import SwiftUI +import _Concurrency +import _StringProcessing +import _SwiftConcurrencyShims +@available(iOS 15.0, macOS 12.0, macCatalyst 15.0, tvOS 15.0, *) +@available(watchOS, unavailable) +extension FirebaseAnalytics.Analytics { + public static func logTransaction(_ transaction: StoreKit.Transaction) +} +@available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, *) +@available(watchOS, unavailable) +extension SwiftUICore.View { + @_Concurrency.MainActor @preconcurrency public func analyticsScreen(name: Swift.String, class: Swift.String = "View", extraParameters: [Swift.String : Any] = [:]) -> some SwiftUICore.View + +} diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/module.modulemap b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/module.modulemap new file mode 100644 index 0000000..fa10817 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/module.modulemap @@ -0,0 +1,16 @@ +framework module FirebaseAnalytics { +umbrella header "FirebaseAnalytics-umbrella.h" +export * +module * { export * } + link framework "Foundation" + link framework "Security" + link framework "SystemConfiguration" + link framework "UIKit" + link "c++" + link "sqlite3" + link "z" +} +module FirebaseAnalytics.Swift { + header "FirebaseAnalytics-Swift.h" + requires objc +} \ No newline at end of file diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/FirebaseAnalytics b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/FirebaseAnalytics new file mode 120000 index 0000000..82502e9 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/FirebaseAnalytics @@ -0,0 +1 @@ +Versions/Current/FirebaseAnalytics \ No newline at end of file diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Headers b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Headers new file mode 120000 index 0000000..a177d2a --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Headers @@ -0,0 +1 @@ +Versions/Current/Headers \ No newline at end of file diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Modules b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Modules new file mode 120000 index 0000000..5736f31 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Modules @@ -0,0 +1 @@ +Versions/Current/Modules \ No newline at end of file diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Resources b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Resources new file mode 120000 index 0000000..953ee36 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Resources @@ -0,0 +1 @@ +Versions/Current/Resources \ No newline at end of file diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/FirebaseAnalytics b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/FirebaseAnalytics new file mode 100644 index 0000000..8329f6a Binary files /dev/null and b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/FirebaseAnalytics differ diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Headers/FIRAnalytics+AppDelegate.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Headers/FIRAnalytics+AppDelegate.h new file mode 100644 index 0000000..cb1e407 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Headers/FIRAnalytics+AppDelegate.h @@ -0,0 +1,80 @@ +#import + +#import "FIRAnalytics.h" + +NS_ASSUME_NONNULL_BEGIN + +/// Provides App Delegate handlers to be used in your App Delegate. +/// +/// To save time integrating Firebase Analytics in an application, Firebase Analytics does not +/// require delegation implementation from the AppDelegate if neither SwiftUI nor UIScene lifecycle +/// is adopted. Instead this is automatically done by Firebase Analytics. Should you choose instead +/// to delegate manually, you can turn off the App Delegate Proxy by adding +/// FirebaseAppDelegateProxyEnabled into your app's Info.plist and setting it to boolean `NO`, and +/// adding the methods in this category to corresponding delegation handlers. +/// +/// To handle Universal Links, you must return `true` in +/// `UIApplicationDelegate.application(_:didFinishLaunchingWithOptions:)`. +@interface FIRAnalytics (AppDelegate) + +/// Handles events related to a URL session that are waiting to be processed. +/// +/// 1. If SwiftUI lifecycle is adopted, call this method from +/// `UIApplicationDelegate.application(_:handleEventsForBackgroundURLSession:completionHandler:)` +/// in your app delegate. +/// +/// 2. If SwiftUI lifecycle is not adopted, Firebase Analytics does not require delegation +/// implementation from the AppDelegate. If you choose instead to delegate manually, you can set +/// FirebaseAppDelegateProxyEnabled to boolean `NO` in your app's Info.plist and call this method +/// from +/// `UIApplicationDelegate.application(_:handleEventsForBackgroundURLSession:completionHandler:)` +/// in your app delegate. +/// +/// @param identifier The identifier of the URL session requiring attention. +/// @param completionHandler The completion handler to call when you finish processing the events. +/// Calling this completion handler lets the system know that your app's user interface is +/// updated and a new snapshot can be taken. ++ (void)handleEventsForBackgroundURLSession:(NSString *)identifier + completionHandler:(nullable void (^)(void))completionHandler; + +/// Handles the event when the app is launched by a URL (custom URL scheme or universal link). +/// +/// 1. If SwiftUI lifecycle is adopted, use `onOpenURL(perform:)` to register a handler and call +/// this method in the handler. +/// +/// 2. If UIScene lifecycle is adopted, call this method from +/// `UISceneDelegate.scene(_:willConnectTo:options:)` and +/// `UISceneDelegate.scene(_:openURLContexts:)` when the URL contexts are available. +/// +/// 3. If neither SwiftUI nor UIScene lifecycle is adopted, Firebase Analytics does not require +/// delegation implementation from the AppDelegate. If you choose instead to delegate manually, you +/// can set FirebaseAppDelegateProxyEnabled to boolean `NO` in your app's Info.plist and call this +/// method from `UIApplicationDelegate.application(_:open:options:)` in your app delegate. +/// +/// @param url The URL resource to open. This resource can be a network resource or a file. ++ (void)handleOpenURL:(NSURL *)url; + +/// Handles the event when the app receives data associated with user activity that includes a +/// Universal Link. +/// +/// 1. If SwiftUI lifecycle is adopted, use `onOpenURL(perform:)` to register a handler and call +/// `Analytics.handleOpen(_:)` instead in the handler. +/// +/// 2. If UIScene lifecycle is adopted, call this method from +/// `UISceneDelegate.scene(_:willConnectTo:options:)` and `UISceneDelegate.scene(_:continue:)` when +/// NSUserActivity is available. See the [Apple +/// doc](https://developer.apple.com/documentation/xcode/supporting-universal-links-in-your-app) for +/// more details. +/// +/// 3. If neither SwiftUI nor UIScene lifecycle is adopted, Firebase Analytics does not require +/// delegation implementation from the AppDelegate. If you choose instead to delegate manually, you +/// can set FirebaseAppDelegateProxyEnabled to boolean `NO` in your app's Info.plist and call this +/// method from `UIApplication.application(_:continue:restorationHandler:)` in your app delegate. +/// +/// @param userActivity The activity object containing the data associated with the task the user +/// was performing. ++ (void)handleUserActivity:(id)userActivity; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Headers/FIRAnalytics+Consent.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Headers/FIRAnalytics+Consent.h new file mode 100644 index 0000000..7758390 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Headers/FIRAnalytics+Consent.h @@ -0,0 +1,51 @@ +#import + +#import "FIRAnalytics.h" + +NS_ASSUME_NONNULL_BEGIN + +/// The type of consent to set. Supported consent types are `ConsentType.adStorage`, +/// `ConsentType.analyticsStorage`, `ConsentType.adUserData`, and `ConsentType.adPersonalization`. +/// Omitting a type retains its previous status. +typedef NSString *FIRConsentType NS_TYPED_ENUM NS_SWIFT_NAME(ConsentType); + +/// Enables storage (such as device identifiers) related to advertising. +extern FIRConsentType const FIRConsentTypeAdStorage; + +/// Enables storage (such as app identifiers) related to analytics, e.g. visit duration. +extern FIRConsentType const FIRConsentTypeAnalyticsStorage; + +/// Sets consent for sending user data to Google for advertising purposes. +extern FIRConsentType const FIRConsentTypeAdUserData; + +/// Sets consent for personalized advertising. +extern FIRConsentType const FIRConsentTypeAdPersonalization; + +/// The status value of the consent type. Supported statuses are `ConsentStatus.granted` and +/// `ConsentStatus.denied`. +typedef NSString *FIRConsentStatus NS_TYPED_ENUM NS_SWIFT_NAME(ConsentStatus); + +/// Consent status indicating consent is denied. For an overview of which data is sent when consent +/// is denied, see [SDK behavior with consent +/// mode](https://developers.google.com/tag-platform/security/concepts/consent-mode#tag-behavior). +extern FIRConsentStatus const FIRConsentStatusDenied; + +/// Consent status indicating consent is granted. +extern FIRConsentStatus const FIRConsentStatusGranted; + +/// Sets the applicable end user consent state. +@interface FIRAnalytics (Consent) + +/// Sets the applicable end user consent state (e.g. for device identifiers) for this app on this +/// device. Use the consent settings to specify individual consent type values. Settings are +/// persisted across app sessions. By default consent types are set to `ConsentStatus.granted`. +/// +/// @param consentSettings A Dictionary of consent types. Supported consent type keys are +/// `ConsentType.adStorage`, `ConsentType.analyticsStorage`, `ConsentType.adUserData`, and +/// `ConsentType.adPersonalization`. Valid values are `ConsentStatus.granted` and +/// `ConsentStatus.denied`. ++ (void)setConsent:(NSDictionary *)consentSettings; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Headers/FIRAnalytics+OnDevice.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Headers/FIRAnalytics+OnDevice.h new file mode 100644 index 0000000..5f87c0d --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Headers/FIRAnalytics+OnDevice.h @@ -0,0 +1,51 @@ +#import + +#import "FIRAnalytics.h" + +NS_ASSUME_NONNULL_BEGIN + +API_UNAVAILABLE(macCatalyst, macos, tvos, watchos) +@interface FIRAnalytics (OnDevice) + +/// Initiates on-device conversion measurement given a user email address. Requires dependency +/// GoogleAdsOnDeviceConversion from +/// https://github.com/googleads/google-ads-on-device-conversion-ios-sdk/ to be linked in, otherwise +/// it is a no-op. +/// @param emailAddress User email address. Include a domain name for all email addresses +/// (e.g. gmail.com or hotmail.co.jp). ++ (void)initiateOnDeviceConversionMeasurementWithEmailAddress:(NSString *)emailAddress + NS_SWIFT_NAME(initiateOnDeviceConversionMeasurement(emailAddress:)); + +/// Initiates on-device conversion measurement given a phone number in E.164 format. Requires +/// dependency GoogleAdsOnDeviceConversion from +/// https://github.com/googleads/google-ads-on-device-conversion-ios-sdk/ to be linked in, otherwise +/// it is a no-op. +/// @param phoneNumber User phone number. Must be in E.164 format, which means it must be +/// limited to a maximum of 15 digits and must include a plus sign (+) prefix and country code +/// with no dashes, parentheses, or spaces. ++ (void)initiateOnDeviceConversionMeasurementWithPhoneNumber:(NSString *)phoneNumber + NS_SWIFT_NAME(initiateOnDeviceConversionMeasurement(phoneNumber:)); + +/// Initiates on-device conversion measurement given a sha256-hashed user email address. Requires +/// dependency GoogleAdsOnDeviceConversion from +/// https://github.com/googleads/google-ads-on-device-conversion-ios-sdk/ to be linked in, otherwise +/// it is a no-op. +/// @param hashedEmailAddress User email address as a UTF8-encoded string normalized and hashed +/// according to the instructions at +/// https://firebase.google.com/docs/tutorials/ads-ios-on-device-measurement/step-3. ++ (void)initiateOnDeviceConversionMeasurementWithHashedEmailAddress:(NSData *)hashedEmailAddress + NS_SWIFT_NAME(initiateOnDeviceConversionMeasurement(hashedEmailAddress:)); + +/// Initiates on-device conversion measurement given a sha256-hashed phone number in E.164 format. +/// Requires dependency GoogleAdsOnDeviceConversion from +/// https://github.com/googleads/google-ads-on-device-conversion-ios-sdk/ to be linked in, otherwise +/// it is a no-op. +/// @param hashedPhoneNumber UTF8-encoded user phone number in E.164 format and then hashed +/// according to the instructions at +/// https://firebase.google.com/docs/tutorials/ads-ios-on-device-measurement/step-3. ++ (void)initiateOnDeviceConversionMeasurementWithHashedPhoneNumber:(NSData *)hashedPhoneNumber + NS_SWIFT_NAME(initiateOnDeviceConversionMeasurement(hashedPhoneNumber:)); + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Headers/FIRAnalytics.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Headers/FIRAnalytics.h new file mode 100644 index 0000000..ec88689 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Headers/FIRAnalytics.h @@ -0,0 +1,155 @@ +#import + +#import "FIREventNames.h" +#import "FIRParameterNames.h" +#import "FIRUserPropertyNames.h" + +NS_ASSUME_NONNULL_BEGIN + +/// The top level Firebase Analytics singleton that provides methods for logging events and setting +/// user properties. See the developer guides for general +/// information on using Firebase Analytics in your apps. +/// +/// @note The Analytics SDK uses SQLite to persist events and other app-specific data. Calling +/// certain thread-unsafe global SQLite methods like `sqlite3_shutdown()` can result in +/// unexpected crashes at runtime. +NS_SWIFT_NAME(Analytics) +@interface FIRAnalytics : NSObject + +/// Logs an app event. The event can have up to 25 parameters. Events with the same name must have +/// the same parameters. Up to 500 event names are supported. Using predefined events and/or +/// parameters is recommended for optimal reporting. +/// +/// The following event names are reserved - events with these names will be dropped, and instead an +/// error event will be logged: +///
    +///
  • ad_activeview
  • +///
  • ad_click
  • +///
  • ad_exposure
  • +///
  • ad_query
  • +///
  • ad_reward
  • +///
  • adunit_exposure
  • +///
  • app_clear_data
  • +///
  • app_exception
  • +///
  • app_remove
  • +///
  • app_store_refund
  • +///
  • app_store_subscription_cancel
  • +///
  • app_store_subscription_convert
  • +///
  • app_store_subscription_renew
  • +///
  • app_update
  • +///
  • app_upgrade
  • +///
  • dynamic_link_app_open
  • +///
  • dynamic_link_app_update
  • +///
  • dynamic_link_first_open
  • +///
  • error
  • +///
  • firebase_campaign
  • +///
  • first_open
  • +///
  • first_visit
  • +///
  • notification_dismiss
  • +///
  • notification_foreground
  • +///
  • notification_open
  • +///
  • notification_receive
  • +///
  • os_update
  • +///
  • session_start
  • +///
  • session_start_with_rollout
  • +///
  • user_engagement
  • +///
+/// +/// @param name The name of the event. Should contain 1 to 40 alphanumeric characters or +/// underscores. The name must start with an alphabetic character. Some event names are +/// reserved. See FIREventNames.h for the list of reserved event names. The "firebase_", +/// "google_", and "ga_" prefixes are reserved and should not be used. Note that event names are +/// case-sensitive and that logging two events whose names differ only in case will result in +/// two distinct events. To manually log screen view events, use the `screen_view` event name. +/// @param parameters The dictionary of event parameters. Passing `nil` indicates that the event has +/// no parameters. Parameter names can be up to 40 characters long and must start with an +/// alphabetic character and contain only alphanumeric characters and underscores. Only String, +/// Int, and Double parameter types are supported. String parameter values can be up to 100 +/// characters long for standard Google Analytics properties, and up to 500 characters long for +/// Google Analytics 360 properties. The "firebase_", "google_", and "ga_" prefixes are reserved +/// and should not be used for parameter names. ++ (void)logEventWithName:(NSString *)name + parameters:(nullable NSDictionary *)parameters + NS_SWIFT_NAME(logEvent(_:parameters:)); + +/// Sets a user property to a given value. Up to 25 user property names are supported. Once set, +/// user property values persist throughout the app lifecycle and across sessions. +/// +/// The following user property names are reserved and cannot be used: +///
    +///
  • first_open_time
  • +///
  • last_deep_link_referrer
  • +///
  • user_id
  • +///
+/// +/// @param value The value of the user property. Values can be up to 36 characters long. Setting the +/// value to `nil` removes the user property. +/// @param name The name of the user property to set. Should contain 1 to 24 alphanumeric characters +/// or underscores and must start with an alphabetic character. The "firebase_", "google_", and +/// "ga_" prefixes are reserved and should not be used for user property names. ++ (void)setUserPropertyString:(nullable NSString *)value forName:(NSString *)name + NS_SWIFT_NAME(setUserProperty(_:forName:)); + +/// Sets the user ID property. This feature must be used in accordance with +/// Google's Privacy Policy +/// +/// @param userID The user ID to ascribe to the user of this app on this device, which must be +/// non-empty and no more than 256 characters long. Setting userID to `nil` removes the user ID. ++ (void)setUserID:(nullable NSString *)userID; + +/// Sets whether analytics collection is enabled for this app on this device. This setting is +/// persisted across app sessions. By default it is enabled. +/// +/// @param analyticsCollectionEnabled A flag that enables or disables Analytics collection. ++ (void)setAnalyticsCollectionEnabled:(BOOL)analyticsCollectionEnabled; + +/// Sets the interval of inactivity in seconds that terminates the current session. The default +/// value is 1800 seconds (30 minutes). +/// +/// @param sessionTimeoutInterval The custom time of inactivity in seconds before the current +/// session terminates. ++ (void)setSessionTimeoutInterval:(NSTimeInterval)sessionTimeoutInterval; + +/// Asynchronously retrieves the identifier of the current app session. +/// +/// The session ID retrieval could fail due to Analytics collection disabled, app session expired, +/// etc. +/// +/// @param completion The completion handler to call when the session ID retrieval is complete. This +/// handler is executed on a system-defined global concurrent queue. +/// This completion handler takes the following parameters: +/// sessionID The identifier of the current app session. The value is undefined if the +/// request failed. +/// error An error object that indicates why the request failed, or `nil` if the request +/// was successful. ++ (void)sessionIDWithCompletion:(void (^)(int64_t sessionID, NSError *_Nullable error))completion; + +/// Returns the unique ID for this instance of the application or `nil` if +/// `ConsentType.analyticsStorage` has been set to `ConsentStatus.denied`. +/// +/// @see `FIRAnalytics+Consent.h` ++ (nullable NSString *)appInstanceID; + +/// Clears all analytics data for this instance from the device and resets the app instance ID. ++ (void)resetAnalyticsData; + +/// Adds parameters that will be set on every event logged from the SDK, including automatic ones. +/// The values passed in the parameters dictionary will be added to the dictionary of default event +/// parameters. These parameters persist across app runs. They are of lower precedence than event +/// parameters, so if an event parameter and a parameter set using this API have the same name, the +/// value of the event parameter will be used. The same limitations on event parameters apply to +/// default event parameters. +/// +/// @param parameters Parameters to be added to the dictionary of parameters added to every event. +/// They will be added to the dictionary of default event parameters, replacing any existing +/// parameter with the same name. Valid parameters are String, Int, and Double. Setting a key's +/// value to `NSNull()` will clear that parameter. Passing in a `nil` dictionary will clear all +/// parameters. ++ (void)setDefaultEventParameters:(nullable NSDictionary *)parameters; + +/// Unavailable. +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Headers/FIREventNames.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Headers/FIREventNames.h new file mode 100644 index 0000000..701ed88 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Headers/FIREventNames.h @@ -0,0 +1,438 @@ +/// @file FIREventNames.h +/// +/// Predefined event names. +/// +/// An Event is an important occurrence in your app that you want to measure. You can report up to +/// 500 different types of Events per app and you can associate up to 25 unique parameters with each +/// Event type. Some common events are suggested below, but you may also choose to specify custom +/// Event types that are associated with your specific app. Each event type is identified by a +/// unique name. Event names can be up to 40 characters long, may only contain alphanumeric +/// characters and underscores ("_"), and must start with an alphabetic character. The "firebase_", +/// "google_", and "ga_" prefixes are reserved and should not be used. + +#import + +/// Ad Impression event. This event signifies when a user sees an ad impression. Note: If you supply +/// the @c AnalyticsParameterValue parameter, you must also supply the @c AnalyticsParameterCurrency +/// parameter so that revenue metrics can be computed accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterAdPlatform (String) (optional)
  • +///
  • @c AnalyticsParameterAdFormat (String) (optional)
  • +///
  • @c AnalyticsParameterAdSource (String) (optional)
  • +///
  • @c AnalyticsParameterAdUnitName (String) (optional)
  • +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventAdImpression NS_SWIFT_NAME(AnalyticsEventAdImpression) = + @"ad_impression"; + +/// Add Payment Info event. This event signifies that a user has submitted their payment +/// information. Note: If you supply the @c AnalyticsParameterValue parameter, you must also supply +/// the @c AnalyticsParameterCurrency parameter so that revenue metrics can be computed accurately. +/// Params: +/// +///
    +///
  • @c AnalyticsParameterCoupon (String) (optional)
  • +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterPaymentType (String) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventAddPaymentInfo NS_SWIFT_NAME(AnalyticsEventAddPaymentInfo) = + @"add_payment_info"; + +/// Add Shipping Info event. This event signifies that a user has submitted their shipping +/// information. Note: If you supply the @c AnalyticsParameterValue parameter, you must also supply +/// the @c AnalyticsParameterCurrency parameter so that revenue metrics can be computed accurately. +/// Params: +/// +///
    +///
  • @c AnalyticsParameterCoupon (String) (optional)
  • +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterShippingTier (String) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventAddShippingInfo NS_SWIFT_NAME(AnalyticsEventAddShippingInfo) = + @"add_shipping_info"; + +/// E-Commerce Add To Cart event. This event signifies that an item(s) was added to a cart for +/// purchase. Add this event to a funnel with @c AnalyticsEventPurchase to gauge the effectiveness +/// of your checkout process. Note: If you supply the @c AnalyticsParameterValue parameter, you must +/// also supply the @c AnalyticsParameterCurrency parameter so that revenue metrics can be computed +/// accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventAddToCart NS_SWIFT_NAME(AnalyticsEventAddToCart) = @"add_to_cart"; + +/// E-Commerce Add To Wishlist event. This event signifies that an item was added to a wishlist. Use +/// this event to identify popular gift items. Note: If you supply the @c AnalyticsParameterValue +/// parameter, you must also supply the @c AnalyticsParameterCurrency parameter so that revenue +/// metrics can be computed accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventAddToWishlist NS_SWIFT_NAME(AnalyticsEventAddToWishlist) = + @"add_to_wishlist"; + +/// App Open event. By logging this event when an App becomes active, developers can understand how +/// often users leave and return during the course of a Session. Although Sessions are automatically +/// reported, this event can provide further clarification around the continuous engagement of +/// app-users. +static NSString *const kFIREventAppOpen NS_SWIFT_NAME(AnalyticsEventAppOpen) = @"app_open"; + +/// E-Commerce Begin Checkout event. This event signifies that a user has begun the process of +/// checking out. Add this event to a funnel with your @c AnalyticsEventPurchase event to gauge the +/// effectiveness of your checkout process. Note: If you supply the @c AnalyticsParameterValue +/// parameter, you must also supply the @c AnalyticsParameterCurrency parameter so that revenue +/// metrics can be computed accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterCoupon (String) (optional)
  • +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventBeginCheckout NS_SWIFT_NAME(AnalyticsEventBeginCheckout) = + @"begin_checkout"; + +/// Campaign Detail event. Log this event to supply the referral details of a re-engagement +/// campaign. Note: you must supply at least one of the required parameters +/// AnalyticsParameterSource, AnalyticsParameterMedium or AnalyticsParameterCampaign. Params: +/// +///
    +///
  • @c AnalyticsParameterSource (String)
  • +///
  • @c AnalyticsParameterMedium (String)
  • +///
  • @c AnalyticsParameterCampaign (String)
  • +///
  • @c AnalyticsParameterTerm (String) (optional)
  • +///
  • @c AnalyticsParameterContent (String) (optional)
  • +///
  • @c AnalyticsParameterAdNetworkClickID (String) (optional)
  • +///
  • @c AnalyticsParameterCP1 (String) (optional)
  • +///
  • @c AnalyticsParameterCampaignID (String) (optional)
  • +///
  • @c AnalyticsParameterCreativeFormat (String) (optional)
  • +///
  • @c AnalyticsParameterMarketingTactic (String) (optional)
  • +///
  • @c AnalyticsParameterSourcePlatform (String) (optional)
  • +///
+static NSString *const kFIREventCampaignDetails NS_SWIFT_NAME(AnalyticsEventCampaignDetails) = + @"campaign_details"; + +/// Earn Virtual Currency event. This event tracks the awarding of virtual currency in your app. Log +/// this along with @c AnalyticsEventSpendVirtualCurrency to better understand your virtual economy. +/// Params: +/// +///
    +///
  • @c AnalyticsParameterVirtualCurrencyName (String)
  • +///
  • @c AnalyticsParameterValue (Int or Double)
  • +///
+static NSString *const kFIREventEarnVirtualCurrency + NS_SWIFT_NAME(AnalyticsEventEarnVirtualCurrency) = @"earn_virtual_currency"; + +/// Generate Lead event. Log this event when a lead has been generated in the app to understand the +/// efficacy of your install and re-engagement campaigns. Note: If you supply the +/// @c AnalyticsParameterValue parameter, you must also supply the @c AnalyticsParameterCurrency +/// parameter so that revenue metrics can be computed accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventGenerateLead NS_SWIFT_NAME(AnalyticsEventGenerateLead) = + @"generate_lead"; + +/// In-App Purchase event. This event signifies that extra content or a subscription was purchased +/// by a user inside an app. Note: This is different from the ecommerce purchase event. Note: If you +/// supply the @c AnalyticsParameterValue parameter, you must also supply the +/// @c AnalyticsParameterCurrency parameter so that revenue metrics can be computed accurately. +/// Params: +/// +///
    +///
  • @c AnalyticsParameterCurrency (String)
  • +///
  • @c AnalyticsParameterFreeTrial (Int) (optional)
  • +///
  • @c AnalyticsParameterPrice (Double) (optional)
  • +///
  • @c AnalyticsParameterPriceIsDiscounted (Int) (optional)
  • +///
  • @c AnalyticsParameterProductID (String) (optional)
  • +///
  • @c AnalyticsParameterProductName (String) (optional)
  • +///
  • @c AnalyticsParameterQuantity (Int) (optional)
  • +///
  • @c AnalyticsParameterSubscription (Int) (optional)
  • +///
  • @c AnalyticsParameterValue (Double)
  • +///
+static NSString *const kFIREventInAppPurchase NS_SWIFT_NAME(AnalyticsEventInAppPurchase) = + @"in_app_purchase"; + +/// Join Group event. Log this event when a user joins a group such as a guild, team or family. Use +/// this event to analyze how popular certain groups or social features are in your app. Params: +/// +///
    +///
  • @c AnalyticsParameterGroupID (String)
  • +///
+static NSString *const kFIREventJoinGroup NS_SWIFT_NAME(AnalyticsEventJoinGroup) = @"join_group"; + +/// Level End event. Log this event when the user finishes a level. Params: +/// +///
    +///
  • @c AnalyticsParameterLevelName (String)
  • +///
  • @c AnalyticsParameterSuccess (String)
  • +///
+static NSString *const kFIREventLevelEnd NS_SWIFT_NAME(AnalyticsEventLevelEnd) = @"level_end"; + +/// Level Start event. Log this event when the user starts a new level. Params: +/// +///
    +///
  • @c AnalyticsParameterLevelName (String)
  • +///
+static NSString *const kFIREventLevelStart NS_SWIFT_NAME(AnalyticsEventLevelStart) = @"level_start"; + +/// Level Up event. This event signifies that a player has leveled up in your gaming app. It can +/// help you gauge the level distribution of your userbase and help you identify certain levels that +/// are difficult to pass. Params: +/// +///
    +///
  • @c AnalyticsParameterLevel (Int)
  • +///
  • @c AnalyticsParameterCharacter (String) (optional)
  • +///
+static NSString *const kFIREventLevelUp NS_SWIFT_NAME(AnalyticsEventLevelUp) = @"level_up"; + +/// Login event. Apps with a login feature can report this event to signify that a user has logged +/// in. +static NSString *const kFIREventLogin NS_SWIFT_NAME(AnalyticsEventLogin) = @"login"; + +/// Post Score event. Log this event when the user posts a score in your gaming app. This event can +/// help you understand how users are actually performing in your game and it can help you correlate +/// high scores with certain audiences or behaviors. Params: +/// +///
    +///
  • @c AnalyticsParameterScore (Int)
  • +///
  • @c AnalyticsParameterLevel (Int) (optional)
  • +///
  • @c AnalyticsParameterCharacter (String) (optional)
  • +///
+static NSString *const kFIREventPostScore NS_SWIFT_NAME(AnalyticsEventPostScore) = @"post_score"; + +/// E-Commerce Purchase event. This event signifies that an item(s) was purchased by a user. Note: +/// This is different from the in-app purchase event, which is reported automatically for App +/// Store-based apps. Note: If you supply the @c AnalyticsParameterValue parameter, you must also +/// supply the @c AnalyticsParameterCurrency parameter so that revenue metrics can be computed +/// accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterAffiliation (String) (optional)
  • +///
  • @c AnalyticsParameterCoupon (String) (optional)
  • +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterEndDate (String) (optional)
  • +///
  • @c AnalyticsParameterItemID (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterShipping (Double) (optional)
  • +///
  • @c AnalyticsParameterStartDate (String) (optional)
  • +///
  • @c AnalyticsParameterTax (Double) (optional)
  • +///
  • @c AnalyticsParameterTransactionID (String) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventPurchase NS_SWIFT_NAME(AnalyticsEventPurchase) = @"purchase"; + +/// E-Commerce Refund event. This event signifies that a refund was issued. Note: If you supply the +/// @c AnalyticsParameterValue parameter, you must also supply the @c AnalyticsParameterCurrency +/// parameter so that revenue metrics can be computed accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterAffiliation (String) (optional)
  • +///
  • @c AnalyticsParameterCoupon (String) (optional)
  • +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterShipping (Double) (optional)
  • +///
  • @c AnalyticsParameterTax (Double) (optional)
  • +///
  • @c AnalyticsParameterTransactionID (String) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventRefund NS_SWIFT_NAME(AnalyticsEventRefund) = @"refund"; + +/// E-Commerce Remove from Cart event. This event signifies that an item(s) was removed from a cart. +/// Note: If you supply the @c AnalyticsParameterValue parameter, you must also supply the @c +/// AnalyticsParameterCurrency parameter so that revenue metrics can be computed accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventRemoveFromCart NS_SWIFT_NAME(AnalyticsEventRemoveFromCart) = + @"remove_from_cart"; + +/// Screen View event. This event signifies a screen view. Use this when a screen transition occurs. +/// This event can be logged irrespective of whether automatic screen tracking is enabled. Params: +/// +///
    +///
  • @c AnalyticsParameterScreenClass (String) (optional)
  • +///
  • @c AnalyticsParameterScreenName (String) (optional)
  • +///
+static NSString *const kFIREventScreenView NS_SWIFT_NAME(AnalyticsEventScreenView) = @"screen_view"; + +/// Search event. Apps that support search features can use this event to contextualize search +/// operations by supplying the appropriate, corresponding parameters. This event can help you +/// identify the most popular content in your app. Params: +/// +///
    +///
  • @c AnalyticsParameterSearchTerm (String)
  • +///
  • @c AnalyticsParameterStartDate (String) (optional)
  • +///
  • @c AnalyticsParameterEndDate (String) (optional)
  • +///
  • @c AnalyticsParameterNumberOfNights (Int) (optional) for hotel bookings
  • +///
  • @c AnalyticsParameterNumberOfRooms (Int) (optional) for hotel bookings
  • +///
  • @c AnalyticsParameterNumberOfPassengers (Int) (optional) for travel bookings
  • +///
  • @c AnalyticsParameterOrigin (String) (optional)
  • +///
  • @c AnalyticsParameterDestination (String) (optional)
  • +///
  • @c AnalyticsParameterTravelClass (String) (optional) for travel bookings
  • +///
+static NSString *const kFIREventSearch NS_SWIFT_NAME(AnalyticsEventSearch) = @"search"; + +/// Select Content event. This general purpose event signifies that a user has selected some content +/// of a certain type in an app. The content can be any object in your app. This event can help you +/// identify popular content and categories of content in your app. Params: +/// +///
    +///
  • @c AnalyticsParameterContentType (String)
  • +///
  • @c AnalyticsParameterItemID (String)
  • +///
+static NSString *const kFIREventSelectContent NS_SWIFT_NAME(AnalyticsEventSelectContent) = + @"select_content"; + +/// Select Item event. This event signifies that an item was selected by a user from a list. Use the +/// appropriate parameters to contextualize the event. Use this event to discover the most popular +/// items selected. Params: +/// +///
    +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterItemListID (String) (optional)
  • +///
  • @c AnalyticsParameterItemListName (String) (optional)
  • +///
+static NSString *const kFIREventSelectItem NS_SWIFT_NAME(AnalyticsEventSelectItem) = @"select_item"; + +/// Select promotion event. This event signifies that a user has selected a promotion offer. Use the +/// appropriate parameters to contextualize the event, such as the item(s) for which the promotion +/// applies. Params: +/// +///
    +///
  • @c AnalyticsParameterCreativeName (String) (optional)
  • +///
  • @c AnalyticsParameterCreativeSlot (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterLocationID (String) (optional)
  • +///
  • @c AnalyticsParameterPromotionID (String) (optional)
  • +///
  • @c AnalyticsParameterPromotionName (String) (optional)
  • +///
+static NSString *const kFIREventSelectPromotion NS_SWIFT_NAME(AnalyticsEventSelectPromotion) = + @"select_promotion"; + +/// Share event. Apps with social features can log the Share event to identify the most viral +/// content. Params: +/// +///
    +///
  • @c AnalyticsParameterContentType (String)
  • +///
  • @c AnalyticsParameterItemID (String)
  • +///
+static NSString *const kFIREventShare NS_SWIFT_NAME(AnalyticsEventShare) = @"share"; + +/// Sign Up event. This event indicates that a user has signed up for an account in your app. The +/// parameter signifies the method by which the user signed up. Use this event to understand the +/// different behaviors between logged in and logged out users. Params: +/// +///
    +///
  • @c AnalyticsParameterMethod (String)
  • +///
+static NSString *const kFIREventSignUp NS_SWIFT_NAME(AnalyticsEventSignUp) = @"sign_up"; + +/// Spend Virtual Currency event. This event tracks the sale of virtual goods in your app and can +/// help you identify which virtual goods are the most popular objects of purchase. Params: +/// +///
    +///
  • @c AnalyticsParameterItemName (String)
  • +///
  • @c AnalyticsParameterVirtualCurrencyName (String)
  • +///
  • @c AnalyticsParameterValue (Int or Double)
  • +///
+static NSString *const kFIREventSpendVirtualCurrency + NS_SWIFT_NAME(AnalyticsEventSpendVirtualCurrency) = @"spend_virtual_currency"; + +/// Tutorial Begin event. This event signifies the start of the on-boarding process in your app. Use +/// this in a funnel with @c AnalyticsEventTutorialComplete to understand how many users complete +/// this process and move on to the full app experience. +static NSString *const kFIREventTutorialBegin NS_SWIFT_NAME(AnalyticsEventTutorialBegin) = + @"tutorial_begin"; + +/// Tutorial End event. Use this event to signify the user's completion of your app's on-boarding +/// process. Add this to a funnel with @c AnalyticsEventTutorialBegin to gauge the completion rate +/// of your on-boarding process. +static NSString *const kFIREventTutorialComplete NS_SWIFT_NAME(AnalyticsEventTutorialComplete) = + @"tutorial_complete"; + +/// Unlock Achievement event. Log this event when the user has unlocked an achievement in your +/// game. Since achievements generally represent the breadth of a gaming experience, this event can +/// help you understand how many users are experiencing all that your game has to offer. Params: +/// +///
    +///
  • @c AnalyticsParameterAchievementID (String)
  • +///
+static NSString *const kFIREventUnlockAchievement NS_SWIFT_NAME(AnalyticsEventUnlockAchievement) = + @"unlock_achievement"; + +/// E-commerce View Cart event. This event signifies that a user has viewed their cart. Use this to +/// analyze your purchase funnel. Note: If you supply the @c AnalyticsParameterValue parameter, you +/// must also supply the @c AnalyticsParameterCurrency parameter so that revenue metrics can be +/// computed accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventViewCart NS_SWIFT_NAME(AnalyticsEventViewCart) = @"view_cart"; + +/// View Item event. This event signifies that a user has viewed an item. Use the appropriate +/// parameters to contextualize the event. Use this event to discover the most popular items viewed +/// in your app. Note: If you supply the @c AnalyticsParameterValue parameter, you must also supply +/// the @c AnalyticsParameterCurrency parameter so that revenue metrics can be computed accurately. +/// Params: +/// +///
    +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventViewItem NS_SWIFT_NAME(AnalyticsEventViewItem) = @"view_item"; + +/// View Item List event. Log this event when a user sees a list of items or offerings. Params: +/// +///
    +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterItemListID (String) (optional)
  • +///
  • @c AnalyticsParameterItemListName (String) (optional)
  • +///
+static NSString *const kFIREventViewItemList NS_SWIFT_NAME(AnalyticsEventViewItemList) = + @"view_item_list"; + +/// View Promotion event. This event signifies that a promotion was shown to a user. Add this event +/// to a funnel with the @c AnalyticsEventAddToCart and @c AnalyticsEventPurchase to gauge your +/// conversion process. Params: +/// +///
    +///
  • @c AnalyticsParameterCreativeName (String) (optional)
  • +///
  • @c AnalyticsParameterCreativeSlot (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterLocationID (String) (optional)
  • +///
  • @c AnalyticsParameterPromotionID (String) (optional)
  • +///
  • @c AnalyticsParameterPromotionName (String) (optional)
  • +///
+static NSString *const kFIREventViewPromotion NS_SWIFT_NAME(AnalyticsEventViewPromotion) = + @"view_promotion"; + +/// View Search Results event. Log this event when the user has been presented with the results of a +/// search. Params: +/// +///
    +///
  • @c AnalyticsParameterSearchTerm (String)
  • +///
+static NSString *const kFIREventViewSearchResults NS_SWIFT_NAME(AnalyticsEventViewSearchResults) = + @"view_search_results"; diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Headers/FIRParameterNames.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Headers/FIRParameterNames.h new file mode 100644 index 0000000..f0e782a --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Headers/FIRParameterNames.h @@ -0,0 +1,775 @@ +/// @file FIRParameterNames.h +/// +/// Predefined event parameter names. +/// +/// Params supply information that contextualize Events. You can associate up to 25 unique Params +/// with each Event type. Some Params are suggested below for certain common Events, but you are +/// not limited to these. You may supply extra Params for suggested Events or custom Params for +/// Custom events. Param names can be up to 40 characters long, may only contain alphanumeric +/// characters and underscores ("_"), and must start with an alphabetic character. Param values can +/// be up to 100 characters long for standard Google Analytics properties and up to 500 characters +/// long for Google Analytics 360 properties. The "firebase_", "google_", and "ga_" prefixes are +/// reserved and should not be used. + +#import + +/// Game achievement ID (String). +///
+///     let params = [
+///       AnalyticsParameterAchievementID : "10_matches_won",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterAchievementID NS_SWIFT_NAME(AnalyticsParameterAchievementID) = + @"achievement_id"; + +/// The ad format (e.g. Banner, Interstitial, Rewarded, Native, Rewarded Interstitial, Instream). +/// (String). +///
+///     let params = [
+///       AnalyticsParameterAdFormat : "Banner",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterAdFormat NS_SWIFT_NAME(AnalyticsParameterAdFormat) = + @"ad_format"; + +/// Ad Network Click ID (String). Used for network-specific click IDs which vary in format. +///
+///     let params = [
+///       AnalyticsParameterAdNetworkClickID : "1234567",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterAdNetworkClickID + NS_SWIFT_NAME(AnalyticsParameterAdNetworkClickID) = @"aclid"; + +/// The ad platform (e.g. MoPub, IronSource) (String). +///
+///     let params = [
+///       AnalyticsParameterAdPlatform : "MoPub",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterAdPlatform NS_SWIFT_NAME(AnalyticsParameterAdPlatform) = + @"ad_platform"; + +/// The ad source (e.g. AdColony) (String). +///
+///     let params = [
+///       AnalyticsParameterAdSource : "AdColony",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterAdSource NS_SWIFT_NAME(AnalyticsParameterAdSource) = + @"ad_source"; + +/// The ad unit name (e.g. Banner_03) (String). +///
+///     let params = [
+///       AnalyticsParameterAdUnitName : "Banner_03",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterAdUnitName NS_SWIFT_NAME(AnalyticsParameterAdUnitName) = + @"ad_unit_name"; + +/// A product affiliation to designate a supplying company or brick and mortar store location +/// (String).
+///     let params = [
+///       AnalyticsParameterAffiliation : "Google Store",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterAffiliation NS_SWIFT_NAME(AnalyticsParameterAffiliation) = + @"affiliation"; + +/// Campaign custom parameter (String). Used as a method of capturing custom data in a campaign. +/// Use varies by network. +///
+///     let params = [
+///       AnalyticsParameterCP1 : "custom_data",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCP1 NS_SWIFT_NAME(AnalyticsParameterCP1) = @"cp1"; + +/// The individual campaign name, slogan, promo code, etc. Some networks have pre-defined macro to +/// capture campaign information, otherwise can be populated by developer. Highly Recommended +/// (String). +///
+///     let params = [
+///       AnalyticsParameterCampaign : "winter_promotion",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCampaign NS_SWIFT_NAME(AnalyticsParameterCampaign) = + @"campaign"; + +/// Campaign ID (String). Used for keyword analysis to identify a specific product promotion or +/// strategic campaign. This is a required key for GA4 data import. +///
+///     let params = [
+///       AnalyticsParameterCampaignID : "7877652710",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCampaignID NS_SWIFT_NAME(AnalyticsParameterCampaignID) = + @"campaign_id"; + +/// Character used in game (String). +///
+///     let params = [
+///       AnalyticsParameterCharacter : "beat_boss",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCharacter NS_SWIFT_NAME(AnalyticsParameterCharacter) = + @"character"; + +/// Campaign content (String). +static NSString *const kFIRParameterContent NS_SWIFT_NAME(AnalyticsParameterContent) = @"content"; + +/// Type of content selected (String). +///
+///     let params = [
+///       AnalyticsParameterContentType : "news article",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterContentType NS_SWIFT_NAME(AnalyticsParameterContentType) = + @"content_type"; + +/// Coupon code used for a purchase (String). +///
+///     let params = [
+///       AnalyticsParameterCoupon : "SUMMER_FUN",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCoupon NS_SWIFT_NAME(AnalyticsParameterCoupon) = @"coupon"; + +/// Creative Format (String). Used to identify the high-level classification of the type of ad +/// served by a specific campaign. +///
+///     let params = [
+///       AnalyticsParameterCreativeFormat : "display",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCreativeFormat NS_SWIFT_NAME(AnalyticsParameterCreativeFormat) = + @"creative_format"; + +/// The name of a creative used in a promotional spot (String). +///
+///     let params = [
+///       AnalyticsParameterCreativeName : "Summer Sale",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCreativeName NS_SWIFT_NAME(AnalyticsParameterCreativeName) = + @"creative_name"; + +/// The name of a creative slot (String). +///
+///     let params = [
+///       AnalyticsParameterCreativeSlot : "summer_banner2",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCreativeSlot NS_SWIFT_NAME(AnalyticsParameterCreativeSlot) = + @"creative_slot"; + +/// Currency of the purchase or items associated with the event, in 3-letter +/// ISO_4217 format (String). +///
+///     let params = [
+///       AnalyticsParameterCurrency : "USD",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCurrency NS_SWIFT_NAME(AnalyticsParameterCurrency) = + @"currency"; + +/// Flight or Travel destination (String). +///
+///     let params = [
+///       AnalyticsParameterDestination : "Mountain View, CA",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterDestination NS_SWIFT_NAME(AnalyticsParameterDestination) = + @"destination"; + +/// Monetary value of discount associated with a purchase (Double). +///
+///     let params = [
+///       AnalyticsParameterDiscount : 2.0,
+///       AnalyticsParameterCurrency : "USD",  // e.g. $2.00 USD
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterDiscount NS_SWIFT_NAME(AnalyticsParameterDiscount) = + @"discount"; + +/// The arrival date, check-out date or rental end date for the item. This should be in +/// YYYY-MM-DD format (String). +///
+///     let params = [
+///       AnalyticsParameterEndDate : "2015-09-14",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterEndDate NS_SWIFT_NAME(AnalyticsParameterEndDate) = @"end_date"; + +/// Indicates that the associated event should either extend the current session or start a new +/// session if no session was active when the event was logged. Specify 1 to extend the current +/// session or to start a new session; any other value will not extend or start a session. +///
+///     let params = [
+///       AnalyticsParameterExtendSession : 1,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterExtendSession NS_SWIFT_NAME(AnalyticsParameterExtendSession) = + @"extend_session"; + +/// Flight number for travel events (String). +///
+///     let params = [
+///       AnalyticsParameterFlightNumber : "ZZ800",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterFlightNumber NS_SWIFT_NAME(AnalyticsParameterFlightNumber) = + @"flight_number"; + +/// Indicates if the user is on a free trial of a subscription. Specify 1 to indicate true and 0 to +/// indicate false (Int). +///
+///     let params = [
+///       AnalyticsParameterFreeTrial : 1,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterFreeTrial NS_SWIFT_NAME(AnalyticsParameterFreeTrial) = + @"free_trial"; + +/// Group/clan/guild ID (String). +///
+///     let params = [
+///       AnalyticsParameterGroupID : "g1",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterGroupID NS_SWIFT_NAME(AnalyticsParameterGroupID) = @"group_id"; + +/// The index of the item in a list (Int). +///
+///     let params = [
+///       AnalyticsParameterIndex : 5,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterIndex NS_SWIFT_NAME(AnalyticsParameterIndex) = @"index"; + +/// Item brand (String). +///
+///     let params = [
+///       AnalyticsParameterItemBrand : "Google",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemBrand NS_SWIFT_NAME(AnalyticsParameterItemBrand) = + @"item_brand"; + +/// Item category (context-specific) (String). +///
+///     let params = [
+///       AnalyticsParameterItemCategory : "pants",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemCategory NS_SWIFT_NAME(AnalyticsParameterItemCategory) = + @"item_category"; + +/// Item Category (context-specific) (String). +///
+///     let params = [
+///       AnalyticsParameterItemCategory2 : "pants",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemCategory2 NS_SWIFT_NAME(AnalyticsParameterItemCategory2) = + @"item_category2"; + +/// Item Category (context-specific) (String). +///
+///     let params = [
+///       AnalyticsParameterItemCategory3 : "pants",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemCategory3 NS_SWIFT_NAME(AnalyticsParameterItemCategory3) = + @"item_category3"; + +/// Item Category (context-specific) (String). +///
+///     let params = [
+///       AnalyticsParameterItemCategory4 : "pants",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemCategory4 NS_SWIFT_NAME(AnalyticsParameterItemCategory4) = + @"item_category4"; + +/// Item Category (context-specific) (String). +///
+///     let params = [
+///       AnalyticsParameterItemCategory5 : "pants",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemCategory5 NS_SWIFT_NAME(AnalyticsParameterItemCategory5) = + @"item_category5"; + +/// Item ID (context-specific) (String). +///
+///     let params = [
+///       AnalyticsParameterItemID : "SKU_12345",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemID NS_SWIFT_NAME(AnalyticsParameterItemID) = @"item_id"; + +/// The ID of the list in which the item was presented to the user (String). +///
+///     let params = [
+///       AnalyticsParameterItemListID : "ABC123",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemListID NS_SWIFT_NAME(AnalyticsParameterItemListID) = + @"item_list_id"; + +/// The name of the list in which the item was presented to the user (String). +///
+///     let params = [
+///       AnalyticsParameterItemListName : "Related products",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemListName NS_SWIFT_NAME(AnalyticsParameterItemListName) = + @"item_list_name"; + +/// Item Name (context-specific) (String). +///
+///     let params = [
+///       AnalyticsParameterItemName : "jeggings",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemName NS_SWIFT_NAME(AnalyticsParameterItemName) = + @"item_name"; + +/// Item variant (String). +///
+///     let params = [
+///       AnalyticsParameterItemVariant : "Black",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemVariant NS_SWIFT_NAME(AnalyticsParameterItemVariant) = + @"item_variant"; + +/// The list of items involved in the transaction expressed as `[[String: Any]]`. +///
+///     let params = [
+///       AnalyticsParameterItems : [
+///         [AnalyticsParameterItemName : "jeggings", AnalyticsParameterItemCategory : "pants"],
+///         [AnalyticsParameterItemName : "boots", AnalyticsParameterItemCategory : "shoes"],
+///       ],
+///     ]
+/// 
+static NSString *const kFIRParameterItems NS_SWIFT_NAME(AnalyticsParameterItems) = @"items"; + +/// Level in game (Int). +///
+///     let params = [
+///       AnalyticsParameterLevel : 42,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterLevel NS_SWIFT_NAME(AnalyticsParameterLevel) = @"level"; + +/// The name of a level in a game (String). +///
+///     let params = [
+///       AnalyticsParameterLevelName : "room_1",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterLevelName NS_SWIFT_NAME(AnalyticsParameterLevelName) = + @"level_name"; + +/// Location (String). The Google Place ID +/// that corresponds to the associated event. Alternatively, you can supply your own custom +/// Location ID. +///
+///     let params = [
+///       AnalyticsParameterLocation : "ChIJiyj437sx3YAR9kUWC8QkLzQ",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterLocation NS_SWIFT_NAME(AnalyticsParameterLocation) = + @"location"; + +/// The location associated with the event. Preferred to be the Google +/// Place ID that corresponds to the +/// associated item but could be overridden to a custom location ID string.(String). +///
+///     let params = [
+///       AnalyticsParameterLocationID : "ChIJiyj437sx3YAR9kUWC8QkLzQ",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterLocationID NS_SWIFT_NAME(AnalyticsParameterLocationID) = + @"location_id"; + +/// Marketing Tactic (String). Used to identify the targeting criteria applied to a specific +/// campaign. +///
+///     let params = [
+///       AnalyticsParameterMarketingTactic : "Remarketing",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterMarketingTactic + NS_SWIFT_NAME(AnalyticsParameterMarketingTactic) = @"marketing_tactic"; + +/// The advertising or marketing medium, for example: cpc, banner, email, push. Highly recommended +/// (String). +///
+///     let params = [
+///       AnalyticsParameterMedium : "email",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterMedium NS_SWIFT_NAME(AnalyticsParameterMedium) = @"medium"; + +/// A particular approach used in an operation; for example, "facebook" or "email" in the context +/// of a sign_up or login event. (String). +///
+///     let params = [
+///       AnalyticsParameterMethod : "google",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterMethod NS_SWIFT_NAME(AnalyticsParameterMethod) = @"method"; + +/// Number of nights staying at hotel (Int). +///
+///     let params = [
+///       AnalyticsParameterNumberOfNights : 3,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterNumberOfNights + NS_SWIFT_NAME(AnalyticsParameterNumberOfNights) = @"number_of_nights"; + +/// Number of passengers traveling (Int). +///
+///     let params = [
+///       AnalyticsParameterNumberOfPassengers : 11,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterNumberOfPassengers + NS_SWIFT_NAME(AnalyticsParameterNumberOfPassengers) = @"number_of_passengers"; + +/// Number of rooms for travel events (Int). +///
+///     let params = [
+///       AnalyticsParameterNumberOfRooms : 2,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterNumberOfRooms NS_SWIFT_NAME(AnalyticsParameterNumberOfRooms) = + @"number_of_rooms"; + +/// Flight or Travel origin (String). +///
+///     let params = [
+///       AnalyticsParameterOrigin : "Mountain View, CA",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterOrigin NS_SWIFT_NAME(AnalyticsParameterOrigin) = @"origin"; + +/// The chosen method of payment (String). +///
+///     let params = [
+///       AnalyticsParameterPaymentType : "Visa",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterPaymentType NS_SWIFT_NAME(AnalyticsParameterPaymentType) = + @"payment_type"; + +/// Purchase price (Double). +///
+///     let params = [
+///       AnalyticsParameterPrice : 1.0,
+///       AnalyticsParameterCurrency : "USD",  // e.g. $1.00 USD
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterPrice NS_SWIFT_NAME(AnalyticsParameterPrice) = @"price"; + +/// Indicates if an item's price is discounted. Specify 1 to indicate true and 0 to indicate false +/// (Int). +///
+///     let params = [
+///       AnalyticsParameterPriceIsDiscounted : 1,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterPriceIsDiscounted + NS_SWIFT_NAME(AnalyticsParameterPriceIsDiscounted) = @"price_is_discounted"; + +/// The ID of a product (String). +///
+///     let params = [
+///       AnalyticsParameterProductID : "PROD_12345",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterProductID NS_SWIFT_NAME(AnalyticsParameterProductID) = + @"product_id"; + +/// The name of a product (String). +///
+///     let params = [
+///       AnalyticsParameterProductName : "My Awesome Product",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterProductName NS_SWIFT_NAME(AnalyticsParameterProductName) = + @"product_name"; + +/// The ID of a product promotion (String). +///
+///     let params = [
+///       AnalyticsParameterPromotionID : "ABC123",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterPromotionID NS_SWIFT_NAME(AnalyticsParameterPromotionID) = + @"promotion_id"; + +/// The name of a product promotion (String). +///
+///     let params = [
+///       AnalyticsParameterPromotionName : "Summer Sale",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterPromotionName NS_SWIFT_NAME(AnalyticsParameterPromotionName) = + @"promotion_name"; + +/// Purchase quantity (Int). +///
+///     let params = [
+///       AnalyticsParameterQuantity : 1,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterQuantity NS_SWIFT_NAME(AnalyticsParameterQuantity) = + @"quantity"; + +/// Score in game (Int). +///
+///     let params = [
+///       AnalyticsParameterScore : 4200,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterScore NS_SWIFT_NAME(AnalyticsParameterScore) = @"score"; + +/// Current screen class, such as the class name of the UIViewController, logged with screen_view +/// event and added to every event (String). +///
+///     let params = [
+///       AnalyticsParameterScreenClass : "LoginViewController",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterScreenClass NS_SWIFT_NAME(AnalyticsParameterScreenClass) = + @"screen_class"; + +/// Current screen name, such as the name of the UIViewController, logged with screen_view event and +/// added to every event (String). +///
+///     let params = [
+///       AnalyticsParameterScreenName : "LoginView",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterScreenName NS_SWIFT_NAME(AnalyticsParameterScreenName) = + @"screen_name"; + +/// The search string/keywords used (String). +///
+///     let params = [
+///       AnalyticsParameterSearchTerm : "periodic table",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterSearchTerm NS_SWIFT_NAME(AnalyticsParameterSearchTerm) = + @"search_term"; + +/// Shipping cost associated with a transaction (Double). +///
+///     let params = [
+///       AnalyticsParameterShipping : 5.99,
+///       AnalyticsParameterCurrency : "USD",  // e.g. $5.99 USD
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterShipping NS_SWIFT_NAME(AnalyticsParameterShipping) = + @"shipping"; + +/// The shipping tier (e.g. Ground, Air, Next-day) selected for delivery of the purchased item +/// (String). +///
+///     let params = [
+///       AnalyticsParameterShippingTier : "Ground",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterShippingTier NS_SWIFT_NAME(AnalyticsParameterShippingTier) = + @"shipping_tier"; + +/// The origin of your traffic, such as an Ad network (for example, google) or partner (urban +/// airship). Identify the advertiser, site, publication, etc. that is sending traffic to your +/// property. Highly recommended (String). +///
+///     let params = [
+///       AnalyticsParameterSource : "InMobi",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterSource NS_SWIFT_NAME(AnalyticsParameterSource) = @"source"; + +/// Source Platform (String). Used to identify the platform responsible for directing traffic to a +/// given Analytics property (e.g., a buying platform where budgets, targeting criteria, etc. are +/// set, a platform for managing organic traffic data, etc.). +///
+///     let params = [
+///       AnalyticsParameterSourcePlatform : "sa360",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterSourcePlatform NS_SWIFT_NAME(AnalyticsParameterSourcePlatform) = + @"source_platform"; + +/// The departure date, check-in date or rental start date for the item. This should be in +/// YYYY-MM-DD format (String). +///
+///     let params = [
+///       AnalyticsParameterStartDate : "2015-09-14",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterStartDate NS_SWIFT_NAME(AnalyticsParameterStartDate) = + @"start_date"; + +/// Indicates if the purchase is a subscription. Specify 1 to indicate true and 0 to indicate false +/// (Int). +///
+///     let params = [
+///       AnalyticsParameterSubscription : 1,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterSubscription NS_SWIFT_NAME(AnalyticsParameterSubscription) = + @"subscription"; + +/// The result of an operation. Specify 1 to indicate success and 0 to indicate failure (Int). +///
+///     let params = [
+///       AnalyticsParameterSuccess : 1,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterSuccess NS_SWIFT_NAME(AnalyticsParameterSuccess) = @"success"; + +/// Tax cost associated with a transaction (Double). +///
+///     let params = [
+///       AnalyticsParameterTax : 2.43,
+///       AnalyticsParameterCurrency : "USD",  // e.g. $2.43 USD
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterTax NS_SWIFT_NAME(AnalyticsParameterTax) = @"tax"; + +/// If you're manually tagging keyword campaigns, you should use utm_term to specify the keyword +/// (String). +///
+///     let params = [
+///       AnalyticsParameterTerm : "game",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterTerm NS_SWIFT_NAME(AnalyticsParameterTerm) = @"term"; + +/// The unique identifier of a transaction (String). +///
+///     let params = [
+///       AnalyticsParameterTransactionID : "T12345",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterTransactionID NS_SWIFT_NAME(AnalyticsParameterTransactionID) = + @"transaction_id"; + +/// Travel class (String). +///
+///     let params = [
+///       AnalyticsParameterTravelClass : "business",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterTravelClass NS_SWIFT_NAME(AnalyticsParameterTravelClass) = + @"travel_class"; + +/// A context-specific numeric value which is accumulated automatically for each event type. This is +/// a general purpose parameter that is useful for accumulating a key metric that pertains to an +/// event. Examples include revenue, distance, time and points. Value should be specified as Int or +/// Double. +/// Notes: Values for pre-defined currency-related events (such as @c AnalyticsEventAddToCart) +/// should be supplied using Double and must be accompanied by a @c AnalyticsParameterCurrency +/// parameter. The valid range of accumulated values is +/// [-9,223,372,036,854.77, 9,223,372,036,854.77]. Supplying a non-numeric value, omitting the +/// corresponding @c AnalyticsParameterCurrency parameter, or supplying an invalid +/// currency code for conversion events will cause that +/// conversion to be omitted from reporting. +///
+///     let params = [
+///       AnalyticsParameterValue : 3.99,
+///       AnalyticsParameterCurrency : "USD",  // e.g. $3.99 USD
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterValue NS_SWIFT_NAME(AnalyticsParameterValue) = @"value"; + +/// Name of virtual currency type (String). +///
+///     let params = [
+///       AnalyticsParameterVirtualCurrencyName : "virtual_currency_name",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterVirtualCurrencyName + NS_SWIFT_NAME(AnalyticsParameterVirtualCurrencyName) = @"virtual_currency_name"; diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Headers/FIRUserPropertyNames.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Headers/FIRUserPropertyNames.h new file mode 100644 index 0000000..2442d8a --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Headers/FIRUserPropertyNames.h @@ -0,0 +1,28 @@ +/// @file FIRUserPropertyNames.h +/// +/// Predefined user property names. +/// +/// A UserProperty is an attribute that describes the app-user. By supplying UserProperties, you can +/// later analyze different behaviors of various segments of your userbase. You may supply up to 25 +/// unique UserProperties per app, and you can use the name and value of your choosing for each one. +/// UserProperty names can be up to 24 characters long, may only contain alphanumeric characters and +/// underscores ("_"), and must start with an alphabetic character. UserProperty values can be up to +/// 36 characters long. The "firebase_", "google_", and "ga_" prefixes are reserved and should not +/// be used. + +#import + +/// Indicates whether events logged by Google Analytics can be used to personalize ads for the user. +/// Set to "YES" to enable, or "NO" to disable. Default is enabled. See the +/// documentation for +/// more details and information about related settings. +/// +///
+///     Analytics.setUserProperty("NO", forName: AnalyticsUserPropertyAllowAdPersonalizationSignals)
+/// 
+static NSString *const kFIRUserPropertyAllowAdPersonalizationSignals + NS_SWIFT_NAME(AnalyticsUserPropertyAllowAdPersonalizationSignals) = @"allow_personalized_ads"; + +/// The method used to sign in. For example, "google", "facebook" or "twitter". +static NSString *const kFIRUserPropertySignUpMethod + NS_SWIFT_NAME(AnalyticsUserPropertySignUpMethod) = @"sign_up_method"; diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Headers/FirebaseAnalytics-Swift.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Headers/FirebaseAnalytics-Swift.h new file mode 100644 index 0000000..b409e3a --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Headers/FirebaseAnalytics-Swift.h @@ -0,0 +1,628 @@ +#if 0 +#elif defined(__arm64__) && __arm64__ +// Generated by Apple Swift version 6.0.3 effective-5.10 (swiftlang-6.0.3.1.10 clang-1600.0.30.1) +#ifndef FIREBASEANALYTICS_SWIFT_H +#define FIREBASEANALYTICS_SWIFT_H +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgcc-compat" + +#if !defined(__has_include) +# define __has_include(x) 0 +#endif +#if !defined(__has_attribute) +# define __has_attribute(x) 0 +#endif +#if !defined(__has_feature) +# define __has_feature(x) 0 +#endif +#if !defined(__has_warning) +# define __has_warning(x) 0 +#endif + +#if __has_include() +# include +#endif + +#pragma clang diagnostic ignored "-Wauto-import" +#if defined(__OBJC__) +#include +#endif +#if defined(__cplusplus) +#include +#include +#include +#include +#include +#include +#include +#else +#include +#include +#include +#include +#endif +#if defined(__cplusplus) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wnon-modular-include-in-framework-module" +#if defined(__arm64e__) && __has_include() +# include +#else +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wreserved-macro-identifier" +# ifndef __ptrauth_swift_value_witness_function_pointer +# define __ptrauth_swift_value_witness_function_pointer(x) +# endif +# ifndef __ptrauth_swift_class_method_pointer +# define __ptrauth_swift_class_method_pointer(x) +# endif +#pragma clang diagnostic pop +#endif +#pragma clang diagnostic pop +#endif + +#if !defined(SWIFT_TYPEDEFS) +# define SWIFT_TYPEDEFS 1 +# if __has_include() +# include +# elif !defined(__cplusplus) +typedef uint_least16_t char16_t; +typedef uint_least32_t char32_t; +# endif +typedef float swift_float2 __attribute__((__ext_vector_type__(2))); +typedef float swift_float3 __attribute__((__ext_vector_type__(3))); +typedef float swift_float4 __attribute__((__ext_vector_type__(4))); +typedef double swift_double2 __attribute__((__ext_vector_type__(2))); +typedef double swift_double3 __attribute__((__ext_vector_type__(3))); +typedef double swift_double4 __attribute__((__ext_vector_type__(4))); +typedef int swift_int2 __attribute__((__ext_vector_type__(2))); +typedef int swift_int3 __attribute__((__ext_vector_type__(3))); +typedef int swift_int4 __attribute__((__ext_vector_type__(4))); +typedef unsigned int swift_uint2 __attribute__((__ext_vector_type__(2))); +typedef unsigned int swift_uint3 __attribute__((__ext_vector_type__(3))); +typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); +#endif + +#if !defined(SWIFT_PASTE) +# define SWIFT_PASTE_HELPER(x, y) x##y +# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y) +#endif +#if !defined(SWIFT_METATYPE) +# define SWIFT_METATYPE(X) Class +#endif +#if !defined(SWIFT_CLASS_PROPERTY) +# if __has_feature(objc_class_property) +# define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__ +# else +# define SWIFT_CLASS_PROPERTY(...) +# endif +#endif +#if !defined(SWIFT_RUNTIME_NAME) +# if __has_attribute(objc_runtime_name) +# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X))) +# else +# define SWIFT_RUNTIME_NAME(X) +# endif +#endif +#if !defined(SWIFT_COMPILE_NAME) +# if __has_attribute(swift_name) +# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X))) +# else +# define SWIFT_COMPILE_NAME(X) +# endif +#endif +#if !defined(SWIFT_METHOD_FAMILY) +# if __has_attribute(objc_method_family) +# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X))) +# else +# define SWIFT_METHOD_FAMILY(X) +# endif +#endif +#if !defined(SWIFT_NOESCAPE) +# if __has_attribute(noescape) +# define SWIFT_NOESCAPE __attribute__((noescape)) +# else +# define SWIFT_NOESCAPE +# endif +#endif +#if !defined(SWIFT_RELEASES_ARGUMENT) +# if __has_attribute(ns_consumed) +# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed)) +# else +# define SWIFT_RELEASES_ARGUMENT +# endif +#endif +#if !defined(SWIFT_WARN_UNUSED_RESULT) +# if __has_attribute(warn_unused_result) +# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) +# else +# define SWIFT_WARN_UNUSED_RESULT +# endif +#endif +#if !defined(SWIFT_NORETURN) +# if __has_attribute(noreturn) +# define SWIFT_NORETURN __attribute__((noreturn)) +# else +# define SWIFT_NORETURN +# endif +#endif +#if !defined(SWIFT_CLASS_EXTRA) +# define SWIFT_CLASS_EXTRA +#endif +#if !defined(SWIFT_PROTOCOL_EXTRA) +# define SWIFT_PROTOCOL_EXTRA +#endif +#if !defined(SWIFT_ENUM_EXTRA) +# define SWIFT_ENUM_EXTRA +#endif +#if !defined(SWIFT_CLASS) +# if __has_attribute(objc_subclassing_restricted) +# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA +# define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA +# else +# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA +# define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA +# endif +#endif +#if !defined(SWIFT_RESILIENT_CLASS) +# if __has_attribute(objc_class_stub) +# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) __attribute__((objc_class_stub)) +# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_class_stub)) SWIFT_CLASS_NAMED(SWIFT_NAME) +# else +# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) +# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) SWIFT_CLASS_NAMED(SWIFT_NAME) +# endif +#endif +#if !defined(SWIFT_PROTOCOL) +# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA +# define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA +#endif +#if !defined(SWIFT_EXTENSION) +# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__) +#endif +#if !defined(OBJC_DESIGNATED_INITIALIZER) +# if __has_attribute(objc_designated_initializer) +# define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) +# else +# define OBJC_DESIGNATED_INITIALIZER +# endif +#endif +#if !defined(SWIFT_ENUM_ATTR) +# if __has_attribute(enum_extensibility) +# define SWIFT_ENUM_ATTR(_extensibility) __attribute__((enum_extensibility(_extensibility))) +# else +# define SWIFT_ENUM_ATTR(_extensibility) +# endif +#endif +#if !defined(SWIFT_ENUM) +# define SWIFT_ENUM(_type, _name, _extensibility) enum _name : _type _name; enum SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type +# if __has_feature(generalized_swift_name) +# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type +# else +# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) SWIFT_ENUM(_type, _name, _extensibility) +# endif +#endif +#if !defined(SWIFT_UNAVAILABLE) +# define SWIFT_UNAVAILABLE __attribute__((unavailable)) +#endif +#if !defined(SWIFT_UNAVAILABLE_MSG) +# define SWIFT_UNAVAILABLE_MSG(msg) __attribute__((unavailable(msg))) +#endif +#if !defined(SWIFT_AVAILABILITY) +# define SWIFT_AVAILABILITY(plat, ...) __attribute__((availability(plat, __VA_ARGS__))) +#endif +#if !defined(SWIFT_WEAK_IMPORT) +# define SWIFT_WEAK_IMPORT __attribute__((weak_import)) +#endif +#if !defined(SWIFT_DEPRECATED) +# define SWIFT_DEPRECATED __attribute__((deprecated)) +#endif +#if !defined(SWIFT_DEPRECATED_MSG) +# define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__))) +#endif +#if !defined(SWIFT_DEPRECATED_OBJC) +# if __has_feature(attribute_diagnose_if_objc) +# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning"))) +# else +# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg) +# endif +#endif +#if defined(__OBJC__) +#if !defined(IBSegueAction) +# define IBSegueAction +#endif +#endif +#if !defined(SWIFT_EXTERN) +# if defined(__cplusplus) +# define SWIFT_EXTERN extern "C" +# else +# define SWIFT_EXTERN extern +# endif +#endif +#if !defined(SWIFT_CALL) +# define SWIFT_CALL __attribute__((swiftcall)) +#endif +#if !defined(SWIFT_INDIRECT_RESULT) +# define SWIFT_INDIRECT_RESULT __attribute__((swift_indirect_result)) +#endif +#if !defined(SWIFT_CONTEXT) +# define SWIFT_CONTEXT __attribute__((swift_context)) +#endif +#if !defined(SWIFT_ERROR_RESULT) +# define SWIFT_ERROR_RESULT __attribute__((swift_error_result)) +#endif +#if defined(__cplusplus) +# define SWIFT_NOEXCEPT noexcept +#else +# define SWIFT_NOEXCEPT +#endif +#if !defined(SWIFT_C_INLINE_THUNK) +# if __has_attribute(always_inline) +# if __has_attribute(nodebug) +# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) __attribute__((nodebug)) +# else +# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) +# endif +# else +# define SWIFT_C_INLINE_THUNK inline +# endif +#endif +#if defined(_WIN32) +#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) +# define SWIFT_IMPORT_STDLIB_SYMBOL __declspec(dllimport) +#endif +#else +#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) +# define SWIFT_IMPORT_STDLIB_SYMBOL +#endif +#endif +#if defined(__OBJC__) +#if __has_feature(objc_modules) +#if __has_warning("-Watimport-in-framework-header") +#pragma clang diagnostic ignored "-Watimport-in-framework-header" +#endif +#endif + +#endif +#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch" +#pragma clang diagnostic ignored "-Wduplicate-method-arg" +#if __has_warning("-Wpragma-clang-attribute") +# pragma clang diagnostic ignored "-Wpragma-clang-attribute" +#endif +#pragma clang diagnostic ignored "-Wunknown-pragmas" +#pragma clang diagnostic ignored "-Wnullability" +#pragma clang diagnostic ignored "-Wdollar-in-identifier-extension" +#pragma clang diagnostic ignored "-Wunsafe-buffer-usage" + +#if __has_attribute(external_source_symbol) +# pragma push_macro("any") +# undef any +# pragma clang attribute push(__attribute__((external_source_symbol(language="Swift", defined_in="FirebaseAnalytics",generated_declaration))), apply_to=any(function,enum,objc_interface,objc_category,objc_protocol)) +# pragma pop_macro("any") +#endif + +#if defined(__OBJC__) + +#endif +#if __has_attribute(external_source_symbol) +# pragma clang attribute pop +#endif +#if defined(__cplusplus) +#endif +#pragma clang diagnostic pop +#endif + +#elif defined(__x86_64__) && __x86_64__ +// Generated by Apple Swift version 6.0.3 effective-5.10 (swiftlang-6.0.3.1.10 clang-1600.0.30.1) +#ifndef FIREBASEANALYTICS_SWIFT_H +#define FIREBASEANALYTICS_SWIFT_H +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgcc-compat" + +#if !defined(__has_include) +# define __has_include(x) 0 +#endif +#if !defined(__has_attribute) +# define __has_attribute(x) 0 +#endif +#if !defined(__has_feature) +# define __has_feature(x) 0 +#endif +#if !defined(__has_warning) +# define __has_warning(x) 0 +#endif + +#if __has_include() +# include +#endif + +#pragma clang diagnostic ignored "-Wauto-import" +#if defined(__OBJC__) +#include +#endif +#if defined(__cplusplus) +#include +#include +#include +#include +#include +#include +#include +#else +#include +#include +#include +#include +#endif +#if defined(__cplusplus) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wnon-modular-include-in-framework-module" +#if defined(__arm64e__) && __has_include() +# include +#else +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wreserved-macro-identifier" +# ifndef __ptrauth_swift_value_witness_function_pointer +# define __ptrauth_swift_value_witness_function_pointer(x) +# endif +# ifndef __ptrauth_swift_class_method_pointer +# define __ptrauth_swift_class_method_pointer(x) +# endif +#pragma clang diagnostic pop +#endif +#pragma clang diagnostic pop +#endif + +#if !defined(SWIFT_TYPEDEFS) +# define SWIFT_TYPEDEFS 1 +# if __has_include() +# include +# elif !defined(__cplusplus) +typedef uint_least16_t char16_t; +typedef uint_least32_t char32_t; +# endif +typedef float swift_float2 __attribute__((__ext_vector_type__(2))); +typedef float swift_float3 __attribute__((__ext_vector_type__(3))); +typedef float swift_float4 __attribute__((__ext_vector_type__(4))); +typedef double swift_double2 __attribute__((__ext_vector_type__(2))); +typedef double swift_double3 __attribute__((__ext_vector_type__(3))); +typedef double swift_double4 __attribute__((__ext_vector_type__(4))); +typedef int swift_int2 __attribute__((__ext_vector_type__(2))); +typedef int swift_int3 __attribute__((__ext_vector_type__(3))); +typedef int swift_int4 __attribute__((__ext_vector_type__(4))); +typedef unsigned int swift_uint2 __attribute__((__ext_vector_type__(2))); +typedef unsigned int swift_uint3 __attribute__((__ext_vector_type__(3))); +typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); +#endif + +#if !defined(SWIFT_PASTE) +# define SWIFT_PASTE_HELPER(x, y) x##y +# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y) +#endif +#if !defined(SWIFT_METATYPE) +# define SWIFT_METATYPE(X) Class +#endif +#if !defined(SWIFT_CLASS_PROPERTY) +# if __has_feature(objc_class_property) +# define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__ +# else +# define SWIFT_CLASS_PROPERTY(...) +# endif +#endif +#if !defined(SWIFT_RUNTIME_NAME) +# if __has_attribute(objc_runtime_name) +# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X))) +# else +# define SWIFT_RUNTIME_NAME(X) +# endif +#endif +#if !defined(SWIFT_COMPILE_NAME) +# if __has_attribute(swift_name) +# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X))) +# else +# define SWIFT_COMPILE_NAME(X) +# endif +#endif +#if !defined(SWIFT_METHOD_FAMILY) +# if __has_attribute(objc_method_family) +# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X))) +# else +# define SWIFT_METHOD_FAMILY(X) +# endif +#endif +#if !defined(SWIFT_NOESCAPE) +# if __has_attribute(noescape) +# define SWIFT_NOESCAPE __attribute__((noescape)) +# else +# define SWIFT_NOESCAPE +# endif +#endif +#if !defined(SWIFT_RELEASES_ARGUMENT) +# if __has_attribute(ns_consumed) +# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed)) +# else +# define SWIFT_RELEASES_ARGUMENT +# endif +#endif +#if !defined(SWIFT_WARN_UNUSED_RESULT) +# if __has_attribute(warn_unused_result) +# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) +# else +# define SWIFT_WARN_UNUSED_RESULT +# endif +#endif +#if !defined(SWIFT_NORETURN) +# if __has_attribute(noreturn) +# define SWIFT_NORETURN __attribute__((noreturn)) +# else +# define SWIFT_NORETURN +# endif +#endif +#if !defined(SWIFT_CLASS_EXTRA) +# define SWIFT_CLASS_EXTRA +#endif +#if !defined(SWIFT_PROTOCOL_EXTRA) +# define SWIFT_PROTOCOL_EXTRA +#endif +#if !defined(SWIFT_ENUM_EXTRA) +# define SWIFT_ENUM_EXTRA +#endif +#if !defined(SWIFT_CLASS) +# if __has_attribute(objc_subclassing_restricted) +# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA +# define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA +# else +# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA +# define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA +# endif +#endif +#if !defined(SWIFT_RESILIENT_CLASS) +# if __has_attribute(objc_class_stub) +# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) __attribute__((objc_class_stub)) +# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_class_stub)) SWIFT_CLASS_NAMED(SWIFT_NAME) +# else +# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) +# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) SWIFT_CLASS_NAMED(SWIFT_NAME) +# endif +#endif +#if !defined(SWIFT_PROTOCOL) +# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA +# define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA +#endif +#if !defined(SWIFT_EXTENSION) +# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__) +#endif +#if !defined(OBJC_DESIGNATED_INITIALIZER) +# if __has_attribute(objc_designated_initializer) +# define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) +# else +# define OBJC_DESIGNATED_INITIALIZER +# endif +#endif +#if !defined(SWIFT_ENUM_ATTR) +# if __has_attribute(enum_extensibility) +# define SWIFT_ENUM_ATTR(_extensibility) __attribute__((enum_extensibility(_extensibility))) +# else +# define SWIFT_ENUM_ATTR(_extensibility) +# endif +#endif +#if !defined(SWIFT_ENUM) +# define SWIFT_ENUM(_type, _name, _extensibility) enum _name : _type _name; enum SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type +# if __has_feature(generalized_swift_name) +# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type +# else +# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) SWIFT_ENUM(_type, _name, _extensibility) +# endif +#endif +#if !defined(SWIFT_UNAVAILABLE) +# define SWIFT_UNAVAILABLE __attribute__((unavailable)) +#endif +#if !defined(SWIFT_UNAVAILABLE_MSG) +# define SWIFT_UNAVAILABLE_MSG(msg) __attribute__((unavailable(msg))) +#endif +#if !defined(SWIFT_AVAILABILITY) +# define SWIFT_AVAILABILITY(plat, ...) __attribute__((availability(plat, __VA_ARGS__))) +#endif +#if !defined(SWIFT_WEAK_IMPORT) +# define SWIFT_WEAK_IMPORT __attribute__((weak_import)) +#endif +#if !defined(SWIFT_DEPRECATED) +# define SWIFT_DEPRECATED __attribute__((deprecated)) +#endif +#if !defined(SWIFT_DEPRECATED_MSG) +# define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__))) +#endif +#if !defined(SWIFT_DEPRECATED_OBJC) +# if __has_feature(attribute_diagnose_if_objc) +# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning"))) +# else +# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg) +# endif +#endif +#if defined(__OBJC__) +#if !defined(IBSegueAction) +# define IBSegueAction +#endif +#endif +#if !defined(SWIFT_EXTERN) +# if defined(__cplusplus) +# define SWIFT_EXTERN extern "C" +# else +# define SWIFT_EXTERN extern +# endif +#endif +#if !defined(SWIFT_CALL) +# define SWIFT_CALL __attribute__((swiftcall)) +#endif +#if !defined(SWIFT_INDIRECT_RESULT) +# define SWIFT_INDIRECT_RESULT __attribute__((swift_indirect_result)) +#endif +#if !defined(SWIFT_CONTEXT) +# define SWIFT_CONTEXT __attribute__((swift_context)) +#endif +#if !defined(SWIFT_ERROR_RESULT) +# define SWIFT_ERROR_RESULT __attribute__((swift_error_result)) +#endif +#if defined(__cplusplus) +# define SWIFT_NOEXCEPT noexcept +#else +# define SWIFT_NOEXCEPT +#endif +#if !defined(SWIFT_C_INLINE_THUNK) +# if __has_attribute(always_inline) +# if __has_attribute(nodebug) +# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) __attribute__((nodebug)) +# else +# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) +# endif +# else +# define SWIFT_C_INLINE_THUNK inline +# endif +#endif +#if defined(_WIN32) +#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) +# define SWIFT_IMPORT_STDLIB_SYMBOL __declspec(dllimport) +#endif +#else +#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) +# define SWIFT_IMPORT_STDLIB_SYMBOL +#endif +#endif +#if defined(__OBJC__) +#if __has_feature(objc_modules) +#if __has_warning("-Watimport-in-framework-header") +#pragma clang diagnostic ignored "-Watimport-in-framework-header" +#endif +#endif + +#endif +#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch" +#pragma clang diagnostic ignored "-Wduplicate-method-arg" +#if __has_warning("-Wpragma-clang-attribute") +# pragma clang diagnostic ignored "-Wpragma-clang-attribute" +#endif +#pragma clang diagnostic ignored "-Wunknown-pragmas" +#pragma clang diagnostic ignored "-Wnullability" +#pragma clang diagnostic ignored "-Wdollar-in-identifier-extension" +#pragma clang diagnostic ignored "-Wunsafe-buffer-usage" + +#if __has_attribute(external_source_symbol) +# pragma push_macro("any") +# undef any +# pragma clang attribute push(__attribute__((external_source_symbol(language="Swift", defined_in="FirebaseAnalytics",generated_declaration))), apply_to=any(function,enum,objc_interface,objc_category,objc_protocol)) +# pragma pop_macro("any") +#endif + +#if defined(__OBJC__) + +#endif +#if __has_attribute(external_source_symbol) +# pragma clang attribute pop +#endif +#if defined(__cplusplus) +#endif +#pragma clang diagnostic pop +#endif + +#else +#error unsupported Swift architecture +#endif diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Headers/FirebaseAnalytics-umbrella.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Headers/FirebaseAnalytics-umbrella.h new file mode 100644 index 0000000..58342c6 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Headers/FirebaseAnalytics-umbrella.h @@ -0,0 +1,24 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + +#import "FIRAnalytics+AppDelegate.h" +#import "FIRAnalytics+Consent.h" +#import "FIRAnalytics+OnDevice.h" +#import "FIRAnalytics.h" +#import "FirebaseAnalytics.h" +#import "FIREventNames.h" +#import "FIRParameterNames.h" +#import "FIRUserPropertyNames.h" + +FOUNDATION_EXPORT double FirebaseAnalyticsVersionNumber; +FOUNDATION_EXPORT const unsigned char FirebaseAnalyticsVersionString[]; + diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Headers/FirebaseAnalytics.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Headers/FirebaseAnalytics.h new file mode 100644 index 0000000..351da20 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Headers/FirebaseAnalytics.h @@ -0,0 +1,7 @@ +#import "FIRAnalytics+AppDelegate.h" +#import "FIRAnalytics+Consent.h" +#import "FIRAnalytics+OnDevice.h" +#import "FIRAnalytics.h" +#import "FIREventNames.h" +#import "FIRParameterNames.h" +#import "FIRUserPropertyNames.h" diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/Project/arm64-apple-macos.swiftsourceinfo b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/Project/arm64-apple-macos.swiftsourceinfo new file mode 100644 index 0000000..157c6c1 Binary files /dev/null and b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/Project/arm64-apple-macos.swiftsourceinfo differ diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/Project/x86_64-apple-macos.swiftsourceinfo b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/Project/x86_64-apple-macos.swiftsourceinfo new file mode 100644 index 0000000..616d76e Binary files /dev/null and b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/Project/x86_64-apple-macos.swiftsourceinfo differ diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-macos.abi.json b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-macos.abi.json new file mode 100644 index 0000000..476738a --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-macos.abi.json @@ -0,0 +1,281 @@ +{ + "ABIRoot": { + "kind": "Root", + "name": "FirebaseAnalytics", + "printedName": "FirebaseAnalytics", + "children": [ + { + "kind": "Import", + "name": "FirebaseAnalyticsPrivate", + "printedName": "FirebaseAnalyticsPrivate", + "declKind": "Import", + "moduleName": "FirebaseAnalytics", + "declAttributes": [ + "ImplementationOnly" + ] + }, + { + "kind": "Import", + "name": "StoreKit", + "printedName": "StoreKit", + "declKind": "Import", + "moduleName": "FirebaseAnalytics" + }, + { + "kind": "Import", + "name": "SwiftUI", + "printedName": "SwiftUI", + "declKind": "Import", + "moduleName": "FirebaseAnalytics" + }, + { + "kind": "TypeDecl", + "name": "Analytics", + "printedName": "Analytics", + "children": [ + { + "kind": "Function", + "name": "logTransaction", + "printedName": "logTransaction(_:)", + "children": [ + { + "kind": "TypeNominal", + "name": "Void", + "printedName": "()" + }, + { + "kind": "TypeNominal", + "name": "Transaction", + "printedName": "StoreKit.Transaction", + "usr": "s:8StoreKit11TransactionV" + } + ], + "declKind": "Func", + "usr": "s:So12FIRAnalyticsC17FirebaseAnalyticsE14logTransactionyy8StoreKit0E0VFZ", + "mangledName": "$sSo12FIRAnalyticsC17FirebaseAnalyticsE14logTransactionyy8StoreKit0E0VFZ", + "moduleName": "FirebaseAnalytics", + "static": true, + "declAttributes": [ + "Final", + "AccessControl", + "RawDocComment" + ], + "isFromExtension": true, + "funcSelfKind": "NonMutating" + } + ], + "declKind": "Class", + "usr": "c:objc(cs)FIRAnalytics", + "moduleName": "FirebaseAnalytics", + "isOpen": true, + "objc_name": "FIRAnalytics", + "declAttributes": [ + "ObjC", + "Dynamic" + ], + "superclassUsr": "c:objc(cs)NSObject", + "isExternal": true, + "inheritsConvenienceInitializers": true, + "superclassNames": [ + "ObjectiveC.NSObject" + ], + "conformances": [ + { + "kind": "Conformance", + "name": "Copyable", + "printedName": "Copyable", + "usr": "s:s8CopyableP", + "mangledName": "$ss8CopyableP" + }, + { + "kind": "Conformance", + "name": "Escapable", + "printedName": "Escapable", + "usr": "s:s9EscapableP", + "mangledName": "$ss9EscapableP" + }, + { + "kind": "Conformance", + "name": "Equatable", + "printedName": "Equatable", + "usr": "s:SQ", + "mangledName": "$sSQ" + }, + { + "kind": "Conformance", + "name": "Hashable", + "printedName": "Hashable", + "usr": "s:SH", + "mangledName": "$sSH" + }, + { + "kind": "Conformance", + "name": "CVarArg", + "printedName": "CVarArg", + "usr": "s:s7CVarArgP", + "mangledName": "$ss7CVarArgP" + }, + { + "kind": "Conformance", + "name": "_KeyValueCodingAndObservingPublishing", + "printedName": "_KeyValueCodingAndObservingPublishing", + "usr": "s:10Foundation37_KeyValueCodingAndObservingPublishingP", + "mangledName": "$s10Foundation37_KeyValueCodingAndObservingPublishingP" + }, + { + "kind": "Conformance", + "name": "_KeyValueCodingAndObserving", + "printedName": "_KeyValueCodingAndObserving", + "usr": "s:10Foundation27_KeyValueCodingAndObservingP", + "mangledName": "$s10Foundation27_KeyValueCodingAndObservingP" + }, + { + "kind": "Conformance", + "name": "CustomStringConvertible", + "printedName": "CustomStringConvertible", + "usr": "s:s23CustomStringConvertibleP", + "mangledName": "$ss23CustomStringConvertibleP" + }, + { + "kind": "Conformance", + "name": "CustomDebugStringConvertible", + "printedName": "CustomDebugStringConvertible", + "usr": "s:s28CustomDebugStringConvertibleP", + "mangledName": "$ss28CustomDebugStringConvertibleP" + } + ] + }, + { + "kind": "TypeDecl", + "name": "View", + "printedName": "View", + "children": [ + { + "kind": "Function", + "name": "analyticsScreen", + "printedName": "analyticsScreen(name:class:extraParameters:)", + "children": [ + { + "kind": "TypeNominal", + "name": "OpaqueTypeArchetype", + "printedName": "some SwiftUI.View", + "children": [ + { + "kind": "TypeNominal", + "name": "View", + "printedName": "SwiftUI.View", + "usr": "s:7SwiftUI4ViewP" + } + ] + }, + { + "kind": "TypeNominal", + "name": "String", + "printedName": "Swift.String", + "usr": "s:SS" + }, + { + "kind": "TypeNominal", + "name": "String", + "printedName": "Swift.String", + "hasDefaultArg": true, + "usr": "s:SS" + }, + { + "kind": "TypeNominal", + "name": "Dictionary", + "printedName": "[Swift.String : Any]", + "children": [ + { + "kind": "TypeNominal", + "name": "String", + "printedName": "Swift.String", + "usr": "s:SS" + }, + { + "kind": "TypeNominal", + "name": "ProtocolComposition", + "printedName": "Any" + } + ], + "hasDefaultArg": true, + "usr": "s:SD" + } + ], + "declKind": "Func", + "usr": "s:7SwiftUI4ViewP17FirebaseAnalyticsE15analyticsScreen4name5class15extraParametersQrSS_SSSDySSypGtF", + "mangledName": "$s7SwiftUI4ViewP17FirebaseAnalyticsE15analyticsScreen4name5class15extraParametersQrSS_SSSDySSypGtF", + "moduleName": "FirebaseAnalytics", + "genericSig": "<τ_0_0 where τ_0_0 : SwiftUI.View>", + "sugared_genericSig": "", + "declAttributes": [ + "Preconcurrency", + "Custom", + "AccessControl", + "RawDocComment" + ], + "isFromExtension": true, + "funcSelfKind": "NonMutating" + } + ], + "declKind": "Protocol", + "usr": "s:7SwiftUI4ViewP", + "mangledName": "$s7SwiftUI4ViewP", + "moduleName": "SwiftUICore", + "genericSig": "<τ_0_0.Body : SwiftUI.View>", + "sugared_genericSig": "", + "intro_Macosx": "10.15", + "intro_iOS": "13.0", + "intro_tvOS": "13.0", + "intro_watchOS": "6.0", + "declAttributes": [ + "Preconcurrency", + "TypeEraser", + "OriginallyDefinedIn", + "OriginallyDefinedIn", + "OriginallyDefinedIn", + "OriginallyDefinedIn", + "Available", + "Available", + "Available", + "Available", + "Custom" + ], + "isExternal": true, + "conformances": [ + { + "kind": "Conformance", + "name": "Escapable", + "printedName": "Escapable", + "usr": "s:s9EscapableP", + "mangledName": "$ss9EscapableP" + }, + { + "kind": "Conformance", + "name": "Copyable", + "printedName": "Copyable", + "usr": "s:s8CopyableP", + "mangledName": "$ss8CopyableP" + } + ] + } + ], + "json_format_version": 8 + }, + "ConstValues": [ + { + "filePath": "\/Volumes\/google\/src\/cloud\/hantran\/m172\/google3\/googlemac\/iPhone\/Firebase\/Analytics\/Sources\/Swift\/Analytics+SwiftUI.swift", + "kind": "StringLiteral", + "offset": 2654, + "length": 6, + "value": "\"View\"" + }, + { + "filePath": "\/Volumes\/google\/src\/cloud\/hantran\/m172\/google3\/googlemac\/iPhone\/Firebase\/Analytics\/Sources\/Swift\/Analytics+SwiftUI.swift", + "kind": "Dictionary", + "offset": 2701, + "length": 3, + "value": "[]" + } + ] +} \ No newline at end of file diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-macos.private.swiftinterface b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-macos.private.swiftinterface new file mode 100644 index 0000000..55560d2 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-macos.private.swiftinterface @@ -0,0 +1,22 @@ +// swift-interface-format-version: 1.0 +// swift-compiler-version: Apple Swift version 6.0.3 effective-5.10 (swiftlang-6.0.3.1.10 clang-1600.0.30.1) +// swift-module-flags: -target arm64-apple-macos10.15 -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -O -enable-bare-slash-regex -module-name FirebaseAnalytics +// swift-module-flags-ignorable: -no-verify-emitted-module-interface +@_exported import FirebaseAnalytics +import StoreKit +import Swift +import SwiftUI +import _Concurrency +import _StringProcessing +import _SwiftConcurrencyShims +@available(iOS 15.0, macOS 12.0, macCatalyst 15.0, tvOS 15.0, *) +@available(watchOS, unavailable) +extension FirebaseAnalytics.Analytics { + public static func logTransaction(_ transaction: StoreKit.Transaction) +} +@available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, *) +@available(watchOS, unavailable) +extension SwiftUICore.View { + @_Concurrency.MainActor @preconcurrency public func analyticsScreen(name: Swift.String, class: Swift.String = "View", extraParameters: [Swift.String : Any] = [:]) -> some SwiftUICore.View + +} diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-macos.swiftdoc b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-macos.swiftdoc new file mode 100644 index 0000000..a25f34e Binary files /dev/null and b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-macos.swiftdoc differ diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-macos.swiftinterface b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-macos.swiftinterface new file mode 100644 index 0000000..55560d2 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-macos.swiftinterface @@ -0,0 +1,22 @@ +// swift-interface-format-version: 1.0 +// swift-compiler-version: Apple Swift version 6.0.3 effective-5.10 (swiftlang-6.0.3.1.10 clang-1600.0.30.1) +// swift-module-flags: -target arm64-apple-macos10.15 -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -O -enable-bare-slash-regex -module-name FirebaseAnalytics +// swift-module-flags-ignorable: -no-verify-emitted-module-interface +@_exported import FirebaseAnalytics +import StoreKit +import Swift +import SwiftUI +import _Concurrency +import _StringProcessing +import _SwiftConcurrencyShims +@available(iOS 15.0, macOS 12.0, macCatalyst 15.0, tvOS 15.0, *) +@available(watchOS, unavailable) +extension FirebaseAnalytics.Analytics { + public static func logTransaction(_ transaction: StoreKit.Transaction) +} +@available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, *) +@available(watchOS, unavailable) +extension SwiftUICore.View { + @_Concurrency.MainActor @preconcurrency public func analyticsScreen(name: Swift.String, class: Swift.String = "View", extraParameters: [Swift.String : Any] = [:]) -> some SwiftUICore.View + +} diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-macos.abi.json b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-macos.abi.json new file mode 100644 index 0000000..476738a --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-macos.abi.json @@ -0,0 +1,281 @@ +{ + "ABIRoot": { + "kind": "Root", + "name": "FirebaseAnalytics", + "printedName": "FirebaseAnalytics", + "children": [ + { + "kind": "Import", + "name": "FirebaseAnalyticsPrivate", + "printedName": "FirebaseAnalyticsPrivate", + "declKind": "Import", + "moduleName": "FirebaseAnalytics", + "declAttributes": [ + "ImplementationOnly" + ] + }, + { + "kind": "Import", + "name": "StoreKit", + "printedName": "StoreKit", + "declKind": "Import", + "moduleName": "FirebaseAnalytics" + }, + { + "kind": "Import", + "name": "SwiftUI", + "printedName": "SwiftUI", + "declKind": "Import", + "moduleName": "FirebaseAnalytics" + }, + { + "kind": "TypeDecl", + "name": "Analytics", + "printedName": "Analytics", + "children": [ + { + "kind": "Function", + "name": "logTransaction", + "printedName": "logTransaction(_:)", + "children": [ + { + "kind": "TypeNominal", + "name": "Void", + "printedName": "()" + }, + { + "kind": "TypeNominal", + "name": "Transaction", + "printedName": "StoreKit.Transaction", + "usr": "s:8StoreKit11TransactionV" + } + ], + "declKind": "Func", + "usr": "s:So12FIRAnalyticsC17FirebaseAnalyticsE14logTransactionyy8StoreKit0E0VFZ", + "mangledName": "$sSo12FIRAnalyticsC17FirebaseAnalyticsE14logTransactionyy8StoreKit0E0VFZ", + "moduleName": "FirebaseAnalytics", + "static": true, + "declAttributes": [ + "Final", + "AccessControl", + "RawDocComment" + ], + "isFromExtension": true, + "funcSelfKind": "NonMutating" + } + ], + "declKind": "Class", + "usr": "c:objc(cs)FIRAnalytics", + "moduleName": "FirebaseAnalytics", + "isOpen": true, + "objc_name": "FIRAnalytics", + "declAttributes": [ + "ObjC", + "Dynamic" + ], + "superclassUsr": "c:objc(cs)NSObject", + "isExternal": true, + "inheritsConvenienceInitializers": true, + "superclassNames": [ + "ObjectiveC.NSObject" + ], + "conformances": [ + { + "kind": "Conformance", + "name": "Copyable", + "printedName": "Copyable", + "usr": "s:s8CopyableP", + "mangledName": "$ss8CopyableP" + }, + { + "kind": "Conformance", + "name": "Escapable", + "printedName": "Escapable", + "usr": "s:s9EscapableP", + "mangledName": "$ss9EscapableP" + }, + { + "kind": "Conformance", + "name": "Equatable", + "printedName": "Equatable", + "usr": "s:SQ", + "mangledName": "$sSQ" + }, + { + "kind": "Conformance", + "name": "Hashable", + "printedName": "Hashable", + "usr": "s:SH", + "mangledName": "$sSH" + }, + { + "kind": "Conformance", + "name": "CVarArg", + "printedName": "CVarArg", + "usr": "s:s7CVarArgP", + "mangledName": "$ss7CVarArgP" + }, + { + "kind": "Conformance", + "name": "_KeyValueCodingAndObservingPublishing", + "printedName": "_KeyValueCodingAndObservingPublishing", + "usr": "s:10Foundation37_KeyValueCodingAndObservingPublishingP", + "mangledName": "$s10Foundation37_KeyValueCodingAndObservingPublishingP" + }, + { + "kind": "Conformance", + "name": "_KeyValueCodingAndObserving", + "printedName": "_KeyValueCodingAndObserving", + "usr": "s:10Foundation27_KeyValueCodingAndObservingP", + "mangledName": "$s10Foundation27_KeyValueCodingAndObservingP" + }, + { + "kind": "Conformance", + "name": "CustomStringConvertible", + "printedName": "CustomStringConvertible", + "usr": "s:s23CustomStringConvertibleP", + "mangledName": "$ss23CustomStringConvertibleP" + }, + { + "kind": "Conformance", + "name": "CustomDebugStringConvertible", + "printedName": "CustomDebugStringConvertible", + "usr": "s:s28CustomDebugStringConvertibleP", + "mangledName": "$ss28CustomDebugStringConvertibleP" + } + ] + }, + { + "kind": "TypeDecl", + "name": "View", + "printedName": "View", + "children": [ + { + "kind": "Function", + "name": "analyticsScreen", + "printedName": "analyticsScreen(name:class:extraParameters:)", + "children": [ + { + "kind": "TypeNominal", + "name": "OpaqueTypeArchetype", + "printedName": "some SwiftUI.View", + "children": [ + { + "kind": "TypeNominal", + "name": "View", + "printedName": "SwiftUI.View", + "usr": "s:7SwiftUI4ViewP" + } + ] + }, + { + "kind": "TypeNominal", + "name": "String", + "printedName": "Swift.String", + "usr": "s:SS" + }, + { + "kind": "TypeNominal", + "name": "String", + "printedName": "Swift.String", + "hasDefaultArg": true, + "usr": "s:SS" + }, + { + "kind": "TypeNominal", + "name": "Dictionary", + "printedName": "[Swift.String : Any]", + "children": [ + { + "kind": "TypeNominal", + "name": "String", + "printedName": "Swift.String", + "usr": "s:SS" + }, + { + "kind": "TypeNominal", + "name": "ProtocolComposition", + "printedName": "Any" + } + ], + "hasDefaultArg": true, + "usr": "s:SD" + } + ], + "declKind": "Func", + "usr": "s:7SwiftUI4ViewP17FirebaseAnalyticsE15analyticsScreen4name5class15extraParametersQrSS_SSSDySSypGtF", + "mangledName": "$s7SwiftUI4ViewP17FirebaseAnalyticsE15analyticsScreen4name5class15extraParametersQrSS_SSSDySSypGtF", + "moduleName": "FirebaseAnalytics", + "genericSig": "<τ_0_0 where τ_0_0 : SwiftUI.View>", + "sugared_genericSig": "", + "declAttributes": [ + "Preconcurrency", + "Custom", + "AccessControl", + "RawDocComment" + ], + "isFromExtension": true, + "funcSelfKind": "NonMutating" + } + ], + "declKind": "Protocol", + "usr": "s:7SwiftUI4ViewP", + "mangledName": "$s7SwiftUI4ViewP", + "moduleName": "SwiftUICore", + "genericSig": "<τ_0_0.Body : SwiftUI.View>", + "sugared_genericSig": "", + "intro_Macosx": "10.15", + "intro_iOS": "13.0", + "intro_tvOS": "13.0", + "intro_watchOS": "6.0", + "declAttributes": [ + "Preconcurrency", + "TypeEraser", + "OriginallyDefinedIn", + "OriginallyDefinedIn", + "OriginallyDefinedIn", + "OriginallyDefinedIn", + "Available", + "Available", + "Available", + "Available", + "Custom" + ], + "isExternal": true, + "conformances": [ + { + "kind": "Conformance", + "name": "Escapable", + "printedName": "Escapable", + "usr": "s:s9EscapableP", + "mangledName": "$ss9EscapableP" + }, + { + "kind": "Conformance", + "name": "Copyable", + "printedName": "Copyable", + "usr": "s:s8CopyableP", + "mangledName": "$ss8CopyableP" + } + ] + } + ], + "json_format_version": 8 + }, + "ConstValues": [ + { + "filePath": "\/Volumes\/google\/src\/cloud\/hantran\/m172\/google3\/googlemac\/iPhone\/Firebase\/Analytics\/Sources\/Swift\/Analytics+SwiftUI.swift", + "kind": "StringLiteral", + "offset": 2654, + "length": 6, + "value": "\"View\"" + }, + { + "filePath": "\/Volumes\/google\/src\/cloud\/hantran\/m172\/google3\/googlemac\/iPhone\/Firebase\/Analytics\/Sources\/Swift\/Analytics+SwiftUI.swift", + "kind": "Dictionary", + "offset": 2701, + "length": 3, + "value": "[]" + } + ] +} \ No newline at end of file diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-macos.private.swiftinterface b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-macos.private.swiftinterface new file mode 100644 index 0000000..584f569 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-macos.private.swiftinterface @@ -0,0 +1,22 @@ +// swift-interface-format-version: 1.0 +// swift-compiler-version: Apple Swift version 6.0.3 effective-5.10 (swiftlang-6.0.3.1.10 clang-1600.0.30.1) +// swift-module-flags: -target x86_64-apple-macos10.15 -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -O -enable-bare-slash-regex -module-name FirebaseAnalytics +// swift-module-flags-ignorable: -no-verify-emitted-module-interface +@_exported import FirebaseAnalytics +import StoreKit +import Swift +import SwiftUI +import _Concurrency +import _StringProcessing +import _SwiftConcurrencyShims +@available(iOS 15.0, macOS 12.0, macCatalyst 15.0, tvOS 15.0, *) +@available(watchOS, unavailable) +extension FirebaseAnalytics.Analytics { + public static func logTransaction(_ transaction: StoreKit.Transaction) +} +@available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, *) +@available(watchOS, unavailable) +extension SwiftUICore.View { + @_Concurrency.MainActor @preconcurrency public func analyticsScreen(name: Swift.String, class: Swift.String = "View", extraParameters: [Swift.String : Any] = [:]) -> some SwiftUICore.View + +} diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-macos.swiftdoc b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-macos.swiftdoc new file mode 100644 index 0000000..e5fe053 Binary files /dev/null and b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-macos.swiftdoc differ diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-macos.swiftinterface b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-macos.swiftinterface new file mode 100644 index 0000000..584f569 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-macos.swiftinterface @@ -0,0 +1,22 @@ +// swift-interface-format-version: 1.0 +// swift-compiler-version: Apple Swift version 6.0.3 effective-5.10 (swiftlang-6.0.3.1.10 clang-1600.0.30.1) +// swift-module-flags: -target x86_64-apple-macos10.15 -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -O -enable-bare-slash-regex -module-name FirebaseAnalytics +// swift-module-flags-ignorable: -no-verify-emitted-module-interface +@_exported import FirebaseAnalytics +import StoreKit +import Swift +import SwiftUI +import _Concurrency +import _StringProcessing +import _SwiftConcurrencyShims +@available(iOS 15.0, macOS 12.0, macCatalyst 15.0, tvOS 15.0, *) +@available(watchOS, unavailable) +extension FirebaseAnalytics.Analytics { + public static func logTransaction(_ transaction: StoreKit.Transaction) +} +@available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, *) +@available(watchOS, unavailable) +extension SwiftUICore.View { + @_Concurrency.MainActor @preconcurrency public func analyticsScreen(name: Swift.String, class: Swift.String = "View", extraParameters: [Swift.String : Any] = [:]) -> some SwiftUICore.View + +} diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/module.modulemap b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/module.modulemap new file mode 100644 index 0000000..927d5c0 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Modules/module.modulemap @@ -0,0 +1,16 @@ +framework module FirebaseAnalytics { +umbrella header "FirebaseAnalytics-umbrella.h" +export * +module * { export * } + link framework "AppKit" + link framework "Foundation" + link framework "Security" + link framework "SystemConfiguration" + link "c++" + link "sqlite3" + link "z" +} +module FirebaseAnalytics.Swift { + header "FirebaseAnalytics-Swift.h" + requires objc +} \ No newline at end of file diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Resources/Info.plist b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Resources/Info.plist new file mode 100644 index 0000000..a19f731 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/A/Resources/Info.plist @@ -0,0 +1,50 @@ + + + + + BuildMachineOSBuild + 24G231 + CFBundleDevelopmentRegion + en + CFBundleExecutable + FirebaseAnalytics + CFBundleIdentifier + org.cocoapods.FirebaseAnalytics + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + FirebaseAnalytics + CFBundlePackageType + FMWK + CFBundleShortVersionString + 12.5.0 + CFBundleSignature + ???? + CFBundleSupportedPlatforms + + MacOSX + + CFBundleVersion + 1 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + DTPlatformBuild + 24C94 + DTPlatformName + macosx + DTPlatformVersion + 15.2 + DTSDKBuild + 24C94 + DTSDKName + macosx15.2 + DTXcode + 1620 + DTXcodeBuild + 16C5032a + LSMinimumSystemVersion + 10.15 + MinimumOSVersion + 100.0 + + diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/Current b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/Current new file mode 120000 index 0000000..8c7e5a6 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/macos-arm64_x86_64/FirebaseAnalytics.framework/Versions/Current @@ -0,0 +1 @@ +A \ No newline at end of file diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/FirebaseAnalytics b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/FirebaseAnalytics new file mode 100644 index 0000000..aa86349 Binary files /dev/null and b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/FirebaseAnalytics differ diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/Headers/FIRAnalytics+AppDelegate.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/Headers/FIRAnalytics+AppDelegate.h new file mode 100644 index 0000000..cb1e407 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/Headers/FIRAnalytics+AppDelegate.h @@ -0,0 +1,80 @@ +#import + +#import "FIRAnalytics.h" + +NS_ASSUME_NONNULL_BEGIN + +/// Provides App Delegate handlers to be used in your App Delegate. +/// +/// To save time integrating Firebase Analytics in an application, Firebase Analytics does not +/// require delegation implementation from the AppDelegate if neither SwiftUI nor UIScene lifecycle +/// is adopted. Instead this is automatically done by Firebase Analytics. Should you choose instead +/// to delegate manually, you can turn off the App Delegate Proxy by adding +/// FirebaseAppDelegateProxyEnabled into your app's Info.plist and setting it to boolean `NO`, and +/// adding the methods in this category to corresponding delegation handlers. +/// +/// To handle Universal Links, you must return `true` in +/// `UIApplicationDelegate.application(_:didFinishLaunchingWithOptions:)`. +@interface FIRAnalytics (AppDelegate) + +/// Handles events related to a URL session that are waiting to be processed. +/// +/// 1. If SwiftUI lifecycle is adopted, call this method from +/// `UIApplicationDelegate.application(_:handleEventsForBackgroundURLSession:completionHandler:)` +/// in your app delegate. +/// +/// 2. If SwiftUI lifecycle is not adopted, Firebase Analytics does not require delegation +/// implementation from the AppDelegate. If you choose instead to delegate manually, you can set +/// FirebaseAppDelegateProxyEnabled to boolean `NO` in your app's Info.plist and call this method +/// from +/// `UIApplicationDelegate.application(_:handleEventsForBackgroundURLSession:completionHandler:)` +/// in your app delegate. +/// +/// @param identifier The identifier of the URL session requiring attention. +/// @param completionHandler The completion handler to call when you finish processing the events. +/// Calling this completion handler lets the system know that your app's user interface is +/// updated and a new snapshot can be taken. ++ (void)handleEventsForBackgroundURLSession:(NSString *)identifier + completionHandler:(nullable void (^)(void))completionHandler; + +/// Handles the event when the app is launched by a URL (custom URL scheme or universal link). +/// +/// 1. If SwiftUI lifecycle is adopted, use `onOpenURL(perform:)` to register a handler and call +/// this method in the handler. +/// +/// 2. If UIScene lifecycle is adopted, call this method from +/// `UISceneDelegate.scene(_:willConnectTo:options:)` and +/// `UISceneDelegate.scene(_:openURLContexts:)` when the URL contexts are available. +/// +/// 3. If neither SwiftUI nor UIScene lifecycle is adopted, Firebase Analytics does not require +/// delegation implementation from the AppDelegate. If you choose instead to delegate manually, you +/// can set FirebaseAppDelegateProxyEnabled to boolean `NO` in your app's Info.plist and call this +/// method from `UIApplicationDelegate.application(_:open:options:)` in your app delegate. +/// +/// @param url The URL resource to open. This resource can be a network resource or a file. ++ (void)handleOpenURL:(NSURL *)url; + +/// Handles the event when the app receives data associated with user activity that includes a +/// Universal Link. +/// +/// 1. If SwiftUI lifecycle is adopted, use `onOpenURL(perform:)` to register a handler and call +/// `Analytics.handleOpen(_:)` instead in the handler. +/// +/// 2. If UIScene lifecycle is adopted, call this method from +/// `UISceneDelegate.scene(_:willConnectTo:options:)` and `UISceneDelegate.scene(_:continue:)` when +/// NSUserActivity is available. See the [Apple +/// doc](https://developer.apple.com/documentation/xcode/supporting-universal-links-in-your-app) for +/// more details. +/// +/// 3. If neither SwiftUI nor UIScene lifecycle is adopted, Firebase Analytics does not require +/// delegation implementation from the AppDelegate. If you choose instead to delegate manually, you +/// can set FirebaseAppDelegateProxyEnabled to boolean `NO` in your app's Info.plist and call this +/// method from `UIApplication.application(_:continue:restorationHandler:)` in your app delegate. +/// +/// @param userActivity The activity object containing the data associated with the task the user +/// was performing. ++ (void)handleUserActivity:(id)userActivity; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/Headers/FIRAnalytics+Consent.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/Headers/FIRAnalytics+Consent.h new file mode 100644 index 0000000..7758390 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/Headers/FIRAnalytics+Consent.h @@ -0,0 +1,51 @@ +#import + +#import "FIRAnalytics.h" + +NS_ASSUME_NONNULL_BEGIN + +/// The type of consent to set. Supported consent types are `ConsentType.adStorage`, +/// `ConsentType.analyticsStorage`, `ConsentType.adUserData`, and `ConsentType.adPersonalization`. +/// Omitting a type retains its previous status. +typedef NSString *FIRConsentType NS_TYPED_ENUM NS_SWIFT_NAME(ConsentType); + +/// Enables storage (such as device identifiers) related to advertising. +extern FIRConsentType const FIRConsentTypeAdStorage; + +/// Enables storage (such as app identifiers) related to analytics, e.g. visit duration. +extern FIRConsentType const FIRConsentTypeAnalyticsStorage; + +/// Sets consent for sending user data to Google for advertising purposes. +extern FIRConsentType const FIRConsentTypeAdUserData; + +/// Sets consent for personalized advertising. +extern FIRConsentType const FIRConsentTypeAdPersonalization; + +/// The status value of the consent type. Supported statuses are `ConsentStatus.granted` and +/// `ConsentStatus.denied`. +typedef NSString *FIRConsentStatus NS_TYPED_ENUM NS_SWIFT_NAME(ConsentStatus); + +/// Consent status indicating consent is denied. For an overview of which data is sent when consent +/// is denied, see [SDK behavior with consent +/// mode](https://developers.google.com/tag-platform/security/concepts/consent-mode#tag-behavior). +extern FIRConsentStatus const FIRConsentStatusDenied; + +/// Consent status indicating consent is granted. +extern FIRConsentStatus const FIRConsentStatusGranted; + +/// Sets the applicable end user consent state. +@interface FIRAnalytics (Consent) + +/// Sets the applicable end user consent state (e.g. for device identifiers) for this app on this +/// device. Use the consent settings to specify individual consent type values. Settings are +/// persisted across app sessions. By default consent types are set to `ConsentStatus.granted`. +/// +/// @param consentSettings A Dictionary of consent types. Supported consent type keys are +/// `ConsentType.adStorage`, `ConsentType.analyticsStorage`, `ConsentType.adUserData`, and +/// `ConsentType.adPersonalization`. Valid values are `ConsentStatus.granted` and +/// `ConsentStatus.denied`. ++ (void)setConsent:(NSDictionary *)consentSettings; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/Headers/FIRAnalytics+OnDevice.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/Headers/FIRAnalytics+OnDevice.h new file mode 100644 index 0000000..5f87c0d --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/Headers/FIRAnalytics+OnDevice.h @@ -0,0 +1,51 @@ +#import + +#import "FIRAnalytics.h" + +NS_ASSUME_NONNULL_BEGIN + +API_UNAVAILABLE(macCatalyst, macos, tvos, watchos) +@interface FIRAnalytics (OnDevice) + +/// Initiates on-device conversion measurement given a user email address. Requires dependency +/// GoogleAdsOnDeviceConversion from +/// https://github.com/googleads/google-ads-on-device-conversion-ios-sdk/ to be linked in, otherwise +/// it is a no-op. +/// @param emailAddress User email address. Include a domain name for all email addresses +/// (e.g. gmail.com or hotmail.co.jp). ++ (void)initiateOnDeviceConversionMeasurementWithEmailAddress:(NSString *)emailAddress + NS_SWIFT_NAME(initiateOnDeviceConversionMeasurement(emailAddress:)); + +/// Initiates on-device conversion measurement given a phone number in E.164 format. Requires +/// dependency GoogleAdsOnDeviceConversion from +/// https://github.com/googleads/google-ads-on-device-conversion-ios-sdk/ to be linked in, otherwise +/// it is a no-op. +/// @param phoneNumber User phone number. Must be in E.164 format, which means it must be +/// limited to a maximum of 15 digits and must include a plus sign (+) prefix and country code +/// with no dashes, parentheses, or spaces. ++ (void)initiateOnDeviceConversionMeasurementWithPhoneNumber:(NSString *)phoneNumber + NS_SWIFT_NAME(initiateOnDeviceConversionMeasurement(phoneNumber:)); + +/// Initiates on-device conversion measurement given a sha256-hashed user email address. Requires +/// dependency GoogleAdsOnDeviceConversion from +/// https://github.com/googleads/google-ads-on-device-conversion-ios-sdk/ to be linked in, otherwise +/// it is a no-op. +/// @param hashedEmailAddress User email address as a UTF8-encoded string normalized and hashed +/// according to the instructions at +/// https://firebase.google.com/docs/tutorials/ads-ios-on-device-measurement/step-3. ++ (void)initiateOnDeviceConversionMeasurementWithHashedEmailAddress:(NSData *)hashedEmailAddress + NS_SWIFT_NAME(initiateOnDeviceConversionMeasurement(hashedEmailAddress:)); + +/// Initiates on-device conversion measurement given a sha256-hashed phone number in E.164 format. +/// Requires dependency GoogleAdsOnDeviceConversion from +/// https://github.com/googleads/google-ads-on-device-conversion-ios-sdk/ to be linked in, otherwise +/// it is a no-op. +/// @param hashedPhoneNumber UTF8-encoded user phone number in E.164 format and then hashed +/// according to the instructions at +/// https://firebase.google.com/docs/tutorials/ads-ios-on-device-measurement/step-3. ++ (void)initiateOnDeviceConversionMeasurementWithHashedPhoneNumber:(NSData *)hashedPhoneNumber + NS_SWIFT_NAME(initiateOnDeviceConversionMeasurement(hashedPhoneNumber:)); + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/Headers/FIRAnalytics.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/Headers/FIRAnalytics.h new file mode 100644 index 0000000..ec88689 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/Headers/FIRAnalytics.h @@ -0,0 +1,155 @@ +#import + +#import "FIREventNames.h" +#import "FIRParameterNames.h" +#import "FIRUserPropertyNames.h" + +NS_ASSUME_NONNULL_BEGIN + +/// The top level Firebase Analytics singleton that provides methods for logging events and setting +/// user properties. See the developer guides for general +/// information on using Firebase Analytics in your apps. +/// +/// @note The Analytics SDK uses SQLite to persist events and other app-specific data. Calling +/// certain thread-unsafe global SQLite methods like `sqlite3_shutdown()` can result in +/// unexpected crashes at runtime. +NS_SWIFT_NAME(Analytics) +@interface FIRAnalytics : NSObject + +/// Logs an app event. The event can have up to 25 parameters. Events with the same name must have +/// the same parameters. Up to 500 event names are supported. Using predefined events and/or +/// parameters is recommended for optimal reporting. +/// +/// The following event names are reserved - events with these names will be dropped, and instead an +/// error event will be logged: +///
    +///
  • ad_activeview
  • +///
  • ad_click
  • +///
  • ad_exposure
  • +///
  • ad_query
  • +///
  • ad_reward
  • +///
  • adunit_exposure
  • +///
  • app_clear_data
  • +///
  • app_exception
  • +///
  • app_remove
  • +///
  • app_store_refund
  • +///
  • app_store_subscription_cancel
  • +///
  • app_store_subscription_convert
  • +///
  • app_store_subscription_renew
  • +///
  • app_update
  • +///
  • app_upgrade
  • +///
  • dynamic_link_app_open
  • +///
  • dynamic_link_app_update
  • +///
  • dynamic_link_first_open
  • +///
  • error
  • +///
  • firebase_campaign
  • +///
  • first_open
  • +///
  • first_visit
  • +///
  • notification_dismiss
  • +///
  • notification_foreground
  • +///
  • notification_open
  • +///
  • notification_receive
  • +///
  • os_update
  • +///
  • session_start
  • +///
  • session_start_with_rollout
  • +///
  • user_engagement
  • +///
+/// +/// @param name The name of the event. Should contain 1 to 40 alphanumeric characters or +/// underscores. The name must start with an alphabetic character. Some event names are +/// reserved. See FIREventNames.h for the list of reserved event names. The "firebase_", +/// "google_", and "ga_" prefixes are reserved and should not be used. Note that event names are +/// case-sensitive and that logging two events whose names differ only in case will result in +/// two distinct events. To manually log screen view events, use the `screen_view` event name. +/// @param parameters The dictionary of event parameters. Passing `nil` indicates that the event has +/// no parameters. Parameter names can be up to 40 characters long and must start with an +/// alphabetic character and contain only alphanumeric characters and underscores. Only String, +/// Int, and Double parameter types are supported. String parameter values can be up to 100 +/// characters long for standard Google Analytics properties, and up to 500 characters long for +/// Google Analytics 360 properties. The "firebase_", "google_", and "ga_" prefixes are reserved +/// and should not be used for parameter names. ++ (void)logEventWithName:(NSString *)name + parameters:(nullable NSDictionary *)parameters + NS_SWIFT_NAME(logEvent(_:parameters:)); + +/// Sets a user property to a given value. Up to 25 user property names are supported. Once set, +/// user property values persist throughout the app lifecycle and across sessions. +/// +/// The following user property names are reserved and cannot be used: +///
    +///
  • first_open_time
  • +///
  • last_deep_link_referrer
  • +///
  • user_id
  • +///
+/// +/// @param value The value of the user property. Values can be up to 36 characters long. Setting the +/// value to `nil` removes the user property. +/// @param name The name of the user property to set. Should contain 1 to 24 alphanumeric characters +/// or underscores and must start with an alphabetic character. The "firebase_", "google_", and +/// "ga_" prefixes are reserved and should not be used for user property names. ++ (void)setUserPropertyString:(nullable NSString *)value forName:(NSString *)name + NS_SWIFT_NAME(setUserProperty(_:forName:)); + +/// Sets the user ID property. This feature must be used in accordance with +/// Google's Privacy Policy +/// +/// @param userID The user ID to ascribe to the user of this app on this device, which must be +/// non-empty and no more than 256 characters long. Setting userID to `nil` removes the user ID. ++ (void)setUserID:(nullable NSString *)userID; + +/// Sets whether analytics collection is enabled for this app on this device. This setting is +/// persisted across app sessions. By default it is enabled. +/// +/// @param analyticsCollectionEnabled A flag that enables or disables Analytics collection. ++ (void)setAnalyticsCollectionEnabled:(BOOL)analyticsCollectionEnabled; + +/// Sets the interval of inactivity in seconds that terminates the current session. The default +/// value is 1800 seconds (30 minutes). +/// +/// @param sessionTimeoutInterval The custom time of inactivity in seconds before the current +/// session terminates. ++ (void)setSessionTimeoutInterval:(NSTimeInterval)sessionTimeoutInterval; + +/// Asynchronously retrieves the identifier of the current app session. +/// +/// The session ID retrieval could fail due to Analytics collection disabled, app session expired, +/// etc. +/// +/// @param completion The completion handler to call when the session ID retrieval is complete. This +/// handler is executed on a system-defined global concurrent queue. +/// This completion handler takes the following parameters: +/// sessionID The identifier of the current app session. The value is undefined if the +/// request failed. +/// error An error object that indicates why the request failed, or `nil` if the request +/// was successful. ++ (void)sessionIDWithCompletion:(void (^)(int64_t sessionID, NSError *_Nullable error))completion; + +/// Returns the unique ID for this instance of the application or `nil` if +/// `ConsentType.analyticsStorage` has been set to `ConsentStatus.denied`. +/// +/// @see `FIRAnalytics+Consent.h` ++ (nullable NSString *)appInstanceID; + +/// Clears all analytics data for this instance from the device and resets the app instance ID. ++ (void)resetAnalyticsData; + +/// Adds parameters that will be set on every event logged from the SDK, including automatic ones. +/// The values passed in the parameters dictionary will be added to the dictionary of default event +/// parameters. These parameters persist across app runs. They are of lower precedence than event +/// parameters, so if an event parameter and a parameter set using this API have the same name, the +/// value of the event parameter will be used. The same limitations on event parameters apply to +/// default event parameters. +/// +/// @param parameters Parameters to be added to the dictionary of parameters added to every event. +/// They will be added to the dictionary of default event parameters, replacing any existing +/// parameter with the same name. Valid parameters are String, Int, and Double. Setting a key's +/// value to `NSNull()` will clear that parameter. Passing in a `nil` dictionary will clear all +/// parameters. ++ (void)setDefaultEventParameters:(nullable NSDictionary *)parameters; + +/// Unavailable. +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/Headers/FIREventNames.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/Headers/FIREventNames.h new file mode 100644 index 0000000..701ed88 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/Headers/FIREventNames.h @@ -0,0 +1,438 @@ +/// @file FIREventNames.h +/// +/// Predefined event names. +/// +/// An Event is an important occurrence in your app that you want to measure. You can report up to +/// 500 different types of Events per app and you can associate up to 25 unique parameters with each +/// Event type. Some common events are suggested below, but you may also choose to specify custom +/// Event types that are associated with your specific app. Each event type is identified by a +/// unique name. Event names can be up to 40 characters long, may only contain alphanumeric +/// characters and underscores ("_"), and must start with an alphabetic character. The "firebase_", +/// "google_", and "ga_" prefixes are reserved and should not be used. + +#import + +/// Ad Impression event. This event signifies when a user sees an ad impression. Note: If you supply +/// the @c AnalyticsParameterValue parameter, you must also supply the @c AnalyticsParameterCurrency +/// parameter so that revenue metrics can be computed accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterAdPlatform (String) (optional)
  • +///
  • @c AnalyticsParameterAdFormat (String) (optional)
  • +///
  • @c AnalyticsParameterAdSource (String) (optional)
  • +///
  • @c AnalyticsParameterAdUnitName (String) (optional)
  • +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventAdImpression NS_SWIFT_NAME(AnalyticsEventAdImpression) = + @"ad_impression"; + +/// Add Payment Info event. This event signifies that a user has submitted their payment +/// information. Note: If you supply the @c AnalyticsParameterValue parameter, you must also supply +/// the @c AnalyticsParameterCurrency parameter so that revenue metrics can be computed accurately. +/// Params: +/// +///
    +///
  • @c AnalyticsParameterCoupon (String) (optional)
  • +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterPaymentType (String) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventAddPaymentInfo NS_SWIFT_NAME(AnalyticsEventAddPaymentInfo) = + @"add_payment_info"; + +/// Add Shipping Info event. This event signifies that a user has submitted their shipping +/// information. Note: If you supply the @c AnalyticsParameterValue parameter, you must also supply +/// the @c AnalyticsParameterCurrency parameter so that revenue metrics can be computed accurately. +/// Params: +/// +///
    +///
  • @c AnalyticsParameterCoupon (String) (optional)
  • +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterShippingTier (String) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventAddShippingInfo NS_SWIFT_NAME(AnalyticsEventAddShippingInfo) = + @"add_shipping_info"; + +/// E-Commerce Add To Cart event. This event signifies that an item(s) was added to a cart for +/// purchase. Add this event to a funnel with @c AnalyticsEventPurchase to gauge the effectiveness +/// of your checkout process. Note: If you supply the @c AnalyticsParameterValue parameter, you must +/// also supply the @c AnalyticsParameterCurrency parameter so that revenue metrics can be computed +/// accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventAddToCart NS_SWIFT_NAME(AnalyticsEventAddToCart) = @"add_to_cart"; + +/// E-Commerce Add To Wishlist event. This event signifies that an item was added to a wishlist. Use +/// this event to identify popular gift items. Note: If you supply the @c AnalyticsParameterValue +/// parameter, you must also supply the @c AnalyticsParameterCurrency parameter so that revenue +/// metrics can be computed accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventAddToWishlist NS_SWIFT_NAME(AnalyticsEventAddToWishlist) = + @"add_to_wishlist"; + +/// App Open event. By logging this event when an App becomes active, developers can understand how +/// often users leave and return during the course of a Session. Although Sessions are automatically +/// reported, this event can provide further clarification around the continuous engagement of +/// app-users. +static NSString *const kFIREventAppOpen NS_SWIFT_NAME(AnalyticsEventAppOpen) = @"app_open"; + +/// E-Commerce Begin Checkout event. This event signifies that a user has begun the process of +/// checking out. Add this event to a funnel with your @c AnalyticsEventPurchase event to gauge the +/// effectiveness of your checkout process. Note: If you supply the @c AnalyticsParameterValue +/// parameter, you must also supply the @c AnalyticsParameterCurrency parameter so that revenue +/// metrics can be computed accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterCoupon (String) (optional)
  • +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventBeginCheckout NS_SWIFT_NAME(AnalyticsEventBeginCheckout) = + @"begin_checkout"; + +/// Campaign Detail event. Log this event to supply the referral details of a re-engagement +/// campaign. Note: you must supply at least one of the required parameters +/// AnalyticsParameterSource, AnalyticsParameterMedium or AnalyticsParameterCampaign. Params: +/// +///
    +///
  • @c AnalyticsParameterSource (String)
  • +///
  • @c AnalyticsParameterMedium (String)
  • +///
  • @c AnalyticsParameterCampaign (String)
  • +///
  • @c AnalyticsParameterTerm (String) (optional)
  • +///
  • @c AnalyticsParameterContent (String) (optional)
  • +///
  • @c AnalyticsParameterAdNetworkClickID (String) (optional)
  • +///
  • @c AnalyticsParameterCP1 (String) (optional)
  • +///
  • @c AnalyticsParameterCampaignID (String) (optional)
  • +///
  • @c AnalyticsParameterCreativeFormat (String) (optional)
  • +///
  • @c AnalyticsParameterMarketingTactic (String) (optional)
  • +///
  • @c AnalyticsParameterSourcePlatform (String) (optional)
  • +///
+static NSString *const kFIREventCampaignDetails NS_SWIFT_NAME(AnalyticsEventCampaignDetails) = + @"campaign_details"; + +/// Earn Virtual Currency event. This event tracks the awarding of virtual currency in your app. Log +/// this along with @c AnalyticsEventSpendVirtualCurrency to better understand your virtual economy. +/// Params: +/// +///
    +///
  • @c AnalyticsParameterVirtualCurrencyName (String)
  • +///
  • @c AnalyticsParameterValue (Int or Double)
  • +///
+static NSString *const kFIREventEarnVirtualCurrency + NS_SWIFT_NAME(AnalyticsEventEarnVirtualCurrency) = @"earn_virtual_currency"; + +/// Generate Lead event. Log this event when a lead has been generated in the app to understand the +/// efficacy of your install and re-engagement campaigns. Note: If you supply the +/// @c AnalyticsParameterValue parameter, you must also supply the @c AnalyticsParameterCurrency +/// parameter so that revenue metrics can be computed accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventGenerateLead NS_SWIFT_NAME(AnalyticsEventGenerateLead) = + @"generate_lead"; + +/// In-App Purchase event. This event signifies that extra content or a subscription was purchased +/// by a user inside an app. Note: This is different from the ecommerce purchase event. Note: If you +/// supply the @c AnalyticsParameterValue parameter, you must also supply the +/// @c AnalyticsParameterCurrency parameter so that revenue metrics can be computed accurately. +/// Params: +/// +///
    +///
  • @c AnalyticsParameterCurrency (String)
  • +///
  • @c AnalyticsParameterFreeTrial (Int) (optional)
  • +///
  • @c AnalyticsParameterPrice (Double) (optional)
  • +///
  • @c AnalyticsParameterPriceIsDiscounted (Int) (optional)
  • +///
  • @c AnalyticsParameterProductID (String) (optional)
  • +///
  • @c AnalyticsParameterProductName (String) (optional)
  • +///
  • @c AnalyticsParameterQuantity (Int) (optional)
  • +///
  • @c AnalyticsParameterSubscription (Int) (optional)
  • +///
  • @c AnalyticsParameterValue (Double)
  • +///
+static NSString *const kFIREventInAppPurchase NS_SWIFT_NAME(AnalyticsEventInAppPurchase) = + @"in_app_purchase"; + +/// Join Group event. Log this event when a user joins a group such as a guild, team or family. Use +/// this event to analyze how popular certain groups or social features are in your app. Params: +/// +///
    +///
  • @c AnalyticsParameterGroupID (String)
  • +///
+static NSString *const kFIREventJoinGroup NS_SWIFT_NAME(AnalyticsEventJoinGroup) = @"join_group"; + +/// Level End event. Log this event when the user finishes a level. Params: +/// +///
    +///
  • @c AnalyticsParameterLevelName (String)
  • +///
  • @c AnalyticsParameterSuccess (String)
  • +///
+static NSString *const kFIREventLevelEnd NS_SWIFT_NAME(AnalyticsEventLevelEnd) = @"level_end"; + +/// Level Start event. Log this event when the user starts a new level. Params: +/// +///
    +///
  • @c AnalyticsParameterLevelName (String)
  • +///
+static NSString *const kFIREventLevelStart NS_SWIFT_NAME(AnalyticsEventLevelStart) = @"level_start"; + +/// Level Up event. This event signifies that a player has leveled up in your gaming app. It can +/// help you gauge the level distribution of your userbase and help you identify certain levels that +/// are difficult to pass. Params: +/// +///
    +///
  • @c AnalyticsParameterLevel (Int)
  • +///
  • @c AnalyticsParameterCharacter (String) (optional)
  • +///
+static NSString *const kFIREventLevelUp NS_SWIFT_NAME(AnalyticsEventLevelUp) = @"level_up"; + +/// Login event. Apps with a login feature can report this event to signify that a user has logged +/// in. +static NSString *const kFIREventLogin NS_SWIFT_NAME(AnalyticsEventLogin) = @"login"; + +/// Post Score event. Log this event when the user posts a score in your gaming app. This event can +/// help you understand how users are actually performing in your game and it can help you correlate +/// high scores with certain audiences or behaviors. Params: +/// +///
    +///
  • @c AnalyticsParameterScore (Int)
  • +///
  • @c AnalyticsParameterLevel (Int) (optional)
  • +///
  • @c AnalyticsParameterCharacter (String) (optional)
  • +///
+static NSString *const kFIREventPostScore NS_SWIFT_NAME(AnalyticsEventPostScore) = @"post_score"; + +/// E-Commerce Purchase event. This event signifies that an item(s) was purchased by a user. Note: +/// This is different from the in-app purchase event, which is reported automatically for App +/// Store-based apps. Note: If you supply the @c AnalyticsParameterValue parameter, you must also +/// supply the @c AnalyticsParameterCurrency parameter so that revenue metrics can be computed +/// accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterAffiliation (String) (optional)
  • +///
  • @c AnalyticsParameterCoupon (String) (optional)
  • +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterEndDate (String) (optional)
  • +///
  • @c AnalyticsParameterItemID (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterShipping (Double) (optional)
  • +///
  • @c AnalyticsParameterStartDate (String) (optional)
  • +///
  • @c AnalyticsParameterTax (Double) (optional)
  • +///
  • @c AnalyticsParameterTransactionID (String) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventPurchase NS_SWIFT_NAME(AnalyticsEventPurchase) = @"purchase"; + +/// E-Commerce Refund event. This event signifies that a refund was issued. Note: If you supply the +/// @c AnalyticsParameterValue parameter, you must also supply the @c AnalyticsParameterCurrency +/// parameter so that revenue metrics can be computed accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterAffiliation (String) (optional)
  • +///
  • @c AnalyticsParameterCoupon (String) (optional)
  • +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterShipping (Double) (optional)
  • +///
  • @c AnalyticsParameterTax (Double) (optional)
  • +///
  • @c AnalyticsParameterTransactionID (String) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventRefund NS_SWIFT_NAME(AnalyticsEventRefund) = @"refund"; + +/// E-Commerce Remove from Cart event. This event signifies that an item(s) was removed from a cart. +/// Note: If you supply the @c AnalyticsParameterValue parameter, you must also supply the @c +/// AnalyticsParameterCurrency parameter so that revenue metrics can be computed accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventRemoveFromCart NS_SWIFT_NAME(AnalyticsEventRemoveFromCart) = + @"remove_from_cart"; + +/// Screen View event. This event signifies a screen view. Use this when a screen transition occurs. +/// This event can be logged irrespective of whether automatic screen tracking is enabled. Params: +/// +///
    +///
  • @c AnalyticsParameterScreenClass (String) (optional)
  • +///
  • @c AnalyticsParameterScreenName (String) (optional)
  • +///
+static NSString *const kFIREventScreenView NS_SWIFT_NAME(AnalyticsEventScreenView) = @"screen_view"; + +/// Search event. Apps that support search features can use this event to contextualize search +/// operations by supplying the appropriate, corresponding parameters. This event can help you +/// identify the most popular content in your app. Params: +/// +///
    +///
  • @c AnalyticsParameterSearchTerm (String)
  • +///
  • @c AnalyticsParameterStartDate (String) (optional)
  • +///
  • @c AnalyticsParameterEndDate (String) (optional)
  • +///
  • @c AnalyticsParameterNumberOfNights (Int) (optional) for hotel bookings
  • +///
  • @c AnalyticsParameterNumberOfRooms (Int) (optional) for hotel bookings
  • +///
  • @c AnalyticsParameterNumberOfPassengers (Int) (optional) for travel bookings
  • +///
  • @c AnalyticsParameterOrigin (String) (optional)
  • +///
  • @c AnalyticsParameterDestination (String) (optional)
  • +///
  • @c AnalyticsParameterTravelClass (String) (optional) for travel bookings
  • +///
+static NSString *const kFIREventSearch NS_SWIFT_NAME(AnalyticsEventSearch) = @"search"; + +/// Select Content event. This general purpose event signifies that a user has selected some content +/// of a certain type in an app. The content can be any object in your app. This event can help you +/// identify popular content and categories of content in your app. Params: +/// +///
    +///
  • @c AnalyticsParameterContentType (String)
  • +///
  • @c AnalyticsParameterItemID (String)
  • +///
+static NSString *const kFIREventSelectContent NS_SWIFT_NAME(AnalyticsEventSelectContent) = + @"select_content"; + +/// Select Item event. This event signifies that an item was selected by a user from a list. Use the +/// appropriate parameters to contextualize the event. Use this event to discover the most popular +/// items selected. Params: +/// +///
    +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterItemListID (String) (optional)
  • +///
  • @c AnalyticsParameterItemListName (String) (optional)
  • +///
+static NSString *const kFIREventSelectItem NS_SWIFT_NAME(AnalyticsEventSelectItem) = @"select_item"; + +/// Select promotion event. This event signifies that a user has selected a promotion offer. Use the +/// appropriate parameters to contextualize the event, such as the item(s) for which the promotion +/// applies. Params: +/// +///
    +///
  • @c AnalyticsParameterCreativeName (String) (optional)
  • +///
  • @c AnalyticsParameterCreativeSlot (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterLocationID (String) (optional)
  • +///
  • @c AnalyticsParameterPromotionID (String) (optional)
  • +///
  • @c AnalyticsParameterPromotionName (String) (optional)
  • +///
+static NSString *const kFIREventSelectPromotion NS_SWIFT_NAME(AnalyticsEventSelectPromotion) = + @"select_promotion"; + +/// Share event. Apps with social features can log the Share event to identify the most viral +/// content. Params: +/// +///
    +///
  • @c AnalyticsParameterContentType (String)
  • +///
  • @c AnalyticsParameterItemID (String)
  • +///
+static NSString *const kFIREventShare NS_SWIFT_NAME(AnalyticsEventShare) = @"share"; + +/// Sign Up event. This event indicates that a user has signed up for an account in your app. The +/// parameter signifies the method by which the user signed up. Use this event to understand the +/// different behaviors between logged in and logged out users. Params: +/// +///
    +///
  • @c AnalyticsParameterMethod (String)
  • +///
+static NSString *const kFIREventSignUp NS_SWIFT_NAME(AnalyticsEventSignUp) = @"sign_up"; + +/// Spend Virtual Currency event. This event tracks the sale of virtual goods in your app and can +/// help you identify which virtual goods are the most popular objects of purchase. Params: +/// +///
    +///
  • @c AnalyticsParameterItemName (String)
  • +///
  • @c AnalyticsParameterVirtualCurrencyName (String)
  • +///
  • @c AnalyticsParameterValue (Int or Double)
  • +///
+static NSString *const kFIREventSpendVirtualCurrency + NS_SWIFT_NAME(AnalyticsEventSpendVirtualCurrency) = @"spend_virtual_currency"; + +/// Tutorial Begin event. This event signifies the start of the on-boarding process in your app. Use +/// this in a funnel with @c AnalyticsEventTutorialComplete to understand how many users complete +/// this process and move on to the full app experience. +static NSString *const kFIREventTutorialBegin NS_SWIFT_NAME(AnalyticsEventTutorialBegin) = + @"tutorial_begin"; + +/// Tutorial End event. Use this event to signify the user's completion of your app's on-boarding +/// process. Add this to a funnel with @c AnalyticsEventTutorialBegin to gauge the completion rate +/// of your on-boarding process. +static NSString *const kFIREventTutorialComplete NS_SWIFT_NAME(AnalyticsEventTutorialComplete) = + @"tutorial_complete"; + +/// Unlock Achievement event. Log this event when the user has unlocked an achievement in your +/// game. Since achievements generally represent the breadth of a gaming experience, this event can +/// help you understand how many users are experiencing all that your game has to offer. Params: +/// +///
    +///
  • @c AnalyticsParameterAchievementID (String)
  • +///
+static NSString *const kFIREventUnlockAchievement NS_SWIFT_NAME(AnalyticsEventUnlockAchievement) = + @"unlock_achievement"; + +/// E-commerce View Cart event. This event signifies that a user has viewed their cart. Use this to +/// analyze your purchase funnel. Note: If you supply the @c AnalyticsParameterValue parameter, you +/// must also supply the @c AnalyticsParameterCurrency parameter so that revenue metrics can be +/// computed accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventViewCart NS_SWIFT_NAME(AnalyticsEventViewCart) = @"view_cart"; + +/// View Item event. This event signifies that a user has viewed an item. Use the appropriate +/// parameters to contextualize the event. Use this event to discover the most popular items viewed +/// in your app. Note: If you supply the @c AnalyticsParameterValue parameter, you must also supply +/// the @c AnalyticsParameterCurrency parameter so that revenue metrics can be computed accurately. +/// Params: +/// +///
    +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventViewItem NS_SWIFT_NAME(AnalyticsEventViewItem) = @"view_item"; + +/// View Item List event. Log this event when a user sees a list of items or offerings. Params: +/// +///
    +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterItemListID (String) (optional)
  • +///
  • @c AnalyticsParameterItemListName (String) (optional)
  • +///
+static NSString *const kFIREventViewItemList NS_SWIFT_NAME(AnalyticsEventViewItemList) = + @"view_item_list"; + +/// View Promotion event. This event signifies that a promotion was shown to a user. Add this event +/// to a funnel with the @c AnalyticsEventAddToCart and @c AnalyticsEventPurchase to gauge your +/// conversion process. Params: +/// +///
    +///
  • @c AnalyticsParameterCreativeName (String) (optional)
  • +///
  • @c AnalyticsParameterCreativeSlot (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterLocationID (String) (optional)
  • +///
  • @c AnalyticsParameterPromotionID (String) (optional)
  • +///
  • @c AnalyticsParameterPromotionName (String) (optional)
  • +///
+static NSString *const kFIREventViewPromotion NS_SWIFT_NAME(AnalyticsEventViewPromotion) = + @"view_promotion"; + +/// View Search Results event. Log this event when the user has been presented with the results of a +/// search. Params: +/// +///
    +///
  • @c AnalyticsParameterSearchTerm (String)
  • +///
+static NSString *const kFIREventViewSearchResults NS_SWIFT_NAME(AnalyticsEventViewSearchResults) = + @"view_search_results"; diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/Headers/FIRParameterNames.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/Headers/FIRParameterNames.h new file mode 100644 index 0000000..f0e782a --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/Headers/FIRParameterNames.h @@ -0,0 +1,775 @@ +/// @file FIRParameterNames.h +/// +/// Predefined event parameter names. +/// +/// Params supply information that contextualize Events. You can associate up to 25 unique Params +/// with each Event type. Some Params are suggested below for certain common Events, but you are +/// not limited to these. You may supply extra Params for suggested Events or custom Params for +/// Custom events. Param names can be up to 40 characters long, may only contain alphanumeric +/// characters and underscores ("_"), and must start with an alphabetic character. Param values can +/// be up to 100 characters long for standard Google Analytics properties and up to 500 characters +/// long for Google Analytics 360 properties. The "firebase_", "google_", and "ga_" prefixes are +/// reserved and should not be used. + +#import + +/// Game achievement ID (String). +///
+///     let params = [
+///       AnalyticsParameterAchievementID : "10_matches_won",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterAchievementID NS_SWIFT_NAME(AnalyticsParameterAchievementID) = + @"achievement_id"; + +/// The ad format (e.g. Banner, Interstitial, Rewarded, Native, Rewarded Interstitial, Instream). +/// (String). +///
+///     let params = [
+///       AnalyticsParameterAdFormat : "Banner",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterAdFormat NS_SWIFT_NAME(AnalyticsParameterAdFormat) = + @"ad_format"; + +/// Ad Network Click ID (String). Used for network-specific click IDs which vary in format. +///
+///     let params = [
+///       AnalyticsParameterAdNetworkClickID : "1234567",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterAdNetworkClickID + NS_SWIFT_NAME(AnalyticsParameterAdNetworkClickID) = @"aclid"; + +/// The ad platform (e.g. MoPub, IronSource) (String). +///
+///     let params = [
+///       AnalyticsParameterAdPlatform : "MoPub",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterAdPlatform NS_SWIFT_NAME(AnalyticsParameterAdPlatform) = + @"ad_platform"; + +/// The ad source (e.g. AdColony) (String). +///
+///     let params = [
+///       AnalyticsParameterAdSource : "AdColony",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterAdSource NS_SWIFT_NAME(AnalyticsParameterAdSource) = + @"ad_source"; + +/// The ad unit name (e.g. Banner_03) (String). +///
+///     let params = [
+///       AnalyticsParameterAdUnitName : "Banner_03",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterAdUnitName NS_SWIFT_NAME(AnalyticsParameterAdUnitName) = + @"ad_unit_name"; + +/// A product affiliation to designate a supplying company or brick and mortar store location +/// (String).
+///     let params = [
+///       AnalyticsParameterAffiliation : "Google Store",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterAffiliation NS_SWIFT_NAME(AnalyticsParameterAffiliation) = + @"affiliation"; + +/// Campaign custom parameter (String). Used as a method of capturing custom data in a campaign. +/// Use varies by network. +///
+///     let params = [
+///       AnalyticsParameterCP1 : "custom_data",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCP1 NS_SWIFT_NAME(AnalyticsParameterCP1) = @"cp1"; + +/// The individual campaign name, slogan, promo code, etc. Some networks have pre-defined macro to +/// capture campaign information, otherwise can be populated by developer. Highly Recommended +/// (String). +///
+///     let params = [
+///       AnalyticsParameterCampaign : "winter_promotion",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCampaign NS_SWIFT_NAME(AnalyticsParameterCampaign) = + @"campaign"; + +/// Campaign ID (String). Used for keyword analysis to identify a specific product promotion or +/// strategic campaign. This is a required key for GA4 data import. +///
+///     let params = [
+///       AnalyticsParameterCampaignID : "7877652710",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCampaignID NS_SWIFT_NAME(AnalyticsParameterCampaignID) = + @"campaign_id"; + +/// Character used in game (String). +///
+///     let params = [
+///       AnalyticsParameterCharacter : "beat_boss",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCharacter NS_SWIFT_NAME(AnalyticsParameterCharacter) = + @"character"; + +/// Campaign content (String). +static NSString *const kFIRParameterContent NS_SWIFT_NAME(AnalyticsParameterContent) = @"content"; + +/// Type of content selected (String). +///
+///     let params = [
+///       AnalyticsParameterContentType : "news article",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterContentType NS_SWIFT_NAME(AnalyticsParameterContentType) = + @"content_type"; + +/// Coupon code used for a purchase (String). +///
+///     let params = [
+///       AnalyticsParameterCoupon : "SUMMER_FUN",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCoupon NS_SWIFT_NAME(AnalyticsParameterCoupon) = @"coupon"; + +/// Creative Format (String). Used to identify the high-level classification of the type of ad +/// served by a specific campaign. +///
+///     let params = [
+///       AnalyticsParameterCreativeFormat : "display",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCreativeFormat NS_SWIFT_NAME(AnalyticsParameterCreativeFormat) = + @"creative_format"; + +/// The name of a creative used in a promotional spot (String). +///
+///     let params = [
+///       AnalyticsParameterCreativeName : "Summer Sale",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCreativeName NS_SWIFT_NAME(AnalyticsParameterCreativeName) = + @"creative_name"; + +/// The name of a creative slot (String). +///
+///     let params = [
+///       AnalyticsParameterCreativeSlot : "summer_banner2",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCreativeSlot NS_SWIFT_NAME(AnalyticsParameterCreativeSlot) = + @"creative_slot"; + +/// Currency of the purchase or items associated with the event, in 3-letter +/// ISO_4217 format (String). +///
+///     let params = [
+///       AnalyticsParameterCurrency : "USD",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCurrency NS_SWIFT_NAME(AnalyticsParameterCurrency) = + @"currency"; + +/// Flight or Travel destination (String). +///
+///     let params = [
+///       AnalyticsParameterDestination : "Mountain View, CA",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterDestination NS_SWIFT_NAME(AnalyticsParameterDestination) = + @"destination"; + +/// Monetary value of discount associated with a purchase (Double). +///
+///     let params = [
+///       AnalyticsParameterDiscount : 2.0,
+///       AnalyticsParameterCurrency : "USD",  // e.g. $2.00 USD
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterDiscount NS_SWIFT_NAME(AnalyticsParameterDiscount) = + @"discount"; + +/// The arrival date, check-out date or rental end date for the item. This should be in +/// YYYY-MM-DD format (String). +///
+///     let params = [
+///       AnalyticsParameterEndDate : "2015-09-14",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterEndDate NS_SWIFT_NAME(AnalyticsParameterEndDate) = @"end_date"; + +/// Indicates that the associated event should either extend the current session or start a new +/// session if no session was active when the event was logged. Specify 1 to extend the current +/// session or to start a new session; any other value will not extend or start a session. +///
+///     let params = [
+///       AnalyticsParameterExtendSession : 1,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterExtendSession NS_SWIFT_NAME(AnalyticsParameterExtendSession) = + @"extend_session"; + +/// Flight number for travel events (String). +///
+///     let params = [
+///       AnalyticsParameterFlightNumber : "ZZ800",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterFlightNumber NS_SWIFT_NAME(AnalyticsParameterFlightNumber) = + @"flight_number"; + +/// Indicates if the user is on a free trial of a subscription. Specify 1 to indicate true and 0 to +/// indicate false (Int). +///
+///     let params = [
+///       AnalyticsParameterFreeTrial : 1,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterFreeTrial NS_SWIFT_NAME(AnalyticsParameterFreeTrial) = + @"free_trial"; + +/// Group/clan/guild ID (String). +///
+///     let params = [
+///       AnalyticsParameterGroupID : "g1",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterGroupID NS_SWIFT_NAME(AnalyticsParameterGroupID) = @"group_id"; + +/// The index of the item in a list (Int). +///
+///     let params = [
+///       AnalyticsParameterIndex : 5,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterIndex NS_SWIFT_NAME(AnalyticsParameterIndex) = @"index"; + +/// Item brand (String). +///
+///     let params = [
+///       AnalyticsParameterItemBrand : "Google",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemBrand NS_SWIFT_NAME(AnalyticsParameterItemBrand) = + @"item_brand"; + +/// Item category (context-specific) (String). +///
+///     let params = [
+///       AnalyticsParameterItemCategory : "pants",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemCategory NS_SWIFT_NAME(AnalyticsParameterItemCategory) = + @"item_category"; + +/// Item Category (context-specific) (String). +///
+///     let params = [
+///       AnalyticsParameterItemCategory2 : "pants",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemCategory2 NS_SWIFT_NAME(AnalyticsParameterItemCategory2) = + @"item_category2"; + +/// Item Category (context-specific) (String). +///
+///     let params = [
+///       AnalyticsParameterItemCategory3 : "pants",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemCategory3 NS_SWIFT_NAME(AnalyticsParameterItemCategory3) = + @"item_category3"; + +/// Item Category (context-specific) (String). +///
+///     let params = [
+///       AnalyticsParameterItemCategory4 : "pants",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemCategory4 NS_SWIFT_NAME(AnalyticsParameterItemCategory4) = + @"item_category4"; + +/// Item Category (context-specific) (String). +///
+///     let params = [
+///       AnalyticsParameterItemCategory5 : "pants",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemCategory5 NS_SWIFT_NAME(AnalyticsParameterItemCategory5) = + @"item_category5"; + +/// Item ID (context-specific) (String). +///
+///     let params = [
+///       AnalyticsParameterItemID : "SKU_12345",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemID NS_SWIFT_NAME(AnalyticsParameterItemID) = @"item_id"; + +/// The ID of the list in which the item was presented to the user (String). +///
+///     let params = [
+///       AnalyticsParameterItemListID : "ABC123",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemListID NS_SWIFT_NAME(AnalyticsParameterItemListID) = + @"item_list_id"; + +/// The name of the list in which the item was presented to the user (String). +///
+///     let params = [
+///       AnalyticsParameterItemListName : "Related products",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemListName NS_SWIFT_NAME(AnalyticsParameterItemListName) = + @"item_list_name"; + +/// Item Name (context-specific) (String). +///
+///     let params = [
+///       AnalyticsParameterItemName : "jeggings",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemName NS_SWIFT_NAME(AnalyticsParameterItemName) = + @"item_name"; + +/// Item variant (String). +///
+///     let params = [
+///       AnalyticsParameterItemVariant : "Black",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemVariant NS_SWIFT_NAME(AnalyticsParameterItemVariant) = + @"item_variant"; + +/// The list of items involved in the transaction expressed as `[[String: Any]]`. +///
+///     let params = [
+///       AnalyticsParameterItems : [
+///         [AnalyticsParameterItemName : "jeggings", AnalyticsParameterItemCategory : "pants"],
+///         [AnalyticsParameterItemName : "boots", AnalyticsParameterItemCategory : "shoes"],
+///       ],
+///     ]
+/// 
+static NSString *const kFIRParameterItems NS_SWIFT_NAME(AnalyticsParameterItems) = @"items"; + +/// Level in game (Int). +///
+///     let params = [
+///       AnalyticsParameterLevel : 42,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterLevel NS_SWIFT_NAME(AnalyticsParameterLevel) = @"level"; + +/// The name of a level in a game (String). +///
+///     let params = [
+///       AnalyticsParameterLevelName : "room_1",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterLevelName NS_SWIFT_NAME(AnalyticsParameterLevelName) = + @"level_name"; + +/// Location (String). The Google Place ID +/// that corresponds to the associated event. Alternatively, you can supply your own custom +/// Location ID. +///
+///     let params = [
+///       AnalyticsParameterLocation : "ChIJiyj437sx3YAR9kUWC8QkLzQ",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterLocation NS_SWIFT_NAME(AnalyticsParameterLocation) = + @"location"; + +/// The location associated with the event. Preferred to be the Google +/// Place ID that corresponds to the +/// associated item but could be overridden to a custom location ID string.(String). +///
+///     let params = [
+///       AnalyticsParameterLocationID : "ChIJiyj437sx3YAR9kUWC8QkLzQ",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterLocationID NS_SWIFT_NAME(AnalyticsParameterLocationID) = + @"location_id"; + +/// Marketing Tactic (String). Used to identify the targeting criteria applied to a specific +/// campaign. +///
+///     let params = [
+///       AnalyticsParameterMarketingTactic : "Remarketing",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterMarketingTactic + NS_SWIFT_NAME(AnalyticsParameterMarketingTactic) = @"marketing_tactic"; + +/// The advertising or marketing medium, for example: cpc, banner, email, push. Highly recommended +/// (String). +///
+///     let params = [
+///       AnalyticsParameterMedium : "email",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterMedium NS_SWIFT_NAME(AnalyticsParameterMedium) = @"medium"; + +/// A particular approach used in an operation; for example, "facebook" or "email" in the context +/// of a sign_up or login event. (String). +///
+///     let params = [
+///       AnalyticsParameterMethod : "google",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterMethod NS_SWIFT_NAME(AnalyticsParameterMethod) = @"method"; + +/// Number of nights staying at hotel (Int). +///
+///     let params = [
+///       AnalyticsParameterNumberOfNights : 3,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterNumberOfNights + NS_SWIFT_NAME(AnalyticsParameterNumberOfNights) = @"number_of_nights"; + +/// Number of passengers traveling (Int). +///
+///     let params = [
+///       AnalyticsParameterNumberOfPassengers : 11,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterNumberOfPassengers + NS_SWIFT_NAME(AnalyticsParameterNumberOfPassengers) = @"number_of_passengers"; + +/// Number of rooms for travel events (Int). +///
+///     let params = [
+///       AnalyticsParameterNumberOfRooms : 2,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterNumberOfRooms NS_SWIFT_NAME(AnalyticsParameterNumberOfRooms) = + @"number_of_rooms"; + +/// Flight or Travel origin (String). +///
+///     let params = [
+///       AnalyticsParameterOrigin : "Mountain View, CA",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterOrigin NS_SWIFT_NAME(AnalyticsParameterOrigin) = @"origin"; + +/// The chosen method of payment (String). +///
+///     let params = [
+///       AnalyticsParameterPaymentType : "Visa",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterPaymentType NS_SWIFT_NAME(AnalyticsParameterPaymentType) = + @"payment_type"; + +/// Purchase price (Double). +///
+///     let params = [
+///       AnalyticsParameterPrice : 1.0,
+///       AnalyticsParameterCurrency : "USD",  // e.g. $1.00 USD
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterPrice NS_SWIFT_NAME(AnalyticsParameterPrice) = @"price"; + +/// Indicates if an item's price is discounted. Specify 1 to indicate true and 0 to indicate false +/// (Int). +///
+///     let params = [
+///       AnalyticsParameterPriceIsDiscounted : 1,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterPriceIsDiscounted + NS_SWIFT_NAME(AnalyticsParameterPriceIsDiscounted) = @"price_is_discounted"; + +/// The ID of a product (String). +///
+///     let params = [
+///       AnalyticsParameterProductID : "PROD_12345",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterProductID NS_SWIFT_NAME(AnalyticsParameterProductID) = + @"product_id"; + +/// The name of a product (String). +///
+///     let params = [
+///       AnalyticsParameterProductName : "My Awesome Product",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterProductName NS_SWIFT_NAME(AnalyticsParameterProductName) = + @"product_name"; + +/// The ID of a product promotion (String). +///
+///     let params = [
+///       AnalyticsParameterPromotionID : "ABC123",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterPromotionID NS_SWIFT_NAME(AnalyticsParameterPromotionID) = + @"promotion_id"; + +/// The name of a product promotion (String). +///
+///     let params = [
+///       AnalyticsParameterPromotionName : "Summer Sale",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterPromotionName NS_SWIFT_NAME(AnalyticsParameterPromotionName) = + @"promotion_name"; + +/// Purchase quantity (Int). +///
+///     let params = [
+///       AnalyticsParameterQuantity : 1,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterQuantity NS_SWIFT_NAME(AnalyticsParameterQuantity) = + @"quantity"; + +/// Score in game (Int). +///
+///     let params = [
+///       AnalyticsParameterScore : 4200,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterScore NS_SWIFT_NAME(AnalyticsParameterScore) = @"score"; + +/// Current screen class, such as the class name of the UIViewController, logged with screen_view +/// event and added to every event (String). +///
+///     let params = [
+///       AnalyticsParameterScreenClass : "LoginViewController",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterScreenClass NS_SWIFT_NAME(AnalyticsParameterScreenClass) = + @"screen_class"; + +/// Current screen name, such as the name of the UIViewController, logged with screen_view event and +/// added to every event (String). +///
+///     let params = [
+///       AnalyticsParameterScreenName : "LoginView",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterScreenName NS_SWIFT_NAME(AnalyticsParameterScreenName) = + @"screen_name"; + +/// The search string/keywords used (String). +///
+///     let params = [
+///       AnalyticsParameterSearchTerm : "periodic table",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterSearchTerm NS_SWIFT_NAME(AnalyticsParameterSearchTerm) = + @"search_term"; + +/// Shipping cost associated with a transaction (Double). +///
+///     let params = [
+///       AnalyticsParameterShipping : 5.99,
+///       AnalyticsParameterCurrency : "USD",  // e.g. $5.99 USD
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterShipping NS_SWIFT_NAME(AnalyticsParameterShipping) = + @"shipping"; + +/// The shipping tier (e.g. Ground, Air, Next-day) selected for delivery of the purchased item +/// (String). +///
+///     let params = [
+///       AnalyticsParameterShippingTier : "Ground",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterShippingTier NS_SWIFT_NAME(AnalyticsParameterShippingTier) = + @"shipping_tier"; + +/// The origin of your traffic, such as an Ad network (for example, google) or partner (urban +/// airship). Identify the advertiser, site, publication, etc. that is sending traffic to your +/// property. Highly recommended (String). +///
+///     let params = [
+///       AnalyticsParameterSource : "InMobi",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterSource NS_SWIFT_NAME(AnalyticsParameterSource) = @"source"; + +/// Source Platform (String). Used to identify the platform responsible for directing traffic to a +/// given Analytics property (e.g., a buying platform where budgets, targeting criteria, etc. are +/// set, a platform for managing organic traffic data, etc.). +///
+///     let params = [
+///       AnalyticsParameterSourcePlatform : "sa360",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterSourcePlatform NS_SWIFT_NAME(AnalyticsParameterSourcePlatform) = + @"source_platform"; + +/// The departure date, check-in date or rental start date for the item. This should be in +/// YYYY-MM-DD format (String). +///
+///     let params = [
+///       AnalyticsParameterStartDate : "2015-09-14",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterStartDate NS_SWIFT_NAME(AnalyticsParameterStartDate) = + @"start_date"; + +/// Indicates if the purchase is a subscription. Specify 1 to indicate true and 0 to indicate false +/// (Int). +///
+///     let params = [
+///       AnalyticsParameterSubscription : 1,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterSubscription NS_SWIFT_NAME(AnalyticsParameterSubscription) = + @"subscription"; + +/// The result of an operation. Specify 1 to indicate success and 0 to indicate failure (Int). +///
+///     let params = [
+///       AnalyticsParameterSuccess : 1,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterSuccess NS_SWIFT_NAME(AnalyticsParameterSuccess) = @"success"; + +/// Tax cost associated with a transaction (Double). +///
+///     let params = [
+///       AnalyticsParameterTax : 2.43,
+///       AnalyticsParameterCurrency : "USD",  // e.g. $2.43 USD
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterTax NS_SWIFT_NAME(AnalyticsParameterTax) = @"tax"; + +/// If you're manually tagging keyword campaigns, you should use utm_term to specify the keyword +/// (String). +///
+///     let params = [
+///       AnalyticsParameterTerm : "game",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterTerm NS_SWIFT_NAME(AnalyticsParameterTerm) = @"term"; + +/// The unique identifier of a transaction (String). +///
+///     let params = [
+///       AnalyticsParameterTransactionID : "T12345",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterTransactionID NS_SWIFT_NAME(AnalyticsParameterTransactionID) = + @"transaction_id"; + +/// Travel class (String). +///
+///     let params = [
+///       AnalyticsParameterTravelClass : "business",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterTravelClass NS_SWIFT_NAME(AnalyticsParameterTravelClass) = + @"travel_class"; + +/// A context-specific numeric value which is accumulated automatically for each event type. This is +/// a general purpose parameter that is useful for accumulating a key metric that pertains to an +/// event. Examples include revenue, distance, time and points. Value should be specified as Int or +/// Double. +/// Notes: Values for pre-defined currency-related events (such as @c AnalyticsEventAddToCart) +/// should be supplied using Double and must be accompanied by a @c AnalyticsParameterCurrency +/// parameter. The valid range of accumulated values is +/// [-9,223,372,036,854.77, 9,223,372,036,854.77]. Supplying a non-numeric value, omitting the +/// corresponding @c AnalyticsParameterCurrency parameter, or supplying an invalid +/// currency code for conversion events will cause that +/// conversion to be omitted from reporting. +///
+///     let params = [
+///       AnalyticsParameterValue : 3.99,
+///       AnalyticsParameterCurrency : "USD",  // e.g. $3.99 USD
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterValue NS_SWIFT_NAME(AnalyticsParameterValue) = @"value"; + +/// Name of virtual currency type (String). +///
+///     let params = [
+///       AnalyticsParameterVirtualCurrencyName : "virtual_currency_name",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterVirtualCurrencyName + NS_SWIFT_NAME(AnalyticsParameterVirtualCurrencyName) = @"virtual_currency_name"; diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/Headers/FIRUserPropertyNames.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/Headers/FIRUserPropertyNames.h new file mode 100644 index 0000000..2442d8a --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/Headers/FIRUserPropertyNames.h @@ -0,0 +1,28 @@ +/// @file FIRUserPropertyNames.h +/// +/// Predefined user property names. +/// +/// A UserProperty is an attribute that describes the app-user. By supplying UserProperties, you can +/// later analyze different behaviors of various segments of your userbase. You may supply up to 25 +/// unique UserProperties per app, and you can use the name and value of your choosing for each one. +/// UserProperty names can be up to 24 characters long, may only contain alphanumeric characters and +/// underscores ("_"), and must start with an alphabetic character. UserProperty values can be up to +/// 36 characters long. The "firebase_", "google_", and "ga_" prefixes are reserved and should not +/// be used. + +#import + +/// Indicates whether events logged by Google Analytics can be used to personalize ads for the user. +/// Set to "YES" to enable, or "NO" to disable. Default is enabled. See the +/// documentation for +/// more details and information about related settings. +/// +///
+///     Analytics.setUserProperty("NO", forName: AnalyticsUserPropertyAllowAdPersonalizationSignals)
+/// 
+static NSString *const kFIRUserPropertyAllowAdPersonalizationSignals + NS_SWIFT_NAME(AnalyticsUserPropertyAllowAdPersonalizationSignals) = @"allow_personalized_ads"; + +/// The method used to sign in. For example, "google", "facebook" or "twitter". +static NSString *const kFIRUserPropertySignUpMethod + NS_SWIFT_NAME(AnalyticsUserPropertySignUpMethod) = @"sign_up_method"; diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/Headers/FirebaseAnalytics-Swift.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/Headers/FirebaseAnalytics-Swift.h new file mode 100644 index 0000000..0ead9a0 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/Headers/FirebaseAnalytics-Swift.h @@ -0,0 +1,316 @@ +#if 0 +#elif defined(__arm64__) && __arm64__ +// Generated by Apple Swift version 6.0.3 effective-5.10 (swiftlang-6.0.3.1.10 clang-1600.0.30.1) +#ifndef FIREBASEANALYTICS_SWIFT_H +#define FIREBASEANALYTICS_SWIFT_H +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgcc-compat" + +#if !defined(__has_include) +# define __has_include(x) 0 +#endif +#if !defined(__has_attribute) +# define __has_attribute(x) 0 +#endif +#if !defined(__has_feature) +# define __has_feature(x) 0 +#endif +#if !defined(__has_warning) +# define __has_warning(x) 0 +#endif + +#if __has_include() +# include +#endif + +#pragma clang diagnostic ignored "-Wauto-import" +#if defined(__OBJC__) +#include +#endif +#if defined(__cplusplus) +#include +#include +#include +#include +#include +#include +#include +#else +#include +#include +#include +#include +#endif +#if defined(__cplusplus) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wnon-modular-include-in-framework-module" +#if defined(__arm64e__) && __has_include() +# include +#else +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wreserved-macro-identifier" +# ifndef __ptrauth_swift_value_witness_function_pointer +# define __ptrauth_swift_value_witness_function_pointer(x) +# endif +# ifndef __ptrauth_swift_class_method_pointer +# define __ptrauth_swift_class_method_pointer(x) +# endif +#pragma clang diagnostic pop +#endif +#pragma clang diagnostic pop +#endif + +#if !defined(SWIFT_TYPEDEFS) +# define SWIFT_TYPEDEFS 1 +# if __has_include() +# include +# elif !defined(__cplusplus) +typedef uint_least16_t char16_t; +typedef uint_least32_t char32_t; +# endif +typedef float swift_float2 __attribute__((__ext_vector_type__(2))); +typedef float swift_float3 __attribute__((__ext_vector_type__(3))); +typedef float swift_float4 __attribute__((__ext_vector_type__(4))); +typedef double swift_double2 __attribute__((__ext_vector_type__(2))); +typedef double swift_double3 __attribute__((__ext_vector_type__(3))); +typedef double swift_double4 __attribute__((__ext_vector_type__(4))); +typedef int swift_int2 __attribute__((__ext_vector_type__(2))); +typedef int swift_int3 __attribute__((__ext_vector_type__(3))); +typedef int swift_int4 __attribute__((__ext_vector_type__(4))); +typedef unsigned int swift_uint2 __attribute__((__ext_vector_type__(2))); +typedef unsigned int swift_uint3 __attribute__((__ext_vector_type__(3))); +typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); +#endif + +#if !defined(SWIFT_PASTE) +# define SWIFT_PASTE_HELPER(x, y) x##y +# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y) +#endif +#if !defined(SWIFT_METATYPE) +# define SWIFT_METATYPE(X) Class +#endif +#if !defined(SWIFT_CLASS_PROPERTY) +# if __has_feature(objc_class_property) +# define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__ +# else +# define SWIFT_CLASS_PROPERTY(...) +# endif +#endif +#if !defined(SWIFT_RUNTIME_NAME) +# if __has_attribute(objc_runtime_name) +# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X))) +# else +# define SWIFT_RUNTIME_NAME(X) +# endif +#endif +#if !defined(SWIFT_COMPILE_NAME) +# if __has_attribute(swift_name) +# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X))) +# else +# define SWIFT_COMPILE_NAME(X) +# endif +#endif +#if !defined(SWIFT_METHOD_FAMILY) +# if __has_attribute(objc_method_family) +# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X))) +# else +# define SWIFT_METHOD_FAMILY(X) +# endif +#endif +#if !defined(SWIFT_NOESCAPE) +# if __has_attribute(noescape) +# define SWIFT_NOESCAPE __attribute__((noescape)) +# else +# define SWIFT_NOESCAPE +# endif +#endif +#if !defined(SWIFT_RELEASES_ARGUMENT) +# if __has_attribute(ns_consumed) +# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed)) +# else +# define SWIFT_RELEASES_ARGUMENT +# endif +#endif +#if !defined(SWIFT_WARN_UNUSED_RESULT) +# if __has_attribute(warn_unused_result) +# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) +# else +# define SWIFT_WARN_UNUSED_RESULT +# endif +#endif +#if !defined(SWIFT_NORETURN) +# if __has_attribute(noreturn) +# define SWIFT_NORETURN __attribute__((noreturn)) +# else +# define SWIFT_NORETURN +# endif +#endif +#if !defined(SWIFT_CLASS_EXTRA) +# define SWIFT_CLASS_EXTRA +#endif +#if !defined(SWIFT_PROTOCOL_EXTRA) +# define SWIFT_PROTOCOL_EXTRA +#endif +#if !defined(SWIFT_ENUM_EXTRA) +# define SWIFT_ENUM_EXTRA +#endif +#if !defined(SWIFT_CLASS) +# if __has_attribute(objc_subclassing_restricted) +# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA +# define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA +# else +# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA +# define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA +# endif +#endif +#if !defined(SWIFT_RESILIENT_CLASS) +# if __has_attribute(objc_class_stub) +# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) __attribute__((objc_class_stub)) +# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_class_stub)) SWIFT_CLASS_NAMED(SWIFT_NAME) +# else +# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) +# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) SWIFT_CLASS_NAMED(SWIFT_NAME) +# endif +#endif +#if !defined(SWIFT_PROTOCOL) +# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA +# define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA +#endif +#if !defined(SWIFT_EXTENSION) +# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__) +#endif +#if !defined(OBJC_DESIGNATED_INITIALIZER) +# if __has_attribute(objc_designated_initializer) +# define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) +# else +# define OBJC_DESIGNATED_INITIALIZER +# endif +#endif +#if !defined(SWIFT_ENUM_ATTR) +# if __has_attribute(enum_extensibility) +# define SWIFT_ENUM_ATTR(_extensibility) __attribute__((enum_extensibility(_extensibility))) +# else +# define SWIFT_ENUM_ATTR(_extensibility) +# endif +#endif +#if !defined(SWIFT_ENUM) +# define SWIFT_ENUM(_type, _name, _extensibility) enum _name : _type _name; enum SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type +# if __has_feature(generalized_swift_name) +# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type +# else +# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) SWIFT_ENUM(_type, _name, _extensibility) +# endif +#endif +#if !defined(SWIFT_UNAVAILABLE) +# define SWIFT_UNAVAILABLE __attribute__((unavailable)) +#endif +#if !defined(SWIFT_UNAVAILABLE_MSG) +# define SWIFT_UNAVAILABLE_MSG(msg) __attribute__((unavailable(msg))) +#endif +#if !defined(SWIFT_AVAILABILITY) +# define SWIFT_AVAILABILITY(plat, ...) __attribute__((availability(plat, __VA_ARGS__))) +#endif +#if !defined(SWIFT_WEAK_IMPORT) +# define SWIFT_WEAK_IMPORT __attribute__((weak_import)) +#endif +#if !defined(SWIFT_DEPRECATED) +# define SWIFT_DEPRECATED __attribute__((deprecated)) +#endif +#if !defined(SWIFT_DEPRECATED_MSG) +# define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__))) +#endif +#if !defined(SWIFT_DEPRECATED_OBJC) +# if __has_feature(attribute_diagnose_if_objc) +# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning"))) +# else +# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg) +# endif +#endif +#if defined(__OBJC__) +#if !defined(IBSegueAction) +# define IBSegueAction +#endif +#endif +#if !defined(SWIFT_EXTERN) +# if defined(__cplusplus) +# define SWIFT_EXTERN extern "C" +# else +# define SWIFT_EXTERN extern +# endif +#endif +#if !defined(SWIFT_CALL) +# define SWIFT_CALL __attribute__((swiftcall)) +#endif +#if !defined(SWIFT_INDIRECT_RESULT) +# define SWIFT_INDIRECT_RESULT __attribute__((swift_indirect_result)) +#endif +#if !defined(SWIFT_CONTEXT) +# define SWIFT_CONTEXT __attribute__((swift_context)) +#endif +#if !defined(SWIFT_ERROR_RESULT) +# define SWIFT_ERROR_RESULT __attribute__((swift_error_result)) +#endif +#if defined(__cplusplus) +# define SWIFT_NOEXCEPT noexcept +#else +# define SWIFT_NOEXCEPT +#endif +#if !defined(SWIFT_C_INLINE_THUNK) +# if __has_attribute(always_inline) +# if __has_attribute(nodebug) +# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) __attribute__((nodebug)) +# else +# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) +# endif +# else +# define SWIFT_C_INLINE_THUNK inline +# endif +#endif +#if defined(_WIN32) +#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) +# define SWIFT_IMPORT_STDLIB_SYMBOL __declspec(dllimport) +#endif +#else +#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) +# define SWIFT_IMPORT_STDLIB_SYMBOL +#endif +#endif +#if defined(__OBJC__) +#if __has_feature(objc_modules) +#if __has_warning("-Watimport-in-framework-header") +#pragma clang diagnostic ignored "-Watimport-in-framework-header" +#endif +#endif + +#endif +#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch" +#pragma clang diagnostic ignored "-Wduplicate-method-arg" +#if __has_warning("-Wpragma-clang-attribute") +# pragma clang diagnostic ignored "-Wpragma-clang-attribute" +#endif +#pragma clang diagnostic ignored "-Wunknown-pragmas" +#pragma clang diagnostic ignored "-Wnullability" +#pragma clang diagnostic ignored "-Wdollar-in-identifier-extension" +#pragma clang diagnostic ignored "-Wunsafe-buffer-usage" + +#if __has_attribute(external_source_symbol) +# pragma push_macro("any") +# undef any +# pragma clang attribute push(__attribute__((external_source_symbol(language="Swift", defined_in="FirebaseAnalytics",generated_declaration))), apply_to=any(function,enum,objc_interface,objc_category,objc_protocol)) +# pragma pop_macro("any") +#endif + +#if defined(__OBJC__) + +#endif +#if __has_attribute(external_source_symbol) +# pragma clang attribute pop +#endif +#if defined(__cplusplus) +#endif +#pragma clang diagnostic pop +#endif + +#else +#error unsupported Swift architecture +#endif diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/Headers/FirebaseAnalytics-umbrella.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/Headers/FirebaseAnalytics-umbrella.h new file mode 100644 index 0000000..ad84fbb --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/Headers/FirebaseAnalytics-umbrella.h @@ -0,0 +1,24 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + +#import "FIRAnalytics+AppDelegate.h" +#import "FIRAnalytics+Consent.h" +#import "FIRAnalytics+OnDevice.h" +#import "FIRAnalytics.h" +#import "FirebaseAnalytics.h" +#import "FIREventNames.h" +#import "FIRParameterNames.h" +#import "FIRUserPropertyNames.h" + +FOUNDATION_EXPORT double FirebaseAnalyticsVersionNumber; +FOUNDATION_EXPORT const unsigned char FirebaseAnalyticsVersionString[]; + diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/Headers/FirebaseAnalytics.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/Headers/FirebaseAnalytics.h new file mode 100644 index 0000000..351da20 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/Headers/FirebaseAnalytics.h @@ -0,0 +1,7 @@ +#import "FIRAnalytics+AppDelegate.h" +#import "FIRAnalytics+Consent.h" +#import "FIRAnalytics+OnDevice.h" +#import "FIRAnalytics.h" +#import "FIREventNames.h" +#import "FIRParameterNames.h" +#import "FIRUserPropertyNames.h" diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/Info.plist b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/Info.plist new file mode 100644 index 0000000..eb471fe --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/Info.plist @@ -0,0 +1,52 @@ + + + + + BuildMachineOSBuild + 24G231 + CFBundleDevelopmentRegion + en + CFBundleExecutable + FirebaseAnalytics + CFBundleIdentifier + org.cocoapods.FirebaseAnalytics + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + FirebaseAnalytics + CFBundlePackageType + FMWK + CFBundleShortVersionString + 12.5.0 + CFBundleSignature + ???? + CFBundleSupportedPlatforms + + AppleTVOS + + CFBundleVersion + 1 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + DTPlatformBuild + 22K152 + DTPlatformName + appletvos + DTPlatformVersion + 18.2 + DTSDKBuild + 22K152 + DTSDKName + appletvos18.2 + DTXcode + 1620 + DTXcodeBuild + 16C5032a + MinimumOSVersion + 100.0 + UIDeviceFamily + + 3 + + + diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/Project/arm64-apple-tvos.swiftsourceinfo b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/Project/arm64-apple-tvos.swiftsourceinfo new file mode 100644 index 0000000..3f6e02f Binary files /dev/null and b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/Project/arm64-apple-tvos.swiftsourceinfo differ diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-tvos.abi.json b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-tvos.abi.json new file mode 100644 index 0000000..476738a --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-tvos.abi.json @@ -0,0 +1,281 @@ +{ + "ABIRoot": { + "kind": "Root", + "name": "FirebaseAnalytics", + "printedName": "FirebaseAnalytics", + "children": [ + { + "kind": "Import", + "name": "FirebaseAnalyticsPrivate", + "printedName": "FirebaseAnalyticsPrivate", + "declKind": "Import", + "moduleName": "FirebaseAnalytics", + "declAttributes": [ + "ImplementationOnly" + ] + }, + { + "kind": "Import", + "name": "StoreKit", + "printedName": "StoreKit", + "declKind": "Import", + "moduleName": "FirebaseAnalytics" + }, + { + "kind": "Import", + "name": "SwiftUI", + "printedName": "SwiftUI", + "declKind": "Import", + "moduleName": "FirebaseAnalytics" + }, + { + "kind": "TypeDecl", + "name": "Analytics", + "printedName": "Analytics", + "children": [ + { + "kind": "Function", + "name": "logTransaction", + "printedName": "logTransaction(_:)", + "children": [ + { + "kind": "TypeNominal", + "name": "Void", + "printedName": "()" + }, + { + "kind": "TypeNominal", + "name": "Transaction", + "printedName": "StoreKit.Transaction", + "usr": "s:8StoreKit11TransactionV" + } + ], + "declKind": "Func", + "usr": "s:So12FIRAnalyticsC17FirebaseAnalyticsE14logTransactionyy8StoreKit0E0VFZ", + "mangledName": "$sSo12FIRAnalyticsC17FirebaseAnalyticsE14logTransactionyy8StoreKit0E0VFZ", + "moduleName": "FirebaseAnalytics", + "static": true, + "declAttributes": [ + "Final", + "AccessControl", + "RawDocComment" + ], + "isFromExtension": true, + "funcSelfKind": "NonMutating" + } + ], + "declKind": "Class", + "usr": "c:objc(cs)FIRAnalytics", + "moduleName": "FirebaseAnalytics", + "isOpen": true, + "objc_name": "FIRAnalytics", + "declAttributes": [ + "ObjC", + "Dynamic" + ], + "superclassUsr": "c:objc(cs)NSObject", + "isExternal": true, + "inheritsConvenienceInitializers": true, + "superclassNames": [ + "ObjectiveC.NSObject" + ], + "conformances": [ + { + "kind": "Conformance", + "name": "Copyable", + "printedName": "Copyable", + "usr": "s:s8CopyableP", + "mangledName": "$ss8CopyableP" + }, + { + "kind": "Conformance", + "name": "Escapable", + "printedName": "Escapable", + "usr": "s:s9EscapableP", + "mangledName": "$ss9EscapableP" + }, + { + "kind": "Conformance", + "name": "Equatable", + "printedName": "Equatable", + "usr": "s:SQ", + "mangledName": "$sSQ" + }, + { + "kind": "Conformance", + "name": "Hashable", + "printedName": "Hashable", + "usr": "s:SH", + "mangledName": "$sSH" + }, + { + "kind": "Conformance", + "name": "CVarArg", + "printedName": "CVarArg", + "usr": "s:s7CVarArgP", + "mangledName": "$ss7CVarArgP" + }, + { + "kind": "Conformance", + "name": "_KeyValueCodingAndObservingPublishing", + "printedName": "_KeyValueCodingAndObservingPublishing", + "usr": "s:10Foundation37_KeyValueCodingAndObservingPublishingP", + "mangledName": "$s10Foundation37_KeyValueCodingAndObservingPublishingP" + }, + { + "kind": "Conformance", + "name": "_KeyValueCodingAndObserving", + "printedName": "_KeyValueCodingAndObserving", + "usr": "s:10Foundation27_KeyValueCodingAndObservingP", + "mangledName": "$s10Foundation27_KeyValueCodingAndObservingP" + }, + { + "kind": "Conformance", + "name": "CustomStringConvertible", + "printedName": "CustomStringConvertible", + "usr": "s:s23CustomStringConvertibleP", + "mangledName": "$ss23CustomStringConvertibleP" + }, + { + "kind": "Conformance", + "name": "CustomDebugStringConvertible", + "printedName": "CustomDebugStringConvertible", + "usr": "s:s28CustomDebugStringConvertibleP", + "mangledName": "$ss28CustomDebugStringConvertibleP" + } + ] + }, + { + "kind": "TypeDecl", + "name": "View", + "printedName": "View", + "children": [ + { + "kind": "Function", + "name": "analyticsScreen", + "printedName": "analyticsScreen(name:class:extraParameters:)", + "children": [ + { + "kind": "TypeNominal", + "name": "OpaqueTypeArchetype", + "printedName": "some SwiftUI.View", + "children": [ + { + "kind": "TypeNominal", + "name": "View", + "printedName": "SwiftUI.View", + "usr": "s:7SwiftUI4ViewP" + } + ] + }, + { + "kind": "TypeNominal", + "name": "String", + "printedName": "Swift.String", + "usr": "s:SS" + }, + { + "kind": "TypeNominal", + "name": "String", + "printedName": "Swift.String", + "hasDefaultArg": true, + "usr": "s:SS" + }, + { + "kind": "TypeNominal", + "name": "Dictionary", + "printedName": "[Swift.String : Any]", + "children": [ + { + "kind": "TypeNominal", + "name": "String", + "printedName": "Swift.String", + "usr": "s:SS" + }, + { + "kind": "TypeNominal", + "name": "ProtocolComposition", + "printedName": "Any" + } + ], + "hasDefaultArg": true, + "usr": "s:SD" + } + ], + "declKind": "Func", + "usr": "s:7SwiftUI4ViewP17FirebaseAnalyticsE15analyticsScreen4name5class15extraParametersQrSS_SSSDySSypGtF", + "mangledName": "$s7SwiftUI4ViewP17FirebaseAnalyticsE15analyticsScreen4name5class15extraParametersQrSS_SSSDySSypGtF", + "moduleName": "FirebaseAnalytics", + "genericSig": "<τ_0_0 where τ_0_0 : SwiftUI.View>", + "sugared_genericSig": "", + "declAttributes": [ + "Preconcurrency", + "Custom", + "AccessControl", + "RawDocComment" + ], + "isFromExtension": true, + "funcSelfKind": "NonMutating" + } + ], + "declKind": "Protocol", + "usr": "s:7SwiftUI4ViewP", + "mangledName": "$s7SwiftUI4ViewP", + "moduleName": "SwiftUICore", + "genericSig": "<τ_0_0.Body : SwiftUI.View>", + "sugared_genericSig": "", + "intro_Macosx": "10.15", + "intro_iOS": "13.0", + "intro_tvOS": "13.0", + "intro_watchOS": "6.0", + "declAttributes": [ + "Preconcurrency", + "TypeEraser", + "OriginallyDefinedIn", + "OriginallyDefinedIn", + "OriginallyDefinedIn", + "OriginallyDefinedIn", + "Available", + "Available", + "Available", + "Available", + "Custom" + ], + "isExternal": true, + "conformances": [ + { + "kind": "Conformance", + "name": "Escapable", + "printedName": "Escapable", + "usr": "s:s9EscapableP", + "mangledName": "$ss9EscapableP" + }, + { + "kind": "Conformance", + "name": "Copyable", + "printedName": "Copyable", + "usr": "s:s8CopyableP", + "mangledName": "$ss8CopyableP" + } + ] + } + ], + "json_format_version": 8 + }, + "ConstValues": [ + { + "filePath": "\/Volumes\/google\/src\/cloud\/hantran\/m172\/google3\/googlemac\/iPhone\/Firebase\/Analytics\/Sources\/Swift\/Analytics+SwiftUI.swift", + "kind": "StringLiteral", + "offset": 2654, + "length": 6, + "value": "\"View\"" + }, + { + "filePath": "\/Volumes\/google\/src\/cloud\/hantran\/m172\/google3\/googlemac\/iPhone\/Firebase\/Analytics\/Sources\/Swift\/Analytics+SwiftUI.swift", + "kind": "Dictionary", + "offset": 2701, + "length": 3, + "value": "[]" + } + ] +} \ No newline at end of file diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-tvos.private.swiftinterface b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-tvos.private.swiftinterface new file mode 100644 index 0000000..dbecb5f --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-tvos.private.swiftinterface @@ -0,0 +1,22 @@ +// swift-interface-format-version: 1.0 +// swift-compiler-version: Apple Swift version 6.0.3 effective-5.10 (swiftlang-6.0.3.1.10 clang-1600.0.30.1) +// swift-module-flags: -target arm64-apple-tvos15.0 -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -O -enable-bare-slash-regex -module-name FirebaseAnalytics +// swift-module-flags-ignorable: -no-verify-emitted-module-interface +@_exported import FirebaseAnalytics +import StoreKit +import Swift +import SwiftUI +import _Concurrency +import _StringProcessing +import _SwiftConcurrencyShims +@available(iOS 15.0, macOS 12.0, macCatalyst 15.0, tvOS 15.0, *) +@available(watchOS, unavailable) +extension FirebaseAnalytics.Analytics { + public static func logTransaction(_ transaction: StoreKit.Transaction) +} +@available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, *) +@available(watchOS, unavailable) +extension SwiftUICore.View { + @_Concurrency.MainActor @preconcurrency public func analyticsScreen(name: Swift.String, class: Swift.String = "View", extraParameters: [Swift.String : Any] = [:]) -> some SwiftUICore.View + +} diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-tvos.swiftdoc b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-tvos.swiftdoc new file mode 100644 index 0000000..e601b18 Binary files /dev/null and b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-tvos.swiftdoc differ diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-tvos.swiftinterface b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-tvos.swiftinterface new file mode 100644 index 0000000..dbecb5f --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-tvos.swiftinterface @@ -0,0 +1,22 @@ +// swift-interface-format-version: 1.0 +// swift-compiler-version: Apple Swift version 6.0.3 effective-5.10 (swiftlang-6.0.3.1.10 clang-1600.0.30.1) +// swift-module-flags: -target arm64-apple-tvos15.0 -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -O -enable-bare-slash-regex -module-name FirebaseAnalytics +// swift-module-flags-ignorable: -no-verify-emitted-module-interface +@_exported import FirebaseAnalytics +import StoreKit +import Swift +import SwiftUI +import _Concurrency +import _StringProcessing +import _SwiftConcurrencyShims +@available(iOS 15.0, macOS 12.0, macCatalyst 15.0, tvOS 15.0, *) +@available(watchOS, unavailable) +extension FirebaseAnalytics.Analytics { + public static func logTransaction(_ transaction: StoreKit.Transaction) +} +@available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, *) +@available(watchOS, unavailable) +extension SwiftUICore.View { + @_Concurrency.MainActor @preconcurrency public func analyticsScreen(name: Swift.String, class: Swift.String = "View", extraParameters: [Swift.String : Any] = [:]) -> some SwiftUICore.View + +} diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/Modules/module.modulemap b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/Modules/module.modulemap new file mode 100644 index 0000000..fa10817 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64/FirebaseAnalytics.framework/Modules/module.modulemap @@ -0,0 +1,16 @@ +framework module FirebaseAnalytics { +umbrella header "FirebaseAnalytics-umbrella.h" +export * +module * { export * } + link framework "Foundation" + link framework "Security" + link framework "SystemConfiguration" + link framework "UIKit" + link "c++" + link "sqlite3" + link "z" +} +module FirebaseAnalytics.Swift { + header "FirebaseAnalytics-Swift.h" + requires objc +} \ No newline at end of file diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/FirebaseAnalytics b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/FirebaseAnalytics new file mode 100644 index 0000000..1d1d825 Binary files /dev/null and b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/FirebaseAnalytics differ diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRAnalytics+AppDelegate.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRAnalytics+AppDelegate.h new file mode 100644 index 0000000..cb1e407 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRAnalytics+AppDelegate.h @@ -0,0 +1,80 @@ +#import + +#import "FIRAnalytics.h" + +NS_ASSUME_NONNULL_BEGIN + +/// Provides App Delegate handlers to be used in your App Delegate. +/// +/// To save time integrating Firebase Analytics in an application, Firebase Analytics does not +/// require delegation implementation from the AppDelegate if neither SwiftUI nor UIScene lifecycle +/// is adopted. Instead this is automatically done by Firebase Analytics. Should you choose instead +/// to delegate manually, you can turn off the App Delegate Proxy by adding +/// FirebaseAppDelegateProxyEnabled into your app's Info.plist and setting it to boolean `NO`, and +/// adding the methods in this category to corresponding delegation handlers. +/// +/// To handle Universal Links, you must return `true` in +/// `UIApplicationDelegate.application(_:didFinishLaunchingWithOptions:)`. +@interface FIRAnalytics (AppDelegate) + +/// Handles events related to a URL session that are waiting to be processed. +/// +/// 1. If SwiftUI lifecycle is adopted, call this method from +/// `UIApplicationDelegate.application(_:handleEventsForBackgroundURLSession:completionHandler:)` +/// in your app delegate. +/// +/// 2. If SwiftUI lifecycle is not adopted, Firebase Analytics does not require delegation +/// implementation from the AppDelegate. If you choose instead to delegate manually, you can set +/// FirebaseAppDelegateProxyEnabled to boolean `NO` in your app's Info.plist and call this method +/// from +/// `UIApplicationDelegate.application(_:handleEventsForBackgroundURLSession:completionHandler:)` +/// in your app delegate. +/// +/// @param identifier The identifier of the URL session requiring attention. +/// @param completionHandler The completion handler to call when you finish processing the events. +/// Calling this completion handler lets the system know that your app's user interface is +/// updated and a new snapshot can be taken. ++ (void)handleEventsForBackgroundURLSession:(NSString *)identifier + completionHandler:(nullable void (^)(void))completionHandler; + +/// Handles the event when the app is launched by a URL (custom URL scheme or universal link). +/// +/// 1. If SwiftUI lifecycle is adopted, use `onOpenURL(perform:)` to register a handler and call +/// this method in the handler. +/// +/// 2. If UIScene lifecycle is adopted, call this method from +/// `UISceneDelegate.scene(_:willConnectTo:options:)` and +/// `UISceneDelegate.scene(_:openURLContexts:)` when the URL contexts are available. +/// +/// 3. If neither SwiftUI nor UIScene lifecycle is adopted, Firebase Analytics does not require +/// delegation implementation from the AppDelegate. If you choose instead to delegate manually, you +/// can set FirebaseAppDelegateProxyEnabled to boolean `NO` in your app's Info.plist and call this +/// method from `UIApplicationDelegate.application(_:open:options:)` in your app delegate. +/// +/// @param url The URL resource to open. This resource can be a network resource or a file. ++ (void)handleOpenURL:(NSURL *)url; + +/// Handles the event when the app receives data associated with user activity that includes a +/// Universal Link. +/// +/// 1. If SwiftUI lifecycle is adopted, use `onOpenURL(perform:)` to register a handler and call +/// `Analytics.handleOpen(_:)` instead in the handler. +/// +/// 2. If UIScene lifecycle is adopted, call this method from +/// `UISceneDelegate.scene(_:willConnectTo:options:)` and `UISceneDelegate.scene(_:continue:)` when +/// NSUserActivity is available. See the [Apple +/// doc](https://developer.apple.com/documentation/xcode/supporting-universal-links-in-your-app) for +/// more details. +/// +/// 3. If neither SwiftUI nor UIScene lifecycle is adopted, Firebase Analytics does not require +/// delegation implementation from the AppDelegate. If you choose instead to delegate manually, you +/// can set FirebaseAppDelegateProxyEnabled to boolean `NO` in your app's Info.plist and call this +/// method from `UIApplication.application(_:continue:restorationHandler:)` in your app delegate. +/// +/// @param userActivity The activity object containing the data associated with the task the user +/// was performing. ++ (void)handleUserActivity:(id)userActivity; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRAnalytics+Consent.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRAnalytics+Consent.h new file mode 100644 index 0000000..7758390 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRAnalytics+Consent.h @@ -0,0 +1,51 @@ +#import + +#import "FIRAnalytics.h" + +NS_ASSUME_NONNULL_BEGIN + +/// The type of consent to set. Supported consent types are `ConsentType.adStorage`, +/// `ConsentType.analyticsStorage`, `ConsentType.adUserData`, and `ConsentType.adPersonalization`. +/// Omitting a type retains its previous status. +typedef NSString *FIRConsentType NS_TYPED_ENUM NS_SWIFT_NAME(ConsentType); + +/// Enables storage (such as device identifiers) related to advertising. +extern FIRConsentType const FIRConsentTypeAdStorage; + +/// Enables storage (such as app identifiers) related to analytics, e.g. visit duration. +extern FIRConsentType const FIRConsentTypeAnalyticsStorage; + +/// Sets consent for sending user data to Google for advertising purposes. +extern FIRConsentType const FIRConsentTypeAdUserData; + +/// Sets consent for personalized advertising. +extern FIRConsentType const FIRConsentTypeAdPersonalization; + +/// The status value of the consent type. Supported statuses are `ConsentStatus.granted` and +/// `ConsentStatus.denied`. +typedef NSString *FIRConsentStatus NS_TYPED_ENUM NS_SWIFT_NAME(ConsentStatus); + +/// Consent status indicating consent is denied. For an overview of which data is sent when consent +/// is denied, see [SDK behavior with consent +/// mode](https://developers.google.com/tag-platform/security/concepts/consent-mode#tag-behavior). +extern FIRConsentStatus const FIRConsentStatusDenied; + +/// Consent status indicating consent is granted. +extern FIRConsentStatus const FIRConsentStatusGranted; + +/// Sets the applicable end user consent state. +@interface FIRAnalytics (Consent) + +/// Sets the applicable end user consent state (e.g. for device identifiers) for this app on this +/// device. Use the consent settings to specify individual consent type values. Settings are +/// persisted across app sessions. By default consent types are set to `ConsentStatus.granted`. +/// +/// @param consentSettings A Dictionary of consent types. Supported consent type keys are +/// `ConsentType.adStorage`, `ConsentType.analyticsStorage`, `ConsentType.adUserData`, and +/// `ConsentType.adPersonalization`. Valid values are `ConsentStatus.granted` and +/// `ConsentStatus.denied`. ++ (void)setConsent:(NSDictionary *)consentSettings; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRAnalytics+OnDevice.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRAnalytics+OnDevice.h new file mode 100644 index 0000000..5f87c0d --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRAnalytics+OnDevice.h @@ -0,0 +1,51 @@ +#import + +#import "FIRAnalytics.h" + +NS_ASSUME_NONNULL_BEGIN + +API_UNAVAILABLE(macCatalyst, macos, tvos, watchos) +@interface FIRAnalytics (OnDevice) + +/// Initiates on-device conversion measurement given a user email address. Requires dependency +/// GoogleAdsOnDeviceConversion from +/// https://github.com/googleads/google-ads-on-device-conversion-ios-sdk/ to be linked in, otherwise +/// it is a no-op. +/// @param emailAddress User email address. Include a domain name for all email addresses +/// (e.g. gmail.com or hotmail.co.jp). ++ (void)initiateOnDeviceConversionMeasurementWithEmailAddress:(NSString *)emailAddress + NS_SWIFT_NAME(initiateOnDeviceConversionMeasurement(emailAddress:)); + +/// Initiates on-device conversion measurement given a phone number in E.164 format. Requires +/// dependency GoogleAdsOnDeviceConversion from +/// https://github.com/googleads/google-ads-on-device-conversion-ios-sdk/ to be linked in, otherwise +/// it is a no-op. +/// @param phoneNumber User phone number. Must be in E.164 format, which means it must be +/// limited to a maximum of 15 digits and must include a plus sign (+) prefix and country code +/// with no dashes, parentheses, or spaces. ++ (void)initiateOnDeviceConversionMeasurementWithPhoneNumber:(NSString *)phoneNumber + NS_SWIFT_NAME(initiateOnDeviceConversionMeasurement(phoneNumber:)); + +/// Initiates on-device conversion measurement given a sha256-hashed user email address. Requires +/// dependency GoogleAdsOnDeviceConversion from +/// https://github.com/googleads/google-ads-on-device-conversion-ios-sdk/ to be linked in, otherwise +/// it is a no-op. +/// @param hashedEmailAddress User email address as a UTF8-encoded string normalized and hashed +/// according to the instructions at +/// https://firebase.google.com/docs/tutorials/ads-ios-on-device-measurement/step-3. ++ (void)initiateOnDeviceConversionMeasurementWithHashedEmailAddress:(NSData *)hashedEmailAddress + NS_SWIFT_NAME(initiateOnDeviceConversionMeasurement(hashedEmailAddress:)); + +/// Initiates on-device conversion measurement given a sha256-hashed phone number in E.164 format. +/// Requires dependency GoogleAdsOnDeviceConversion from +/// https://github.com/googleads/google-ads-on-device-conversion-ios-sdk/ to be linked in, otherwise +/// it is a no-op. +/// @param hashedPhoneNumber UTF8-encoded user phone number in E.164 format and then hashed +/// according to the instructions at +/// https://firebase.google.com/docs/tutorials/ads-ios-on-device-measurement/step-3. ++ (void)initiateOnDeviceConversionMeasurementWithHashedPhoneNumber:(NSData *)hashedPhoneNumber + NS_SWIFT_NAME(initiateOnDeviceConversionMeasurement(hashedPhoneNumber:)); + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRAnalytics.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRAnalytics.h new file mode 100644 index 0000000..ec88689 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRAnalytics.h @@ -0,0 +1,155 @@ +#import + +#import "FIREventNames.h" +#import "FIRParameterNames.h" +#import "FIRUserPropertyNames.h" + +NS_ASSUME_NONNULL_BEGIN + +/// The top level Firebase Analytics singleton that provides methods for logging events and setting +/// user properties. See the developer guides for general +/// information on using Firebase Analytics in your apps. +/// +/// @note The Analytics SDK uses SQLite to persist events and other app-specific data. Calling +/// certain thread-unsafe global SQLite methods like `sqlite3_shutdown()` can result in +/// unexpected crashes at runtime. +NS_SWIFT_NAME(Analytics) +@interface FIRAnalytics : NSObject + +/// Logs an app event. The event can have up to 25 parameters. Events with the same name must have +/// the same parameters. Up to 500 event names are supported. Using predefined events and/or +/// parameters is recommended for optimal reporting. +/// +/// The following event names are reserved - events with these names will be dropped, and instead an +/// error event will be logged: +///
    +///
  • ad_activeview
  • +///
  • ad_click
  • +///
  • ad_exposure
  • +///
  • ad_query
  • +///
  • ad_reward
  • +///
  • adunit_exposure
  • +///
  • app_clear_data
  • +///
  • app_exception
  • +///
  • app_remove
  • +///
  • app_store_refund
  • +///
  • app_store_subscription_cancel
  • +///
  • app_store_subscription_convert
  • +///
  • app_store_subscription_renew
  • +///
  • app_update
  • +///
  • app_upgrade
  • +///
  • dynamic_link_app_open
  • +///
  • dynamic_link_app_update
  • +///
  • dynamic_link_first_open
  • +///
  • error
  • +///
  • firebase_campaign
  • +///
  • first_open
  • +///
  • first_visit
  • +///
  • notification_dismiss
  • +///
  • notification_foreground
  • +///
  • notification_open
  • +///
  • notification_receive
  • +///
  • os_update
  • +///
  • session_start
  • +///
  • session_start_with_rollout
  • +///
  • user_engagement
  • +///
+/// +/// @param name The name of the event. Should contain 1 to 40 alphanumeric characters or +/// underscores. The name must start with an alphabetic character. Some event names are +/// reserved. See FIREventNames.h for the list of reserved event names. The "firebase_", +/// "google_", and "ga_" prefixes are reserved and should not be used. Note that event names are +/// case-sensitive and that logging two events whose names differ only in case will result in +/// two distinct events. To manually log screen view events, use the `screen_view` event name. +/// @param parameters The dictionary of event parameters. Passing `nil` indicates that the event has +/// no parameters. Parameter names can be up to 40 characters long and must start with an +/// alphabetic character and contain only alphanumeric characters and underscores. Only String, +/// Int, and Double parameter types are supported. String parameter values can be up to 100 +/// characters long for standard Google Analytics properties, and up to 500 characters long for +/// Google Analytics 360 properties. The "firebase_", "google_", and "ga_" prefixes are reserved +/// and should not be used for parameter names. ++ (void)logEventWithName:(NSString *)name + parameters:(nullable NSDictionary *)parameters + NS_SWIFT_NAME(logEvent(_:parameters:)); + +/// Sets a user property to a given value. Up to 25 user property names are supported. Once set, +/// user property values persist throughout the app lifecycle and across sessions. +/// +/// The following user property names are reserved and cannot be used: +///
    +///
  • first_open_time
  • +///
  • last_deep_link_referrer
  • +///
  • user_id
  • +///
+/// +/// @param value The value of the user property. Values can be up to 36 characters long. Setting the +/// value to `nil` removes the user property. +/// @param name The name of the user property to set. Should contain 1 to 24 alphanumeric characters +/// or underscores and must start with an alphabetic character. The "firebase_", "google_", and +/// "ga_" prefixes are reserved and should not be used for user property names. ++ (void)setUserPropertyString:(nullable NSString *)value forName:(NSString *)name + NS_SWIFT_NAME(setUserProperty(_:forName:)); + +/// Sets the user ID property. This feature must be used in accordance with +/// Google's Privacy Policy +/// +/// @param userID The user ID to ascribe to the user of this app on this device, which must be +/// non-empty and no more than 256 characters long. Setting userID to `nil` removes the user ID. ++ (void)setUserID:(nullable NSString *)userID; + +/// Sets whether analytics collection is enabled for this app on this device. This setting is +/// persisted across app sessions. By default it is enabled. +/// +/// @param analyticsCollectionEnabled A flag that enables or disables Analytics collection. ++ (void)setAnalyticsCollectionEnabled:(BOOL)analyticsCollectionEnabled; + +/// Sets the interval of inactivity in seconds that terminates the current session. The default +/// value is 1800 seconds (30 minutes). +/// +/// @param sessionTimeoutInterval The custom time of inactivity in seconds before the current +/// session terminates. ++ (void)setSessionTimeoutInterval:(NSTimeInterval)sessionTimeoutInterval; + +/// Asynchronously retrieves the identifier of the current app session. +/// +/// The session ID retrieval could fail due to Analytics collection disabled, app session expired, +/// etc. +/// +/// @param completion The completion handler to call when the session ID retrieval is complete. This +/// handler is executed on a system-defined global concurrent queue. +/// This completion handler takes the following parameters: +/// sessionID The identifier of the current app session. The value is undefined if the +/// request failed. +/// error An error object that indicates why the request failed, or `nil` if the request +/// was successful. ++ (void)sessionIDWithCompletion:(void (^)(int64_t sessionID, NSError *_Nullable error))completion; + +/// Returns the unique ID for this instance of the application or `nil` if +/// `ConsentType.analyticsStorage` has been set to `ConsentStatus.denied`. +/// +/// @see `FIRAnalytics+Consent.h` ++ (nullable NSString *)appInstanceID; + +/// Clears all analytics data for this instance from the device and resets the app instance ID. ++ (void)resetAnalyticsData; + +/// Adds parameters that will be set on every event logged from the SDK, including automatic ones. +/// The values passed in the parameters dictionary will be added to the dictionary of default event +/// parameters. These parameters persist across app runs. They are of lower precedence than event +/// parameters, so if an event parameter and a parameter set using this API have the same name, the +/// value of the event parameter will be used. The same limitations on event parameters apply to +/// default event parameters. +/// +/// @param parameters Parameters to be added to the dictionary of parameters added to every event. +/// They will be added to the dictionary of default event parameters, replacing any existing +/// parameter with the same name. Valid parameters are String, Int, and Double. Setting a key's +/// value to `NSNull()` will clear that parameter. Passing in a `nil` dictionary will clear all +/// parameters. ++ (void)setDefaultEventParameters:(nullable NSDictionary *)parameters; + +/// Unavailable. +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIREventNames.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIREventNames.h new file mode 100644 index 0000000..701ed88 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIREventNames.h @@ -0,0 +1,438 @@ +/// @file FIREventNames.h +/// +/// Predefined event names. +/// +/// An Event is an important occurrence in your app that you want to measure. You can report up to +/// 500 different types of Events per app and you can associate up to 25 unique parameters with each +/// Event type. Some common events are suggested below, but you may also choose to specify custom +/// Event types that are associated with your specific app. Each event type is identified by a +/// unique name. Event names can be up to 40 characters long, may only contain alphanumeric +/// characters and underscores ("_"), and must start with an alphabetic character. The "firebase_", +/// "google_", and "ga_" prefixes are reserved and should not be used. + +#import + +/// Ad Impression event. This event signifies when a user sees an ad impression. Note: If you supply +/// the @c AnalyticsParameterValue parameter, you must also supply the @c AnalyticsParameterCurrency +/// parameter so that revenue metrics can be computed accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterAdPlatform (String) (optional)
  • +///
  • @c AnalyticsParameterAdFormat (String) (optional)
  • +///
  • @c AnalyticsParameterAdSource (String) (optional)
  • +///
  • @c AnalyticsParameterAdUnitName (String) (optional)
  • +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventAdImpression NS_SWIFT_NAME(AnalyticsEventAdImpression) = + @"ad_impression"; + +/// Add Payment Info event. This event signifies that a user has submitted their payment +/// information. Note: If you supply the @c AnalyticsParameterValue parameter, you must also supply +/// the @c AnalyticsParameterCurrency parameter so that revenue metrics can be computed accurately. +/// Params: +/// +///
    +///
  • @c AnalyticsParameterCoupon (String) (optional)
  • +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterPaymentType (String) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventAddPaymentInfo NS_SWIFT_NAME(AnalyticsEventAddPaymentInfo) = + @"add_payment_info"; + +/// Add Shipping Info event. This event signifies that a user has submitted their shipping +/// information. Note: If you supply the @c AnalyticsParameterValue parameter, you must also supply +/// the @c AnalyticsParameterCurrency parameter so that revenue metrics can be computed accurately. +/// Params: +/// +///
    +///
  • @c AnalyticsParameterCoupon (String) (optional)
  • +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterShippingTier (String) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventAddShippingInfo NS_SWIFT_NAME(AnalyticsEventAddShippingInfo) = + @"add_shipping_info"; + +/// E-Commerce Add To Cart event. This event signifies that an item(s) was added to a cart for +/// purchase. Add this event to a funnel with @c AnalyticsEventPurchase to gauge the effectiveness +/// of your checkout process. Note: If you supply the @c AnalyticsParameterValue parameter, you must +/// also supply the @c AnalyticsParameterCurrency parameter so that revenue metrics can be computed +/// accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventAddToCart NS_SWIFT_NAME(AnalyticsEventAddToCart) = @"add_to_cart"; + +/// E-Commerce Add To Wishlist event. This event signifies that an item was added to a wishlist. Use +/// this event to identify popular gift items. Note: If you supply the @c AnalyticsParameterValue +/// parameter, you must also supply the @c AnalyticsParameterCurrency parameter so that revenue +/// metrics can be computed accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventAddToWishlist NS_SWIFT_NAME(AnalyticsEventAddToWishlist) = + @"add_to_wishlist"; + +/// App Open event. By logging this event when an App becomes active, developers can understand how +/// often users leave and return during the course of a Session. Although Sessions are automatically +/// reported, this event can provide further clarification around the continuous engagement of +/// app-users. +static NSString *const kFIREventAppOpen NS_SWIFT_NAME(AnalyticsEventAppOpen) = @"app_open"; + +/// E-Commerce Begin Checkout event. This event signifies that a user has begun the process of +/// checking out. Add this event to a funnel with your @c AnalyticsEventPurchase event to gauge the +/// effectiveness of your checkout process. Note: If you supply the @c AnalyticsParameterValue +/// parameter, you must also supply the @c AnalyticsParameterCurrency parameter so that revenue +/// metrics can be computed accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterCoupon (String) (optional)
  • +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventBeginCheckout NS_SWIFT_NAME(AnalyticsEventBeginCheckout) = + @"begin_checkout"; + +/// Campaign Detail event. Log this event to supply the referral details of a re-engagement +/// campaign. Note: you must supply at least one of the required parameters +/// AnalyticsParameterSource, AnalyticsParameterMedium or AnalyticsParameterCampaign. Params: +/// +///
    +///
  • @c AnalyticsParameterSource (String)
  • +///
  • @c AnalyticsParameterMedium (String)
  • +///
  • @c AnalyticsParameterCampaign (String)
  • +///
  • @c AnalyticsParameterTerm (String) (optional)
  • +///
  • @c AnalyticsParameterContent (String) (optional)
  • +///
  • @c AnalyticsParameterAdNetworkClickID (String) (optional)
  • +///
  • @c AnalyticsParameterCP1 (String) (optional)
  • +///
  • @c AnalyticsParameterCampaignID (String) (optional)
  • +///
  • @c AnalyticsParameterCreativeFormat (String) (optional)
  • +///
  • @c AnalyticsParameterMarketingTactic (String) (optional)
  • +///
  • @c AnalyticsParameterSourcePlatform (String) (optional)
  • +///
+static NSString *const kFIREventCampaignDetails NS_SWIFT_NAME(AnalyticsEventCampaignDetails) = + @"campaign_details"; + +/// Earn Virtual Currency event. This event tracks the awarding of virtual currency in your app. Log +/// this along with @c AnalyticsEventSpendVirtualCurrency to better understand your virtual economy. +/// Params: +/// +///
    +///
  • @c AnalyticsParameterVirtualCurrencyName (String)
  • +///
  • @c AnalyticsParameterValue (Int or Double)
  • +///
+static NSString *const kFIREventEarnVirtualCurrency + NS_SWIFT_NAME(AnalyticsEventEarnVirtualCurrency) = @"earn_virtual_currency"; + +/// Generate Lead event. Log this event when a lead has been generated in the app to understand the +/// efficacy of your install and re-engagement campaigns. Note: If you supply the +/// @c AnalyticsParameterValue parameter, you must also supply the @c AnalyticsParameterCurrency +/// parameter so that revenue metrics can be computed accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventGenerateLead NS_SWIFT_NAME(AnalyticsEventGenerateLead) = + @"generate_lead"; + +/// In-App Purchase event. This event signifies that extra content or a subscription was purchased +/// by a user inside an app. Note: This is different from the ecommerce purchase event. Note: If you +/// supply the @c AnalyticsParameterValue parameter, you must also supply the +/// @c AnalyticsParameterCurrency parameter so that revenue metrics can be computed accurately. +/// Params: +/// +///
    +///
  • @c AnalyticsParameterCurrency (String)
  • +///
  • @c AnalyticsParameterFreeTrial (Int) (optional)
  • +///
  • @c AnalyticsParameterPrice (Double) (optional)
  • +///
  • @c AnalyticsParameterPriceIsDiscounted (Int) (optional)
  • +///
  • @c AnalyticsParameterProductID (String) (optional)
  • +///
  • @c AnalyticsParameterProductName (String) (optional)
  • +///
  • @c AnalyticsParameterQuantity (Int) (optional)
  • +///
  • @c AnalyticsParameterSubscription (Int) (optional)
  • +///
  • @c AnalyticsParameterValue (Double)
  • +///
+static NSString *const kFIREventInAppPurchase NS_SWIFT_NAME(AnalyticsEventInAppPurchase) = + @"in_app_purchase"; + +/// Join Group event. Log this event when a user joins a group such as a guild, team or family. Use +/// this event to analyze how popular certain groups or social features are in your app. Params: +/// +///
    +///
  • @c AnalyticsParameterGroupID (String)
  • +///
+static NSString *const kFIREventJoinGroup NS_SWIFT_NAME(AnalyticsEventJoinGroup) = @"join_group"; + +/// Level End event. Log this event when the user finishes a level. Params: +/// +///
    +///
  • @c AnalyticsParameterLevelName (String)
  • +///
  • @c AnalyticsParameterSuccess (String)
  • +///
+static NSString *const kFIREventLevelEnd NS_SWIFT_NAME(AnalyticsEventLevelEnd) = @"level_end"; + +/// Level Start event. Log this event when the user starts a new level. Params: +/// +///
    +///
  • @c AnalyticsParameterLevelName (String)
  • +///
+static NSString *const kFIREventLevelStart NS_SWIFT_NAME(AnalyticsEventLevelStart) = @"level_start"; + +/// Level Up event. This event signifies that a player has leveled up in your gaming app. It can +/// help you gauge the level distribution of your userbase and help you identify certain levels that +/// are difficult to pass. Params: +/// +///
    +///
  • @c AnalyticsParameterLevel (Int)
  • +///
  • @c AnalyticsParameterCharacter (String) (optional)
  • +///
+static NSString *const kFIREventLevelUp NS_SWIFT_NAME(AnalyticsEventLevelUp) = @"level_up"; + +/// Login event. Apps with a login feature can report this event to signify that a user has logged +/// in. +static NSString *const kFIREventLogin NS_SWIFT_NAME(AnalyticsEventLogin) = @"login"; + +/// Post Score event. Log this event when the user posts a score in your gaming app. This event can +/// help you understand how users are actually performing in your game and it can help you correlate +/// high scores with certain audiences or behaviors. Params: +/// +///
    +///
  • @c AnalyticsParameterScore (Int)
  • +///
  • @c AnalyticsParameterLevel (Int) (optional)
  • +///
  • @c AnalyticsParameterCharacter (String) (optional)
  • +///
+static NSString *const kFIREventPostScore NS_SWIFT_NAME(AnalyticsEventPostScore) = @"post_score"; + +/// E-Commerce Purchase event. This event signifies that an item(s) was purchased by a user. Note: +/// This is different from the in-app purchase event, which is reported automatically for App +/// Store-based apps. Note: If you supply the @c AnalyticsParameterValue parameter, you must also +/// supply the @c AnalyticsParameterCurrency parameter so that revenue metrics can be computed +/// accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterAffiliation (String) (optional)
  • +///
  • @c AnalyticsParameterCoupon (String) (optional)
  • +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterEndDate (String) (optional)
  • +///
  • @c AnalyticsParameterItemID (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterShipping (Double) (optional)
  • +///
  • @c AnalyticsParameterStartDate (String) (optional)
  • +///
  • @c AnalyticsParameterTax (Double) (optional)
  • +///
  • @c AnalyticsParameterTransactionID (String) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventPurchase NS_SWIFT_NAME(AnalyticsEventPurchase) = @"purchase"; + +/// E-Commerce Refund event. This event signifies that a refund was issued. Note: If you supply the +/// @c AnalyticsParameterValue parameter, you must also supply the @c AnalyticsParameterCurrency +/// parameter so that revenue metrics can be computed accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterAffiliation (String) (optional)
  • +///
  • @c AnalyticsParameterCoupon (String) (optional)
  • +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterShipping (Double) (optional)
  • +///
  • @c AnalyticsParameterTax (Double) (optional)
  • +///
  • @c AnalyticsParameterTransactionID (String) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventRefund NS_SWIFT_NAME(AnalyticsEventRefund) = @"refund"; + +/// E-Commerce Remove from Cart event. This event signifies that an item(s) was removed from a cart. +/// Note: If you supply the @c AnalyticsParameterValue parameter, you must also supply the @c +/// AnalyticsParameterCurrency parameter so that revenue metrics can be computed accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventRemoveFromCart NS_SWIFT_NAME(AnalyticsEventRemoveFromCart) = + @"remove_from_cart"; + +/// Screen View event. This event signifies a screen view. Use this when a screen transition occurs. +/// This event can be logged irrespective of whether automatic screen tracking is enabled. Params: +/// +///
    +///
  • @c AnalyticsParameterScreenClass (String) (optional)
  • +///
  • @c AnalyticsParameterScreenName (String) (optional)
  • +///
+static NSString *const kFIREventScreenView NS_SWIFT_NAME(AnalyticsEventScreenView) = @"screen_view"; + +/// Search event. Apps that support search features can use this event to contextualize search +/// operations by supplying the appropriate, corresponding parameters. This event can help you +/// identify the most popular content in your app. Params: +/// +///
    +///
  • @c AnalyticsParameterSearchTerm (String)
  • +///
  • @c AnalyticsParameterStartDate (String) (optional)
  • +///
  • @c AnalyticsParameterEndDate (String) (optional)
  • +///
  • @c AnalyticsParameterNumberOfNights (Int) (optional) for hotel bookings
  • +///
  • @c AnalyticsParameterNumberOfRooms (Int) (optional) for hotel bookings
  • +///
  • @c AnalyticsParameterNumberOfPassengers (Int) (optional) for travel bookings
  • +///
  • @c AnalyticsParameterOrigin (String) (optional)
  • +///
  • @c AnalyticsParameterDestination (String) (optional)
  • +///
  • @c AnalyticsParameterTravelClass (String) (optional) for travel bookings
  • +///
+static NSString *const kFIREventSearch NS_SWIFT_NAME(AnalyticsEventSearch) = @"search"; + +/// Select Content event. This general purpose event signifies that a user has selected some content +/// of a certain type in an app. The content can be any object in your app. This event can help you +/// identify popular content and categories of content in your app. Params: +/// +///
    +///
  • @c AnalyticsParameterContentType (String)
  • +///
  • @c AnalyticsParameterItemID (String)
  • +///
+static NSString *const kFIREventSelectContent NS_SWIFT_NAME(AnalyticsEventSelectContent) = + @"select_content"; + +/// Select Item event. This event signifies that an item was selected by a user from a list. Use the +/// appropriate parameters to contextualize the event. Use this event to discover the most popular +/// items selected. Params: +/// +///
    +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterItemListID (String) (optional)
  • +///
  • @c AnalyticsParameterItemListName (String) (optional)
  • +///
+static NSString *const kFIREventSelectItem NS_SWIFT_NAME(AnalyticsEventSelectItem) = @"select_item"; + +/// Select promotion event. This event signifies that a user has selected a promotion offer. Use the +/// appropriate parameters to contextualize the event, such as the item(s) for which the promotion +/// applies. Params: +/// +///
    +///
  • @c AnalyticsParameterCreativeName (String) (optional)
  • +///
  • @c AnalyticsParameterCreativeSlot (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterLocationID (String) (optional)
  • +///
  • @c AnalyticsParameterPromotionID (String) (optional)
  • +///
  • @c AnalyticsParameterPromotionName (String) (optional)
  • +///
+static NSString *const kFIREventSelectPromotion NS_SWIFT_NAME(AnalyticsEventSelectPromotion) = + @"select_promotion"; + +/// Share event. Apps with social features can log the Share event to identify the most viral +/// content. Params: +/// +///
    +///
  • @c AnalyticsParameterContentType (String)
  • +///
  • @c AnalyticsParameterItemID (String)
  • +///
+static NSString *const kFIREventShare NS_SWIFT_NAME(AnalyticsEventShare) = @"share"; + +/// Sign Up event. This event indicates that a user has signed up for an account in your app. The +/// parameter signifies the method by which the user signed up. Use this event to understand the +/// different behaviors between logged in and logged out users. Params: +/// +///
    +///
  • @c AnalyticsParameterMethod (String)
  • +///
+static NSString *const kFIREventSignUp NS_SWIFT_NAME(AnalyticsEventSignUp) = @"sign_up"; + +/// Spend Virtual Currency event. This event tracks the sale of virtual goods in your app and can +/// help you identify which virtual goods are the most popular objects of purchase. Params: +/// +///
    +///
  • @c AnalyticsParameterItemName (String)
  • +///
  • @c AnalyticsParameterVirtualCurrencyName (String)
  • +///
  • @c AnalyticsParameterValue (Int or Double)
  • +///
+static NSString *const kFIREventSpendVirtualCurrency + NS_SWIFT_NAME(AnalyticsEventSpendVirtualCurrency) = @"spend_virtual_currency"; + +/// Tutorial Begin event. This event signifies the start of the on-boarding process in your app. Use +/// this in a funnel with @c AnalyticsEventTutorialComplete to understand how many users complete +/// this process and move on to the full app experience. +static NSString *const kFIREventTutorialBegin NS_SWIFT_NAME(AnalyticsEventTutorialBegin) = + @"tutorial_begin"; + +/// Tutorial End event. Use this event to signify the user's completion of your app's on-boarding +/// process. Add this to a funnel with @c AnalyticsEventTutorialBegin to gauge the completion rate +/// of your on-boarding process. +static NSString *const kFIREventTutorialComplete NS_SWIFT_NAME(AnalyticsEventTutorialComplete) = + @"tutorial_complete"; + +/// Unlock Achievement event. Log this event when the user has unlocked an achievement in your +/// game. Since achievements generally represent the breadth of a gaming experience, this event can +/// help you understand how many users are experiencing all that your game has to offer. Params: +/// +///
    +///
  • @c AnalyticsParameterAchievementID (String)
  • +///
+static NSString *const kFIREventUnlockAchievement NS_SWIFT_NAME(AnalyticsEventUnlockAchievement) = + @"unlock_achievement"; + +/// E-commerce View Cart event. This event signifies that a user has viewed their cart. Use this to +/// analyze your purchase funnel. Note: If you supply the @c AnalyticsParameterValue parameter, you +/// must also supply the @c AnalyticsParameterCurrency parameter so that revenue metrics can be +/// computed accurately. Params: +/// +///
    +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventViewCart NS_SWIFT_NAME(AnalyticsEventViewCart) = @"view_cart"; + +/// View Item event. This event signifies that a user has viewed an item. Use the appropriate +/// parameters to contextualize the event. Use this event to discover the most popular items viewed +/// in your app. Note: If you supply the @c AnalyticsParameterValue parameter, you must also supply +/// the @c AnalyticsParameterCurrency parameter so that revenue metrics can be computed accurately. +/// Params: +/// +///
    +///
  • @c AnalyticsParameterCurrency (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterValue (Double) (optional)
  • +///
+static NSString *const kFIREventViewItem NS_SWIFT_NAME(AnalyticsEventViewItem) = @"view_item"; + +/// View Item List event. Log this event when a user sees a list of items or offerings. Params: +/// +///
    +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterItemListID (String) (optional)
  • +///
  • @c AnalyticsParameterItemListName (String) (optional)
  • +///
+static NSString *const kFIREventViewItemList NS_SWIFT_NAME(AnalyticsEventViewItemList) = + @"view_item_list"; + +/// View Promotion event. This event signifies that a promotion was shown to a user. Add this event +/// to a funnel with the @c AnalyticsEventAddToCart and @c AnalyticsEventPurchase to gauge your +/// conversion process. Params: +/// +///
    +///
  • @c AnalyticsParameterCreativeName (String) (optional)
  • +///
  • @c AnalyticsParameterCreativeSlot (String) (optional)
  • +///
  • @c AnalyticsParameterItems ([[String: Any]]) (optional)
  • +///
  • @c AnalyticsParameterLocationID (String) (optional)
  • +///
  • @c AnalyticsParameterPromotionID (String) (optional)
  • +///
  • @c AnalyticsParameterPromotionName (String) (optional)
  • +///
+static NSString *const kFIREventViewPromotion NS_SWIFT_NAME(AnalyticsEventViewPromotion) = + @"view_promotion"; + +/// View Search Results event. Log this event when the user has been presented with the results of a +/// search. Params: +/// +///
    +///
  • @c AnalyticsParameterSearchTerm (String)
  • +///
+static NSString *const kFIREventViewSearchResults NS_SWIFT_NAME(AnalyticsEventViewSearchResults) = + @"view_search_results"; diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRParameterNames.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRParameterNames.h new file mode 100644 index 0000000..f0e782a --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRParameterNames.h @@ -0,0 +1,775 @@ +/// @file FIRParameterNames.h +/// +/// Predefined event parameter names. +/// +/// Params supply information that contextualize Events. You can associate up to 25 unique Params +/// with each Event type. Some Params are suggested below for certain common Events, but you are +/// not limited to these. You may supply extra Params for suggested Events or custom Params for +/// Custom events. Param names can be up to 40 characters long, may only contain alphanumeric +/// characters and underscores ("_"), and must start with an alphabetic character. Param values can +/// be up to 100 characters long for standard Google Analytics properties and up to 500 characters +/// long for Google Analytics 360 properties. The "firebase_", "google_", and "ga_" prefixes are +/// reserved and should not be used. + +#import + +/// Game achievement ID (String). +///
+///     let params = [
+///       AnalyticsParameterAchievementID : "10_matches_won",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterAchievementID NS_SWIFT_NAME(AnalyticsParameterAchievementID) = + @"achievement_id"; + +/// The ad format (e.g. Banner, Interstitial, Rewarded, Native, Rewarded Interstitial, Instream). +/// (String). +///
+///     let params = [
+///       AnalyticsParameterAdFormat : "Banner",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterAdFormat NS_SWIFT_NAME(AnalyticsParameterAdFormat) = + @"ad_format"; + +/// Ad Network Click ID (String). Used for network-specific click IDs which vary in format. +///
+///     let params = [
+///       AnalyticsParameterAdNetworkClickID : "1234567",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterAdNetworkClickID + NS_SWIFT_NAME(AnalyticsParameterAdNetworkClickID) = @"aclid"; + +/// The ad platform (e.g. MoPub, IronSource) (String). +///
+///     let params = [
+///       AnalyticsParameterAdPlatform : "MoPub",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterAdPlatform NS_SWIFT_NAME(AnalyticsParameterAdPlatform) = + @"ad_platform"; + +/// The ad source (e.g. AdColony) (String). +///
+///     let params = [
+///       AnalyticsParameterAdSource : "AdColony",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterAdSource NS_SWIFT_NAME(AnalyticsParameterAdSource) = + @"ad_source"; + +/// The ad unit name (e.g. Banner_03) (String). +///
+///     let params = [
+///       AnalyticsParameterAdUnitName : "Banner_03",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterAdUnitName NS_SWIFT_NAME(AnalyticsParameterAdUnitName) = + @"ad_unit_name"; + +/// A product affiliation to designate a supplying company or brick and mortar store location +/// (String).
+///     let params = [
+///       AnalyticsParameterAffiliation : "Google Store",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterAffiliation NS_SWIFT_NAME(AnalyticsParameterAffiliation) = + @"affiliation"; + +/// Campaign custom parameter (String). Used as a method of capturing custom data in a campaign. +/// Use varies by network. +///
+///     let params = [
+///       AnalyticsParameterCP1 : "custom_data",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCP1 NS_SWIFT_NAME(AnalyticsParameterCP1) = @"cp1"; + +/// The individual campaign name, slogan, promo code, etc. Some networks have pre-defined macro to +/// capture campaign information, otherwise can be populated by developer. Highly Recommended +/// (String). +///
+///     let params = [
+///       AnalyticsParameterCampaign : "winter_promotion",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCampaign NS_SWIFT_NAME(AnalyticsParameterCampaign) = + @"campaign"; + +/// Campaign ID (String). Used for keyword analysis to identify a specific product promotion or +/// strategic campaign. This is a required key for GA4 data import. +///
+///     let params = [
+///       AnalyticsParameterCampaignID : "7877652710",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCampaignID NS_SWIFT_NAME(AnalyticsParameterCampaignID) = + @"campaign_id"; + +/// Character used in game (String). +///
+///     let params = [
+///       AnalyticsParameterCharacter : "beat_boss",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCharacter NS_SWIFT_NAME(AnalyticsParameterCharacter) = + @"character"; + +/// Campaign content (String). +static NSString *const kFIRParameterContent NS_SWIFT_NAME(AnalyticsParameterContent) = @"content"; + +/// Type of content selected (String). +///
+///     let params = [
+///       AnalyticsParameterContentType : "news article",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterContentType NS_SWIFT_NAME(AnalyticsParameterContentType) = + @"content_type"; + +/// Coupon code used for a purchase (String). +///
+///     let params = [
+///       AnalyticsParameterCoupon : "SUMMER_FUN",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCoupon NS_SWIFT_NAME(AnalyticsParameterCoupon) = @"coupon"; + +/// Creative Format (String). Used to identify the high-level classification of the type of ad +/// served by a specific campaign. +///
+///     let params = [
+///       AnalyticsParameterCreativeFormat : "display",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCreativeFormat NS_SWIFT_NAME(AnalyticsParameterCreativeFormat) = + @"creative_format"; + +/// The name of a creative used in a promotional spot (String). +///
+///     let params = [
+///       AnalyticsParameterCreativeName : "Summer Sale",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCreativeName NS_SWIFT_NAME(AnalyticsParameterCreativeName) = + @"creative_name"; + +/// The name of a creative slot (String). +///
+///     let params = [
+///       AnalyticsParameterCreativeSlot : "summer_banner2",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCreativeSlot NS_SWIFT_NAME(AnalyticsParameterCreativeSlot) = + @"creative_slot"; + +/// Currency of the purchase or items associated with the event, in 3-letter +/// ISO_4217 format (String). +///
+///     let params = [
+///       AnalyticsParameterCurrency : "USD",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterCurrency NS_SWIFT_NAME(AnalyticsParameterCurrency) = + @"currency"; + +/// Flight or Travel destination (String). +///
+///     let params = [
+///       AnalyticsParameterDestination : "Mountain View, CA",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterDestination NS_SWIFT_NAME(AnalyticsParameterDestination) = + @"destination"; + +/// Monetary value of discount associated with a purchase (Double). +///
+///     let params = [
+///       AnalyticsParameterDiscount : 2.0,
+///       AnalyticsParameterCurrency : "USD",  // e.g. $2.00 USD
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterDiscount NS_SWIFT_NAME(AnalyticsParameterDiscount) = + @"discount"; + +/// The arrival date, check-out date or rental end date for the item. This should be in +/// YYYY-MM-DD format (String). +///
+///     let params = [
+///       AnalyticsParameterEndDate : "2015-09-14",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterEndDate NS_SWIFT_NAME(AnalyticsParameterEndDate) = @"end_date"; + +/// Indicates that the associated event should either extend the current session or start a new +/// session if no session was active when the event was logged. Specify 1 to extend the current +/// session or to start a new session; any other value will not extend or start a session. +///
+///     let params = [
+///       AnalyticsParameterExtendSession : 1,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterExtendSession NS_SWIFT_NAME(AnalyticsParameterExtendSession) = + @"extend_session"; + +/// Flight number for travel events (String). +///
+///     let params = [
+///       AnalyticsParameterFlightNumber : "ZZ800",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterFlightNumber NS_SWIFT_NAME(AnalyticsParameterFlightNumber) = + @"flight_number"; + +/// Indicates if the user is on a free trial of a subscription. Specify 1 to indicate true and 0 to +/// indicate false (Int). +///
+///     let params = [
+///       AnalyticsParameterFreeTrial : 1,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterFreeTrial NS_SWIFT_NAME(AnalyticsParameterFreeTrial) = + @"free_trial"; + +/// Group/clan/guild ID (String). +///
+///     let params = [
+///       AnalyticsParameterGroupID : "g1",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterGroupID NS_SWIFT_NAME(AnalyticsParameterGroupID) = @"group_id"; + +/// The index of the item in a list (Int). +///
+///     let params = [
+///       AnalyticsParameterIndex : 5,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterIndex NS_SWIFT_NAME(AnalyticsParameterIndex) = @"index"; + +/// Item brand (String). +///
+///     let params = [
+///       AnalyticsParameterItemBrand : "Google",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemBrand NS_SWIFT_NAME(AnalyticsParameterItemBrand) = + @"item_brand"; + +/// Item category (context-specific) (String). +///
+///     let params = [
+///       AnalyticsParameterItemCategory : "pants",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemCategory NS_SWIFT_NAME(AnalyticsParameterItemCategory) = + @"item_category"; + +/// Item Category (context-specific) (String). +///
+///     let params = [
+///       AnalyticsParameterItemCategory2 : "pants",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemCategory2 NS_SWIFT_NAME(AnalyticsParameterItemCategory2) = + @"item_category2"; + +/// Item Category (context-specific) (String). +///
+///     let params = [
+///       AnalyticsParameterItemCategory3 : "pants",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemCategory3 NS_SWIFT_NAME(AnalyticsParameterItemCategory3) = + @"item_category3"; + +/// Item Category (context-specific) (String). +///
+///     let params = [
+///       AnalyticsParameterItemCategory4 : "pants",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemCategory4 NS_SWIFT_NAME(AnalyticsParameterItemCategory4) = + @"item_category4"; + +/// Item Category (context-specific) (String). +///
+///     let params = [
+///       AnalyticsParameterItemCategory5 : "pants",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemCategory5 NS_SWIFT_NAME(AnalyticsParameterItemCategory5) = + @"item_category5"; + +/// Item ID (context-specific) (String). +///
+///     let params = [
+///       AnalyticsParameterItemID : "SKU_12345",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemID NS_SWIFT_NAME(AnalyticsParameterItemID) = @"item_id"; + +/// The ID of the list in which the item was presented to the user (String). +///
+///     let params = [
+///       AnalyticsParameterItemListID : "ABC123",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemListID NS_SWIFT_NAME(AnalyticsParameterItemListID) = + @"item_list_id"; + +/// The name of the list in which the item was presented to the user (String). +///
+///     let params = [
+///       AnalyticsParameterItemListName : "Related products",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemListName NS_SWIFT_NAME(AnalyticsParameterItemListName) = + @"item_list_name"; + +/// Item Name (context-specific) (String). +///
+///     let params = [
+///       AnalyticsParameterItemName : "jeggings",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemName NS_SWIFT_NAME(AnalyticsParameterItemName) = + @"item_name"; + +/// Item variant (String). +///
+///     let params = [
+///       AnalyticsParameterItemVariant : "Black",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterItemVariant NS_SWIFT_NAME(AnalyticsParameterItemVariant) = + @"item_variant"; + +/// The list of items involved in the transaction expressed as `[[String: Any]]`. +///
+///     let params = [
+///       AnalyticsParameterItems : [
+///         [AnalyticsParameterItemName : "jeggings", AnalyticsParameterItemCategory : "pants"],
+///         [AnalyticsParameterItemName : "boots", AnalyticsParameterItemCategory : "shoes"],
+///       ],
+///     ]
+/// 
+static NSString *const kFIRParameterItems NS_SWIFT_NAME(AnalyticsParameterItems) = @"items"; + +/// Level in game (Int). +///
+///     let params = [
+///       AnalyticsParameterLevel : 42,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterLevel NS_SWIFT_NAME(AnalyticsParameterLevel) = @"level"; + +/// The name of a level in a game (String). +///
+///     let params = [
+///       AnalyticsParameterLevelName : "room_1",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterLevelName NS_SWIFT_NAME(AnalyticsParameterLevelName) = + @"level_name"; + +/// Location (String). The Google Place ID +/// that corresponds to the associated event. Alternatively, you can supply your own custom +/// Location ID. +///
+///     let params = [
+///       AnalyticsParameterLocation : "ChIJiyj437sx3YAR9kUWC8QkLzQ",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterLocation NS_SWIFT_NAME(AnalyticsParameterLocation) = + @"location"; + +/// The location associated with the event. Preferred to be the Google +/// Place ID that corresponds to the +/// associated item but could be overridden to a custom location ID string.(String). +///
+///     let params = [
+///       AnalyticsParameterLocationID : "ChIJiyj437sx3YAR9kUWC8QkLzQ",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterLocationID NS_SWIFT_NAME(AnalyticsParameterLocationID) = + @"location_id"; + +/// Marketing Tactic (String). Used to identify the targeting criteria applied to a specific +/// campaign. +///
+///     let params = [
+///       AnalyticsParameterMarketingTactic : "Remarketing",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterMarketingTactic + NS_SWIFT_NAME(AnalyticsParameterMarketingTactic) = @"marketing_tactic"; + +/// The advertising or marketing medium, for example: cpc, banner, email, push. Highly recommended +/// (String). +///
+///     let params = [
+///       AnalyticsParameterMedium : "email",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterMedium NS_SWIFT_NAME(AnalyticsParameterMedium) = @"medium"; + +/// A particular approach used in an operation; for example, "facebook" or "email" in the context +/// of a sign_up or login event. (String). +///
+///     let params = [
+///       AnalyticsParameterMethod : "google",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterMethod NS_SWIFT_NAME(AnalyticsParameterMethod) = @"method"; + +/// Number of nights staying at hotel (Int). +///
+///     let params = [
+///       AnalyticsParameterNumberOfNights : 3,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterNumberOfNights + NS_SWIFT_NAME(AnalyticsParameterNumberOfNights) = @"number_of_nights"; + +/// Number of passengers traveling (Int). +///
+///     let params = [
+///       AnalyticsParameterNumberOfPassengers : 11,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterNumberOfPassengers + NS_SWIFT_NAME(AnalyticsParameterNumberOfPassengers) = @"number_of_passengers"; + +/// Number of rooms for travel events (Int). +///
+///     let params = [
+///       AnalyticsParameterNumberOfRooms : 2,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterNumberOfRooms NS_SWIFT_NAME(AnalyticsParameterNumberOfRooms) = + @"number_of_rooms"; + +/// Flight or Travel origin (String). +///
+///     let params = [
+///       AnalyticsParameterOrigin : "Mountain View, CA",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterOrigin NS_SWIFT_NAME(AnalyticsParameterOrigin) = @"origin"; + +/// The chosen method of payment (String). +///
+///     let params = [
+///       AnalyticsParameterPaymentType : "Visa",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterPaymentType NS_SWIFT_NAME(AnalyticsParameterPaymentType) = + @"payment_type"; + +/// Purchase price (Double). +///
+///     let params = [
+///       AnalyticsParameterPrice : 1.0,
+///       AnalyticsParameterCurrency : "USD",  // e.g. $1.00 USD
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterPrice NS_SWIFT_NAME(AnalyticsParameterPrice) = @"price"; + +/// Indicates if an item's price is discounted. Specify 1 to indicate true and 0 to indicate false +/// (Int). +///
+///     let params = [
+///       AnalyticsParameterPriceIsDiscounted : 1,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterPriceIsDiscounted + NS_SWIFT_NAME(AnalyticsParameterPriceIsDiscounted) = @"price_is_discounted"; + +/// The ID of a product (String). +///
+///     let params = [
+///       AnalyticsParameterProductID : "PROD_12345",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterProductID NS_SWIFT_NAME(AnalyticsParameterProductID) = + @"product_id"; + +/// The name of a product (String). +///
+///     let params = [
+///       AnalyticsParameterProductName : "My Awesome Product",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterProductName NS_SWIFT_NAME(AnalyticsParameterProductName) = + @"product_name"; + +/// The ID of a product promotion (String). +///
+///     let params = [
+///       AnalyticsParameterPromotionID : "ABC123",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterPromotionID NS_SWIFT_NAME(AnalyticsParameterPromotionID) = + @"promotion_id"; + +/// The name of a product promotion (String). +///
+///     let params = [
+///       AnalyticsParameterPromotionName : "Summer Sale",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterPromotionName NS_SWIFT_NAME(AnalyticsParameterPromotionName) = + @"promotion_name"; + +/// Purchase quantity (Int). +///
+///     let params = [
+///       AnalyticsParameterQuantity : 1,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterQuantity NS_SWIFT_NAME(AnalyticsParameterQuantity) = + @"quantity"; + +/// Score in game (Int). +///
+///     let params = [
+///       AnalyticsParameterScore : 4200,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterScore NS_SWIFT_NAME(AnalyticsParameterScore) = @"score"; + +/// Current screen class, such as the class name of the UIViewController, logged with screen_view +/// event and added to every event (String). +///
+///     let params = [
+///       AnalyticsParameterScreenClass : "LoginViewController",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterScreenClass NS_SWIFT_NAME(AnalyticsParameterScreenClass) = + @"screen_class"; + +/// Current screen name, such as the name of the UIViewController, logged with screen_view event and +/// added to every event (String). +///
+///     let params = [
+///       AnalyticsParameterScreenName : "LoginView",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterScreenName NS_SWIFT_NAME(AnalyticsParameterScreenName) = + @"screen_name"; + +/// The search string/keywords used (String). +///
+///     let params = [
+///       AnalyticsParameterSearchTerm : "periodic table",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterSearchTerm NS_SWIFT_NAME(AnalyticsParameterSearchTerm) = + @"search_term"; + +/// Shipping cost associated with a transaction (Double). +///
+///     let params = [
+///       AnalyticsParameterShipping : 5.99,
+///       AnalyticsParameterCurrency : "USD",  // e.g. $5.99 USD
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterShipping NS_SWIFT_NAME(AnalyticsParameterShipping) = + @"shipping"; + +/// The shipping tier (e.g. Ground, Air, Next-day) selected for delivery of the purchased item +/// (String). +///
+///     let params = [
+///       AnalyticsParameterShippingTier : "Ground",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterShippingTier NS_SWIFT_NAME(AnalyticsParameterShippingTier) = + @"shipping_tier"; + +/// The origin of your traffic, such as an Ad network (for example, google) or partner (urban +/// airship). Identify the advertiser, site, publication, etc. that is sending traffic to your +/// property. Highly recommended (String). +///
+///     let params = [
+///       AnalyticsParameterSource : "InMobi",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterSource NS_SWIFT_NAME(AnalyticsParameterSource) = @"source"; + +/// Source Platform (String). Used to identify the platform responsible for directing traffic to a +/// given Analytics property (e.g., a buying platform where budgets, targeting criteria, etc. are +/// set, a platform for managing organic traffic data, etc.). +///
+///     let params = [
+///       AnalyticsParameterSourcePlatform : "sa360",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterSourcePlatform NS_SWIFT_NAME(AnalyticsParameterSourcePlatform) = + @"source_platform"; + +/// The departure date, check-in date or rental start date for the item. This should be in +/// YYYY-MM-DD format (String). +///
+///     let params = [
+///       AnalyticsParameterStartDate : "2015-09-14",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterStartDate NS_SWIFT_NAME(AnalyticsParameterStartDate) = + @"start_date"; + +/// Indicates if the purchase is a subscription. Specify 1 to indicate true and 0 to indicate false +/// (Int). +///
+///     let params = [
+///       AnalyticsParameterSubscription : 1,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterSubscription NS_SWIFT_NAME(AnalyticsParameterSubscription) = + @"subscription"; + +/// The result of an operation. Specify 1 to indicate success and 0 to indicate failure (Int). +///
+///     let params = [
+///       AnalyticsParameterSuccess : 1,
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterSuccess NS_SWIFT_NAME(AnalyticsParameterSuccess) = @"success"; + +/// Tax cost associated with a transaction (Double). +///
+///     let params = [
+///       AnalyticsParameterTax : 2.43,
+///       AnalyticsParameterCurrency : "USD",  // e.g. $2.43 USD
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterTax NS_SWIFT_NAME(AnalyticsParameterTax) = @"tax"; + +/// If you're manually tagging keyword campaigns, you should use utm_term to specify the keyword +/// (String). +///
+///     let params = [
+///       AnalyticsParameterTerm : "game",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterTerm NS_SWIFT_NAME(AnalyticsParameterTerm) = @"term"; + +/// The unique identifier of a transaction (String). +///
+///     let params = [
+///       AnalyticsParameterTransactionID : "T12345",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterTransactionID NS_SWIFT_NAME(AnalyticsParameterTransactionID) = + @"transaction_id"; + +/// Travel class (String). +///
+///     let params = [
+///       AnalyticsParameterTravelClass : "business",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterTravelClass NS_SWIFT_NAME(AnalyticsParameterTravelClass) = + @"travel_class"; + +/// A context-specific numeric value which is accumulated automatically for each event type. This is +/// a general purpose parameter that is useful for accumulating a key metric that pertains to an +/// event. Examples include revenue, distance, time and points. Value should be specified as Int or +/// Double. +/// Notes: Values for pre-defined currency-related events (such as @c AnalyticsEventAddToCart) +/// should be supplied using Double and must be accompanied by a @c AnalyticsParameterCurrency +/// parameter. The valid range of accumulated values is +/// [-9,223,372,036,854.77, 9,223,372,036,854.77]. Supplying a non-numeric value, omitting the +/// corresponding @c AnalyticsParameterCurrency parameter, or supplying an invalid +/// currency code for conversion events will cause that +/// conversion to be omitted from reporting. +///
+///     let params = [
+///       AnalyticsParameterValue : 3.99,
+///       AnalyticsParameterCurrency : "USD",  // e.g. $3.99 USD
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterValue NS_SWIFT_NAME(AnalyticsParameterValue) = @"value"; + +/// Name of virtual currency type (String). +///
+///     let params = [
+///       AnalyticsParameterVirtualCurrencyName : "virtual_currency_name",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRParameterVirtualCurrencyName + NS_SWIFT_NAME(AnalyticsParameterVirtualCurrencyName) = @"virtual_currency_name"; diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRUserPropertyNames.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRUserPropertyNames.h new file mode 100644 index 0000000..2442d8a --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRUserPropertyNames.h @@ -0,0 +1,28 @@ +/// @file FIRUserPropertyNames.h +/// +/// Predefined user property names. +/// +/// A UserProperty is an attribute that describes the app-user. By supplying UserProperties, you can +/// later analyze different behaviors of various segments of your userbase. You may supply up to 25 +/// unique UserProperties per app, and you can use the name and value of your choosing for each one. +/// UserProperty names can be up to 24 characters long, may only contain alphanumeric characters and +/// underscores ("_"), and must start with an alphabetic character. UserProperty values can be up to +/// 36 characters long. The "firebase_", "google_", and "ga_" prefixes are reserved and should not +/// be used. + +#import + +/// Indicates whether events logged by Google Analytics can be used to personalize ads for the user. +/// Set to "YES" to enable, or "NO" to disable. Default is enabled. See the +/// documentation for +/// more details and information about related settings. +/// +///
+///     Analytics.setUserProperty("NO", forName: AnalyticsUserPropertyAllowAdPersonalizationSignals)
+/// 
+static NSString *const kFIRUserPropertyAllowAdPersonalizationSignals + NS_SWIFT_NAME(AnalyticsUserPropertyAllowAdPersonalizationSignals) = @"allow_personalized_ads"; + +/// The method used to sign in. For example, "google", "facebook" or "twitter". +static NSString *const kFIRUserPropertySignUpMethod + NS_SWIFT_NAME(AnalyticsUserPropertySignUpMethod) = @"sign_up_method"; diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FirebaseAnalytics-Swift.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FirebaseAnalytics-Swift.h new file mode 100644 index 0000000..b409e3a --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FirebaseAnalytics-Swift.h @@ -0,0 +1,628 @@ +#if 0 +#elif defined(__arm64__) && __arm64__ +// Generated by Apple Swift version 6.0.3 effective-5.10 (swiftlang-6.0.3.1.10 clang-1600.0.30.1) +#ifndef FIREBASEANALYTICS_SWIFT_H +#define FIREBASEANALYTICS_SWIFT_H +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgcc-compat" + +#if !defined(__has_include) +# define __has_include(x) 0 +#endif +#if !defined(__has_attribute) +# define __has_attribute(x) 0 +#endif +#if !defined(__has_feature) +# define __has_feature(x) 0 +#endif +#if !defined(__has_warning) +# define __has_warning(x) 0 +#endif + +#if __has_include() +# include +#endif + +#pragma clang diagnostic ignored "-Wauto-import" +#if defined(__OBJC__) +#include +#endif +#if defined(__cplusplus) +#include +#include +#include +#include +#include +#include +#include +#else +#include +#include +#include +#include +#endif +#if defined(__cplusplus) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wnon-modular-include-in-framework-module" +#if defined(__arm64e__) && __has_include() +# include +#else +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wreserved-macro-identifier" +# ifndef __ptrauth_swift_value_witness_function_pointer +# define __ptrauth_swift_value_witness_function_pointer(x) +# endif +# ifndef __ptrauth_swift_class_method_pointer +# define __ptrauth_swift_class_method_pointer(x) +# endif +#pragma clang diagnostic pop +#endif +#pragma clang diagnostic pop +#endif + +#if !defined(SWIFT_TYPEDEFS) +# define SWIFT_TYPEDEFS 1 +# if __has_include() +# include +# elif !defined(__cplusplus) +typedef uint_least16_t char16_t; +typedef uint_least32_t char32_t; +# endif +typedef float swift_float2 __attribute__((__ext_vector_type__(2))); +typedef float swift_float3 __attribute__((__ext_vector_type__(3))); +typedef float swift_float4 __attribute__((__ext_vector_type__(4))); +typedef double swift_double2 __attribute__((__ext_vector_type__(2))); +typedef double swift_double3 __attribute__((__ext_vector_type__(3))); +typedef double swift_double4 __attribute__((__ext_vector_type__(4))); +typedef int swift_int2 __attribute__((__ext_vector_type__(2))); +typedef int swift_int3 __attribute__((__ext_vector_type__(3))); +typedef int swift_int4 __attribute__((__ext_vector_type__(4))); +typedef unsigned int swift_uint2 __attribute__((__ext_vector_type__(2))); +typedef unsigned int swift_uint3 __attribute__((__ext_vector_type__(3))); +typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); +#endif + +#if !defined(SWIFT_PASTE) +# define SWIFT_PASTE_HELPER(x, y) x##y +# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y) +#endif +#if !defined(SWIFT_METATYPE) +# define SWIFT_METATYPE(X) Class +#endif +#if !defined(SWIFT_CLASS_PROPERTY) +# if __has_feature(objc_class_property) +# define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__ +# else +# define SWIFT_CLASS_PROPERTY(...) +# endif +#endif +#if !defined(SWIFT_RUNTIME_NAME) +# if __has_attribute(objc_runtime_name) +# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X))) +# else +# define SWIFT_RUNTIME_NAME(X) +# endif +#endif +#if !defined(SWIFT_COMPILE_NAME) +# if __has_attribute(swift_name) +# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X))) +# else +# define SWIFT_COMPILE_NAME(X) +# endif +#endif +#if !defined(SWIFT_METHOD_FAMILY) +# if __has_attribute(objc_method_family) +# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X))) +# else +# define SWIFT_METHOD_FAMILY(X) +# endif +#endif +#if !defined(SWIFT_NOESCAPE) +# if __has_attribute(noescape) +# define SWIFT_NOESCAPE __attribute__((noescape)) +# else +# define SWIFT_NOESCAPE +# endif +#endif +#if !defined(SWIFT_RELEASES_ARGUMENT) +# if __has_attribute(ns_consumed) +# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed)) +# else +# define SWIFT_RELEASES_ARGUMENT +# endif +#endif +#if !defined(SWIFT_WARN_UNUSED_RESULT) +# if __has_attribute(warn_unused_result) +# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) +# else +# define SWIFT_WARN_UNUSED_RESULT +# endif +#endif +#if !defined(SWIFT_NORETURN) +# if __has_attribute(noreturn) +# define SWIFT_NORETURN __attribute__((noreturn)) +# else +# define SWIFT_NORETURN +# endif +#endif +#if !defined(SWIFT_CLASS_EXTRA) +# define SWIFT_CLASS_EXTRA +#endif +#if !defined(SWIFT_PROTOCOL_EXTRA) +# define SWIFT_PROTOCOL_EXTRA +#endif +#if !defined(SWIFT_ENUM_EXTRA) +# define SWIFT_ENUM_EXTRA +#endif +#if !defined(SWIFT_CLASS) +# if __has_attribute(objc_subclassing_restricted) +# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA +# define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA +# else +# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA +# define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA +# endif +#endif +#if !defined(SWIFT_RESILIENT_CLASS) +# if __has_attribute(objc_class_stub) +# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) __attribute__((objc_class_stub)) +# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_class_stub)) SWIFT_CLASS_NAMED(SWIFT_NAME) +# else +# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) +# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) SWIFT_CLASS_NAMED(SWIFT_NAME) +# endif +#endif +#if !defined(SWIFT_PROTOCOL) +# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA +# define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA +#endif +#if !defined(SWIFT_EXTENSION) +# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__) +#endif +#if !defined(OBJC_DESIGNATED_INITIALIZER) +# if __has_attribute(objc_designated_initializer) +# define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) +# else +# define OBJC_DESIGNATED_INITIALIZER +# endif +#endif +#if !defined(SWIFT_ENUM_ATTR) +# if __has_attribute(enum_extensibility) +# define SWIFT_ENUM_ATTR(_extensibility) __attribute__((enum_extensibility(_extensibility))) +# else +# define SWIFT_ENUM_ATTR(_extensibility) +# endif +#endif +#if !defined(SWIFT_ENUM) +# define SWIFT_ENUM(_type, _name, _extensibility) enum _name : _type _name; enum SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type +# if __has_feature(generalized_swift_name) +# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type +# else +# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) SWIFT_ENUM(_type, _name, _extensibility) +# endif +#endif +#if !defined(SWIFT_UNAVAILABLE) +# define SWIFT_UNAVAILABLE __attribute__((unavailable)) +#endif +#if !defined(SWIFT_UNAVAILABLE_MSG) +# define SWIFT_UNAVAILABLE_MSG(msg) __attribute__((unavailable(msg))) +#endif +#if !defined(SWIFT_AVAILABILITY) +# define SWIFT_AVAILABILITY(plat, ...) __attribute__((availability(plat, __VA_ARGS__))) +#endif +#if !defined(SWIFT_WEAK_IMPORT) +# define SWIFT_WEAK_IMPORT __attribute__((weak_import)) +#endif +#if !defined(SWIFT_DEPRECATED) +# define SWIFT_DEPRECATED __attribute__((deprecated)) +#endif +#if !defined(SWIFT_DEPRECATED_MSG) +# define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__))) +#endif +#if !defined(SWIFT_DEPRECATED_OBJC) +# if __has_feature(attribute_diagnose_if_objc) +# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning"))) +# else +# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg) +# endif +#endif +#if defined(__OBJC__) +#if !defined(IBSegueAction) +# define IBSegueAction +#endif +#endif +#if !defined(SWIFT_EXTERN) +# if defined(__cplusplus) +# define SWIFT_EXTERN extern "C" +# else +# define SWIFT_EXTERN extern +# endif +#endif +#if !defined(SWIFT_CALL) +# define SWIFT_CALL __attribute__((swiftcall)) +#endif +#if !defined(SWIFT_INDIRECT_RESULT) +# define SWIFT_INDIRECT_RESULT __attribute__((swift_indirect_result)) +#endif +#if !defined(SWIFT_CONTEXT) +# define SWIFT_CONTEXT __attribute__((swift_context)) +#endif +#if !defined(SWIFT_ERROR_RESULT) +# define SWIFT_ERROR_RESULT __attribute__((swift_error_result)) +#endif +#if defined(__cplusplus) +# define SWIFT_NOEXCEPT noexcept +#else +# define SWIFT_NOEXCEPT +#endif +#if !defined(SWIFT_C_INLINE_THUNK) +# if __has_attribute(always_inline) +# if __has_attribute(nodebug) +# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) __attribute__((nodebug)) +# else +# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) +# endif +# else +# define SWIFT_C_INLINE_THUNK inline +# endif +#endif +#if defined(_WIN32) +#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) +# define SWIFT_IMPORT_STDLIB_SYMBOL __declspec(dllimport) +#endif +#else +#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) +# define SWIFT_IMPORT_STDLIB_SYMBOL +#endif +#endif +#if defined(__OBJC__) +#if __has_feature(objc_modules) +#if __has_warning("-Watimport-in-framework-header") +#pragma clang diagnostic ignored "-Watimport-in-framework-header" +#endif +#endif + +#endif +#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch" +#pragma clang diagnostic ignored "-Wduplicate-method-arg" +#if __has_warning("-Wpragma-clang-attribute") +# pragma clang diagnostic ignored "-Wpragma-clang-attribute" +#endif +#pragma clang diagnostic ignored "-Wunknown-pragmas" +#pragma clang diagnostic ignored "-Wnullability" +#pragma clang diagnostic ignored "-Wdollar-in-identifier-extension" +#pragma clang diagnostic ignored "-Wunsafe-buffer-usage" + +#if __has_attribute(external_source_symbol) +# pragma push_macro("any") +# undef any +# pragma clang attribute push(__attribute__((external_source_symbol(language="Swift", defined_in="FirebaseAnalytics",generated_declaration))), apply_to=any(function,enum,objc_interface,objc_category,objc_protocol)) +# pragma pop_macro("any") +#endif + +#if defined(__OBJC__) + +#endif +#if __has_attribute(external_source_symbol) +# pragma clang attribute pop +#endif +#if defined(__cplusplus) +#endif +#pragma clang diagnostic pop +#endif + +#elif defined(__x86_64__) && __x86_64__ +// Generated by Apple Swift version 6.0.3 effective-5.10 (swiftlang-6.0.3.1.10 clang-1600.0.30.1) +#ifndef FIREBASEANALYTICS_SWIFT_H +#define FIREBASEANALYTICS_SWIFT_H +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgcc-compat" + +#if !defined(__has_include) +# define __has_include(x) 0 +#endif +#if !defined(__has_attribute) +# define __has_attribute(x) 0 +#endif +#if !defined(__has_feature) +# define __has_feature(x) 0 +#endif +#if !defined(__has_warning) +# define __has_warning(x) 0 +#endif + +#if __has_include() +# include +#endif + +#pragma clang diagnostic ignored "-Wauto-import" +#if defined(__OBJC__) +#include +#endif +#if defined(__cplusplus) +#include +#include +#include +#include +#include +#include +#include +#else +#include +#include +#include +#include +#endif +#if defined(__cplusplus) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wnon-modular-include-in-framework-module" +#if defined(__arm64e__) && __has_include() +# include +#else +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wreserved-macro-identifier" +# ifndef __ptrauth_swift_value_witness_function_pointer +# define __ptrauth_swift_value_witness_function_pointer(x) +# endif +# ifndef __ptrauth_swift_class_method_pointer +# define __ptrauth_swift_class_method_pointer(x) +# endif +#pragma clang diagnostic pop +#endif +#pragma clang diagnostic pop +#endif + +#if !defined(SWIFT_TYPEDEFS) +# define SWIFT_TYPEDEFS 1 +# if __has_include() +# include +# elif !defined(__cplusplus) +typedef uint_least16_t char16_t; +typedef uint_least32_t char32_t; +# endif +typedef float swift_float2 __attribute__((__ext_vector_type__(2))); +typedef float swift_float3 __attribute__((__ext_vector_type__(3))); +typedef float swift_float4 __attribute__((__ext_vector_type__(4))); +typedef double swift_double2 __attribute__((__ext_vector_type__(2))); +typedef double swift_double3 __attribute__((__ext_vector_type__(3))); +typedef double swift_double4 __attribute__((__ext_vector_type__(4))); +typedef int swift_int2 __attribute__((__ext_vector_type__(2))); +typedef int swift_int3 __attribute__((__ext_vector_type__(3))); +typedef int swift_int4 __attribute__((__ext_vector_type__(4))); +typedef unsigned int swift_uint2 __attribute__((__ext_vector_type__(2))); +typedef unsigned int swift_uint3 __attribute__((__ext_vector_type__(3))); +typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); +#endif + +#if !defined(SWIFT_PASTE) +# define SWIFT_PASTE_HELPER(x, y) x##y +# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y) +#endif +#if !defined(SWIFT_METATYPE) +# define SWIFT_METATYPE(X) Class +#endif +#if !defined(SWIFT_CLASS_PROPERTY) +# if __has_feature(objc_class_property) +# define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__ +# else +# define SWIFT_CLASS_PROPERTY(...) +# endif +#endif +#if !defined(SWIFT_RUNTIME_NAME) +# if __has_attribute(objc_runtime_name) +# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X))) +# else +# define SWIFT_RUNTIME_NAME(X) +# endif +#endif +#if !defined(SWIFT_COMPILE_NAME) +# if __has_attribute(swift_name) +# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X))) +# else +# define SWIFT_COMPILE_NAME(X) +# endif +#endif +#if !defined(SWIFT_METHOD_FAMILY) +# if __has_attribute(objc_method_family) +# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X))) +# else +# define SWIFT_METHOD_FAMILY(X) +# endif +#endif +#if !defined(SWIFT_NOESCAPE) +# if __has_attribute(noescape) +# define SWIFT_NOESCAPE __attribute__((noescape)) +# else +# define SWIFT_NOESCAPE +# endif +#endif +#if !defined(SWIFT_RELEASES_ARGUMENT) +# if __has_attribute(ns_consumed) +# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed)) +# else +# define SWIFT_RELEASES_ARGUMENT +# endif +#endif +#if !defined(SWIFT_WARN_UNUSED_RESULT) +# if __has_attribute(warn_unused_result) +# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) +# else +# define SWIFT_WARN_UNUSED_RESULT +# endif +#endif +#if !defined(SWIFT_NORETURN) +# if __has_attribute(noreturn) +# define SWIFT_NORETURN __attribute__((noreturn)) +# else +# define SWIFT_NORETURN +# endif +#endif +#if !defined(SWIFT_CLASS_EXTRA) +# define SWIFT_CLASS_EXTRA +#endif +#if !defined(SWIFT_PROTOCOL_EXTRA) +# define SWIFT_PROTOCOL_EXTRA +#endif +#if !defined(SWIFT_ENUM_EXTRA) +# define SWIFT_ENUM_EXTRA +#endif +#if !defined(SWIFT_CLASS) +# if __has_attribute(objc_subclassing_restricted) +# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA +# define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA +# else +# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA +# define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA +# endif +#endif +#if !defined(SWIFT_RESILIENT_CLASS) +# if __has_attribute(objc_class_stub) +# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) __attribute__((objc_class_stub)) +# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_class_stub)) SWIFT_CLASS_NAMED(SWIFT_NAME) +# else +# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) +# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) SWIFT_CLASS_NAMED(SWIFT_NAME) +# endif +#endif +#if !defined(SWIFT_PROTOCOL) +# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA +# define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA +#endif +#if !defined(SWIFT_EXTENSION) +# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__) +#endif +#if !defined(OBJC_DESIGNATED_INITIALIZER) +# if __has_attribute(objc_designated_initializer) +# define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) +# else +# define OBJC_DESIGNATED_INITIALIZER +# endif +#endif +#if !defined(SWIFT_ENUM_ATTR) +# if __has_attribute(enum_extensibility) +# define SWIFT_ENUM_ATTR(_extensibility) __attribute__((enum_extensibility(_extensibility))) +# else +# define SWIFT_ENUM_ATTR(_extensibility) +# endif +#endif +#if !defined(SWIFT_ENUM) +# define SWIFT_ENUM(_type, _name, _extensibility) enum _name : _type _name; enum SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type +# if __has_feature(generalized_swift_name) +# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type +# else +# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) SWIFT_ENUM(_type, _name, _extensibility) +# endif +#endif +#if !defined(SWIFT_UNAVAILABLE) +# define SWIFT_UNAVAILABLE __attribute__((unavailable)) +#endif +#if !defined(SWIFT_UNAVAILABLE_MSG) +# define SWIFT_UNAVAILABLE_MSG(msg) __attribute__((unavailable(msg))) +#endif +#if !defined(SWIFT_AVAILABILITY) +# define SWIFT_AVAILABILITY(plat, ...) __attribute__((availability(plat, __VA_ARGS__))) +#endif +#if !defined(SWIFT_WEAK_IMPORT) +# define SWIFT_WEAK_IMPORT __attribute__((weak_import)) +#endif +#if !defined(SWIFT_DEPRECATED) +# define SWIFT_DEPRECATED __attribute__((deprecated)) +#endif +#if !defined(SWIFT_DEPRECATED_MSG) +# define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__))) +#endif +#if !defined(SWIFT_DEPRECATED_OBJC) +# if __has_feature(attribute_diagnose_if_objc) +# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning"))) +# else +# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg) +# endif +#endif +#if defined(__OBJC__) +#if !defined(IBSegueAction) +# define IBSegueAction +#endif +#endif +#if !defined(SWIFT_EXTERN) +# if defined(__cplusplus) +# define SWIFT_EXTERN extern "C" +# else +# define SWIFT_EXTERN extern +# endif +#endif +#if !defined(SWIFT_CALL) +# define SWIFT_CALL __attribute__((swiftcall)) +#endif +#if !defined(SWIFT_INDIRECT_RESULT) +# define SWIFT_INDIRECT_RESULT __attribute__((swift_indirect_result)) +#endif +#if !defined(SWIFT_CONTEXT) +# define SWIFT_CONTEXT __attribute__((swift_context)) +#endif +#if !defined(SWIFT_ERROR_RESULT) +# define SWIFT_ERROR_RESULT __attribute__((swift_error_result)) +#endif +#if defined(__cplusplus) +# define SWIFT_NOEXCEPT noexcept +#else +# define SWIFT_NOEXCEPT +#endif +#if !defined(SWIFT_C_INLINE_THUNK) +# if __has_attribute(always_inline) +# if __has_attribute(nodebug) +# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) __attribute__((nodebug)) +# else +# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) +# endif +# else +# define SWIFT_C_INLINE_THUNK inline +# endif +#endif +#if defined(_WIN32) +#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) +# define SWIFT_IMPORT_STDLIB_SYMBOL __declspec(dllimport) +#endif +#else +#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) +# define SWIFT_IMPORT_STDLIB_SYMBOL +#endif +#endif +#if defined(__OBJC__) +#if __has_feature(objc_modules) +#if __has_warning("-Watimport-in-framework-header") +#pragma clang diagnostic ignored "-Watimport-in-framework-header" +#endif +#endif + +#endif +#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch" +#pragma clang diagnostic ignored "-Wduplicate-method-arg" +#if __has_warning("-Wpragma-clang-attribute") +# pragma clang diagnostic ignored "-Wpragma-clang-attribute" +#endif +#pragma clang diagnostic ignored "-Wunknown-pragmas" +#pragma clang diagnostic ignored "-Wnullability" +#pragma clang diagnostic ignored "-Wdollar-in-identifier-extension" +#pragma clang diagnostic ignored "-Wunsafe-buffer-usage" + +#if __has_attribute(external_source_symbol) +# pragma push_macro("any") +# undef any +# pragma clang attribute push(__attribute__((external_source_symbol(language="Swift", defined_in="FirebaseAnalytics",generated_declaration))), apply_to=any(function,enum,objc_interface,objc_category,objc_protocol)) +# pragma pop_macro("any") +#endif + +#if defined(__OBJC__) + +#endif +#if __has_attribute(external_source_symbol) +# pragma clang attribute pop +#endif +#if defined(__cplusplus) +#endif +#pragma clang diagnostic pop +#endif + +#else +#error unsupported Swift architecture +#endif diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FirebaseAnalytics-umbrella.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FirebaseAnalytics-umbrella.h new file mode 100644 index 0000000..ad84fbb --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FirebaseAnalytics-umbrella.h @@ -0,0 +1,24 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + +#import "FIRAnalytics+AppDelegate.h" +#import "FIRAnalytics+Consent.h" +#import "FIRAnalytics+OnDevice.h" +#import "FIRAnalytics.h" +#import "FirebaseAnalytics.h" +#import "FIREventNames.h" +#import "FIRParameterNames.h" +#import "FIRUserPropertyNames.h" + +FOUNDATION_EXPORT double FirebaseAnalyticsVersionNumber; +FOUNDATION_EXPORT const unsigned char FirebaseAnalyticsVersionString[]; + diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FirebaseAnalytics.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FirebaseAnalytics.h new file mode 100644 index 0000000..351da20 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Headers/FirebaseAnalytics.h @@ -0,0 +1,7 @@ +#import "FIRAnalytics+AppDelegate.h" +#import "FIRAnalytics+Consent.h" +#import "FIRAnalytics+OnDevice.h" +#import "FIRAnalytics.h" +#import "FIREventNames.h" +#import "FIRParameterNames.h" +#import "FIRUserPropertyNames.h" diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Info.plist b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Info.plist new file mode 100644 index 0000000..a690cd5 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Info.plist @@ -0,0 +1,52 @@ + + + + + BuildMachineOSBuild + 24G231 + CFBundleDevelopmentRegion + en + CFBundleExecutable + FirebaseAnalytics + CFBundleIdentifier + org.cocoapods.FirebaseAnalytics + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + FirebaseAnalytics + CFBundlePackageType + FMWK + CFBundleShortVersionString + 12.5.0 + CFBundleSignature + ???? + CFBundleSupportedPlatforms + + AppleTVSimulator + + CFBundleVersion + 1 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + DTPlatformBuild + 22K152 + DTPlatformName + appletvsimulator + DTPlatformVersion + 18.2 + DTSDKBuild + 22K152 + DTSDKName + appletvsimulator18.2 + DTXcode + 1620 + DTXcodeBuild + 16C5032a + MinimumOSVersion + 100.0 + UIDeviceFamily + + 3 + + + diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/Project/arm64-apple-tvos-simulator.swiftsourceinfo b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/Project/arm64-apple-tvos-simulator.swiftsourceinfo new file mode 100644 index 0000000..f65acaf Binary files /dev/null and b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/Project/arm64-apple-tvos-simulator.swiftsourceinfo differ diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/Project/x86_64-apple-tvos-simulator.swiftsourceinfo b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/Project/x86_64-apple-tvos-simulator.swiftsourceinfo new file mode 100644 index 0000000..a238e7d Binary files /dev/null and b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/Project/x86_64-apple-tvos-simulator.swiftsourceinfo differ diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-tvos-simulator.abi.json b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-tvos-simulator.abi.json new file mode 100644 index 0000000..476738a --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-tvos-simulator.abi.json @@ -0,0 +1,281 @@ +{ + "ABIRoot": { + "kind": "Root", + "name": "FirebaseAnalytics", + "printedName": "FirebaseAnalytics", + "children": [ + { + "kind": "Import", + "name": "FirebaseAnalyticsPrivate", + "printedName": "FirebaseAnalyticsPrivate", + "declKind": "Import", + "moduleName": "FirebaseAnalytics", + "declAttributes": [ + "ImplementationOnly" + ] + }, + { + "kind": "Import", + "name": "StoreKit", + "printedName": "StoreKit", + "declKind": "Import", + "moduleName": "FirebaseAnalytics" + }, + { + "kind": "Import", + "name": "SwiftUI", + "printedName": "SwiftUI", + "declKind": "Import", + "moduleName": "FirebaseAnalytics" + }, + { + "kind": "TypeDecl", + "name": "Analytics", + "printedName": "Analytics", + "children": [ + { + "kind": "Function", + "name": "logTransaction", + "printedName": "logTransaction(_:)", + "children": [ + { + "kind": "TypeNominal", + "name": "Void", + "printedName": "()" + }, + { + "kind": "TypeNominal", + "name": "Transaction", + "printedName": "StoreKit.Transaction", + "usr": "s:8StoreKit11TransactionV" + } + ], + "declKind": "Func", + "usr": "s:So12FIRAnalyticsC17FirebaseAnalyticsE14logTransactionyy8StoreKit0E0VFZ", + "mangledName": "$sSo12FIRAnalyticsC17FirebaseAnalyticsE14logTransactionyy8StoreKit0E0VFZ", + "moduleName": "FirebaseAnalytics", + "static": true, + "declAttributes": [ + "Final", + "AccessControl", + "RawDocComment" + ], + "isFromExtension": true, + "funcSelfKind": "NonMutating" + } + ], + "declKind": "Class", + "usr": "c:objc(cs)FIRAnalytics", + "moduleName": "FirebaseAnalytics", + "isOpen": true, + "objc_name": "FIRAnalytics", + "declAttributes": [ + "ObjC", + "Dynamic" + ], + "superclassUsr": "c:objc(cs)NSObject", + "isExternal": true, + "inheritsConvenienceInitializers": true, + "superclassNames": [ + "ObjectiveC.NSObject" + ], + "conformances": [ + { + "kind": "Conformance", + "name": "Copyable", + "printedName": "Copyable", + "usr": "s:s8CopyableP", + "mangledName": "$ss8CopyableP" + }, + { + "kind": "Conformance", + "name": "Escapable", + "printedName": "Escapable", + "usr": "s:s9EscapableP", + "mangledName": "$ss9EscapableP" + }, + { + "kind": "Conformance", + "name": "Equatable", + "printedName": "Equatable", + "usr": "s:SQ", + "mangledName": "$sSQ" + }, + { + "kind": "Conformance", + "name": "Hashable", + "printedName": "Hashable", + "usr": "s:SH", + "mangledName": "$sSH" + }, + { + "kind": "Conformance", + "name": "CVarArg", + "printedName": "CVarArg", + "usr": "s:s7CVarArgP", + "mangledName": "$ss7CVarArgP" + }, + { + "kind": "Conformance", + "name": "_KeyValueCodingAndObservingPublishing", + "printedName": "_KeyValueCodingAndObservingPublishing", + "usr": "s:10Foundation37_KeyValueCodingAndObservingPublishingP", + "mangledName": "$s10Foundation37_KeyValueCodingAndObservingPublishingP" + }, + { + "kind": "Conformance", + "name": "_KeyValueCodingAndObserving", + "printedName": "_KeyValueCodingAndObserving", + "usr": "s:10Foundation27_KeyValueCodingAndObservingP", + "mangledName": "$s10Foundation27_KeyValueCodingAndObservingP" + }, + { + "kind": "Conformance", + "name": "CustomStringConvertible", + "printedName": "CustomStringConvertible", + "usr": "s:s23CustomStringConvertibleP", + "mangledName": "$ss23CustomStringConvertibleP" + }, + { + "kind": "Conformance", + "name": "CustomDebugStringConvertible", + "printedName": "CustomDebugStringConvertible", + "usr": "s:s28CustomDebugStringConvertibleP", + "mangledName": "$ss28CustomDebugStringConvertibleP" + } + ] + }, + { + "kind": "TypeDecl", + "name": "View", + "printedName": "View", + "children": [ + { + "kind": "Function", + "name": "analyticsScreen", + "printedName": "analyticsScreen(name:class:extraParameters:)", + "children": [ + { + "kind": "TypeNominal", + "name": "OpaqueTypeArchetype", + "printedName": "some SwiftUI.View", + "children": [ + { + "kind": "TypeNominal", + "name": "View", + "printedName": "SwiftUI.View", + "usr": "s:7SwiftUI4ViewP" + } + ] + }, + { + "kind": "TypeNominal", + "name": "String", + "printedName": "Swift.String", + "usr": "s:SS" + }, + { + "kind": "TypeNominal", + "name": "String", + "printedName": "Swift.String", + "hasDefaultArg": true, + "usr": "s:SS" + }, + { + "kind": "TypeNominal", + "name": "Dictionary", + "printedName": "[Swift.String : Any]", + "children": [ + { + "kind": "TypeNominal", + "name": "String", + "printedName": "Swift.String", + "usr": "s:SS" + }, + { + "kind": "TypeNominal", + "name": "ProtocolComposition", + "printedName": "Any" + } + ], + "hasDefaultArg": true, + "usr": "s:SD" + } + ], + "declKind": "Func", + "usr": "s:7SwiftUI4ViewP17FirebaseAnalyticsE15analyticsScreen4name5class15extraParametersQrSS_SSSDySSypGtF", + "mangledName": "$s7SwiftUI4ViewP17FirebaseAnalyticsE15analyticsScreen4name5class15extraParametersQrSS_SSSDySSypGtF", + "moduleName": "FirebaseAnalytics", + "genericSig": "<τ_0_0 where τ_0_0 : SwiftUI.View>", + "sugared_genericSig": "", + "declAttributes": [ + "Preconcurrency", + "Custom", + "AccessControl", + "RawDocComment" + ], + "isFromExtension": true, + "funcSelfKind": "NonMutating" + } + ], + "declKind": "Protocol", + "usr": "s:7SwiftUI4ViewP", + "mangledName": "$s7SwiftUI4ViewP", + "moduleName": "SwiftUICore", + "genericSig": "<τ_0_0.Body : SwiftUI.View>", + "sugared_genericSig": "", + "intro_Macosx": "10.15", + "intro_iOS": "13.0", + "intro_tvOS": "13.0", + "intro_watchOS": "6.0", + "declAttributes": [ + "Preconcurrency", + "TypeEraser", + "OriginallyDefinedIn", + "OriginallyDefinedIn", + "OriginallyDefinedIn", + "OriginallyDefinedIn", + "Available", + "Available", + "Available", + "Available", + "Custom" + ], + "isExternal": true, + "conformances": [ + { + "kind": "Conformance", + "name": "Escapable", + "printedName": "Escapable", + "usr": "s:s9EscapableP", + "mangledName": "$ss9EscapableP" + }, + { + "kind": "Conformance", + "name": "Copyable", + "printedName": "Copyable", + "usr": "s:s8CopyableP", + "mangledName": "$ss8CopyableP" + } + ] + } + ], + "json_format_version": 8 + }, + "ConstValues": [ + { + "filePath": "\/Volumes\/google\/src\/cloud\/hantran\/m172\/google3\/googlemac\/iPhone\/Firebase\/Analytics\/Sources\/Swift\/Analytics+SwiftUI.swift", + "kind": "StringLiteral", + "offset": 2654, + "length": 6, + "value": "\"View\"" + }, + { + "filePath": "\/Volumes\/google\/src\/cloud\/hantran\/m172\/google3\/googlemac\/iPhone\/Firebase\/Analytics\/Sources\/Swift\/Analytics+SwiftUI.swift", + "kind": "Dictionary", + "offset": 2701, + "length": 3, + "value": "[]" + } + ] +} \ No newline at end of file diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-tvos-simulator.private.swiftinterface b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-tvos-simulator.private.swiftinterface new file mode 100644 index 0000000..0979880 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-tvos-simulator.private.swiftinterface @@ -0,0 +1,22 @@ +// swift-interface-format-version: 1.0 +// swift-compiler-version: Apple Swift version 6.0.3 effective-5.10 (swiftlang-6.0.3.1.10 clang-1600.0.30.1) +// swift-module-flags: -target arm64-apple-tvos15.0-simulator -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -O -enable-bare-slash-regex -module-name FirebaseAnalytics +// swift-module-flags-ignorable: -no-verify-emitted-module-interface +@_exported import FirebaseAnalytics +import StoreKit +import Swift +import SwiftUI +import _Concurrency +import _StringProcessing +import _SwiftConcurrencyShims +@available(iOS 15.0, macOS 12.0, macCatalyst 15.0, tvOS 15.0, *) +@available(watchOS, unavailable) +extension FirebaseAnalytics.Analytics { + public static func logTransaction(_ transaction: StoreKit.Transaction) +} +@available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, *) +@available(watchOS, unavailable) +extension SwiftUICore.View { + @_Concurrency.MainActor @preconcurrency public func analyticsScreen(name: Swift.String, class: Swift.String = "View", extraParameters: [Swift.String : Any] = [:]) -> some SwiftUICore.View + +} diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-tvos-simulator.swiftdoc b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-tvos-simulator.swiftdoc new file mode 100644 index 0000000..1f2ef26 Binary files /dev/null and b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-tvos-simulator.swiftdoc differ diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-tvos-simulator.swiftinterface b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-tvos-simulator.swiftinterface new file mode 100644 index 0000000..0979880 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/arm64-apple-tvos-simulator.swiftinterface @@ -0,0 +1,22 @@ +// swift-interface-format-version: 1.0 +// swift-compiler-version: Apple Swift version 6.0.3 effective-5.10 (swiftlang-6.0.3.1.10 clang-1600.0.30.1) +// swift-module-flags: -target arm64-apple-tvos15.0-simulator -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -O -enable-bare-slash-regex -module-name FirebaseAnalytics +// swift-module-flags-ignorable: -no-verify-emitted-module-interface +@_exported import FirebaseAnalytics +import StoreKit +import Swift +import SwiftUI +import _Concurrency +import _StringProcessing +import _SwiftConcurrencyShims +@available(iOS 15.0, macOS 12.0, macCatalyst 15.0, tvOS 15.0, *) +@available(watchOS, unavailable) +extension FirebaseAnalytics.Analytics { + public static func logTransaction(_ transaction: StoreKit.Transaction) +} +@available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, *) +@available(watchOS, unavailable) +extension SwiftUICore.View { + @_Concurrency.MainActor @preconcurrency public func analyticsScreen(name: Swift.String, class: Swift.String = "View", extraParameters: [Swift.String : Any] = [:]) -> some SwiftUICore.View + +} diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-tvos-simulator.abi.json b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-tvos-simulator.abi.json new file mode 100644 index 0000000..476738a --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-tvos-simulator.abi.json @@ -0,0 +1,281 @@ +{ + "ABIRoot": { + "kind": "Root", + "name": "FirebaseAnalytics", + "printedName": "FirebaseAnalytics", + "children": [ + { + "kind": "Import", + "name": "FirebaseAnalyticsPrivate", + "printedName": "FirebaseAnalyticsPrivate", + "declKind": "Import", + "moduleName": "FirebaseAnalytics", + "declAttributes": [ + "ImplementationOnly" + ] + }, + { + "kind": "Import", + "name": "StoreKit", + "printedName": "StoreKit", + "declKind": "Import", + "moduleName": "FirebaseAnalytics" + }, + { + "kind": "Import", + "name": "SwiftUI", + "printedName": "SwiftUI", + "declKind": "Import", + "moduleName": "FirebaseAnalytics" + }, + { + "kind": "TypeDecl", + "name": "Analytics", + "printedName": "Analytics", + "children": [ + { + "kind": "Function", + "name": "logTransaction", + "printedName": "logTransaction(_:)", + "children": [ + { + "kind": "TypeNominal", + "name": "Void", + "printedName": "()" + }, + { + "kind": "TypeNominal", + "name": "Transaction", + "printedName": "StoreKit.Transaction", + "usr": "s:8StoreKit11TransactionV" + } + ], + "declKind": "Func", + "usr": "s:So12FIRAnalyticsC17FirebaseAnalyticsE14logTransactionyy8StoreKit0E0VFZ", + "mangledName": "$sSo12FIRAnalyticsC17FirebaseAnalyticsE14logTransactionyy8StoreKit0E0VFZ", + "moduleName": "FirebaseAnalytics", + "static": true, + "declAttributes": [ + "Final", + "AccessControl", + "RawDocComment" + ], + "isFromExtension": true, + "funcSelfKind": "NonMutating" + } + ], + "declKind": "Class", + "usr": "c:objc(cs)FIRAnalytics", + "moduleName": "FirebaseAnalytics", + "isOpen": true, + "objc_name": "FIRAnalytics", + "declAttributes": [ + "ObjC", + "Dynamic" + ], + "superclassUsr": "c:objc(cs)NSObject", + "isExternal": true, + "inheritsConvenienceInitializers": true, + "superclassNames": [ + "ObjectiveC.NSObject" + ], + "conformances": [ + { + "kind": "Conformance", + "name": "Copyable", + "printedName": "Copyable", + "usr": "s:s8CopyableP", + "mangledName": "$ss8CopyableP" + }, + { + "kind": "Conformance", + "name": "Escapable", + "printedName": "Escapable", + "usr": "s:s9EscapableP", + "mangledName": "$ss9EscapableP" + }, + { + "kind": "Conformance", + "name": "Equatable", + "printedName": "Equatable", + "usr": "s:SQ", + "mangledName": "$sSQ" + }, + { + "kind": "Conformance", + "name": "Hashable", + "printedName": "Hashable", + "usr": "s:SH", + "mangledName": "$sSH" + }, + { + "kind": "Conformance", + "name": "CVarArg", + "printedName": "CVarArg", + "usr": "s:s7CVarArgP", + "mangledName": "$ss7CVarArgP" + }, + { + "kind": "Conformance", + "name": "_KeyValueCodingAndObservingPublishing", + "printedName": "_KeyValueCodingAndObservingPublishing", + "usr": "s:10Foundation37_KeyValueCodingAndObservingPublishingP", + "mangledName": "$s10Foundation37_KeyValueCodingAndObservingPublishingP" + }, + { + "kind": "Conformance", + "name": "_KeyValueCodingAndObserving", + "printedName": "_KeyValueCodingAndObserving", + "usr": "s:10Foundation27_KeyValueCodingAndObservingP", + "mangledName": "$s10Foundation27_KeyValueCodingAndObservingP" + }, + { + "kind": "Conformance", + "name": "CustomStringConvertible", + "printedName": "CustomStringConvertible", + "usr": "s:s23CustomStringConvertibleP", + "mangledName": "$ss23CustomStringConvertibleP" + }, + { + "kind": "Conformance", + "name": "CustomDebugStringConvertible", + "printedName": "CustomDebugStringConvertible", + "usr": "s:s28CustomDebugStringConvertibleP", + "mangledName": "$ss28CustomDebugStringConvertibleP" + } + ] + }, + { + "kind": "TypeDecl", + "name": "View", + "printedName": "View", + "children": [ + { + "kind": "Function", + "name": "analyticsScreen", + "printedName": "analyticsScreen(name:class:extraParameters:)", + "children": [ + { + "kind": "TypeNominal", + "name": "OpaqueTypeArchetype", + "printedName": "some SwiftUI.View", + "children": [ + { + "kind": "TypeNominal", + "name": "View", + "printedName": "SwiftUI.View", + "usr": "s:7SwiftUI4ViewP" + } + ] + }, + { + "kind": "TypeNominal", + "name": "String", + "printedName": "Swift.String", + "usr": "s:SS" + }, + { + "kind": "TypeNominal", + "name": "String", + "printedName": "Swift.String", + "hasDefaultArg": true, + "usr": "s:SS" + }, + { + "kind": "TypeNominal", + "name": "Dictionary", + "printedName": "[Swift.String : Any]", + "children": [ + { + "kind": "TypeNominal", + "name": "String", + "printedName": "Swift.String", + "usr": "s:SS" + }, + { + "kind": "TypeNominal", + "name": "ProtocolComposition", + "printedName": "Any" + } + ], + "hasDefaultArg": true, + "usr": "s:SD" + } + ], + "declKind": "Func", + "usr": "s:7SwiftUI4ViewP17FirebaseAnalyticsE15analyticsScreen4name5class15extraParametersQrSS_SSSDySSypGtF", + "mangledName": "$s7SwiftUI4ViewP17FirebaseAnalyticsE15analyticsScreen4name5class15extraParametersQrSS_SSSDySSypGtF", + "moduleName": "FirebaseAnalytics", + "genericSig": "<τ_0_0 where τ_0_0 : SwiftUI.View>", + "sugared_genericSig": "", + "declAttributes": [ + "Preconcurrency", + "Custom", + "AccessControl", + "RawDocComment" + ], + "isFromExtension": true, + "funcSelfKind": "NonMutating" + } + ], + "declKind": "Protocol", + "usr": "s:7SwiftUI4ViewP", + "mangledName": "$s7SwiftUI4ViewP", + "moduleName": "SwiftUICore", + "genericSig": "<τ_0_0.Body : SwiftUI.View>", + "sugared_genericSig": "", + "intro_Macosx": "10.15", + "intro_iOS": "13.0", + "intro_tvOS": "13.0", + "intro_watchOS": "6.0", + "declAttributes": [ + "Preconcurrency", + "TypeEraser", + "OriginallyDefinedIn", + "OriginallyDefinedIn", + "OriginallyDefinedIn", + "OriginallyDefinedIn", + "Available", + "Available", + "Available", + "Available", + "Custom" + ], + "isExternal": true, + "conformances": [ + { + "kind": "Conformance", + "name": "Escapable", + "printedName": "Escapable", + "usr": "s:s9EscapableP", + "mangledName": "$ss9EscapableP" + }, + { + "kind": "Conformance", + "name": "Copyable", + "printedName": "Copyable", + "usr": "s:s8CopyableP", + "mangledName": "$ss8CopyableP" + } + ] + } + ], + "json_format_version": 8 + }, + "ConstValues": [ + { + "filePath": "\/Volumes\/google\/src\/cloud\/hantran\/m172\/google3\/googlemac\/iPhone\/Firebase\/Analytics\/Sources\/Swift\/Analytics+SwiftUI.swift", + "kind": "StringLiteral", + "offset": 2654, + "length": 6, + "value": "\"View\"" + }, + { + "filePath": "\/Volumes\/google\/src\/cloud\/hantran\/m172\/google3\/googlemac\/iPhone\/Firebase\/Analytics\/Sources\/Swift\/Analytics+SwiftUI.swift", + "kind": "Dictionary", + "offset": 2701, + "length": 3, + "value": "[]" + } + ] +} \ No newline at end of file diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-tvos-simulator.private.swiftinterface b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-tvos-simulator.private.swiftinterface new file mode 100644 index 0000000..20c3280 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-tvos-simulator.private.swiftinterface @@ -0,0 +1,22 @@ +// swift-interface-format-version: 1.0 +// swift-compiler-version: Apple Swift version 6.0.3 effective-5.10 (swiftlang-6.0.3.1.10 clang-1600.0.30.1) +// swift-module-flags: -target x86_64-apple-tvos15.0-simulator -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -O -enable-bare-slash-regex -module-name FirebaseAnalytics +// swift-module-flags-ignorable: -no-verify-emitted-module-interface +@_exported import FirebaseAnalytics +import StoreKit +import Swift +import SwiftUI +import _Concurrency +import _StringProcessing +import _SwiftConcurrencyShims +@available(iOS 15.0, macOS 12.0, macCatalyst 15.0, tvOS 15.0, *) +@available(watchOS, unavailable) +extension FirebaseAnalytics.Analytics { + public static func logTransaction(_ transaction: StoreKit.Transaction) +} +@available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, *) +@available(watchOS, unavailable) +extension SwiftUICore.View { + @_Concurrency.MainActor @preconcurrency public func analyticsScreen(name: Swift.String, class: Swift.String = "View", extraParameters: [Swift.String : Any] = [:]) -> some SwiftUICore.View + +} diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-tvos-simulator.swiftdoc b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-tvos-simulator.swiftdoc new file mode 100644 index 0000000..e8092ca Binary files /dev/null and b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-tvos-simulator.swiftdoc differ diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-tvos-simulator.swiftinterface b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-tvos-simulator.swiftinterface new file mode 100644 index 0000000..20c3280 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/FirebaseAnalytics.swiftmodule/x86_64-apple-tvos-simulator.swiftinterface @@ -0,0 +1,22 @@ +// swift-interface-format-version: 1.0 +// swift-compiler-version: Apple Swift version 6.0.3 effective-5.10 (swiftlang-6.0.3.1.10 clang-1600.0.30.1) +// swift-module-flags: -target x86_64-apple-tvos15.0-simulator -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -O -enable-bare-slash-regex -module-name FirebaseAnalytics +// swift-module-flags-ignorable: -no-verify-emitted-module-interface +@_exported import FirebaseAnalytics +import StoreKit +import Swift +import SwiftUI +import _Concurrency +import _StringProcessing +import _SwiftConcurrencyShims +@available(iOS 15.0, macOS 12.0, macCatalyst 15.0, tvOS 15.0, *) +@available(watchOS, unavailable) +extension FirebaseAnalytics.Analytics { + public static func logTransaction(_ transaction: StoreKit.Transaction) +} +@available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, *) +@available(watchOS, unavailable) +extension SwiftUICore.View { + @_Concurrency.MainActor @preconcurrency public func analyticsScreen(name: Swift.String, class: Swift.String = "View", extraParameters: [Swift.String : Any] = [:]) -> some SwiftUICore.View + +} diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/module.modulemap b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/module.modulemap new file mode 100644 index 0000000..fa10817 --- /dev/null +++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator/FirebaseAnalytics.framework/Modules/module.modulemap @@ -0,0 +1,16 @@ +framework module FirebaseAnalytics { +umbrella header "FirebaseAnalytics-umbrella.h" +export * +module * { export * } + link framework "Foundation" + link framework "Security" + link framework "SystemConfiguration" + link framework "UIKit" + link "c++" + link "sqlite3" + link "z" +} +module FirebaseAnalytics.Swift { + header "FirebaseAnalytics-Swift.h" + requires objc +} \ No newline at end of file diff --git a/Pods/FirebaseCore/FirebaseCore/Extension/FIRAppInternal.h b/Pods/FirebaseCore/FirebaseCore/Extension/FIRAppInternal.h new file mode 100644 index 0000000..96d42ef --- /dev/null +++ b/Pods/FirebaseCore/FirebaseCore/Extension/FIRAppInternal.h @@ -0,0 +1,182 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FIREBASECORE_FIRAPPINTERNAL_H +#define FIREBASECORE_FIRAPPINTERNAL_H + +#import + +@class FIRComponentContainer; +@class FIRHeartbeatLogger; +@protocol FIRLibrary; + +/** + * The internal interface to `FirebaseApp`. This is meant for first-party integrators, who need to + * receive `FirebaseApp` notifications, log info about the success or failure of their + * configuration, and access other internal functionality of `FirebaseApp`. + */ +NS_ASSUME_NONNULL_BEGIN + +typedef NS_ENUM(NSInteger, FIRConfigType) { + FIRConfigTypeCore = 1, + FIRConfigTypeSDK = 2, +}; + +extern NSString *const kFIRDefaultAppName; +extern NSString *const kFIRAppReadyToConfigureSDKNotification; +extern NSString *const kFIRAppDeleteNotification; +extern NSString *const kFIRAppIsDefaultAppKey; +extern NSString *const kFIRAppNameKey; +extern NSString *const kFIRGoogleAppIDKey; +extern NSString *const kFirebaseCoreErrorDomain; + +/** + * Keys for the strings in the plist file. + */ +extern NSString *const kFIRAPIKey; +extern NSString *const kFIRTrackingID; +extern NSString *const kFIRGoogleAppID; +extern NSString *const kFIRClientID; +extern NSString *const kFIRGCMSenderID; +extern NSString *const kFIRAndroidClientID; +extern NSString *const kFIRDatabaseURL; +extern NSString *const kFIRStorageBucket; +extern NSString *const kFIRBundleID; +extern NSString *const kFIRProjectID; + +/** + * Keys for the plist file name + */ +extern NSString *const kServiceInfoFileName; + +extern NSString *const kServiceInfoFileType; + +/** + * The format string for the `UserDefaults` key used for storing the data collection enabled flag. + * This includes formatting to append the `FirebaseApp`'s name. + */ +extern NSString *const kFIRGlobalAppDataCollectionEnabledDefaultsKeyFormat; + +/** + * The plist key used for storing the data collection enabled flag. + */ +extern NSString *const kFIRGlobalAppDataCollectionEnabledPlistKey; + +/** @var FirebaseAuthStateDidChangeInternalNotification + @brief The name of the @c NotificationCenter notification which is posted when the auth state + changes (e.g. a new token has been produced, a user logs in or out). The object parameter of + the notification is a dictionary possibly containing the key: + @c FirebaseAuthStateDidChangeInternalNotificationTokenKey (the new access token.) If it does not + contain this key it indicates a sign-out event took place. + */ +extern NSString *const FIRAuthStateDidChangeInternalNotification; + +/** @var FirebaseAuthStateDidChangeInternalNotificationTokenKey + @brief A key present in the dictionary object parameter of the + @c FirebaseAuthStateDidChangeInternalNotification notification. The value associated with this + key will contain the new access token. + */ +extern NSString *const FIRAuthStateDidChangeInternalNotificationTokenKey; + +/** @var FirebaseAuthStateDidChangeInternalNotificationAppKey + @brief A key present in the dictionary object parameter of the + @c FirebaseAuthStateDidChangeInternalNotification notification. The value associated with this + key will contain the FirebaseApp associated with the auth instance. + */ +extern NSString *const FIRAuthStateDidChangeInternalNotificationAppKey; + +/** @var FirebaseAuthStateDidChangeInternalNotificationUIDKey + @brief A key present in the dictionary object parameter of the + @c FirebaseAuthStateDidChangeInternalNotification notification. The value associated with this + key will contain the new user's UID (or nil if there is no longer a user signed in). + */ +extern NSString *const FIRAuthStateDidChangeInternalNotificationUIDKey; + +@interface FIRApp () + +/** + * A flag indicating if this is the default app (has the default app name). + */ +@property(nonatomic, readonly) BOOL isDefaultApp; + +/** + * The container of interop SDKs for this app. + */ +@property(nonatomic) FIRComponentContainer *container; + +/** + * The heartbeat logger associated with this app. + * + * Firebase apps have a 1:1 relationship with heartbeat loggers. + */ +@property(readonly) FIRHeartbeatLogger *heartbeatLogger; + +/** + * Checks if the default app is configured without trying to configure it. + */ ++ (BOOL)isDefaultAppConfigured; + +/** + * Registers a given third-party library with the given version number to be reported for + * analytics. + * + * @param name Name of the library. + * @param version Version of the library. + */ ++ (void)registerLibrary:(nonnull NSString *)name withVersion:(nonnull NSString *)version; + +/** + * Registers a given internal library to be reported for analytics. + * + * @param library Optional parameter for component registration. + * @param name Name of the library. + */ ++ (void)registerInternalLibrary:(nonnull Class)library + withName:(nonnull NSString *)name; + +/** + * Registers a given internal library with the given version number to be reported for + * analytics. This should only be used for non-Firebase libraries that have their own versioning + * scheme. + * + * @param library Optional parameter for component registration. + * @param name Name of the library. + * @param version Version of the library. + */ ++ (void)registerInternalLibrary:(nonnull Class)library + withName:(nonnull NSString *)name + withVersion:(nonnull NSString *)version; + +/** + * A concatenated string representing all the third-party libraries and version numbers. + */ ++ (NSString *)firebaseUserAgent; + +/** + * Can be used by the unit tests in each SDK to reset `FirebaseApp`. This method is thread unsafe. + */ ++ (void)resetApps; + +/** + * Can be used by the unit tests in each SDK to set customized options. + */ +- (instancetype)initInstanceWithName:(NSString *)name options:(FIROptions *)options; + +@end + +NS_ASSUME_NONNULL_END + +#endif // FIREBASECORE_FIRAPPINTERNAL_H diff --git a/Pods/FirebaseCore/FirebaseCore/Extension/FIRComponent.h b/Pods/FirebaseCore/FirebaseCore/Extension/FIRComponent.h new file mode 100644 index 0000000..98c7a89 --- /dev/null +++ b/Pods/FirebaseCore/FirebaseCore/Extension/FIRComponent.h @@ -0,0 +1,89 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FIREBASECORE_FIRCOMPONENT_H +#define FIREBASECORE_FIRCOMPONENT_H + +#import + +@class FIRApp; +@class FIRComponentContainer; + +NS_ASSUME_NONNULL_BEGIN + +/// Provides a system to clean up cached instances returned from the component system. +NS_SWIFT_NAME(ComponentLifecycleMaintainer) +@protocol FIRComponentLifecycleMaintainer +/// The associated app will be deleted, clean up any resources as they are about to be deallocated. +- (void)appWillBeDeleted:(FIRApp *)app; +@end + +typedef _Nullable id (^FIRComponentCreationBlock)(FIRComponentContainer *container, + BOOL *isCacheable) + NS_SWIFT_NAME(ComponentCreationBlock); + +/// Describes the timing of instantiation. Note: new components should default to lazy unless there +/// is a strong reason to be eager. +typedef NS_ENUM(NSInteger, FIRInstantiationTiming) { + FIRInstantiationTimingLazy, + FIRInstantiationTimingAlwaysEager, + FIRInstantiationTimingEagerInDefaultApp +} NS_SWIFT_NAME(InstantiationTiming); + +/// A component that can be used from other Firebase SDKs. +NS_SWIFT_NAME(Component) +@interface FIRComponent : NSObject + +/// The protocol describing functionality provided from the `Component`. +@property(nonatomic, strong, readonly) Protocol *protocol; + +/// The timing of instantiation. +@property(nonatomic, readonly) FIRInstantiationTiming instantiationTiming; + +/// A block to instantiate an instance of the component with the appropriate dependencies. +@property(nonatomic, copy, readonly) FIRComponentCreationBlock creationBlock; + +// There's an issue with long NS_SWIFT_NAMES that causes compilation to fail, disable clang-format +// for the next two methods. +// clang-format off + +/// Creates a component with no dependencies that will be lazily initialized. ++ (instancetype)componentWithProtocol:(Protocol *)protocol + creationBlock:(FIRComponentCreationBlock)creationBlock +NS_SWIFT_NAME(init(_:creationBlock:)); + +/// Creates a component to be registered with the component container. +/// +/// @param protocol - The protocol describing functionality provided by the component. +/// @param instantiationTiming - When the component should be initialized. Use .lazy unless there's +/// a good reason to be instantiated earlier. +/// @param creationBlock - A block to instantiate the component with a container, and if +/// @return A component that can be registered with the component container. ++ (instancetype)componentWithProtocol:(Protocol *)protocol + instantiationTiming:(FIRInstantiationTiming)instantiationTiming + creationBlock:(FIRComponentCreationBlock)creationBlock +NS_SWIFT_NAME(init(_:instantiationTiming:creationBlock:)); + +// clang-format on + +/// Unavailable. +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END + +#endif // FIREBASECORE_FIRCOMPONENT_H diff --git a/Pods/FirebaseCore/FirebaseCore/Extension/FIRComponentContainer.h b/Pods/FirebaseCore/FirebaseCore/Extension/FIRComponentContainer.h new file mode 100644 index 0000000..6864087 --- /dev/null +++ b/Pods/FirebaseCore/FirebaseCore/Extension/FIRComponentContainer.h @@ -0,0 +1,51 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FIREBASECORE_FIRCOMPONENTCONTAINER_H +#define FIREBASECORE_FIRCOMPONENTCONTAINER_H + +#import + +NS_ASSUME_NONNULL_BEGIN + +/// A type-safe macro to retrieve a component from a container. This should be used to retrieve +/// components instead of using the container directly. +#define FIR_COMPONENT(type, container) \ + [FIRComponentType> instanceForProtocol:@protocol(type) inContainer:container] + +@class FIRApp; + +/// A container that holds different components that are registered via the +/// `registerAsComponentRegistrant` call. These classes should conform to `ComponentRegistrant` +/// in order to properly register components for Core. +NS_SWIFT_NAME(FirebaseComponentContainer) +@interface FIRComponentContainer : NSObject + +/// A weak reference to the app that an instance of the container belongs to. +@property(nonatomic, weak, readonly) FIRApp *app; + +// TODO: See if we can get improved type safety here. +/// A Swift only API for fetching an instance since the top macro isn't available. +- (nullable id)__instanceForProtocol:(Protocol *)protocol NS_SWIFT_NAME(instance(for:)); + +/// Unavailable. Use the `container` property on `FirebaseApp`. +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END + +#endif // FIREBASECORE_FIRCOMPONENTCONTAINER_H diff --git a/Pods/FirebaseCore/FirebaseCore/Extension/FIRComponentType.h b/Pods/FirebaseCore/FirebaseCore/Extension/FIRComponentType.h new file mode 100644 index 0000000..92a5aab --- /dev/null +++ b/Pods/FirebaseCore/FirebaseCore/Extension/FIRComponentType.h @@ -0,0 +1,40 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FIREBASECORE_FIRCOMPONENTTYPE_H +#define FIREBASECORE_FIRCOMPONENTTYPE_H + +#import + +@class FIRComponentContainer; + +NS_ASSUME_NONNULL_BEGIN + +/// Do not use directly. A placeholder type in order to provide a macro that will warn users of +/// mis-matched protocols. +NS_SWIFT_NAME(ComponentType) +@interface FIRComponentType<__covariant T> : NSObject + +/// Do not use directly. A factory method to retrieve an instance that provides a specific +/// functionality. ++ (nullable T)instanceForProtocol:(Protocol *)protocol + inContainer:(FIRComponentContainer *)container; + +@end + +NS_ASSUME_NONNULL_END + +#endif // FIREBASECORE_FIRCOMPONENTTYPE_H diff --git a/Pods/FirebaseCore/FirebaseCore/Extension/FIRHeartbeatLogger.h b/Pods/FirebaseCore/FirebaseCore/Extension/FIRHeartbeatLogger.h new file mode 100644 index 0000000..95497d2 --- /dev/null +++ b/Pods/FirebaseCore/FirebaseCore/Extension/FIRHeartbeatLogger.h @@ -0,0 +1,110 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef FIREBASECORE_FIRHEARTBEATLOGGER_H +#define FIREBASECORE_FIRHEARTBEATLOGGER_H + +#import + +NS_ASSUME_NONNULL_BEGIN + +#ifndef FIREBASE_BUILD_CMAKE +@class FIRHeartbeatsPayload; +#endif // FIREBASE_BUILD_CMAKE + +/// Enum representing different daily heartbeat codes. +/// This enum is only used by clients using platform logging V1. This is because +/// the V1 payload only supports a single daily heartbeat. +typedef NS_ENUM(NSInteger, FIRDailyHeartbeatCode) { + /// Represents the absence of a daily heartbeat. + FIRDailyHeartbeatCodeNone = 0, + /// Represents the presence of a daily heartbeat. + FIRDailyHeartbeatCodeSome = 2, +}; + +NS_SWIFT_SENDABLE +@protocol FIRHeartbeatLoggerProtocol + +/// Asynchronously logs a heartbeat. +- (void)log; + +/// Gets the heartbeat code for today. +- (FIRDailyHeartbeatCode)heartbeatCodeForToday; + +#ifndef FIREBASE_BUILD_CMAKE +/// Returns the header value for the heartbeat logger via the given completion handler.. +- (void)asyncHeaderValueWithCompletionHandler:(void (^)(NSString *_Nullable))completionHandler + API_AVAILABLE(ios(13.0), macosx(10.15), macCatalyst(13.0), tvos(13.0), watchos(6.0)); + +/// Return the header value for the heartbeat logger. +- (NSString *_Nullable)headerValue; +#endif // FIREBASE_BUILD_CMAKE + +@end + +#ifndef FIREBASE_BUILD_CMAKE +/// Returns a nullable string header value from a given heartbeats payload. +/// +/// This API returns `nil` when the given heartbeats payload is considered empty. +/// +/// @param heartbeatsPayload The heartbeats payload. +NSString *_Nullable FIRHeaderValueFromHeartbeatsPayload(FIRHeartbeatsPayload *heartbeatsPayload); +#endif // FIREBASE_BUILD_CMAKE + +/// A thread safe, synchronized object that logs and flushes platform logging info. +@interface FIRHeartbeatLogger : NSObject + +/// Designated initializer. +/// +/// @param appID The app ID that this heartbeat logger corresponds to. +- (instancetype)initWithAppID:(NSString *)appID; + +/// Asynchronously logs a new heartbeat corresponding to the Firebase User Agent, if needed. +/// +/// @note This API is thread-safe. +- (void)log; + +#ifndef FIREBASE_BUILD_CMAKE +/// Synchronously flushes heartbeats from storage into a structured payload of heartbeats. +/// +/// This API is for clients using platform logging V2. +/// +/// @note This API is thread-safe. +/// @return A payload of heartbeats. +- (FIRHeartbeatsPayload *)flushHeartbeatsIntoPayload; + +/// Asynchronously flushes heartbeats from storage into a structured payload of heartbeats. +/// +/// This API is for clients using platform logging V2. +/// +/// @note This API is thread-safe. +/// @param completionHandler A completion handler to process the flushed payload of heartbeats. +- (void)flushHeartbeatsIntoPayloadWithCompletionHandler: + (void (^)(FIRHeartbeatsPayload *))completionHandler + API_AVAILABLE(ios(13.0), macosx(10.15), macCatalyst(13.0), tvos(13.0), watchos(6.0)); +#endif // FIREBASE_BUILD_CMAKE + +/// Gets today's corresponding heartbeat code. +/// +/// This API is for clients using platform logging V1. +/// +/// @note This API is thread-safe. +/// @return Heartbeat code indicating whether or not there is an unsent global heartbeat. +- (FIRDailyHeartbeatCode)heartbeatCodeForToday; + +@end + +NS_ASSUME_NONNULL_END + +#endif // FIREBASECORE_FIRHEARTBEATLOGGER_H diff --git a/Pods/FirebaseCore/FirebaseCore/Extension/FIRLibrary.h b/Pods/FirebaseCore/FirebaseCore/Extension/FIRLibrary.h new file mode 100644 index 0000000..fe256ad --- /dev/null +++ b/Pods/FirebaseCore/FirebaseCore/Extension/FIRLibrary.h @@ -0,0 +1,44 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FIREBASECORE_FIRLIBRARY_H +#define FIREBASECORE_FIRLIBRARY_H + +#ifndef FIRLibrary_h +#define FIRLibrary_h + +#import + +@class FIRApp; +@class FIRComponent; + +NS_ASSUME_NONNULL_BEGIN + +/// Provide an interface to register a library for userAgent logging and availability to others. +NS_SWIFT_NAME(Library) +@protocol FIRLibrary + +/// Returns one or more Components that will be registered in +/// FirebaseApp and participate in dependency resolution and injection. ++ (NSArray *)componentsToRegister; + +@end + +NS_ASSUME_NONNULL_END + +#endif /* FIRLibrary_h */ + +#endif // FIREBASECORE_FIRLIBRARY_H diff --git a/Pods/FirebaseCore/FirebaseCore/Extension/FIRLogger.h b/Pods/FirebaseCore/FirebaseCore/Extension/FIRLogger.h new file mode 100644 index 0000000..8117189 --- /dev/null +++ b/Pods/FirebaseCore/FirebaseCore/Extension/FIRLogger.h @@ -0,0 +1,198 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FIREBASECORE_FIRLOGGER_H +#define FIREBASECORE_FIRLOGGER_H + +#import + +typedef NS_ENUM(NSInteger, FIRLoggerLevel); + +NS_ASSUME_NONNULL_BEGIN + +/** + * The Firebase services used in Firebase logger. + */ +typedef NSString *const FIRLoggerService; + +extern NSString *const kFIRLoggerAnalytics; +extern NSString *const kFIRLoggerCrash; +extern NSString *const kFIRLoggerCore; +extern NSString *const kFIRLoggerRemoteConfig; + +/** + * The key used to store the logger's error count. + */ +extern NSString *const kFIRLoggerErrorCountKey; + +/** + * The key used to store the logger's warning count. + */ +extern NSString *const kFIRLoggerWarningCountKey; + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/** + * Enables or disables Analytics debug mode. + * If set to true, the logging level for Analytics will be set to FirebaseLoggerLevelDebug. + * Enabling the debug mode has no effect if the app is running from App Store. + * (required) analytics debug mode flag. + */ +void FIRSetAnalyticsDebugMode(BOOL analyticsDebugMode); + +/** + * Gets the current FIRLoggerLevel. + */ +FIRLoggerLevel FIRGetLoggerLevel(void); + +/** + * Changes the default logging level of FirebaseLoggerLevelNotice to a user-specified level. + * The default level cannot be set above FirebaseLoggerLevelNotice if the app is running from App + * Store. (required) log level (one of the FirebaseLoggerLevel enum values). + */ +void FIRSetLoggerLevel(FIRLoggerLevel loggerLevel); + +void FIRSetLoggerLevelNotice(void); +void FIRSetLoggerLevelWarning(void); +void FIRSetLoggerLevelError(void); +void FIRSetLoggerLevelDebug(void); + +/** + * Checks if the specified logger level is loggable given the current settings. + * (required) log level (one of the FirebaseLoggerLevel enum values). + * (required) whether or not this function is called from the Analytics component. + */ +BOOL FIRIsLoggableLevel(FIRLoggerLevel loggerLevel, BOOL analyticsComponent); + +BOOL FIRIsLoggableLevelNotice(void); +BOOL FIRIsLoggableLevelWarning(void); +BOOL FIRIsLoggableLevelError(void); +BOOL FIRIsLoggableLevelDebug(void); + +/** + * Logs a message to the Xcode console and the device log. If running from AppStore, will + * not log any messages with a level higher than FirebaseLoggerLevelNotice to avoid log spamming. + * (required) log level (one of the FirebaseLoggerLevel enum values). + * (required) service name of type FirebaseLoggerService. + * (required) message code starting with "I-" which means iOS, followed by a capitalized + * three-character service identifier and a six digit integer message ID that is unique + * within the service. + * An example of the message code is @"I-COR000001". + * (required) message string which can be a format string. + * (optional) variable arguments list obtained from calling va_start, used when message is a format + * string. + */ +extern void FIRLogBasic(FIRLoggerLevel level, + NSString *category, + NSString *messageCode, + NSString *message, +// On 64-bit simulators, va_list is not a pointer, so cannot be marked nullable +// See: http://stackoverflow.com/q/29095469 +#if __LP64__ && TARGET_OS_SIMULATOR || TARGET_OS_OSX + va_list args_ptr +#else + va_list _Nullable args_ptr +#endif +); + +/** + * The following functions accept the following parameters in order: + * (required) service name of type FirebaseLoggerService. + * (required) message code starting from "I-" which means iOS, followed by a capitalized + * three-character service identifier and a six digit integer message ID that is unique + * within the service. + * An example of the message code is @"I-COR000001". + * See go/firebase-log-proposal for details. + * (required) message string which can be a format string. + * (optional) the list of arguments to substitute into the format string. + * Example usage: + * FirebaseLogError(kFirebaseLoggerCore, @"I-COR000001", @"Configuration of %@ failed.", app.name); + */ +extern void FIRLogError(NSString *category, NSString *messageCode, NSString *message, ...) + NS_FORMAT_FUNCTION(3, 4); +extern void FIRLogWarning(NSString *category, NSString *messageCode, NSString *message, ...) + NS_FORMAT_FUNCTION(3, 4); +extern void FIRLogNotice(NSString *category, NSString *messageCode, NSString *message, ...) + NS_FORMAT_FUNCTION(3, 4); +extern void FIRLogInfo(NSString *category, NSString *messageCode, NSString *message, ...) + NS_FORMAT_FUNCTION(3, 4); +extern void FIRLogDebug(NSString *category, NSString *messageCode, NSString *message, ...) + NS_FORMAT_FUNCTION(3, 4); + +/** + * This function is similar to the one above, except it takes a `va_list` instead of the listed + * variables. + * + * The following functions accept the following parameters in order: (required) service + * name of type FirebaseLoggerService. + * + * (required) message code starting from "I-" which means iOS, + * followed by a capitalized three-character service identifier and a six digit integer message + * ID that is unique within the service. An example of the message code is @"I-COR000001". + * See go/firebase-log-proposal for details. + * (required) message string which can be a format string. + * (optional) A va_list + */ +extern void FIRLogBasicError(NSString *category, + NSString *messageCode, + NSString *message, + va_list args_ptr); +extern void FIRLogBasicWarning(NSString *category, + NSString *messageCode, + NSString *message, + va_list args_ptr); +extern void FIRLogBasicNotice(NSString *category, + NSString *messageCode, + NSString *message, + va_list args_ptr); +extern void FIRLogBasicInfo(NSString *category, + NSString *messageCode, + NSString *message, + va_list args_ptr); +extern void FIRLogBasicDebug(NSString *category, + NSString *messageCode, + NSString *message, + va_list args_ptr); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + +NS_SWIFT_NAME(FirebaseLogger) +@interface FIRLoggerWrapper : NSObject + +/// Logs a given message at a given log level. +/// +/// - Parameters: +/// - level: The log level to use (defined by `FirebaseLoggerLevel` enum values). +/// - category: The service name of type `FirebaseLoggerService`. +/// - code: The message code. Starting with "I-" which means iOS, followed by a capitalized +/// three-character service identifier and a six digit integer message ID that is unique within +/// the service. An example of the message code is @"I-COR000001". +/// - message: Formatted string to be used as the log's message. ++ (void)logWithLevel:(FIRLoggerLevel)level + service:(NSString *)category + code:(NSString *)code + message:(NSString *)message + __attribute__((__swift_name__("log(level:service:code:message:)"))); + +@end + +NS_ASSUME_NONNULL_END + +#endif // FIREBASECORE_FIRLOGGER_H diff --git a/Pods/FirebaseCore/FirebaseCore/Extension/FirebaseCoreInternal.h b/Pods/FirebaseCore/FirebaseCore/Extension/FirebaseCoreInternal.h new file mode 100644 index 0000000..2561008 --- /dev/null +++ b/Pods/FirebaseCore/FirebaseCore/Extension/FirebaseCoreInternal.h @@ -0,0 +1,28 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef FIREBASECORE_FIREBASECOREINTERNAL_H +#define FIREBASECORE_FIREBASECOREINTERNAL_H + +@import FirebaseCore; + +#import "FIRAppInternal.h" +#import "FIRComponent.h" +#import "FIRComponentContainer.h" +#import "FIRComponentType.h" +#import "FIRHeartbeatLogger.h" +#import "FIRLibrary.h" +#import "FIRLogger.h" + +#endif // FIREBASECORE_FIREBASECOREINTERNAL_H diff --git a/Pods/FirebaseCore/FirebaseCore/Sources/FIRAnalyticsConfiguration.h b/Pods/FirebaseCore/FirebaseCore/Sources/FIRAnalyticsConfiguration.h new file mode 100644 index 0000000..9d2285c --- /dev/null +++ b/Pods/FirebaseCore/FirebaseCore/Sources/FIRAnalyticsConfiguration.h @@ -0,0 +1,48 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +/// Values stored in analyticsEnabledState. Never alter these constants since they must match with +/// values persisted to disk. +typedef NS_ENUM(int64_t, FIRAnalyticsEnabledState) { + // 0 is the default value for keys not found stored in persisted config, so it cannot represent + // kFIRAnalyticsEnabledStateSetNo. It must represent kFIRAnalyticsEnabledStateNotSet. + kFIRAnalyticsEnabledStateNotSet = 0, + kFIRAnalyticsEnabledStateSetYes = 1, + kFIRAnalyticsEnabledStateSetNo = 2, +}; + +/// The user defaults key for the persisted measurementEnabledState value. FIRAPersistedConfig reads +/// measurementEnabledState using this same key. +static NSString *const kFIRAPersistedConfigMeasurementEnabledStateKey = + @"/google/measurement/measurement_enabled_state"; + +static NSString *const kFIRAnalyticsConfigurationSetEnabledNotification = + @"FIRAnalyticsConfigurationSetEnabledNotification"; + +@interface FIRAnalyticsConfiguration : NSObject + +/// Returns the shared instance of FIRAnalyticsConfiguration. ++ (FIRAnalyticsConfiguration *)sharedInstance; + +/// Sets whether analytics collection is enabled for this app on this device, and a flag to persist +/// the value or not. The setting should not be persisted if being set by the global data collection +/// flag. +- (void)setAnalyticsCollectionEnabled:(BOOL)analyticsCollectionEnabled + persistSetting:(BOOL)shouldPersist; + +@end diff --git a/Pods/FirebaseCore/FirebaseCore/Sources/FIRAnalyticsConfiguration.m b/Pods/FirebaseCore/FirebaseCore/Sources/FIRAnalyticsConfiguration.m new file mode 100644 index 0000000..44132cb --- /dev/null +++ b/Pods/FirebaseCore/FirebaseCore/Sources/FIRAnalyticsConfiguration.m @@ -0,0 +1,58 @@ +// Copyright 2017 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +#import "FirebaseCore/Sources/FIRAnalyticsConfiguration.h" + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-implementations" +@implementation FIRAnalyticsConfiguration +#pragma clang diagnostic pop + ++ (FIRAnalyticsConfiguration *)sharedInstance { + static FIRAnalyticsConfiguration *sharedInstance = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + sharedInstance = [[FIRAnalyticsConfiguration alloc] init]; + }); + return sharedInstance; +} + +- (void)postNotificationName:(NSString *)name value:(id)value { + if (!name.length || !value) { + return; + } + [[NSNotificationCenter defaultCenter] postNotificationName:name + object:self + userInfo:@{name : value}]; +} + +- (void)setAnalyticsCollectionEnabled:(BOOL)analyticsCollectionEnabled + persistSetting:(BOOL)shouldPersist { + // Persist the measurementEnabledState. Use FIRAnalyticsEnabledState values instead of YES/NO. + FIRAnalyticsEnabledState analyticsEnabledState = + analyticsCollectionEnabled ? kFIRAnalyticsEnabledStateSetYes : kFIRAnalyticsEnabledStateSetNo; + if (shouldPersist) { + NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; + [userDefaults setObject:@(analyticsEnabledState) + forKey:kFIRAPersistedConfigMeasurementEnabledStateKey]; + [userDefaults synchronize]; + } + + [self postNotificationName:kFIRAnalyticsConfigurationSetEnabledNotification + value:@(analyticsCollectionEnabled)]; +} + +@end diff --git a/Pods/FirebaseCore/FirebaseCore/Sources/FIRApp.m b/Pods/FirebaseCore/FirebaseCore/Sources/FIRApp.m new file mode 100644 index 0000000..0cbcea1 --- /dev/null +++ b/Pods/FirebaseCore/FirebaseCore/Sources/FIRApp.m @@ -0,0 +1,890 @@ +// Copyright 2017 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include + +#if __has_include() +#import +#endif + +#if __has_include() +#import +#endif + +#if __has_include() +#import +#endif + +#import "FirebaseCore/Sources/Public/FirebaseCore/FIRApp.h" + +#import "FirebaseCore/Sources/FIRAnalyticsConfiguration.h" +#import "FirebaseCore/Sources/FIRBundleUtil.h" +#import "FirebaseCore/Sources/FIRComponentContainerInternal.h" +#import "FirebaseCore/Sources/FIRConfigurationInternal.h" +#import "FirebaseCore/Sources/FIRFirebaseUserAgent.h" + +#import "FirebaseCore/Extension/FIRAppInternal.h" +#import "FirebaseCore/Extension/FIRHeartbeatLogger.h" +#import "FirebaseCore/Extension/FIRLibrary.h" +#import "FirebaseCore/Extension/FIRLogger.h" +#import "FirebaseCore/Sources/FIROptionsInternal.h" +#import "FirebaseCore/Sources/Public/FirebaseCore/FIROptions.h" +#import "FirebaseCore/Sources/Public/FirebaseCore/FIRVersion.h" + +#import + +#import + +NSString *const kFIRDefaultAppName = @"__FIRAPP_DEFAULT"; +NSString *const kFIRAppReadyToConfigureSDKNotification = @"FIRAppReadyToConfigureSDKNotification"; +NSString *const kFIRAppDeleteNotification = @"FIRAppDeleteNotification"; +NSString *const kFIRAppIsDefaultAppKey = @"FIRAppIsDefaultAppKey"; +NSString *const kFIRAppNameKey = @"FIRAppNameKey"; +NSString *const kFIRGoogleAppIDKey = @"FIRGoogleAppIDKey"; + +NSString *const kFIRGlobalAppDataCollectionEnabledDefaultsKeyFormat = + @"/google/firebase/global_data_collection_enabled:%@"; +NSString *const kFIRGlobalAppDataCollectionEnabledPlistKey = + @"FirebaseDataCollectionDefaultEnabled"; + +NSString *const kFIRAppDiagnosticsConfigurationTypeKey = @"ConfigType"; +NSString *const kFIRAppDiagnosticsErrorKey = @"Error"; +NSString *const kFIRAppDiagnosticsFIRAppKey = @"FIRApp"; +NSString *const kFIRAppDiagnosticsSDKNameKey = @"SDKName"; +NSString *const kFIRAppDiagnosticsSDKVersionKey = @"SDKVersion"; +NSString *const kFIRAppDiagnosticsApplePlatformPrefix = @"apple-platform"; + +// Auth internal notification notification and key. +NSString *const FIRAuthStateDidChangeInternalNotification = + @"FIRAuthStateDidChangeInternalNotification"; +NSString *const FIRAuthStateDidChangeInternalNotificationAppKey = + @"FIRAuthStateDidChangeInternalNotificationAppKey"; +NSString *const FIRAuthStateDidChangeInternalNotificationTokenKey = + @"FIRAuthStateDidChangeInternalNotificationTokenKey"; +NSString *const FIRAuthStateDidChangeInternalNotificationUIDKey = + @"FIRAuthStateDidChangeInternalNotificationUIDKey"; + +/** + * Error domain for exceptions and NSError construction. + */ +NSString *const kFirebaseCoreErrorDomain = @"com.firebase.core"; + +/** + * The URL to download plist files. + */ +static NSString *const kPlistURL = @"https://console.firebase.google.com/"; + +@interface FIRApp () + +#ifdef DEBUG +@property(nonatomic) BOOL alreadyOutputDataCollectionFlag; +#endif // DEBUG + +@end + +@implementation FIRApp + +// This is necessary since our custom getter prevents `_options` from being created. +@synthesize options = _options; + +static NSMutableDictionary *sAllApps; +static FIRApp *sDefaultApp; + ++ (void)configure { + FIROptions *options = [FIROptions defaultOptions]; + if (!options) { +#if DEBUG + [self findMisnamedGoogleServiceInfoPlist]; +#endif // DEBUG + [NSException raise:kFirebaseCoreErrorDomain + format:@"`FirebaseApp.configure()` could not find " + @"a valid GoogleService-Info.plist in your project. Please download one " + @"from %@.", + kPlistURL]; + } + [FIRApp configureWithOptions:options]; +} + ++ (void)configureWithOptions:(FIROptions *)options { + if (!options) { + [NSException raise:kFirebaseCoreErrorDomain + format:@"Options is nil. Please pass a valid options."]; + } + [FIRApp configureWithName:kFIRDefaultAppName options:options]; +} + ++ (NSCharacterSet *)applicationNameAllowedCharacters { + static NSCharacterSet *applicationNameAllowedCharacters; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSMutableCharacterSet *allowedNameCharacters = [NSMutableCharacterSet alphanumericCharacterSet]; + [allowedNameCharacters addCharactersInString:@"-_"]; + applicationNameAllowedCharacters = [allowedNameCharacters copy]; + }); + return applicationNameAllowedCharacters; +} + ++ (void)configureWithName:(NSString *)name options:(FIROptions *)options { + if (!name || !options) { + [NSException raise:kFirebaseCoreErrorDomain format:@"Neither name nor options can be nil."]; + } + if (name.length == 0) { + [NSException raise:kFirebaseCoreErrorDomain format:@"Name cannot be empty."]; + } + + if ([name isEqualToString:kFIRDefaultAppName]) { + if (sDefaultApp) { + // The default app already exists. Handle duplicate `configure` calls and return. + [self appWasConfiguredTwice:sDefaultApp usingOptions:options]; + return; + } + + FIRLogDebug(kFIRLoggerCore, @"I-COR000001", @"Configuring the default app."); + } else { + // Validate the app name and ensure it hasn't been configured already. + NSCharacterSet *nameCharacters = [NSCharacterSet characterSetWithCharactersInString:name]; + + if (![[self applicationNameAllowedCharacters] isSupersetOfSet:nameCharacters]) { + [NSException raise:kFirebaseCoreErrorDomain + format:@"App name can only contain alphanumeric, " + @"hyphen (-), and underscore (_) characters"]; + } + + @synchronized(self) { + if (sAllApps && sAllApps[name]) { + // The app already exists. Handle a duplicate `configure` call and return. + [self appWasConfiguredTwice:sAllApps[name] usingOptions:options]; + return; + } + } + + FIRLogDebug(kFIRLoggerCore, @"I-COR000002", @"Configuring app named %@", name); + } + + // Default instantiation, make sure we populate with Swift SDKs that can't register in time. + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + [self registerSwiftComponents]; + }); + + @synchronized(self) { + FIRApp *app = [[FIRApp alloc] initInstanceWithName:name options:options]; + if (app.isDefaultApp) { + sDefaultApp = app; + } + + [FIRApp addAppToAppDictionary:app]; + + // The FIRApp instance is ready to go, `sDefaultApp` is assigned, other SDKs are now ready to be + // instantiated. + [app.container instantiateEagerComponents]; + [FIRApp sendNotificationsToSDKs:app]; + } +} + +/// Called when `configure` has been called multiple times for the same app. This can either throw +/// an exception (most cases) or ignore the duplicate configuration in situations where it's allowed +/// like an extension. ++ (void)appWasConfiguredTwice:(FIRApp *)app usingOptions:(FIROptions *)options { + // Only extensions should potentially be able to call `configure` more than once. + if (![GULAppEnvironmentUtil isAppExtension]) { + // Throw an exception since this is now an invalid state. + if (app.isDefaultApp) { + [NSException raise:kFirebaseCoreErrorDomain + format:@"Default app has already been configured."]; + } else { + [NSException raise:kFirebaseCoreErrorDomain + format:@"App named %@ has already been configured.", app.name]; + } + } + + // In an extension, the entry point could be called multiple times. As long as the options are + // identical we should allow multiple `configure` calls. + if ([options isEqual:app.options]) { + // Everything is identical but the extension's lifecycle triggered `configure` twice. + // Ignore duplicate calls and return since everything should still be in a valid state. + FIRLogDebug(kFIRLoggerCore, @"I-COR000035", + @"Ignoring second `configure` call in an extension."); + return; + } else { + [NSException raise:kFirebaseCoreErrorDomain + format:@"App named %@ has already been configured.", app.name]; + } +} + ++ (FIRApp *)defaultApp { + if (sDefaultApp) { + return sDefaultApp; + } + FIRLogError(kFIRLoggerCore, @"I-COR000003", + @"The default Firebase app has not yet been " + @"configured. Add `FirebaseApp.configure()` to your " + @"application initialization. This can be done in " + @"in the App Delegate's application(_:didFinishLaunchingWithOptions:)` " + @"(or the `@main` struct's initializer in SwiftUI). " + @"Read more: " + @"https://firebase.google.com/docs/ios/setup#initialize_firebase_in_your_app"); + return nil; +} + ++ (FIRApp *)appNamed:(NSString *)name { + @synchronized(self) { + if (sAllApps) { + FIRApp *app = sAllApps[name]; + if (app) { + return app; + } + } + FIRLogError(kFIRLoggerCore, @"I-COR000004", @"App with name %@ does not exist.", name); + return nil; + } +} + ++ (NSDictionary *)allApps { + @synchronized(self) { + if (!sAllApps) { + FIRLogError(kFIRLoggerCore, @"I-COR000005", @"No app has been configured yet."); + } + return [sAllApps copy]; + } +} + +// Public only for tests ++ (void)resetApps { + @synchronized(self) { + sDefaultApp = nil; + [sAllApps removeAllObjects]; + sAllApps = nil; + [[self userAgent] reset]; + } +} + +- (void)deleteApp:(FIRAppVoidBoolCallback)completion { + @synchronized([self class]) { + if (sAllApps && sAllApps[self.name]) { + FIRLogDebug(kFIRLoggerCore, @"I-COR000006", @"Deleting app named %@", self.name); + + // Remove all registered libraries from the container to avoid creating new instances. + [self.container removeAllComponents]; + // Remove all cached instances from the container before deleting the app. + [self.container removeAllCachedInstances]; + + [sAllApps removeObjectForKey:self.name]; + [self clearDataCollectionSwitchFromUserDefaults]; + if ([self.name isEqualToString:kFIRDefaultAppName]) { + sDefaultApp = nil; + } + NSDictionary *appInfoDict = @{kFIRAppNameKey : self.name}; + [[NSNotificationCenter defaultCenter] postNotificationName:kFIRAppDeleteNotification + object:[self class] + userInfo:appInfoDict]; + completion(YES); + } else { + FIRLogError(kFIRLoggerCore, @"I-COR000007", @"App does not exist."); + completion(NO); + } + } +} + ++ (void)addAppToAppDictionary:(FIRApp *)app { + if (!sAllApps) { + sAllApps = [NSMutableDictionary dictionary]; + } + if ([app configureCore]) { + sAllApps[app.name] = app; + } else { + [NSException raise:kFirebaseCoreErrorDomain + format:@"Configuration fails. It may be caused by an invalid GOOGLE_APP_ID in " + @"GoogleService-Info.plist or set in the customized options."]; + } +} + +- (instancetype)initInstanceWithName:(NSString *)name options:(FIROptions *)options { + self = [super init]; + if (self) { + _name = [name copy]; + _options = [options copy]; + _options.editingLocked = YES; + _isDefaultApp = [name isEqualToString:kFIRDefaultAppName]; + _container = [[FIRComponentContainer alloc] initWithApp:self]; + _heartbeatLogger = [[FIRHeartbeatLogger alloc] initWithAppID:self.options.googleAppID]; + } + return self; +} + +- (void)dealloc { + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +- (BOOL)configureCore { + [self checkExpectedBundleID]; + if (![self isAppIDValid]) { + return NO; + } + + // Initialize the Analytics once there is a valid options under default app. Analytics should + // always initialize first by itself before the other SDKs. + if ([self.name isEqualToString:kFIRDefaultAppName]) { + Class firAnalyticsClass = NSClassFromString(@"FIRAnalytics"); + if (firAnalyticsClass) { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wundeclared-selector" + SEL startWithConfigurationSelector = @selector(startWithConfiguration:options:); +#pragma clang diagnostic pop + if ([firAnalyticsClass respondsToSelector:startWithConfigurationSelector]) { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-performSelector-leaks" +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + [firAnalyticsClass performSelector:startWithConfigurationSelector + withObject:[FIRConfiguration sharedInstance].analyticsConfiguration + withObject:_options]; +#pragma clang diagnostic pop + } + } + } + + [self subscribeForAppDidBecomeActiveNotifications]; + + return YES; +} + +- (FIROptions *)options { + return [_options copy]; +} + +- (void)setDataCollectionDefaultEnabled:(BOOL)dataCollectionDefaultEnabled { +#ifdef DEBUG + FIRLogDebug(kFIRLoggerCore, @"I-COR000034", @"Explicitly %@ data collection flag.", + dataCollectionDefaultEnabled ? @"enabled" : @"disabled"); + self.alreadyOutputDataCollectionFlag = YES; +#endif // DEBUG + + NSString *key = + [NSString stringWithFormat:kFIRGlobalAppDataCollectionEnabledDefaultsKeyFormat, self.name]; + [[NSUserDefaults standardUserDefaults] setBool:dataCollectionDefaultEnabled forKey:key]; + + // Core also controls the FirebaseAnalytics flag, so check if the Analytics flags are set + // within FIROptions and change the Analytics value if necessary. Analytics only works with the + // default app, so return if this isn't the default app. + if (!self.isDefaultApp) { + return; + } + + // Check if the Analytics flag is explicitly set. If so, no further actions are necessary. + if ([self.options isAnalyticsCollectionExplicitlySet]) { + return; + } + + // The Analytics flag has not been explicitly set, so update with the value being set. +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + [[FIRAnalyticsConfiguration sharedInstance] + setAnalyticsCollectionEnabled:dataCollectionDefaultEnabled + persistSetting:NO]; +#pragma clang diagnostic pop +} + +- (BOOL)isDataCollectionDefaultEnabled { + // Check if it's been manually set before in code, and use that as the higher priority value. + NSNumber *defaultsObject = [[self class] readDataCollectionSwitchFromUserDefaultsForApp:self]; + if (defaultsObject != nil) { +#ifdef DEBUG + if (!self.alreadyOutputDataCollectionFlag) { + FIRLogDebug(kFIRLoggerCore, @"I-COR000031", @"Data Collection flag is %@ in user defaults.", + [defaultsObject boolValue] ? @"enabled" : @"disabled"); + self.alreadyOutputDataCollectionFlag = YES; + } +#endif // DEBUG + return [defaultsObject boolValue]; + } + + // Read the Info.plist to see if the flag is set. If it's not set, it should default to `YES`. + // As per the implementation of `readDataCollectionSwitchFromPlist`, it's a cached value and has + // no performance impact calling multiple times. + NSNumber *collectionEnabledPlistValue = [[self class] readDataCollectionSwitchFromPlist]; + if (collectionEnabledPlistValue != nil) { +#ifdef DEBUG + if (!self.alreadyOutputDataCollectionFlag) { + FIRLogDebug(kFIRLoggerCore, @"I-COR000032", @"Data Collection flag is %@ in plist.", + [collectionEnabledPlistValue boolValue] ? @"enabled" : @"disabled"); + self.alreadyOutputDataCollectionFlag = YES; + } +#endif // DEBUG + return [collectionEnabledPlistValue boolValue]; + } + +#ifdef DEBUG + if (!self.alreadyOutputDataCollectionFlag) { + FIRLogDebug(kFIRLoggerCore, @"I-COR000033", @"Data Collection flag is not set."); + self.alreadyOutputDataCollectionFlag = YES; + } +#endif // DEBUG + return YES; +} + +#pragma mark - private + ++ (void)sendNotificationsToSDKs:(FIRApp *)app { + // TODO: Remove this notification once all SDKs are registered with `FIRCoreConfigurable`. + NSNumber *isDefaultApp = [NSNumber numberWithBool:app.isDefaultApp]; + NSDictionary *appInfoDict = @{ + kFIRAppNameKey : app.name, + kFIRAppIsDefaultAppKey : isDefaultApp, + kFIRGoogleAppIDKey : app.options.googleAppID + }; + [[NSNotificationCenter defaultCenter] postNotificationName:kFIRAppReadyToConfigureSDKNotification + object:self + userInfo:appInfoDict]; +} + ++ (BOOL)isDefaultAppConfigured { + return (sDefaultApp != nil); +} + ++ (void)registerLibrary:(nonnull NSString *)name withVersion:(nonnull NSString *)version { + // Create the set of characters which aren't allowed, only if this feature is used. + NSMutableCharacterSet *allowedSet = [NSMutableCharacterSet alphanumericCharacterSet]; + [allowedSet addCharactersInString:@"-_."]; + NSCharacterSet *disallowedSet = [allowedSet invertedSet]; + // Make sure the library name and version strings do not contain unexpected characters, and + // add the name/version pair to the dictionary. + if ([name rangeOfCharacterFromSet:disallowedSet].location == NSNotFound && + [version rangeOfCharacterFromSet:disallowedSet].location == NSNotFound) { + [[self userAgent] setValue:version forComponent:name]; + } else { + FIRLogError(kFIRLoggerCore, @"I-COR000027", + @"The library name (%@) or version number (%@) contain invalid characters. " + @"Only alphanumeric, dash, underscore and period characters are allowed.", + name, version); + } +} + ++ (void)registerInternalLibrary:(nonnull Class)library + withName:(nonnull NSString *)name { + [self registerInternalLibrary:library withName:name withVersion:FIRFirebaseVersion()]; +} + ++ (void)registerInternalLibrary:(nonnull Class)library + withName:(nonnull NSString *)name + withVersion:(nonnull NSString *)version { + // This is called at +load time, keep the work to a minimum. + + // Ensure the class given conforms to the proper protocol. + if (![(Class)library conformsToProtocol:@protocol(FIRLibrary)] || + ![(Class)library respondsToSelector:@selector(componentsToRegister)]) { + [NSException raise:NSInvalidArgumentException + format:@"Class %@ attempted to register components, but it does not conform to " + @"`FIRLibrary or provide a `componentsToRegister:` method.", + library]; + } + + [FIRComponentContainer registerAsComponentRegistrant:library]; + [self registerLibrary:name withVersion:version]; +} + ++ (FIRFirebaseUserAgent *)userAgent { + static dispatch_once_t onceToken; + static FIRFirebaseUserAgent *_userAgent; + dispatch_once(&onceToken, ^{ + _userAgent = [[FIRFirebaseUserAgent alloc] init]; + [_userAgent setValue:FIRFirebaseVersion() forComponent:@"fire-ios"]; + }); + return _userAgent; +} + ++ (NSString *)firebaseUserAgent { + return [[self userAgent] firebaseUserAgent]; +} + +- (void)checkExpectedBundleID { + NSArray *bundles = [FIRBundleUtil relevantBundles]; + NSString *expectedBundleID = [self expectedBundleID]; + // The checking is only done when the bundle ID is provided in the serviceInfo dictionary for + // backward compatibility. + if (expectedBundleID != nil && ![FIRBundleUtil hasBundleIdentifierPrefix:expectedBundleID + inBundles:bundles]) { + FIRLogError(kFIRLoggerCore, @"I-COR000008", + @"The project's Bundle ID is inconsistent with " + @"either the Bundle ID in '%@.%@', or the Bundle ID in the options if you are " + @"using a customized options. To ensure that everything can be configured " + @"correctly, you may need to make the Bundle IDs consistent. To continue with this " + @"plist file, you may change your app's bundle identifier to '%@'. Or you can " + @"download a new configuration file that matches your bundle identifier from %@ " + @"and replace the current one.", + kServiceInfoFileName, kServiceInfoFileType, expectedBundleID, kPlistURL); + } +} + +#pragma mark - private - App ID Validation + +/** + * Validates the format of app ID and its included bundle ID hash contained in GOOGLE_APP_ID in the + * plist file. This is the main method for validating app ID. + * + * @return YES if the app ID fulfills the expected format and contains a hashed bundle ID, NO + * otherwise. + */ +- (BOOL)isAppIDValid { + NSString *appID = _options.googleAppID; + BOOL isValid = [FIRApp validateAppID:appID]; + if (!isValid) { + NSString *expectedBundleID = [self expectedBundleID]; + FIRLogError(kFIRLoggerCore, @"I-COR000009", + @"The GOOGLE_APP_ID either in the plist file " + @"'%@.%@' or the one set in the customized options is invalid. If you are using " + @"the plist file, use the iOS version of bundle identifier to download the file, " + @"and do not manually edit the GOOGLE_APP_ID. You may change your app's bundle " + @"identifier to '%@'. Or you can download a new configuration file that matches " + @"your bundle identifier from %@ and replace the current one.", + kServiceInfoFileName, kServiceInfoFileType, expectedBundleID, kPlistURL); + }; + return isValid; +} + ++ (BOOL)validateAppID:(NSString *)appID { + // Failing validation only occurs when we are sure we are looking at a V2 app ID and it does not + // have a valid hashed bundle ID, otherwise we just warn about the potential issue. + if (!appID.length) { + return NO; + } + + NSScanner *stringScanner = [NSScanner scannerWithString:appID]; + stringScanner.charactersToBeSkipped = nil; + + NSString *appIDVersion; + if (![stringScanner scanCharactersFromSet:[NSCharacterSet decimalDigitCharacterSet] + intoString:&appIDVersion]) { + return NO; + } + + if (![stringScanner scanString:@":" intoString:NULL]) { + // appIDVersion must be separated by ":" + return NO; + } + + NSArray *knownVersions = @[ @"1" ]; + if (![knownVersions containsObject:appIDVersion]) { + // Permit unknown yet properly formatted app ID versions. + FIRLogInfo(kFIRLoggerCore, @"I-COR000010", @"Unknown GOOGLE_APP_ID version: %@", appIDVersion); + return YES; + } + + if (![self validateAppIDFormat:appID withVersion:appIDVersion]) { + return NO; + } + + if (![self validateBundleIDHashWithinAppID:appID forVersion:appIDVersion]) { + return NO; + } + + return YES; +} + ++ (NSString *)actualBundleID { + return [[NSBundle mainBundle] bundleIdentifier]; +} + +/** + * Validates that the format of the app ID string is what is expected based on the supplied version. + * The version must end in ":". + * + * For v1 app ids the format is expected to be + * '::ios:'. + * + * This method does not verify that the contents of the app id are correct, just that they fulfill + * the expected format. + * + * @param appID Contents of GOOGLE_APP_ID from the plist file. + * @param version Indicates what version of the app id format this string should be. + * @return YES if provided string fulfills the expected format, NO otherwise. + */ ++ (BOOL)validateAppIDFormat:(NSString *)appID withVersion:(NSString *)version { + if (!appID.length || !version.length) { + return NO; + } + + NSScanner *stringScanner = [NSScanner scannerWithString:appID]; + stringScanner.charactersToBeSkipped = nil; + + // Skip version part + // '**::ios:' + if (![stringScanner scanString:version intoString:NULL]) { + // The version part is missing or mismatched + return NO; + } + + // Validate version part (see part between '*' symbols below) + // '*:*:ios:' + if (![stringScanner scanString:@":" intoString:NULL]) { + // appIDVersion must be separated by ":" + return NO; + } + + // Validate version part (see part between '*' symbols below) + // ':**:ios:'. + NSInteger projectNumber = NSNotFound; + if (![stringScanner scanInteger:&projectNumber]) { + // NO project number found. + return NO; + } + + // Validate version part (see part between '*' symbols below) + // ':*:*ios:'. + if (![stringScanner scanString:@":" intoString:NULL]) { + // The project number must be separated by ":" + return NO; + } + + // Validate version part (see part between '*' symbols below) + // '::*ios*:'. + NSString *platform; + if (![stringScanner scanUpToString:@":" intoString:&platform]) { + return NO; + } + + if (![platform isEqualToString:@"ios"]) { + // The platform must be @"ios" + return NO; + } + + // Validate version part (see part between '*' symbols below) + // '::ios*:*'. + if (![stringScanner scanString:@":" intoString:NULL]) { + // The platform must be separated by ":" + return NO; + } + + // Validate version part (see part between '*' symbols below) + // '::ios:**'. + unsigned long long bundleIDHash = NSNotFound; + if (![stringScanner scanHexLongLong:&bundleIDHash]) { + // Hashed bundleID part is missing + return NO; + } + + if (!stringScanner.isAtEnd) { + // There are not allowed characters in the hashed bundle ID part + return NO; + } + + return YES; +} + +/** + * Validates that the hashed bundle ID included in the app ID string is what is expected based on + * the supplied version. + * + * Note that the v1 hash algorithm is not permitted on the client and cannot be fully validated. + * + * @param appID Contents of GOOGLE_APP_ID from the plist file. + * @param version Indicates what version of the app id format this string should be. + * @return YES if provided string fulfills the expected hashed bundle ID and the version is known, + * NO otherwise. + */ ++ (BOOL)validateBundleIDHashWithinAppID:(NSString *)appID forVersion:(NSString *)version { + // Extract the hashed bundle ID from the given app ID. + // This assumes the app ID format is the same for all known versions below. + // If the app ID format changes in future versions, the tokenizing of the app + // ID format will need to take into account the version of the app ID. + NSArray *components = [appID componentsSeparatedByString:@":"]; + if (components.count != 4) { + return NO; + } + + NSString *suppliedBundleIDHashString = components[3]; + if (!suppliedBundleIDHashString.length) { + return NO; + } + + uint64_t suppliedBundleIDHash; + NSScanner *scanner = [NSScanner scannerWithString:suppliedBundleIDHashString]; + if (![scanner scanHexLongLong:&suppliedBundleIDHash]) { + return NO; + } + + if ([version isEqual:@"1"]) { + // The v1 hash algorithm is not permitted on the client so the actual hash cannot be validated. + return YES; + } + + // Unknown version. + return NO; +} + +- (NSString *)expectedBundleID { + return _options.bundleID; +} + +// end App ID validation + +#pragma mark - Reading From Plist & User Defaults + +/** + * Clears the data collection switch from the standard NSUserDefaults for easier testing and + * readability. + */ +- (void)clearDataCollectionSwitchFromUserDefaults { + NSString *key = + [NSString stringWithFormat:kFIRGlobalAppDataCollectionEnabledDefaultsKeyFormat, self.name]; + [[NSUserDefaults standardUserDefaults] removeObjectForKey:key]; +} + +/** + * Reads the data collection switch from the standard NSUserDefaults for easier testing and + * readability. + */ ++ (nullable NSNumber *)readDataCollectionSwitchFromUserDefaultsForApp:(FIRApp *)app { + // Read the object in user defaults, and only return if it's an NSNumber. + NSString *key = + [NSString stringWithFormat:kFIRGlobalAppDataCollectionEnabledDefaultsKeyFormat, app.name]; + id collectionEnabledDefaultsObject = [[NSUserDefaults standardUserDefaults] objectForKey:key]; + if ([collectionEnabledDefaultsObject isKindOfClass:[NSNumber class]]) { + return collectionEnabledDefaultsObject; + } + + return nil; +} + +/** + * Reads the data collection switch from the Info.plist for easier testing and readability. Will + * only read once from the plist and return the cached value. + */ ++ (nullable NSNumber *)readDataCollectionSwitchFromPlist { + static NSNumber *collectionEnabledPlistObject; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + // Read the data from the `Info.plist`, only assign it if it's there and an NSNumber. + id plistValue = [[NSBundle mainBundle] + objectForInfoDictionaryKey:kFIRGlobalAppDataCollectionEnabledPlistKey]; + if (plistValue && [plistValue isKindOfClass:[NSNumber class]]) { + collectionEnabledPlistObject = (NSNumber *)plistValue; + } + }); + + return collectionEnabledPlistObject; +} + +#pragma mark - Swift Components. + ++ (void)registerSwiftComponents { + SEL componentsToRegisterSEL = @selector(componentsToRegister); + // Dictionary of class names that conform to `FIRLibrary` and their user agents. These should only + // be SDKs that are written in Swift but still visible to ObjC. + // This is only necessary for products that need to do work at launch during configuration. + NSDictionary *swiftComponents = @{ + @"FIRSessions" : @"fire-ses", + @"FIRAuthComponent" : @"fire-auth", + }; + for (NSString *className in swiftComponents.allKeys) { + Class klass = NSClassFromString(className); + if (klass && [klass respondsToSelector:componentsToRegisterSEL]) { + [FIRApp registerInternalLibrary:klass withName:swiftComponents[className]]; + } + } + + // Swift libraries that don't need component behaviour + NSDictionary *swiftLibraries = @{ + @"FIRCombineAuthLibrary" : @"comb-auth", + @"FIRCombineFirestoreLibrary" : @"comb-firestore", + @"FIRCombineFunctionsLibrary" : @"comb-functions", + @"FIRCombineStorageLibrary" : @"comb-storage", + @"FIRFunctions" : @"fire-fun", + @"FIRStorage" : @"fire-str", + @"FIRVertexAIComponent" : @"fire-vertex", + @"FIRDataConnectComponent" : @"fire-dc", + }; + for (NSString *className in swiftLibraries.allKeys) { + Class klass = NSClassFromString(className); + if (klass) { + NSString *version = FIRFirebaseVersion(); +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wundeclared-selector" + SEL sdkVersionSelector = @selector(sdkVersion); +#pragma clang diagnostic pop + if ([klass respondsToSelector:sdkVersionSelector]) { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-performSelector-leaks" + NSString *sdkVersion = (NSString *)[klass performSelector:sdkVersionSelector]; + if (sdkVersion) version = sdkVersion; +#pragma clang diagnostic pop + } + [FIRApp registerLibrary:swiftLibraries[className] withVersion:version]; + } + } +} + +#pragma mark - App Life Cycle + +- (void)subscribeForAppDidBecomeActiveNotifications { +#if TARGET_OS_IOS || TARGET_OS_TV || TARGET_OS_VISION + NSNotificationName notificationName = UIApplicationDidBecomeActiveNotification; +#elif TARGET_OS_OSX + NSNotificationName notificationName = NSApplicationDidBecomeActiveNotification; +#elif TARGET_OS_WATCH + // TODO(ncooke3): Remove when minimum supported watchOS version is watchOS 7.0. + // On watchOS 7.0+, heartbeats are logged when the watch app becomes active. + // On watchOS 6.0, heartbeats are logged when the Firebase app is configuring. + // While it does not cover all use cases, logging when the Firebase app is + // configuring is done because watchOS lifecycle notifications are a + // watchOS 7.0+ feature. + NSNotificationName notificationName = kFIRAppReadyToConfigureSDKNotification; + if (@available(watchOS 7.0, *)) { + notificationName = WKApplicationDidBecomeActiveNotification; + } +#endif + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(appDidBecomeActive:) + name:notificationName + object:nil]; +} + +- (void)appDidBecomeActive:(NSNotification *)notification { + if ([self isDataCollectionDefaultEnabled]) { + // If changing the below line, consult with the Games team to ensure they + // are not negatively impacted. For more details, see + // go/firebase-game-sdk-user-agent-register-timing. + [self.heartbeatLogger log]; + } +} + +#if DEBUG ++ (void)findMisnamedGoogleServiceInfoPlist { + for (NSBundle *bundle in [NSBundle allBundles]) { + // Not recursive, but we're looking for misnames, not people accidentally + // hiding their config file in a subdirectory of their bundle. + NSArray *plistPaths = [bundle pathsForResourcesOfType:@"plist" inDirectory:nil]; + for (NSString *path in plistPaths) { + @autoreleasepool { + NSDictionary *contents = [NSDictionary dictionaryWithContentsOfFile:path]; + if (contents == nil) { + continue; + } + + NSString *projectID = contents[@"PROJECT_ID"]; + if (projectID != nil) { + [NSException raise:kFirebaseCoreErrorDomain + format:@"`FirebaseApp.configure()` could not find the default " + @"configuration plist in your project, but did find one at " + @"%@. Please rename this file to GoogleService-Info.plist to " + @"use it as the default configuration.", + path]; + } + } + } + } +} +#endif // DEBUG + +@end diff --git a/Pods/FirebaseCore/FirebaseCore/Sources/FIRBundleUtil.h b/Pods/FirebaseCore/FirebaseCore/Sources/FIRBundleUtil.h new file mode 100644 index 0000000..d9475dd --- /dev/null +++ b/Pods/FirebaseCore/FirebaseCore/Sources/FIRBundleUtil.h @@ -0,0 +1,53 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +/** + * This class provides utilities for accessing resources in bundles. + */ +@interface FIRBundleUtil : NSObject + +/** + * Finds all relevant bundles, starting with [NSBundle mainBundle]. + */ ++ (NSArray *)relevantBundles; + +/** + * Reads the options dictionary from one of the provided bundles. + * + * @param resourceName The resource name, e.g. @"GoogleService-Info". + * @param fileType The file type (extension), e.g. @"plist". + * @param bundles The bundles to expect, in priority order. See also + * +[FIRBundleUtil relevantBundles]. + */ ++ (NSString *)optionsDictionaryPathWithResourceName:(NSString *)resourceName + andFileType:(NSString *)fileType + inBundles:(NSArray *)bundles; + +/** + * Finds URL schemes defined in all relevant bundles, starting with those from + * [NSBundle mainBundle]. + */ ++ (NSArray *)relevantURLSchemes; + +/** + * Checks if any of the given bundles have a matching bundle identifier prefix (removing extension + * suffixes). + */ ++ (BOOL)hasBundleIdentifierPrefix:(NSString *)bundleIdentifier inBundles:(NSArray *)bundles; + +@end diff --git a/Pods/FirebaseCore/FirebaseCore/Sources/FIRBundleUtil.m b/Pods/FirebaseCore/FirebaseCore/Sources/FIRBundleUtil.m new file mode 100644 index 0000000..de2c295 --- /dev/null +++ b/Pods/FirebaseCore/FirebaseCore/Sources/FIRBundleUtil.m @@ -0,0 +1,79 @@ +// Copyright 2017 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "FirebaseCore/Sources/FIRBundleUtil.h" + +#import + +@implementation FIRBundleUtil + ++ (NSArray *)relevantBundles { + return @[ [NSBundle mainBundle], [NSBundle bundleForClass:[self class]] ]; +} + ++ (NSString *)optionsDictionaryPathWithResourceName:(NSString *)resourceName + andFileType:(NSString *)fileType + inBundles:(NSArray *)bundles { + // Loop through all bundles to find the config dict. + for (NSBundle *bundle in bundles) { + NSString *path = [bundle pathForResource:resourceName ofType:fileType]; + // Use the first one we find. + if (path) { + return path; + } + } + return nil; +} + ++ (NSArray *)relevantURLSchemes { + NSMutableArray *result = [[NSMutableArray alloc] init]; + for (NSBundle *bundle in [[self class] relevantBundles]) { + NSArray *urlTypes = [bundle objectForInfoDictionaryKey:@"CFBundleURLTypes"]; + for (NSDictionary *urlType in urlTypes) { + [result addObjectsFromArray:urlType[@"CFBundleURLSchemes"]]; + } + } + return result; +} + ++ (BOOL)hasBundleIdentifierPrefix:(NSString *)bundleIdentifier inBundles:(NSArray *)bundles { + for (NSBundle *bundle in bundles) { + if ([bundle.bundleIdentifier isEqualToString:bundleIdentifier]) { + return YES; + } + + if ([GULAppEnvironmentUtil isAppExtension]) { + // A developer could be using the same `FIROptions` for both their app and extension. Since + // extensions have a suffix added to the bundleID, we consider a matching prefix as valid. + NSString *appBundleIDFromExtension = + [self bundleIdentifierByRemovingLastPartFrom:bundle.bundleIdentifier]; + if ([appBundleIDFromExtension isEqualToString:bundleIdentifier]) { + return YES; + } + } + } + return NO; +} + ++ (NSString *)bundleIdentifierByRemovingLastPartFrom:(NSString *)bundleIdentifier { + NSString *bundleIDComponentsSeparator = @"."; + + NSMutableArray *bundleIDComponents = + [[bundleIdentifier componentsSeparatedByString:bundleIDComponentsSeparator] mutableCopy]; + [bundleIDComponents removeLastObject]; + + return [bundleIDComponents componentsJoinedByString:bundleIDComponentsSeparator]; +} + +@end diff --git a/Pods/FirebaseCore/FirebaseCore/Sources/FIRComponent.m b/Pods/FirebaseCore/FirebaseCore/Sources/FIRComponent.m new file mode 100644 index 0000000..78c06ff --- /dev/null +++ b/Pods/FirebaseCore/FirebaseCore/Sources/FIRComponent.m @@ -0,0 +1,58 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseCore/Extension/FIRComponent.h" + +#import "FirebaseCore/Extension/FIRComponentContainer.h" + +@interface FIRComponent () + +- (instancetype)initWithProtocol:(Protocol *)protocol + instantiationTiming:(FIRInstantiationTiming)instantiationTiming + creationBlock:(FIRComponentCreationBlock)creationBlock; + +@end + +@implementation FIRComponent + ++ (instancetype)componentWithProtocol:(Protocol *)protocol + creationBlock:(FIRComponentCreationBlock)creationBlock { + return [[FIRComponent alloc] initWithProtocol:protocol + instantiationTiming:FIRInstantiationTimingLazy + creationBlock:creationBlock]; +} + ++ (instancetype)componentWithProtocol:(Protocol *)protocol + instantiationTiming:(FIRInstantiationTiming)instantiationTiming + creationBlock:(FIRComponentCreationBlock)creationBlock { + return [[FIRComponent alloc] initWithProtocol:protocol + instantiationTiming:instantiationTiming + creationBlock:creationBlock]; +} + +- (instancetype)initWithProtocol:(Protocol *)protocol + instantiationTiming:(FIRInstantiationTiming)instantiationTiming + creationBlock:(FIRComponentCreationBlock)creationBlock { + self = [super init]; + if (self) { + _protocol = protocol; + _instantiationTiming = instantiationTiming; + _creationBlock = creationBlock; + } + return self; +} + +@end diff --git a/Pods/FirebaseCore/FirebaseCore/Sources/FIRComponentContainer.m b/Pods/FirebaseCore/FirebaseCore/Sources/FIRComponentContainer.m new file mode 100644 index 0000000..d4e4c7c --- /dev/null +++ b/Pods/FirebaseCore/FirebaseCore/Sources/FIRComponentContainer.m @@ -0,0 +1,252 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseCore/Extension/FIRComponentContainer.h" + +#import "FirebaseCore/Extension/FIRAppInternal.h" +#import "FirebaseCore/Extension/FIRComponent.h" +#import "FirebaseCore/Extension/FIRLibrary.h" +#import "FirebaseCore/Extension/FIRLogger.h" +#import "FirebaseCore/Sources/FIROptionsInternal.h" +#import "FirebaseCore/Sources/Public/FirebaseCore/FIROptions.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRComponentContainer () + +/// The dictionary of components that are registered for a particular app. The key is an `NSString` +/// of the protocol. +@property(nonatomic, strong) NSMutableDictionary *components; + +/// Cached instances of components that requested to be cached. +@property(nonatomic, strong) NSMutableDictionary *cachedInstances; + +/// Protocols of components that have requested to be eagerly instantiated. +@property(nonatomic, strong, nullable) NSMutableArray *eagerProtocolsToInstantiate; + +@end + +@implementation FIRComponentContainer + +// Collection of all classes that register to provide components. +static NSMutableSet *sFIRComponentRegistrants; + +#pragma mark - Public Registration + ++ (void)registerAsComponentRegistrant:(Class)klass { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + sFIRComponentRegistrants = [[NSMutableSet alloc] init]; + }); + + [self registerAsComponentRegistrant:klass inSet:sFIRComponentRegistrants]; +} + ++ (void)registerAsComponentRegistrant:(Class)klass + inSet:(NSMutableSet *)allRegistrants { + [allRegistrants addObject:klass]; +} + +#pragma mark - Internal Initialization + +- (instancetype)initWithApp:(FIRApp *)app { + NSMutableSet *componentRegistrants = sFIRComponentRegistrants; + // If the app being created is for the ARCore SDK, remove the App Check + // component (if it exists) since it does not support App Check. + if ([self isAppForARCore:app]) { + Class klass = NSClassFromString(@"FIRAppCheckComponent"); + if (klass && [sFIRComponentRegistrants containsObject:klass]) { + componentRegistrants = [componentRegistrants mutableCopy]; + [componentRegistrants removeObject:klass]; + } + } + + return [self initWithApp:app registrants:componentRegistrants]; +} + +- (instancetype)initWithApp:(FIRApp *)app registrants:(NSMutableSet *)allRegistrants { + self = [super init]; + if (self) { + _app = app; + _cachedInstances = [NSMutableDictionary dictionary]; + _components = [NSMutableDictionary dictionary]; + + [self populateComponentsFromRegisteredClasses:allRegistrants forApp:app]; + } + return self; +} + +- (void)populateComponentsFromRegisteredClasses:(NSSet *)classes forApp:(FIRApp *)app { + // Keep track of any components that need to eagerly instantiate after all components are added. + self.eagerProtocolsToInstantiate = [[NSMutableArray alloc] init]; + + // Loop through the verified component registrants and populate the components array. + for (Class klass in classes) { + // Loop through all the components being registered and store them as appropriate. + // Classes which do not provide functionality should use a dummy FIRComponentRegistrant + // protocol. + for (FIRComponent *component in [klass componentsToRegister]) { + // Check if the component has been registered before, and error out if so. + NSString *protocolName = NSStringFromProtocol(component.protocol); + if (self.components[protocolName]) { + FIRLogError(kFIRLoggerCore, @"I-COR000029", + @"Attempted to register protocol %@, but it already has an implementation.", + protocolName); + continue; + } + + // Store the creation block for later usage. + self.components[protocolName] = component.creationBlock; + + // Queue any protocols that should be eagerly instantiated. Don't instantiate them yet + // because they could depend on other components that haven't been added to the components + // array yet. + BOOL shouldInstantiateEager = + (component.instantiationTiming == FIRInstantiationTimingAlwaysEager); + BOOL shouldInstantiateDefaultEager = + (component.instantiationTiming == FIRInstantiationTimingEagerInDefaultApp && + [app isDefaultApp]); + if (shouldInstantiateEager || shouldInstantiateDefaultEager) { + [self.eagerProtocolsToInstantiate addObject:component.protocol]; + } + } + } +} + +#pragma mark - Instance Creation + +- (void)instantiateEagerComponents { + // After all components are registered, instantiate the ones that are requesting eager + // instantiation. + @synchronized(self) { + for (Protocol *protocol in self.eagerProtocolsToInstantiate) { + // Get an instance for the protocol, which will instantiate it since it couldn't have been + // cached yet. Ignore the instance coming back since we don't need it. + __unused id unusedInstance = [self instanceForProtocol:protocol]; + } + + // All eager instantiation is complete, clear the stored property now. + self.eagerProtocolsToInstantiate = nil; + } +} + +/// Instantiate an instance of a class that conforms to the specified protocol. +/// This will: +/// - Call the block to create an instance if possible, +/// - Validate that the instance returned conforms to the protocol it claims to, +/// - Cache the instance if the block requests it +/// +/// Note that this method assumes the caller already has @synchronized on self. +- (nullable id)instantiateInstanceForProtocol:(Protocol *)protocol + withBlock:(FIRComponentCreationBlock)creationBlock { + if (!creationBlock) { + return nil; + } + + // Create an instance using the creation block. + BOOL shouldCache = NO; + id instance = creationBlock(self, &shouldCache); + if (!instance) { + return nil; + } + + // An instance was created, validate that it conforms to the protocol it claims to. + NSString *protocolName = NSStringFromProtocol(protocol); + if (![instance conformsToProtocol:protocol]) { + FIRLogError(kFIRLoggerCore, @"I-COR000030", + @"An instance conforming to %@ was requested, but the instance provided does not " + @"conform to the protocol", + protocolName); + } + + // The instance is ready to be returned, but check if it should be cached first before returning. + if (shouldCache) { + self.cachedInstances[protocolName] = instance; + } + + return instance; +} + +#pragma mark - Internal Retrieval + +// Redirected for Swift users. +- (nullable id)__instanceForProtocol:(Protocol *)protocol { + return [self instanceForProtocol:protocol]; +} + +- (nullable id)instanceForProtocol:(Protocol *)protocol { + // Check if there is a cached instance, and return it if so. + NSString *protocolName = NSStringFromProtocol(protocol); + + id cachedInstance; + @synchronized(self) { + cachedInstance = self.cachedInstances[protocolName]; + if (!cachedInstance) { + // Use the creation block to instantiate an instance and return it. + FIRComponentCreationBlock creationBlock = self.components[protocolName]; + cachedInstance = [self instantiateInstanceForProtocol:protocol withBlock:creationBlock]; + } + } + return cachedInstance; +} + +#pragma mark - Lifecycle + +- (void)removeAllCachedInstances { + @synchronized(self) { + // Loop through the cache and notify each instance that is a maintainer to clean up after + // itself. + for (id instance in self.cachedInstances.allValues) { + if ([instance conformsToProtocol:@protocol(FIRComponentLifecycleMaintainer)] && + [instance respondsToSelector:@selector(appWillBeDeleted:)]) { + [instance appWillBeDeleted:self.app]; + } + } + + // Empty the cache. + [self.cachedInstances removeAllObjects]; + } +} + +- (void)removeAllComponents { + @synchronized(self) { + [self.components removeAllObjects]; + } +} + +#pragma mark - Helpers + +- (BOOL)isAppForARCore:(FIRApp *)app { + // First, check if the app name matches that of the one used by ARCore. + if ([app.name isEqualToString:@"ARCoreFIRApp"]) { + // Second, check if the app's gcmSenderID matches that of ARCore. This + // prevents false positives in the unlikely event a 3P Firebase app is + // named `ARCoreFIRApp`. + const char *p1 = "406756"; + const char *p2 = "893798"; + const char gcmSenderIDKey[27] = {p1[0], p2[0], p1[1], p2[1], p1[2], p2[2], p1[3], + p2[3], p1[4], p2[4], p1[5], p2[5], p1[6], p2[6], + p1[7], p2[7], p1[8], p2[8], p1[9], p2[9], p1[10], + p2[10], p1[11], p2[11], p1[12], p2[12], '\0'}; + NSString *gcmSenderID = [NSString stringWithUTF8String:gcmSenderIDKey]; + return [app.options.GCMSenderID isEqualToString:gcmSenderID]; + } + return NO; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseCore/FirebaseCore/Sources/FIRComponentContainerInternal.h b/Pods/FirebaseCore/FirebaseCore/Sources/FIRComponentContainerInternal.h new file mode 100644 index 0000000..169e181 --- /dev/null +++ b/Pods/FirebaseCore/FirebaseCore/Sources/FIRComponentContainerInternal.h @@ -0,0 +1,50 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#import + +#import "FirebaseCore/Extension/FIRComponentContainer.h" +#import "FirebaseCore/Extension/FIRLibrary.h" + +@class FIRApp; + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRComponentContainer (Private) + +/// Initializes a container for a given app. This should only be called by the app itself. +- (instancetype)initWithApp:(FIRApp *)app; + +/// Retrieves an instance that conforms to the specified protocol. This will return `nil` if the +/// protocol wasn't registered, or if the instance couldn't be instantiated for the provided app. +- (nullable id)instanceForProtocol:(Protocol *)protocol + NS_SWIFT_UNAVAILABLE("Use `instance(for:)` from the FirebaseCoreExtension module instead."); + +/// Instantiates all the components that have registered as "eager" after initialization. +- (void)instantiateEagerComponents; + +/// Remove all of the cached instances stored and allow them to clean up after themselves. +- (void)removeAllCachedInstances; + +/// Removes all the components. After calling this method no new instances will be created. +- (void)removeAllComponents; + +/// Register a class to provide components for the interoperability system. The class should conform +/// to `FIRComponentRegistrant` and provide an array of `FIRComponent` objects. ++ (void)registerAsComponentRegistrant:(Class)klass; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseCore/FirebaseCore/Sources/FIRComponentType.m b/Pods/FirebaseCore/FirebaseCore/Sources/FIRComponentType.m new file mode 100644 index 0000000..2204fd6 --- /dev/null +++ b/Pods/FirebaseCore/FirebaseCore/Sources/FIRComponentType.m @@ -0,0 +1,29 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseCore/Extension/FIRComponentType.h" + +#import "FirebaseCore/Sources/FIRComponentContainerInternal.h" + +@implementation FIRComponentType + ++ (nullable id)instanceForProtocol:(Protocol *)protocol + inContainer:(FIRComponentContainer *)container { + // Forward the call to the container. + return [container instanceForProtocol:protocol]; +} + +@end diff --git a/Pods/FirebaseCore/FirebaseCore/Sources/FIRConfiguration.m b/Pods/FirebaseCore/FirebaseCore/Sources/FIRConfiguration.m new file mode 100644 index 0000000..8a646bd --- /dev/null +++ b/Pods/FirebaseCore/FirebaseCore/Sources/FIRConfiguration.m @@ -0,0 +1,55 @@ +// Copyright 2017 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "FirebaseCore/Sources/FIRConfigurationInternal.h" + +#import "FirebaseCore/Sources/FIRAnalyticsConfiguration.h" + +extern void FIRSetLoggerLevel(FIRLoggerLevel loggerLevel); +extern FIRLoggerLevel FIRGetLoggerLevel(void); + +@implementation FIRConfiguration + ++ (instancetype)sharedInstance { + static FIRConfiguration *sharedInstance = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + sharedInstance = [[FIRConfiguration alloc] init]; + }); + return sharedInstance; +} + +- (instancetype)init { + self = [super init]; + if (self) { + _analyticsConfiguration = [FIRAnalyticsConfiguration sharedInstance]; + } + return self; +} + +- (void)setLoggerLevel:(FIRLoggerLevel)loggerLevel { + NSAssert(loggerLevel <= FIRLoggerLevelMax && loggerLevel >= FIRLoggerLevelMin, + @"Invalid logger level, %ld", (long)loggerLevel); + @synchronized(self) { + FIRSetLoggerLevel(loggerLevel); + } +} + +- (FIRLoggerLevel)loggerLevel { + @synchronized(self) { + return FIRGetLoggerLevel(); + } +} + +@end diff --git a/Pods/FirebaseCore/FirebaseCore/Sources/FIRConfigurationInternal.h b/Pods/FirebaseCore/FirebaseCore/Sources/FIRConfigurationInternal.h new file mode 100644 index 0000000..9361e73 --- /dev/null +++ b/Pods/FirebaseCore/FirebaseCore/Sources/FIRConfigurationInternal.h @@ -0,0 +1,29 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseCore/Sources/Public/FirebaseCore/FIRConfiguration.h" + +@class FIRAnalyticsConfiguration; + +@interface FIRConfiguration () + +/** + * The configuration class for Firebase Analytics. This should be removed once the logic for + * enabling and disabling Analytics is moved to Analytics. + */ +@property(nonatomic, readwrite) FIRAnalyticsConfiguration *analyticsConfiguration; + +@end diff --git a/Pods/FirebaseCore/FirebaseCore/Sources/FIRFirebaseUserAgent.h b/Pods/FirebaseCore/FirebaseCore/Sources/FIRFirebaseUserAgent.h new file mode 100644 index 0000000..ffb11fb --- /dev/null +++ b/Pods/FirebaseCore/FirebaseCore/Sources/FIRFirebaseUserAgent.h @@ -0,0 +1,36 @@ +/* + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRFirebaseUserAgent : NSObject + +/** Returns the firebase user agent which consists of environment part and the components added via + * `setValue:forComponent` method. */ +- (NSString *)firebaseUserAgent; + +/** Sets value associated with the specified component. If value is `nil` then the component is + * removed. */ +- (void)setValue:(nullable NSString *)value forComponent:(NSString *)componentName; + +/** Resets manually added components. */ +- (void)reset; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseCore/FirebaseCore/Sources/FIRFirebaseUserAgent.m b/Pods/FirebaseCore/FirebaseCore/Sources/FIRFirebaseUserAgent.m new file mode 100644 index 0000000..04e7566 --- /dev/null +++ b/Pods/FirebaseCore/FirebaseCore/Sources/FIRFirebaseUserAgent.m @@ -0,0 +1,107 @@ +/* + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseCore/Sources/FIRFirebaseUserAgent.h" + +#import + +@interface FIRFirebaseUserAgent () + +@property(nonatomic, readonly) NSMutableDictionary *valuesByComponent; +@property(nonatomic, readonly) NSDictionary *environmentComponents; +@property(nonatomic, readonly) NSString *firebaseUserAgent; + +@end + +@implementation FIRFirebaseUserAgent + +@synthesize firebaseUserAgent = _firebaseUserAgent; +@synthesize environmentComponents = _environmentComponents; + +- (instancetype)init { + self = [super init]; + if (self) { + _valuesByComponent = [[NSMutableDictionary alloc] init]; + } + return self; +} + +- (NSString *)firebaseUserAgent { + @synchronized(self) { + if (_firebaseUserAgent == nil) { + NSMutableDictionary *allComponents = + [self.valuesByComponent mutableCopy]; + [allComponents setValuesForKeysWithDictionary:self.environmentComponents]; + + __block NSMutableArray *components = + [[NSMutableArray alloc] initWithCapacity:self.valuesByComponent.count]; + [allComponents enumerateKeysAndObjectsUsingBlock:^( + NSString *_Nonnull name, NSString *_Nonnull value, BOOL *_Nonnull stop) { + [components addObject:[NSString stringWithFormat:@"%@/%@", name, value]]; + }]; + [components sortUsingSelector:@selector(localizedCaseInsensitiveCompare:)]; + _firebaseUserAgent = [components componentsJoinedByString:@" "]; + } + return _firebaseUserAgent; + } +} + +- (void)setValue:(nullable NSString *)value forComponent:(NSString *)componentName { + @synchronized(self) { + self.valuesByComponent[componentName] = value; + // Reset cached user agent string. + _firebaseUserAgent = nil; + } +} + +- (void)reset { + @synchronized(self) { + // Reset components. + _valuesByComponent = [[[self class] environmentComponents] mutableCopy]; + // Reset cached user agent string. + _firebaseUserAgent = nil; + } +} + +#pragma mark - Environment components + +- (NSDictionary *)environmentComponents { + if (_environmentComponents == nil) { + _environmentComponents = [[self class] environmentComponents]; + } + return _environmentComponents; +} + ++ (NSDictionary *)environmentComponents { + NSMutableDictionary *components = [NSMutableDictionary dictionary]; + + NSDictionary *info = [[NSBundle mainBundle] infoDictionary]; + NSString *xcodeVersion = info[@"DTXcodeBuild"]; + NSString *appleSdkVersion = info[@"DTSDKBuild"]; + NSString *isFromAppstoreFlagValue = [GULAppEnvironmentUtil isFromAppStore] ? @"true" : @"false"; + + components[@"apple-platform"] = [GULAppEnvironmentUtil applePlatform]; + components[@"apple-sdk"] = appleSdkVersion; + components[@"appstore"] = isFromAppstoreFlagValue; + components[@"deploy"] = [GULAppEnvironmentUtil deploymentType]; + components[@"device"] = [GULAppEnvironmentUtil deviceModel]; + components[@"os-version"] = [GULAppEnvironmentUtil systemVersion]; + components[@"xcode"] = xcodeVersion; + + return [components copy]; +} + +@end diff --git a/Pods/FirebaseCore/FirebaseCore/Sources/FIRHeartbeatLogger.m b/Pods/FirebaseCore/FirebaseCore/Sources/FIRHeartbeatLogger.m new file mode 100644 index 0000000..4becd08 --- /dev/null +++ b/Pods/FirebaseCore/FirebaseCore/Sources/FIRHeartbeatLogger.m @@ -0,0 +1,112 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +#ifndef FIREBASE_BUILD_CMAKE +@import FirebaseCoreInternal; +#endif // FIREBASE_BUILD_CMAKE + +#import "FirebaseCore/Extension/FIRAppInternal.h" +#import "FirebaseCore/Extension/FIRHeartbeatLogger.h" + +#ifndef FIREBASE_BUILD_CMAKE +NSString *_Nullable FIRHeaderValueFromHeartbeatsPayload(FIRHeartbeatsPayload *heartbeatsPayload) { + if ([heartbeatsPayload isEmpty]) { + return nil; + } + + return [heartbeatsPayload headerValue]; +} +#endif // FIREBASE_BUILD_CMAKE + +@interface FIRHeartbeatLogger () +#ifndef FIREBASE_BUILD_CMAKE +@property(nonatomic, readonly) FIRHeartbeatController *heartbeatController; +#endif // FIREBASE_BUILD_CMAKE +@property(copy, readonly) NSString * (^userAgentProvider)(void); +@end + +@implementation FIRHeartbeatLogger + +- (instancetype)initWithAppID:(NSString *)appID { + return [self initWithAppID:appID userAgentProvider:[[self class] currentUserAgentProvider]]; +} + +- (instancetype)initWithAppID:(NSString *)appID + userAgentProvider:(NSString * (^)(void))userAgentProvider { + self = [super init]; + if (self) { +#ifndef FIREBASE_BUILD_CMAKE + _heartbeatController = [[FIRHeartbeatController alloc] initWithId:[appID copy]]; +#endif // FIREBASE_BUILD_CMAKE + _userAgentProvider = [userAgentProvider copy]; + } + return self; +} + ++ (NSString * (^)(void))currentUserAgentProvider { + return ^NSString * { + return [FIRApp firebaseUserAgent]; + }; +} + +- (void)log { + NSString *userAgent = _userAgentProvider(); +#ifndef FIREBASE_BUILD_CMAKE + [_heartbeatController log:userAgent]; +#endif // FIREBASE_BUILD_CMAKE +} + +#ifndef FIREBASE_BUILD_CMAKE +- (NSString *_Nullable)headerValue { + return FIRHeaderValueFromHeartbeatsPayload([self flushHeartbeatsIntoPayload]); +} + +- (void)asyncHeaderValueWithCompletionHandler:(void (^)(NSString *_Nullable))completionHandler + API_AVAILABLE(ios(13.0), macosx(10.15), macCatalyst(13.0), tvos(13.0), watchos(6.0)) { + [self flushHeartbeatsIntoPayloadWithCompletionHandler:^(FIRHeartbeatsPayload *payload) { + completionHandler(FIRHeaderValueFromHeartbeatsPayload(payload)); + }]; +} + +- (FIRHeartbeatsPayload *)flushHeartbeatsIntoPayload { + FIRHeartbeatsPayload *payload = [_heartbeatController flush]; + return payload; +} + +- (void)flushHeartbeatsIntoPayloadWithCompletionHandler: + (void (^)(FIRHeartbeatsPayload *))completionHandler + API_AVAILABLE(ios(13.0), macosx(10.15), macCatalyst(13.0), tvos(13.0), watchos(6.0)) { + [_heartbeatController flushAsyncWithCompletionHandler:^(FIRHeartbeatsPayload *payload) { + completionHandler(payload); + }]; +} +#endif // FIREBASE_BUILD_CMAKE + +- (FIRDailyHeartbeatCode)heartbeatCodeForToday { +#ifndef FIREBASE_BUILD_CMAKE + FIRHeartbeatsPayload *todaysHeartbeatPayload = [_heartbeatController flushHeartbeatFromToday]; + + if ([todaysHeartbeatPayload isEmpty]) { + return FIRDailyHeartbeatCodeNone; + } else { + return FIRDailyHeartbeatCodeSome; + } +#else + return FIRDailyHeartbeatCodeNone; +#endif // FIREBASE_BUILD_CMAKE +} + +@end diff --git a/Pods/FirebaseCore/FirebaseCore/Sources/FIRLogger.m b/Pods/FirebaseCore/FirebaseCore/Sources/FIRLogger.m new file mode 100644 index 0000000..9ec8999 --- /dev/null +++ b/Pods/FirebaseCore/FirebaseCore/Sources/FIRLogger.m @@ -0,0 +1,222 @@ +// Copyright 2017 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "FirebaseCore/Extension/FIRLogger.h" + +#import +#import +#import "FirebaseCore/Sources/Public/FirebaseCore/FIRLoggerLevel.h" + +#import "FirebaseCore/Sources/Public/FirebaseCore/FIRVersion.h" + +NSString *const kFIRLoggerSubsystem = @"com.google.firebase"; + +NSString *const kFIRLoggerCore = @"[FirebaseCore]"; + +// All the FIRLoggerService definitions should be migrated to clients. Do not add new ones! +NSString *const kFIRLoggerAnalytics = @"[FirebaseAnalytics]"; +NSString *const kFIRLoggerCrash = @"[FirebaseCrash]"; +NSString *const kFIRLoggerRemoteConfig = @"[FirebaseRemoteConfig]"; + +/// Arguments passed on launch. +NSString *const kFIRDisableDebugModeApplicationArgument = @"-FIRDebugDisabled"; +NSString *const kFIREnableDebugModeApplicationArgument = @"-FIRDebugEnabled"; + +/// Key for the debug mode bit in NSUserDefaults. +NSString *const kFIRPersistedDebugModeKey = @"/google/firebase/debug_mode"; + +/// NSUserDefaults that should be used to store and read variables. If nil, `standardUserDefaults` +/// will be used. +static NSUserDefaults *sFIRLoggerUserDefaults; + +static dispatch_once_t sFIRLoggerOnceToken; + +// The sFIRAnalyticsDebugMode flag is here to support the -FIRDebugEnabled/-FIRDebugDisabled +// flags used by Analytics. Users who use those flags expect Analytics to log verbosely, +// while the rest of Firebase logs at the default level. This flag is introduced to support +// that behavior. +static BOOL sFIRAnalyticsDebugMode; + +#ifdef DEBUG +/// The regex pattern for the message code. +static NSString *const kMessageCodePattern = @"^I-[A-Z]{3}[0-9]{6}$"; +static NSRegularExpression *sMessageCodeRegex; +#endif + +void FIRLoggerInitialize(void) { + dispatch_once(&sFIRLoggerOnceToken, ^{ + // Register Firebase Version with GULLogger. + GULLoggerRegisterVersion(FIRFirebaseVersion()); + + NSArray *arguments = [NSProcessInfo processInfo].arguments; + + // Use the standard NSUserDefaults if it hasn't been explicitly set. + if (sFIRLoggerUserDefaults == nil) { + sFIRLoggerUserDefaults = [NSUserDefaults standardUserDefaults]; + } + + BOOL forceDebugMode = NO; + BOOL debugMode = [sFIRLoggerUserDefaults boolForKey:kFIRPersistedDebugModeKey]; + if ([arguments containsObject:kFIRDisableDebugModeApplicationArgument]) { // Default mode + [sFIRLoggerUserDefaults removeObjectForKey:kFIRPersistedDebugModeKey]; + } else if ([arguments containsObject:kFIREnableDebugModeApplicationArgument] || + debugMode) { // Debug mode + [sFIRLoggerUserDefaults setBool:YES forKey:kFIRPersistedDebugModeKey]; + forceDebugMode = YES; + } + GULLoggerInitialize(); + if (forceDebugMode) { + GULLoggerForceDebug(); + } + }); +} + +__attribute__((no_sanitize("thread"))) void FIRSetAnalyticsDebugMode(BOOL analyticsDebugMode) { + sFIRAnalyticsDebugMode = analyticsDebugMode; +} + +FIRLoggerLevel FIRGetLoggerLevel(void) { + FIRLoggerInitialize(); + return (FIRLoggerLevel)GULGetLoggerLevel(); +} + +void FIRSetLoggerLevel(FIRLoggerLevel loggerLevel) { + FIRLoggerInitialize(); + GULSetLoggerLevel((GULLoggerLevel)loggerLevel); +} + +void FIRSetLoggerLevelNotice(void) { + FIRLoggerInitialize(); + GULSetLoggerLevel(GULLoggerLevelNotice); +} + +void FIRSetLoggerLevelWarning(void) { + FIRLoggerInitialize(); + GULSetLoggerLevel(GULLoggerLevelWarning); +} + +void FIRSetLoggerLevelError(void) { + FIRLoggerInitialize(); + GULSetLoggerLevel(GULLoggerLevelError); +} + +void FIRSetLoggerLevelDebug(void) { + FIRLoggerInitialize(); + GULSetLoggerLevel(GULLoggerLevelDebug); +} + +#ifdef DEBUG +void FIRResetLogger(void) { + extern void GULResetLogger(void); + sFIRLoggerOnceToken = 0; + [sFIRLoggerUserDefaults removeObjectForKey:kFIRPersistedDebugModeKey]; + sFIRLoggerUserDefaults = nil; + GULResetLogger(); +} + +void FIRSetLoggerUserDefaults(NSUserDefaults *defaults) { + sFIRLoggerUserDefaults = defaults; +} +#endif + +/** + * Check if the level is high enough to be loggable. + * + * Analytics can override the log level with an intentional race condition. + * Add the attribute to get a clean thread sanitizer run. + */ +__attribute__((no_sanitize("thread"))) BOOL FIRIsLoggableLevel(FIRLoggerLevel loggerLevel, + BOOL analyticsComponent) { + FIRLoggerInitialize(); + if (sFIRAnalyticsDebugMode && analyticsComponent) { + return YES; + } + return GULIsLoggableLevel((GULLoggerLevel)loggerLevel); +} + +BOOL FIRIsLoggableLevelNotice(void) { + return FIRIsLoggableLevel(FIRLoggerLevelNotice, NO); +} + +BOOL FIRIsLoggableLevelWarning(void) { + return FIRIsLoggableLevel(FIRLoggerLevelWarning, NO); +} + +BOOL FIRIsLoggableLevelError(void) { + return FIRIsLoggableLevel(FIRLoggerLevelError, NO); +} + +BOOL FIRIsLoggableLevelDebug(void) { + return FIRIsLoggableLevel(FIRLoggerLevelDebug, NO); +} + +void FIRLogBasic(FIRLoggerLevel level, + NSString *category, + NSString *messageCode, + NSString *message, + va_list args_ptr) { + FIRLoggerInitialize(); + GULOSLogBasic((GULLoggerLevel)level, kFIRLoggerSubsystem, category, + sFIRAnalyticsDebugMode && [kFIRLoggerAnalytics isEqualToString:category], + messageCode, message, args_ptr); +} + +#define FIR_LOGGING_FUNCTION_BASIC(level) \ + void FIRLogBasic##level(NSString *category, NSString *messageCode, NSString *message, \ + va_list args_ptr) { \ + FIRLogBasic(FIRLoggerLevel##level, category, messageCode, message, args_ptr); \ + } + +FIR_LOGGING_FUNCTION_BASIC(Error) +FIR_LOGGING_FUNCTION_BASIC(Warning) +FIR_LOGGING_FUNCTION_BASIC(Notice) +FIR_LOGGING_FUNCTION_BASIC(Info) +FIR_LOGGING_FUNCTION_BASIC(Debug) + +/** + * Generates the logging functions using macros. + * + * Calling FIRLogError(kFIRLoggerCore, @"I-COR000001", @"Configure %@ failed.", @"blah") shows: + * yyyy-mm-dd hh:mm:ss.SSS sender[PID] [Firebase/Core][I-COR000001] Configure blah failed. + * Calling FIRLogDebug(kFIRLoggerCore, @"I-COR000001", @"Configure succeed.") shows: + * yyyy-mm-dd hh:mm:ss.SSS sender[PID] [Firebase/Core][I-COR000001] Configure succeed. + */ +#define FIR_LOGGING_FUNCTION(level) \ + void FIRLog##level(NSString *category, NSString *messageCode, NSString *message, ...) { \ + va_list args_ptr; \ + va_start(args_ptr, message); \ + FIRLogBasic(FIRLoggerLevel##level, category, messageCode, message, args_ptr); \ + va_end(args_ptr); \ + } + +FIR_LOGGING_FUNCTION(Error) +FIR_LOGGING_FUNCTION(Warning) +FIR_LOGGING_FUNCTION(Notice) +FIR_LOGGING_FUNCTION(Info) +FIR_LOGGING_FUNCTION(Debug) + +#undef FIR_LOGGING_FUNCTION + +#pragma mark - FIRLoggerWrapper + +@implementation FIRLoggerWrapper + ++ (void)logWithLevel:(FIRLoggerLevel)level + service:(NSString *)service + code:(NSString *)code + message:(NSString *)message { + FIRLogBasic(level, service, code, message, NULL); +} + +@end diff --git a/Pods/FirebaseCore/FirebaseCore/Sources/FIROptions.m b/Pods/FirebaseCore/FirebaseCore/Sources/FIROptions.m new file mode 100644 index 0000000..95a3480 --- /dev/null +++ b/Pods/FirebaseCore/FirebaseCore/Sources/FIROptions.m @@ -0,0 +1,468 @@ +// Copyright 2017 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "FirebaseCore/Extension/FIRAppInternal.h" +#import "FirebaseCore/Extension/FIRLogger.h" +#import "FirebaseCore/Sources/FIRBundleUtil.h" +#import "FirebaseCore/Sources/FIROptionsInternal.h" +#import "FirebaseCore/Sources/Public/FirebaseCore/FIRVersion.h" + +// Keys for the strings in the plist file. +NSString *const kFIRAPIKey = @"API_KEY"; +NSString *const kFIRGoogleAppID = @"GOOGLE_APP_ID"; +NSString *const kFIRClientID = @"CLIENT_ID"; +NSString *const kFIRGCMSenderID = @"GCM_SENDER_ID"; +NSString *const kFIRDatabaseURL = @"DATABASE_URL"; +NSString *const kFIRStorageBucket = @"STORAGE_BUCKET"; +// The key to locate the expected bundle identifier in the plist file. +NSString *const kFIRBundleID = @"BUNDLE_ID"; +// The key to locate the project identifier in the plist file. +NSString *const kFIRProjectID = @"PROJECT_ID"; + +NSString *const kFIRIsMeasurementEnabled = @"IS_MEASUREMENT_ENABLED"; +NSString *const kFIRIsAnalyticsCollectionEnabled = @"FIREBASE_ANALYTICS_COLLECTION_ENABLED"; +NSString *const kFIRIsAnalyticsCollectionDeactivated = @"FIREBASE_ANALYTICS_COLLECTION_DEACTIVATED"; + +// Library version ID formatted like: +// @"5" // Major version (one or more digits) +// @"04" // Minor version (exactly 2 digits) +// @"01" // Build number (exactly 2 digits) +// @"000"; // Fixed "000" +NSString *kFIRLibraryVersionID; + +// Plist file name. +NSString *const kServiceInfoFileName = @"GoogleService-Info"; +// Plist file type. +NSString *const kServiceInfoFileType = @"plist"; + +// Exception raised from attempting to modify a FIROptions after it's been copied to a FIRApp. +NSString *const kFIRExceptionBadModification = + @"Attempted to modify options after it's set on FIRApp. Please modify all properties before " + @"initializing FIRApp."; + +@interface FIROptions () + +/** + * This property maintains the actual configuration key-value pairs. + */ +@property(nonatomic, readwrite) NSMutableDictionary *optionsDictionary; + +/** + * Calls `analyticsOptionsDictionaryWithInfoDictionary:` using [NSBundle mainBundle].infoDictionary. + * It combines analytics options from both the infoDictionary and the GoogleService-Info.plist. + * Values which are present in the main plist override values from the GoogleService-Info.plist. + */ +@property(nonatomic, readonly) NSDictionary *analyticsOptionsDictionary; + +/** + * Combination of analytics options from both the infoDictionary and the GoogleService-Info.plist. + * Values which are present in the infoDictionary override values from the GoogleService-Info.plist. + */ +- (NSDictionary *)analyticsOptionsDictionaryWithInfoDictionary:(NSDictionary *)infoDictionary; + +/** + * Throw exception if editing is locked when attempting to modify an option. + */ +- (void)checkEditingLocked; + +/** + * The flag indicating whether this object was constructed with the values in the default plist + * file. + */ +@property(nonatomic) BOOL usingOptionsFromDefaultPlist; + +/** + * Whether or not Measurement was enabled. Measurement is enabled unless explicitly disabled in + * GoogleService-Info.plist. + */ +@property(nonatomic, readonly) BOOL isMeasurementEnabled; + +@end + +@implementation FIROptions { + /// Backing variable for self.analyticsOptionsDictionary. + NSDictionary *_analyticsOptionsDictionary; +} + +static FIROptions *sDefaultOptions = nil; +static NSDictionary *sDefaultOptionsDictionary = nil; +static dispatch_once_t sDefaultOptionsOnceToken; +static dispatch_once_t sDefaultOptionsDictionaryOnceToken; + +#pragma mark - Public only for internal class methods + ++ (FIROptions *)defaultOptions { + dispatch_once(&sDefaultOptionsOnceToken, ^{ + NSDictionary *defaultOptionsDictionary = [self defaultOptionsDictionary]; + if (defaultOptionsDictionary != nil) { + sDefaultOptions = + [[FIROptions alloc] initInternalWithOptionsDictionary:defaultOptionsDictionary]; + } + }); + + return sDefaultOptions; +} + +#pragma mark - Private class methods + ++ (NSDictionary *)defaultOptionsDictionary { + dispatch_once(&sDefaultOptionsDictionaryOnceToken, ^{ + NSString *plistFilePath = [FIROptions plistFilePathWithName:kServiceInfoFileName]; + if (plistFilePath == nil) { + return; + } + sDefaultOptionsDictionary = [NSDictionary dictionaryWithContentsOfFile:plistFilePath]; + if (sDefaultOptionsDictionary == nil) { + FIRLogError(kFIRLoggerCore, @"I-COR000011", + @"The configuration file is not a dictionary: " + @"'%@.%@'.", + kServiceInfoFileName, kServiceInfoFileType); + } + }); + + return sDefaultOptionsDictionary; +} + +// Returns the path of the plist file with a given file name. ++ (NSString *)plistFilePathWithName:(NSString *)fileName { + NSArray *bundles = [FIRBundleUtil relevantBundles]; + NSString *plistFilePath = + [FIRBundleUtil optionsDictionaryPathWithResourceName:fileName + andFileType:kServiceInfoFileType + inBundles:bundles]; + if (plistFilePath == nil) { + FIRLogError(kFIRLoggerCore, @"I-COR000012", @"Could not locate configuration file: '%@.%@'.", + fileName, kServiceInfoFileType); + } + return plistFilePath; +} + ++ (void)resetDefaultOptions { + sDefaultOptions = nil; + sDefaultOptionsDictionary = nil; + sDefaultOptionsOnceToken = 0; + sDefaultOptionsDictionaryOnceToken = 0; +} + +#pragma mark - Private instance methods + +- (instancetype)initInternalWithOptionsDictionary:(NSDictionary *)optionsDictionary { + self = [super init]; + if (self) { + _optionsDictionary = [optionsDictionary mutableCopy]; + _usingOptionsFromDefaultPlist = YES; + } + return self; +} + +- (id)copyWithZone:(NSZone *)zone { + FIROptions *newOptions = [(FIROptions *)[[self class] allocWithZone:zone] + initInternalWithOptionsDictionary:self.optionsDictionary]; + if (newOptions) { + newOptions.appGroupID = self.appGroupID; + newOptions.editingLocked = self.isEditingLocked; + newOptions.usingOptionsFromDefaultPlist = self.usingOptionsFromDefaultPlist; + } + return newOptions; +} + +#pragma mark - Public instance methods + +- (instancetype)init { + // Unavailable. + [self doesNotRecognizeSelector:_cmd]; + return nil; +} + +- (instancetype)initWithContentsOfFile:(NSString *)plistPath { + self = [super init]; + if (self) { + if (plistPath == nil) { + FIRLogError(kFIRLoggerCore, @"I-COR000013", @"The plist file path is nil."); + return nil; + } + _optionsDictionary = [[NSDictionary dictionaryWithContentsOfFile:plistPath] mutableCopy]; + if (_optionsDictionary == nil) { + FIRLogError(kFIRLoggerCore, @"I-COR000014", + @"The configuration file at %@ does not exist or " + @"is not a well-formed plist file.", + plistPath); + return nil; + } + // TODO: Do we want to validate the dictionary here? It says we do that already in + // the public header. + } + return self; +} + +- (instancetype)initWithGoogleAppID:(NSString *)googleAppID GCMSenderID:(NSString *)GCMSenderID { + self = [super init]; + if (self) { + NSMutableDictionary *mutableOptionsDict = [NSMutableDictionary dictionary]; + [mutableOptionsDict setValue:googleAppID forKey:kFIRGoogleAppID]; + [mutableOptionsDict setValue:GCMSenderID forKey:kFIRGCMSenderID]; + [mutableOptionsDict setValue:[[NSBundle mainBundle] bundleIdentifier] forKey:kFIRBundleID]; + self.optionsDictionary = mutableOptionsDict; + } + return self; +} + +- (NSString *)APIKey { + return self.optionsDictionary[kFIRAPIKey]; +} + +- (void)checkEditingLocked { + if (self.isEditingLocked) { + [NSException raise:kFirebaseCoreErrorDomain format:kFIRExceptionBadModification]; + } +} + +- (void)setAPIKey:(NSString *)APIKey { + [self checkEditingLocked]; + _optionsDictionary[kFIRAPIKey] = [APIKey copy]; +} + +- (NSString *)clientID { + return self.optionsDictionary[kFIRClientID]; +} + +- (void)setClientID:(NSString *)clientID { + [self checkEditingLocked]; + _optionsDictionary[kFIRClientID] = [clientID copy]; +} + +- (NSString *)GCMSenderID { + return self.optionsDictionary[kFIRGCMSenderID]; +} + +- (void)setGCMSenderID:(NSString *)GCMSenderID { + [self checkEditingLocked]; + _optionsDictionary[kFIRGCMSenderID] = [GCMSenderID copy]; +} + +- (NSString *)projectID { + return self.optionsDictionary[kFIRProjectID]; +} + +- (void)setProjectID:(NSString *)projectID { + [self checkEditingLocked]; + _optionsDictionary[kFIRProjectID] = [projectID copy]; +} + +- (NSString *)googleAppID { + return self.optionsDictionary[kFIRGoogleAppID]; +} + +- (void)setGoogleAppID:(NSString *)googleAppID { + [self checkEditingLocked]; + _optionsDictionary[kFIRGoogleAppID] = [googleAppID copy]; +} + +- (NSString *)libraryVersionID { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + // The unit tests are set up to catch anything that does not properly convert. + NSString *version = FIRFirebaseVersion(); + NSArray *components = [version componentsSeparatedByString:@"."]; + NSString *major = [NSString stringWithFormat:@"%02d", [[components objectAtIndex:0] intValue]]; + NSString *minor = [NSString stringWithFormat:@"%02d", [[components objectAtIndex:1] intValue]]; + NSString *patch = [NSString stringWithFormat:@"%02d", [[components objectAtIndex:2] intValue]]; + kFIRLibraryVersionID = [NSString stringWithFormat:@"%@%@%@000", major, minor, patch]; + }); + return kFIRLibraryVersionID; +} + +- (void)setLibraryVersionID:(NSString *)libraryVersionID { + _optionsDictionary[kFIRLibraryVersionID] = [libraryVersionID copy]; +} + +- (NSString *)databaseURL { + return self.optionsDictionary[kFIRDatabaseURL]; +} + +- (void)setDatabaseURL:(NSString *)databaseURL { + [self checkEditingLocked]; + + _optionsDictionary[kFIRDatabaseURL] = [databaseURL copy]; +} + +- (NSString *)storageBucket { + return self.optionsDictionary[kFIRStorageBucket]; +} + +- (void)setStorageBucket:(NSString *)storageBucket { + [self checkEditingLocked]; + _optionsDictionary[kFIRStorageBucket] = [storageBucket copy]; +} + +- (NSString *)bundleID { + return self.optionsDictionary[kFIRBundleID]; +} + +- (void)setBundleID:(NSString *)bundleID { + [self checkEditingLocked]; + _optionsDictionary[kFIRBundleID] = [bundleID copy]; +} + +- (void)setAppGroupID:(NSString *)appGroupID { + [self checkEditingLocked]; + _appGroupID = [appGroupID copy]; +} + +#pragma mark - Equality + +- (BOOL)isEqual:(id)object { + if (!object || ![object isKindOfClass:[FIROptions class]]) { + return NO; + } + + return [self isEqualToOptions:(FIROptions *)object]; +} + +- (BOOL)isEqualToOptions:(FIROptions *)options { + // Skip any non-FIROptions classes. + if (![options isKindOfClass:[FIROptions class]]) { + return NO; + } + + // Check the internal dictionary and custom properties for differences. + if (![options.optionsDictionary isEqualToDictionary:self.optionsDictionary]) { + return NO; + } + + // Validate extra properties not contained in the dictionary. Only validate it if one of the + // objects has the property set. + if ((options.appGroupID != nil || self.appGroupID != nil) && + ![options.appGroupID isEqualToString:self.appGroupID]) { + return NO; + } + + // Validate the Analytics options haven't changed with the Info.plist. + if (![options.analyticsOptionsDictionary isEqualToDictionary:self.analyticsOptionsDictionary]) { + return NO; + } + + // We don't care about the `editingLocked` or `usingOptionsFromDefaultPlist` properties since + // those relate to lifecycle and construction, we only care if the contents of the options + // themselves are equal. + return YES; +} + +- (NSUInteger)hash { + // This is strongly recommended for any object that implements a custom `isEqual:` method to + // ensure that dictionary and set behavior matches other `isEqual:` checks. + // Note: `self.analyticsOptionsDictionary` was left out here since it solely relies on the + // contents of the main bundle's `Info.plist`. We should avoid reading that file and the contents + // should be identical. + return self.optionsDictionary.hash ^ self.appGroupID.hash; +} + +#pragma mark - Internal instance methods + +- (NSDictionary *)analyticsOptionsDictionaryWithInfoDictionary:(NSDictionary *)infoDictionary { + if (_analyticsOptionsDictionary == nil) { + NSMutableDictionary *tempAnalyticsOptions = [[NSMutableDictionary alloc] init]; + NSArray *measurementKeys = @[ + kFIRIsMeasurementEnabled, kFIRIsAnalyticsCollectionEnabled, + kFIRIsAnalyticsCollectionDeactivated + ]; + for (NSString *key in measurementKeys) { + id value = infoDictionary[key] ?: self.optionsDictionary[key] ?: nil; + if (!value) { + continue; + } + tempAnalyticsOptions[key] = value; + } + _analyticsOptionsDictionary = tempAnalyticsOptions; + } + return _analyticsOptionsDictionary; +} + +- (NSDictionary *)analyticsOptionsDictionary { + return [self analyticsOptionsDictionaryWithInfoDictionary:[NSBundle mainBundle].infoDictionary]; +} + +/** + * Whether or not Measurement was enabled. Measurement is enabled unless explicitly disabled in + * GoogleService-Info.plist. This uses the old plist flag `IS_MEASUREMENT_ENABLED`, which should + * still be supported. + */ +- (BOOL)isMeasurementEnabled { + if (self.isAnalyticsCollectionDeactivated) { + return NO; + } + NSNumber *value = self.analyticsOptionsDictionary[kFIRIsMeasurementEnabled]; + if (value == nil) { + // TODO: This could probably be cleaned up since FIROptions shouldn't know about FIRApp or have + // to check if it's the default app. The FIROptions instance can't be modified after + // `+configure` is called, so it's not a good place to copy it either in case the flag is + // changed at runtime. + + // If no values are set for Analytics, fall back to the global collection switch in FIRApp. + // Analytics only supports the default FIRApp, so check that first. + if (![FIRApp isDefaultAppConfigured]) { + return NO; + } + + // Fall back to the default app's collection switch when the key is not in the dictionary. + return [FIRApp defaultApp].isDataCollectionDefaultEnabled; + } + return [value boolValue]; +} + +- (BOOL)isAnalyticsCollectionExplicitlySet { + // If it's de-activated, it classifies as explicitly set. If not, it's not a good enough + // indication that the developer wants FirebaseAnalytics enabled so continue checking. + if (self.isAnalyticsCollectionDeactivated) { + return YES; + } + + // Check if the current Analytics flag is set. + id collectionEnabledObject = self.analyticsOptionsDictionary[kFIRIsAnalyticsCollectionEnabled]; + if (collectionEnabledObject && [collectionEnabledObject isKindOfClass:[NSNumber class]]) { + // It doesn't matter what the value is, it's explicitly set. + return YES; + } + + // Check if the old measurement flag is set. + id measurementEnabledObject = self.analyticsOptionsDictionary[kFIRIsMeasurementEnabled]; + if (measurementEnabledObject && [measurementEnabledObject isKindOfClass:[NSNumber class]]) { + // It doesn't matter what the value is, it's explicitly set. + return YES; + } + + // No flags are set to explicitly enable or disable FirebaseAnalytics. + return NO; +} + +- (BOOL)isAnalyticsCollectionEnabled { + if (self.isAnalyticsCollectionDeactivated) { + return NO; + } + NSNumber *value = self.analyticsOptionsDictionary[kFIRIsAnalyticsCollectionEnabled]; + if (value == nil) { + return self.isMeasurementEnabled; // Fall back to older plist flag. + } + return [value boolValue]; +} + +- (BOOL)isAnalyticsCollectionDeactivated { + NSNumber *value = self.analyticsOptionsDictionary[kFIRIsAnalyticsCollectionDeactivated]; + if (value == nil) { + return NO; // Analytics Collection is not deactivated when the key is not in the dictionary. + } + return [value boolValue]; +} + +@end diff --git a/Pods/FirebaseCore/FirebaseCore/Sources/FIROptionsInternal.h b/Pods/FirebaseCore/FirebaseCore/Sources/FIROptionsInternal.h new file mode 100644 index 0000000..22e6808 --- /dev/null +++ b/Pods/FirebaseCore/FirebaseCore/Sources/FIROptionsInternal.h @@ -0,0 +1,73 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +/** + * This header file exposes the initialization of FirebaseOptions to internal use. + */ +@interface FIROptions () + +/** + * `resetDefaultOptions` and `initInternalWithOptionsDictionary` are exposed only for unit tests. + */ ++ (void)resetDefaultOptions; + +/** + * Initializes the options with dictionary. The above strings are the keys of the dictionary. + * This is the designated initializer. + */ +- (instancetype)initInternalWithOptionsDictionary:(NSDictionary *)serviceInfoDictionary + NS_DESIGNATED_INITIALIZER; + +/** + * `defaultOptions` and `defaultOptionsDictionary` are exposed in order to be used in FirebaseApp + * and other first party services. + */ ++ (FIROptions *)defaultOptions; + ++ (NSDictionary *)defaultOptionsDictionary; + +/** + * Indicates whether or not Analytics collection was explicitly enabled via a plist flag or at + * runtime. + */ +@property(nonatomic, readonly) BOOL isAnalyticsCollectionExplicitlySet; + +/** + * Whether or not Analytics Collection was enabled. Analytics Collection is enabled unless + * explicitly disabled in GoogleService-Info.plist. + */ +@property(nonatomic, readonly) BOOL isAnalyticsCollectionEnabled; + +/** + * Whether or not Analytics Collection was completely disabled. If true, then + * isAnalyticsCollectionEnabled will be false. + */ +@property(nonatomic, readonly) BOOL isAnalyticsCollectionDeactivated; + +/** + * The version ID of the client library, e.g. @"1100000". + */ +@property(nonatomic, readonly, copy) NSString *libraryVersionID; + +/** + * Whether or not editing is locked. This should occur after `FirebaseOptions` has been set on a + * `FirebaseApp`. + */ +@property(nonatomic, getter=isEditingLocked) BOOL editingLocked; + +@end diff --git a/Pods/FirebaseCore/FirebaseCore/Sources/FIRTimestamp.m b/Pods/FirebaseCore/FirebaseCore/Sources/FIRTimestamp.m new file mode 100644 index 0000000..8db07ce --- /dev/null +++ b/Pods/FirebaseCore/FirebaseCore/Sources/FIRTimestamp.m @@ -0,0 +1,152 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseCore/Sources/FIRTimestampInternal.h" + +NS_ASSUME_NONNULL_BEGIN + +static const int kNanosPerSecond = 1000000000; + +@implementation FIRTimestamp (Internal) + +#pragma mark - Internal public methods + +- (NSString *)ISO8601String { + NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; + formatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ss"; + formatter.timeZone = [NSTimeZone timeZoneWithName:@"UTC"]; + NSDate *secondsDate = [NSDate dateWithTimeIntervalSince1970:self.seconds]; + NSString *secondsString = [formatter stringFromDate:secondsDate]; + if (secondsString.length != 19) { + [NSException raise:@"Invalid ISO string" format:@"Invalid ISO string: %@", secondsString]; + } + + NSString *nanosString = [NSString stringWithFormat:@"%09d", self.nanoseconds]; + return [NSString stringWithFormat:@"%@.%@Z", secondsString, nanosString]; +} + +@end + +@implementation FIRTimestamp + +#pragma mark - Constructors + ++ (instancetype)timestampWithDate:(NSDate *)date { + double secondsDouble; + double fraction = modf(date.timeIntervalSince1970, &secondsDouble); + // GCP Timestamps always have non-negative nanos. + if (fraction < 0) { + fraction += 1.0; + secondsDouble -= 1.0; + } + int64_t seconds = (int64_t)secondsDouble; + int32_t nanos = (int32_t)(fraction * kNanosPerSecond); + return [[FIRTimestamp alloc] initWithSeconds:seconds nanoseconds:nanos]; +} + ++ (instancetype)timestampWithSeconds:(int64_t)seconds nanoseconds:(int32_t)nanoseconds { + return [[FIRTimestamp alloc] initWithSeconds:seconds nanoseconds:nanoseconds]; +} + ++ (instancetype)timestamp { + return [FIRTimestamp timestampWithDate:[NSDate date]]; +} + +- (instancetype)initWithSeconds:(int64_t)seconds nanoseconds:(int32_t)nanoseconds { + self = [super init]; + if (self) { + if (nanoseconds < 0) { + [NSException raise:@"Invalid timestamp" + format:@"Timestamp nanoseconds out of range: %d", nanoseconds]; + } + if (nanoseconds >= 1e9) { + [NSException raise:@"Invalid timestamp" + format:@"Timestamp nanoseconds out of range: %d", nanoseconds]; + } + // Midnight at the beginning of 1/1/1 is the earliest timestamp supported. + if (seconds < -62135596800L) { + [NSException raise:@"Invalid timestamp" + format:@"Timestamp seconds out of range: %lld", seconds]; + } + // This will break in the year 10,000. + if (seconds >= 253402300800L) { + [NSException raise:@"Invalid timestamp" + format:@"Timestamp seconds out of range: %lld", seconds]; + } + + _seconds = seconds; + _nanoseconds = nanoseconds; + } + return self; +} + +#pragma mark - NSObject methods + +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[FIRTimestamp class]]) { + return NO; + } + return [self isEqualToTimestamp:(FIRTimestamp *)object]; +} + +- (NSUInteger)hash { + return (NSUInteger)((self.seconds >> 32) ^ self.seconds ^ self.nanoseconds); +} + +- (NSString *)description { + return [NSString stringWithFormat:@"", self.seconds, + self.nanoseconds]; +} + +/** Implements NSCopying without actually copying because timestamps are immutable. */ +- (id)copyWithZone:(__unused NSZone *_Nullable)zone { + return self; +} + +#pragma mark - Public methods + +- (NSDate *)dateValue { + NSTimeInterval interval = (NSTimeInterval)self.seconds + ((NSTimeInterval)self.nanoseconds) / 1e9; + return [NSDate dateWithTimeIntervalSince1970:interval]; +} + +- (NSComparisonResult)compare:(FIRTimestamp *)other { + if (self.seconds < other.seconds) { + return NSOrderedAscending; + } else if (self.seconds > other.seconds) { + return NSOrderedDescending; + } + + if (self.nanoseconds < other.nanoseconds) { + return NSOrderedAscending; + } else if (self.nanoseconds > other.nanoseconds) { + return NSOrderedDescending; + } + return NSOrderedSame; +} + +#pragma mark - Private methods + +- (BOOL)isEqualToTimestamp:(FIRTimestamp *)other { + return [self compare:other] == NSOrderedSame; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseCore/FirebaseCore/Sources/FIRTimestampInternal.h b/Pods/FirebaseCore/FirebaseCore/Sources/FIRTimestampInternal.h new file mode 100644 index 0000000..6261c63 --- /dev/null +++ b/Pods/FirebaseCore/FirebaseCore/Sources/FIRTimestampInternal.h @@ -0,0 +1,35 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseCore/Sources/Public/FirebaseCore/FIRTimestamp.h" + +NS_ASSUME_NONNULL_BEGIN + +/** Internal FIRTimestamp API we don't want exposed in our public header files. */ +@interface FIRTimestamp (Internal) + +/** + * Converts the given date to an ISO 8601 timestamp string, useful for rendering in JSON. + * + * ISO 8601 dates times in UTC look like this: "1912-04-14T23:40:00.000000000Z". + * + * @see http://www.ecma-international.org/ecma-262/6.0/#sec-date-time-string-format + */ +- (NSString *)ISO8601String; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseCore/FirebaseCore/Sources/FIRVersion.m b/Pods/FirebaseCore/FirebaseCore/Sources/FIRVersion.m new file mode 100644 index 0000000..f458a3a --- /dev/null +++ b/Pods/FirebaseCore/FirebaseCore/Sources/FIRVersion.m @@ -0,0 +1,32 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseCore/Sources/Public/FirebaseCore/FIRVersion.h" + +#ifndef Firebase_VERSION +#error "Firebase_VERSION is not defined: add -DFirebase_VERSION=... to the build invocation" +#endif + +// The following two macros supply the incantation so that the C +// preprocessor does not try to parse the version as a floating +// point number. See +// https://www.guyrutenberg.com/2008/12/20/expanding-macros-into-string-constants-in-c/ +#define STR(x) STR_EXPAND(x) +#define STR_EXPAND(x) #x + +NSString* FIRFirebaseVersion(void) { + return @STR(Firebase_VERSION); +} diff --git a/Pods/FirebaseCore/FirebaseCore/Sources/Public/FirebaseCore/FIRApp.h b/Pods/FirebaseCore/FirebaseCore/Sources/Public/FirebaseCore/FIRApp.h new file mode 100644 index 0000000..58ef2a6 --- /dev/null +++ b/Pods/FirebaseCore/FirebaseCore/Sources/Public/FirebaseCore/FIRApp.h @@ -0,0 +1,129 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FIROptions; + +NS_ASSUME_NONNULL_BEGIN + +/** A block that takes a BOOL and has no return value. */ +typedef void (^FIRAppVoidBoolCallback)(BOOL success) + NS_SWIFT_UNAVAILABLE("Use Swift's closure syntax instead."); + +/** + * The entry point of Firebase SDKs. + * + * Initialize and configure `FirebaseApp` using `FirebaseApp.configure()` + * or other customized ways as shown below. + * + * The logging system has two modes: default mode and debug mode. In default mode, only logs with + * log level Notice, Warning and Error will be sent to device. In debug mode, all logs will be sent + * to device. The log levels that Firebase uses are consistent with the ASL log levels. + * + * Enable debug mode by passing the `-FIRDebugEnabled` argument to the application. You can add this + * argument in the application's Xcode scheme. When debug mode is enabled via `-FIRDebugEnabled`, + * further executions of the application will also be in debug mode. In order to return to default + * mode, you must explicitly disable the debug mode with the application argument + * `-FIRDebugDisabled`. + * + * It is also possible to change the default logging level in code by calling + * `FirebaseConfiguration.shared.setLoggerLevel(_:)` with the desired level. + */ +NS_SWIFT_NAME(FirebaseApp) +@interface FIRApp : NSObject + +/** + * Configures a default Firebase app. Raises an exception if any configuration step fails. The + * default app is named "__FIRAPP_DEFAULT". This method should be called after the app is launched + * and before using Firebase services. This method should be called from the main thread and + * contains synchronous file I/O (reading GoogleService-Info.plist from disk). + */ ++ (void)configure; + +/** + * Configures the default Firebase app with the provided options. The default app is named + * "__FIRAPP_DEFAULT". Raises an exception if any configuration step fails. This method should be + * called from the main thread. + * + * @param options The Firebase application options used to configure the service. + */ ++ (void)configureWithOptions:(FIROptions *)options NS_SWIFT_NAME(configure(options:)); + +/** + * Configures a Firebase app with the given name and options. Raises an exception if any + * configuration step fails. This method should be called from the main thread. + * + * @param name The application's name given by the developer. The name should should only contain + Letters, Numbers and Underscore. + * @param options The Firebase application options used to configure the services. + */ +// clang-format off ++ (void)configureWithName:(NSString *)name + options:(FIROptions *)options NS_SWIFT_NAME(configure(name:options:)); +// clang-format on + +/** + * Returns the default app, or `nil` if the default app does not exist. + */ ++ (nullable FIRApp *)defaultApp NS_SWIFT_NAME(app()); + +/** + * Returns a previously created `FirebaseApp` instance with the given name, or `nil` if no such app + * exists. This method is thread safe. + */ ++ (nullable FIRApp *)appNamed:(NSString *)name NS_SWIFT_NAME(app(name:)); + +/** + * Returns the set of all extant `FirebaseApp` instances, or `nil` if there are no `FirebaseApp` + * instances. This method is thread safe. + */ +@property(class, readonly, nullable) NSDictionary *allApps; + +/** + * Cleans up the current `FirebaseApp`, freeing associated data and returning its name to the pool + * for future use. This method is thread safe. + */ +- (void)deleteApp:(void (^)(BOOL success))completion; + +/** + * `FirebaseApp` instances should not be initialized directly. Call `FirebaseApp.configure()`, + * `FirebaseApp.configure(options:)`, or `FirebaseApp.configure(name:options:)` directly. + */ +- (instancetype)init NS_UNAVAILABLE; + +/** + * Gets the name of this app. + */ +@property(nonatomic, copy, readonly) NSString *name; + +/** + * Gets a copy of the options for this app. These are non-modifiable. + */ +@property(nonatomic, copy, readonly) FIROptions *options; + +/** + * Gets or sets whether automatic data collection is enabled for all products. Defaults to `true` + * unless `FirebaseDataCollectionDefaultEnabled` is set to `NO` in your app's Info.plist. This value + * is persisted across runs of the app so that it can be set once when users have consented to + * collection. + */ +@property(nonatomic, readwrite, getter=isDataCollectionDefaultEnabled) + BOOL dataCollectionDefaultEnabled; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseCore/FirebaseCore/Sources/Public/FirebaseCore/FIRConfiguration.h b/Pods/FirebaseCore/FirebaseCore/Sources/Public/FirebaseCore/FIRConfiguration.h new file mode 100644 index 0000000..e6c1f1d --- /dev/null +++ b/Pods/FirebaseCore/FirebaseCore/Sources/Public/FirebaseCore/FIRConfiguration.h @@ -0,0 +1,48 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FIRLoggerLevel.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + * This interface provides global level properties that the developer can tweak. + */ +NS_SWIFT_NAME(FirebaseConfiguration) +@interface FIRConfiguration : NSObject + +/** Returns the shared configuration object. */ +@property(class, nonatomic, readonly) FIRConfiguration *sharedInstance NS_SWIFT_NAME(shared); + +/** + * Sets the logging level for internal Firebase logging. Firebase will only log messages + * that are logged at or below `loggerLevel`. The messages are logged both to the Xcode + * console and to the device's log. Note that if an app is running from AppStore, it will + * never log above `.notice` even if `loggerLevel` is set to a higher (more verbose) + * setting. + * + * @param loggerLevel The maximum logging level. The default level is set to FIRLoggerLevelNotice. + */ +- (void)setLoggerLevel:(FIRLoggerLevel)loggerLevel; + +/// Returns the logging level for internal Firebase logging. +- (FIRLoggerLevel)loggerLevel; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseCore/FirebaseCore/Sources/Public/FirebaseCore/FIRLoggerLevel.h b/Pods/FirebaseCore/FirebaseCore/Sources/Public/FirebaseCore/FIRLoggerLevel.h new file mode 100644 index 0000000..dca3aa0 --- /dev/null +++ b/Pods/FirebaseCore/FirebaseCore/Sources/Public/FirebaseCore/FIRLoggerLevel.h @@ -0,0 +1,38 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Note that importing GULLoggerLevel.h will lead to a non-modular header +// import error. + +/** + * The log levels used by internal logging. + */ +typedef NS_ENUM(NSInteger, FIRLoggerLevel) { + /** Error level, matches ASL_LEVEL_ERR. */ + FIRLoggerLevelError = 3, + /** Warning level, matches ASL_LEVEL_WARNING. */ + FIRLoggerLevelWarning = 4, + /** Notice level, matches ASL_LEVEL_NOTICE. */ + FIRLoggerLevelNotice = 5, + /** Info level, matches ASL_LEVEL_INFO. */ + FIRLoggerLevelInfo = 6, + /** Debug level, matches ASL_LEVEL_DEBUG. */ + FIRLoggerLevelDebug = 7, + /** Minimum log level. */ + FIRLoggerLevelMin = FIRLoggerLevelError, + /** Maximum log level. */ + FIRLoggerLevelMax = FIRLoggerLevelDebug +} NS_SWIFT_NAME(FirebaseLoggerLevel); diff --git a/Pods/FirebaseCore/FirebaseCore/Sources/Public/FirebaseCore/FIROptions.h b/Pods/FirebaseCore/FirebaseCore/Sources/Public/FirebaseCore/FIROptions.h new file mode 100644 index 0000000..4e9f885 --- /dev/null +++ b/Pods/FirebaseCore/FirebaseCore/Sources/Public/FirebaseCore/FIROptions.h @@ -0,0 +1,116 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + * This class provides constant fields of Google APIs. + */ +NS_SWIFT_NAME(FirebaseOptions) +@interface FIROptions : NSObject + +/** + * Returns the default options. The first time this is called it synchronously reads + * GoogleService-Info.plist from disk. + */ ++ (nullable FIROptions *)defaultOptions NS_SWIFT_NAME(defaultOptions()); + +/** + * An API key used for authenticating requests from your Apple app, e.g. + * The key must begin with "A" and contain exactly 39 alphanumeric characters, used to identify your + * app to Google servers. + */ +@property(nonatomic, copy, nullable) NSString *APIKey NS_SWIFT_NAME(apiKey); + +/** + * The bundle ID for the application. Defaults to `Bundle.main.bundleIdentifier` when not set + * manually or in a plist. + */ +@property(nonatomic, copy) NSString *bundleID; + +/** + * The OAuth2 client ID for Apple applications used to authenticate Google users, for example + * @"12345.apps.googleusercontent.com", used for signing in with Google. + */ +@property(nonatomic, copy, nullable) NSString *clientID; + +/** + * The Project Number from the Google Developer's console, for example @"012345678901", used to + * configure Firebase Cloud Messaging. + */ +@property(nonatomic, copy) NSString *GCMSenderID NS_SWIFT_NAME(gcmSenderID); + +/** + * The Project ID from the Firebase console, for example @"abc-xyz-123". + */ +@property(nonatomic, copy, nullable) NSString *projectID; + +/** + * The Google App ID that is used to uniquely identify an instance of an app. + */ +@property(nonatomic, copy) NSString *googleAppID; + +/** + * The database root URL, e.g. @"http://abc-xyz-123.firebaseio.com". + */ +@property(nonatomic, copy, nullable) NSString *databaseURL; + +/** + * The Google Cloud Storage bucket name, e.g. @"abc-xyz-123.storage.firebase.com". + */ +@property(nonatomic, copy, nullable) NSString *storageBucket; + +/** + * The App Group identifier to share data between the application and the application extensions. + * The App Group must be configured in the application and on the Apple Developer Portal. Default + * value `nil`. + */ +@property(nonatomic, copy, nullable) NSString *appGroupID; + +/** + * Initializes a customized instance of FirebaseOptions from the file at the given plist file path. + * This will read the file synchronously from disk. + * For example: + * ```swift + * if let path = Bundle.main.path(forResource:"GoogleService-Info", ofType:"plist") { + * let options = FirebaseOptions(contentsOfFile: path) + * } + * ``` + * Note that it is not possible to customize `FirebaseOptions` for Firebase Analytics which expects + * a static file named `GoogleService-Info.plist` - + * https://github.com/firebase/firebase-ios-sdk/issues/230. + * Returns `nil` if the plist file does not exist or is invalid. + */ +- (nullable instancetype)initWithContentsOfFile:(NSString *)plistPath NS_DESIGNATED_INITIALIZER; + +/** + * Initializes a customized instance of `FirebaseOptions` with required fields. Use the mutable + * properties to modify fields for configuring specific services. Note that it is not possible to + * customize `FirebaseOptions` for Firebase Analytics which expects a static file named + * `GoogleServices-Info.plist` - https://github.com/firebase/firebase-ios-sdk/issues/230. + */ +- (instancetype)initWithGoogleAppID:(NSString *)googleAppID + GCMSenderID:(NSString *)GCMSenderID + NS_SWIFT_NAME(init(googleAppID:gcmSenderID:))NS_DESIGNATED_INITIALIZER; + +/** Unavailable. Please use `init(contentsOfFile:)` or `init(googleAppID:gcmSenderID:)` instead. */ +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseCore/FirebaseCore/Sources/Public/FirebaseCore/FIRTimestamp.h b/Pods/FirebaseCore/FirebaseCore/Sources/Public/FirebaseCore/FIRTimestamp.h new file mode 100644 index 0000000..0420d40 --- /dev/null +++ b/Pods/FirebaseCore/FirebaseCore/Sources/Public/FirebaseCore/FIRTimestamp.h @@ -0,0 +1,90 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + * A Timestamp represents a point in time independent of any time zone or calendar, represented as + * seconds and fractions of seconds at nanosecond resolution in UTC Epoch time. It is encoded using + * the Proleptic Gregorian Calendar which extends the Gregorian calendar backwards to year one. It + * is encoded assuming all minutes are 60 seconds long, i.e. leap seconds are "smeared" so that no + * leap second table is needed for interpretation. Range is from 0001-01-01T00:00:00Z to + * 9999-12-31T23:59:59.999999999Z. By restricting to that range, we ensure that we can convert to + * and from RFC 3339 date strings. + * + * @see https://github.com/google/protobuf/blob/main/src/google/protobuf/timestamp.proto for the + * reference timestamp definition. + */ +NS_SWIFT_SENDABLE +NS_SWIFT_NAME(Timestamp) +@interface FIRTimestamp : NSObject + +/** :nodoc: */ +- (instancetype)init NS_UNAVAILABLE; + +/** + * Creates a new timestamp. + * + * @param seconds the number of seconds since epoch. + * @param nanoseconds the number of nanoseconds after the seconds. + */ +- (instancetype)initWithSeconds:(int64_t)seconds + nanoseconds:(int32_t)nanoseconds NS_DESIGNATED_INITIALIZER; + +/** + * Creates a new timestamp. + * + * @param seconds the number of seconds since epoch. + * @param nanoseconds the number of nanoseconds after the seconds. + */ ++ (instancetype)timestampWithSeconds:(int64_t)seconds nanoseconds:(int32_t)nanoseconds; + +/** Creates a new timestamp from the given date. */ ++ (instancetype)timestampWithDate:(NSDate *)date; + +/** Creates a new timestamp with the current date / time. */ ++ (instancetype)timestamp; + +/** Returns a new `Date` corresponding to this timestamp. This may lose precision. */ +- (NSDate *)dateValue; + +/** + * Returns the result of comparing the receiver with another timestamp. + * @param other the other timestamp to compare. + * @return `orderedAscending` if `other` is chronologically following self, + * `orderedDescending` if `other` is chronologically preceding self, + * `orderedSame` otherwise. + */ +- (NSComparisonResult)compare:(FIRTimestamp *)other; + +/** + * Represents seconds of UTC time since Unix epoch 1970-01-01T00:00:00Z. + * Must be from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59Z inclusive. + */ +@property(nonatomic, assign, readonly) int64_t seconds; + +/** + * Non-negative fractions of a second at nanosecond resolution. Negative second values with + * fractions must still have non-negative nanos values that count forward in time. + * Must be from 0 to 999,999,999 inclusive. + */ +@property(nonatomic, assign, readonly) int32_t nanoseconds; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseCore/FirebaseCore/Sources/Public/FirebaseCore/FIRVersion.h b/Pods/FirebaseCore/FirebaseCore/Sources/Public/FirebaseCore/FIRVersion.h new file mode 100644 index 0000000..651edaf --- /dev/null +++ b/Pods/FirebaseCore/FirebaseCore/Sources/Public/FirebaseCore/FIRVersion.h @@ -0,0 +1,25 @@ +/* + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** Returns the current version of Firebase. */ +NS_SWIFT_NAME(FirebaseVersion()) +NSString* FIRFirebaseVersion(void); + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseCore/FirebaseCore/Sources/Public/FirebaseCore/FirebaseCore.h b/Pods/FirebaseCore/FirebaseCore/Sources/Public/FirebaseCore/FirebaseCore.h new file mode 100644 index 0000000..fff8631 --- /dev/null +++ b/Pods/FirebaseCore/FirebaseCore/Sources/Public/FirebaseCore/FirebaseCore.h @@ -0,0 +1,22 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRApp.h" +#import "FIRConfiguration.h" +#import "FIRLoggerLevel.h" +#import "FIROptions.h" +#import "FIRTimestamp.h" +#import "FIRVersion.h" diff --git a/Pods/FirebaseCore/FirebaseCore/Sources/Resources/PrivacyInfo.xcprivacy b/Pods/FirebaseCore/FirebaseCore/Sources/Resources/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..0244f2f --- /dev/null +++ b/Pods/FirebaseCore/FirebaseCore/Sources/Resources/PrivacyInfo.xcprivacy @@ -0,0 +1,26 @@ + + + + + NSPrivacyTracking + + NSPrivacyTrackingDomains + + + NSPrivacyCollectedDataTypes + + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + NSPrivacyAccessedAPITypeReasons + + CA92.1 + + + + + + diff --git a/Pods/FirebaseCore/LICENSE b/Pods/FirebaseCore/LICENSE new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/Pods/FirebaseCore/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/Pods/FirebaseCore/README.md b/Pods/FirebaseCore/README.md new file mode 100644 index 0000000..15a560d --- /dev/null +++ b/Pods/FirebaseCore/README.md @@ -0,0 +1,302 @@ +

+ + + + + + + + +
+ + + + + + +

+ +# Firebase Apple Open Source Development + +This repository contains the source code for all Apple platform Firebase SDKs except FirebaseAnalytics. + +Firebase is an app development platform with tools to help you build, grow, and +monetize your app. More information about Firebase can be found on the +[official Firebase website](https://firebase.google.com). + +## Installation + +See the subsections below for details about the different installation methods. Where +available, it's recommended to install any libraries with a `Swift` suffix to get the +best experience when writing your app in Swift. + +1. [Standard pod install](#standard-pod-install) +2. [Swift Package Manager](#swift-package-manager) +3. [Installing from the GitHub repo](#installing-from-github) +4. [Experimental Carthage](#carthage-ios-only) + +### Standard pod install + +For instructions on the standard pod install, visit: +[https://firebase.google.com/docs/ios/setup](https://firebase.google.com/docs/ios/setup). + +### Swift Package Manager + +Instructions for [Swift Package Manager](https://swift.org/package-manager/) support can be +found in the [SwiftPackageManager.md](SwiftPackageManager.md) Markdown file. + +### Installing from GitHub + +These instructions can be used to access the Firebase repo at other branches, +tags, or commits. + +#### Background + +See [the Podfile Syntax Reference](https://guides.cocoapods.org/syntax/podfile.html#pod) +for instructions and options about overriding pod source locations. + +#### Accessing Firebase Source Snapshots + +All official releases are tagged in this repo and available via CocoaPods. To access a local +source snapshot or unreleased branch, use Podfile directives like the following: + +To access FirebaseFirestore via a branch: +```ruby +pod 'FirebaseCore', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :branch => 'main' +pod 'FirebaseFirestore', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :branch => 'main' +``` + +To access FirebaseMessaging via a checked-out version of the firebase-ios-sdk repo: +```ruby +pod 'FirebaseCore', :path => '/path/to/firebase-ios-sdk' +pod 'FirebaseMessaging', :path => '/path/to/firebase-ios-sdk' +``` + +### Carthage (iOS only) + +Instructions for the experimental Carthage distribution can be found at +[Carthage.md](Carthage.md). + +### Using Firebase from a Framework or a library + +For details on using Firebase from a Framework or a library, refer to [firebase_in_libraries.md](docs/firebase_in_libraries.md). + +## Development + +To develop Firebase software in this repository, ensure that you have at least +the following software: + +* Xcode 16.2 (or later) + +CocoaPods is still the canonical way to develop, but much of the repo now supports +development with Swift Package Manager. + +### CocoaPods + +Install the following: +* CocoaPods 1.12.0 (or later) +* [CocoaPods generate](https://github.com/square/cocoapods-generate) + +For the pod that you want to develop: + +```ruby +pod gen Firebase{name here}.podspec --local-sources=./ --auto-open --platforms=ios +``` + +Note: If the CocoaPods cache is out of date, you may need to run +`pod repo update` before the `pod gen` command. + +Note: Set the `--platforms` option to `macos` or `tvos` to develop/test for +those platforms. Since 10.2, Xcode does not properly handle multi-platform +CocoaPods workspaces. + +Firestore has a self-contained Xcode project. See +[Firestore/README](Firestore/README.md) Markdown file. + +#### Development for Catalyst +* `pod gen {name here}.podspec --local-sources=./ --auto-open --platforms=ios` +* Check the Mac box in the App-iOS Build Settings +* Sign the App in the Settings Signing & Capabilities tab +* Click Pods in the Project Manager +* Add Signing to the iOS host app and unit test targets +* Select the Unit-unit scheme +* Run it to build and test + +Alternatively, disable signing in each target: +* Go to Build Settings tab +* Click `+` +* Select `Add User-Defined Setting` +* Add `CODE_SIGNING_REQUIRED` setting with a value of `NO` + +### Swift Package Manager +* To enable test schemes: `./scripts/setup_spm_tests.sh` +* `open Package.swift` or double click `Package.swift` in Finder. +* Xcode will open the project + * Choose a scheme for a library to build or test suite to run + * Choose a target platform by selecting the run destination along with the scheme + +### Adding a New Firebase Pod + +Refer to [AddNewPod](docs/AddNewPod.md) Markdown file for details. + +### Managing Headers and Imports + +For information about managing headers and imports, see [HeadersImports](HeadersImports.md) Markdown file. + +### Code Formatting + +To ensure that the code is formatted consistently, run the script +[./scripts/check.sh](https://github.com/firebase/firebase-ios-sdk/blob/main/scripts/check.sh) +before creating a pull request (PR). + +GitHub Actions will verify that any code changes are done in a style-compliant +way. Install `clang-format` and `mint`: + +```console +brew install clang-format@21 +brew install mint +``` + +### Running Unit Tests + +Select a scheme and press Command-u to build a component and run its unit tests. + +### Running Sample Apps +To run the sample apps and integration tests, you'll need a valid +`GoogleService-Info.plist +` file. The Firebase Xcode project contains dummy plist +files without real values, but they can be replaced with real plist files. To get your own +`GoogleService-Info.plist` files: + +1. Go to the [Firebase Console](https://console.firebase.google.com/) +2. Create a new Firebase project, if you don't already have one +3. For each sample app you want to test, create a new Firebase app with the sample app's bundle +identifier (e.g., `com.google.Database-Example`) +4. Download the resulting `GoogleService-Info.plist` and add it to the Xcode project. + +### Coverage Report Generation + +For coverage report generation instructions, see [scripts/code_coverage_report/README](scripts/code_coverage_report/README.md) Markdown file. + +## Specific Component Instructions +See the sections below for any special instructions for those components. + +### Firebase AI Logic + +See the [Firebase AI Logic README](FirebaseAI#development) for instructions +about building and testing the SDK. + +### Firebase Auth + +For specific Firebase Auth development, refer to the [Auth Sample README](FirebaseAuth/Tests/Sample/README.md) for instructions about +building and running the FirebaseAuth pod along with various samples and tests. + +### Firebase Database + +The Firebase Database Integration tests can be run against a locally running Database Emulator +or against a production instance. + +To run against a local emulator instance, invoke `./scripts/run_database_emulator.sh start` before +running the integration test. + +To run against a production instance, provide a valid `GoogleServices-Info.plist` and copy it to +`FirebaseDatabase/Tests/Resources/GoogleService-Info.plist`. Your Security Rule must be set to +[public](https://firebase.google.com/docs/database/security/quickstart) while your tests are +running. + +### Firebase Dynamic Links + +Firebase Dynamic Links is **deprecated** and should not be used in new projects. The service will shut down on August 25, 2025. + +Please see our [Dynamic Links Deprecation FAQ documentation](https://firebase.google.com/support/dynamic-links-faq) for more guidance. + +### Firebase Performance Monitoring + +For specific Firebase Performance Monitoring development, see +[the Performance README](FirebasePerformance/README.md) for instructions about building the SDK +and [the Performance TestApp README](FirebasePerformance/Tests/TestApp/README.md) for instructions about +integrating Performance with the dev test App. + +### Firebase Storage + +To run the Storage Integration tests, follow the instructions in +[StorageIntegration.swift](FirebaseStorage/Tests/Integration/StorageIntegration.swift). + +#### Push Notifications + +Push notifications can only be delivered to specially provisioned App IDs in the developer portal. +In order to test receiving push notifications, you will need to: + +1. Change the bundle identifier of the sample app to something you own in your Apple Developer +account and enable that App ID for push notifications. +2. You'll also need to +[upload your APNs Provider Authentication Key or certificate to the +Firebase Console](https://firebase.google.com/docs/cloud-messaging/ios/certs) +at **Project Settings > Cloud Messaging > [Your Firebase App]**. +3. Ensure your iOS device is added to your Apple Developer portal as a test device. + +#### iOS Simulator + +The iOS Simulator cannot register for remote notifications and will not receive push notifications. +To receive push notifications, follow the steps above and run the app on a physical device. + +## Building with Firebase on Apple platforms + +Firebase provides official beta support for macOS, Catalyst, and tvOS. visionOS and watchOS +are community supported. Thanks to community contributions for many of the multi-platform PRs. + +At this time, most of Firebase's products are available across Apple platforms. There are still +a few gaps, especially on visionOS and watchOS. For details about the current support matrix, see +[this chart](https://firebase.google.com/docs/ios/learn-more#firebase_library_support_by_platform) +in Firebase's documentation. + +### visionOS + +Where supported, visionOS works as expected with the exception of Firestore via Swift Package +Manager where it is required to use the source distribution. + +To enable the Firestore source distribution, quit Xcode and open the desired +project from the command line with the `FIREBASE_SOURCE_FIRESTORE` environment +variable: `open --env FIREBASE_SOURCE_FIRESTORE /path/to/project.xcodeproj`. +To go back to using the binary distribution of Firestore, quit Xcode and open +Xcode like normal, without the environment variable. + +### watchOS +Thanks to contributions from the community, many of Firebase SDKs now compile, run unit tests, and +work on watchOS. See the [Independent Watch App Sample](Example/watchOSSample). + +Keep in mind that watchOS is not officially supported by Firebase. While we can catch basic unit +test issues with GitHub Actions, there may be some changes where the SDK no longer works as expected +on watchOS. If you encounter this, please +[file an issue](https://github.com/firebase/firebase-ios-sdk/issues). + +During app setup in the console, you may get to a step that mentions something like "Checking if the +app has communicated with our servers". This relies on Analytics and will not work on watchOS. +**It's safe to ignore the message and continue**, the rest of the SDKs will work as expected. + +#### Additional Crashlytics Notes +* watchOS has limited support. Due to watchOS restrictions, mach exceptions and signal crashes are +not recorded. (Crashes in SwiftUI are generated as mach exceptions, so will not be recorded) + +## Combine +Thanks to contributions from the community, _FirebaseCombineSwift_ contains support for Apple's Combine +framework. This module is currently under development and not yet supported for use in production +environments. For more details, please refer to the [docs](FirebaseCombineSwift/README.md). + +## Roadmap + +See [Roadmap](ROADMAP.md) for more about the Firebase Apple SDK Open Source +plans and directions. + +## Contributing + +See [Contributing](CONTRIBUTING.md) for more information on contributing to the Firebase +Apple SDK. + +## License + +The contents of this repository are licensed under the +[Apache License, version 2.0](http://www.apache.org/licenses/LICENSE-2.0). + +Your use of Firebase is governed by the +[Terms of Service for Firebase Services](https://firebase.google.com/terms/). diff --git a/Pods/FirebaseCoreExtension/FirebaseCore/Extension/FIRAppInternal.h b/Pods/FirebaseCoreExtension/FirebaseCore/Extension/FIRAppInternal.h new file mode 100644 index 0000000..96d42ef --- /dev/null +++ b/Pods/FirebaseCoreExtension/FirebaseCore/Extension/FIRAppInternal.h @@ -0,0 +1,182 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FIREBASECORE_FIRAPPINTERNAL_H +#define FIREBASECORE_FIRAPPINTERNAL_H + +#import + +@class FIRComponentContainer; +@class FIRHeartbeatLogger; +@protocol FIRLibrary; + +/** + * The internal interface to `FirebaseApp`. This is meant for first-party integrators, who need to + * receive `FirebaseApp` notifications, log info about the success or failure of their + * configuration, and access other internal functionality of `FirebaseApp`. + */ +NS_ASSUME_NONNULL_BEGIN + +typedef NS_ENUM(NSInteger, FIRConfigType) { + FIRConfigTypeCore = 1, + FIRConfigTypeSDK = 2, +}; + +extern NSString *const kFIRDefaultAppName; +extern NSString *const kFIRAppReadyToConfigureSDKNotification; +extern NSString *const kFIRAppDeleteNotification; +extern NSString *const kFIRAppIsDefaultAppKey; +extern NSString *const kFIRAppNameKey; +extern NSString *const kFIRGoogleAppIDKey; +extern NSString *const kFirebaseCoreErrorDomain; + +/** + * Keys for the strings in the plist file. + */ +extern NSString *const kFIRAPIKey; +extern NSString *const kFIRTrackingID; +extern NSString *const kFIRGoogleAppID; +extern NSString *const kFIRClientID; +extern NSString *const kFIRGCMSenderID; +extern NSString *const kFIRAndroidClientID; +extern NSString *const kFIRDatabaseURL; +extern NSString *const kFIRStorageBucket; +extern NSString *const kFIRBundleID; +extern NSString *const kFIRProjectID; + +/** + * Keys for the plist file name + */ +extern NSString *const kServiceInfoFileName; + +extern NSString *const kServiceInfoFileType; + +/** + * The format string for the `UserDefaults` key used for storing the data collection enabled flag. + * This includes formatting to append the `FirebaseApp`'s name. + */ +extern NSString *const kFIRGlobalAppDataCollectionEnabledDefaultsKeyFormat; + +/** + * The plist key used for storing the data collection enabled flag. + */ +extern NSString *const kFIRGlobalAppDataCollectionEnabledPlistKey; + +/** @var FirebaseAuthStateDidChangeInternalNotification + @brief The name of the @c NotificationCenter notification which is posted when the auth state + changes (e.g. a new token has been produced, a user logs in or out). The object parameter of + the notification is a dictionary possibly containing the key: + @c FirebaseAuthStateDidChangeInternalNotificationTokenKey (the new access token.) If it does not + contain this key it indicates a sign-out event took place. + */ +extern NSString *const FIRAuthStateDidChangeInternalNotification; + +/** @var FirebaseAuthStateDidChangeInternalNotificationTokenKey + @brief A key present in the dictionary object parameter of the + @c FirebaseAuthStateDidChangeInternalNotification notification. The value associated with this + key will contain the new access token. + */ +extern NSString *const FIRAuthStateDidChangeInternalNotificationTokenKey; + +/** @var FirebaseAuthStateDidChangeInternalNotificationAppKey + @brief A key present in the dictionary object parameter of the + @c FirebaseAuthStateDidChangeInternalNotification notification. The value associated with this + key will contain the FirebaseApp associated with the auth instance. + */ +extern NSString *const FIRAuthStateDidChangeInternalNotificationAppKey; + +/** @var FirebaseAuthStateDidChangeInternalNotificationUIDKey + @brief A key present in the dictionary object parameter of the + @c FirebaseAuthStateDidChangeInternalNotification notification. The value associated with this + key will contain the new user's UID (or nil if there is no longer a user signed in). + */ +extern NSString *const FIRAuthStateDidChangeInternalNotificationUIDKey; + +@interface FIRApp () + +/** + * A flag indicating if this is the default app (has the default app name). + */ +@property(nonatomic, readonly) BOOL isDefaultApp; + +/** + * The container of interop SDKs for this app. + */ +@property(nonatomic) FIRComponentContainer *container; + +/** + * The heartbeat logger associated with this app. + * + * Firebase apps have a 1:1 relationship with heartbeat loggers. + */ +@property(readonly) FIRHeartbeatLogger *heartbeatLogger; + +/** + * Checks if the default app is configured without trying to configure it. + */ ++ (BOOL)isDefaultAppConfigured; + +/** + * Registers a given third-party library with the given version number to be reported for + * analytics. + * + * @param name Name of the library. + * @param version Version of the library. + */ ++ (void)registerLibrary:(nonnull NSString *)name withVersion:(nonnull NSString *)version; + +/** + * Registers a given internal library to be reported for analytics. + * + * @param library Optional parameter for component registration. + * @param name Name of the library. + */ ++ (void)registerInternalLibrary:(nonnull Class)library + withName:(nonnull NSString *)name; + +/** + * Registers a given internal library with the given version number to be reported for + * analytics. This should only be used for non-Firebase libraries that have their own versioning + * scheme. + * + * @param library Optional parameter for component registration. + * @param name Name of the library. + * @param version Version of the library. + */ ++ (void)registerInternalLibrary:(nonnull Class)library + withName:(nonnull NSString *)name + withVersion:(nonnull NSString *)version; + +/** + * A concatenated string representing all the third-party libraries and version numbers. + */ ++ (NSString *)firebaseUserAgent; + +/** + * Can be used by the unit tests in each SDK to reset `FirebaseApp`. This method is thread unsafe. + */ ++ (void)resetApps; + +/** + * Can be used by the unit tests in each SDK to set customized options. + */ +- (instancetype)initInstanceWithName:(NSString *)name options:(FIROptions *)options; + +@end + +NS_ASSUME_NONNULL_END + +#endif // FIREBASECORE_FIRAPPINTERNAL_H diff --git a/Pods/FirebaseCoreExtension/FirebaseCore/Extension/FIRComponent.h b/Pods/FirebaseCoreExtension/FirebaseCore/Extension/FIRComponent.h new file mode 100644 index 0000000..98c7a89 --- /dev/null +++ b/Pods/FirebaseCoreExtension/FirebaseCore/Extension/FIRComponent.h @@ -0,0 +1,89 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FIREBASECORE_FIRCOMPONENT_H +#define FIREBASECORE_FIRCOMPONENT_H + +#import + +@class FIRApp; +@class FIRComponentContainer; + +NS_ASSUME_NONNULL_BEGIN + +/// Provides a system to clean up cached instances returned from the component system. +NS_SWIFT_NAME(ComponentLifecycleMaintainer) +@protocol FIRComponentLifecycleMaintainer +/// The associated app will be deleted, clean up any resources as they are about to be deallocated. +- (void)appWillBeDeleted:(FIRApp *)app; +@end + +typedef _Nullable id (^FIRComponentCreationBlock)(FIRComponentContainer *container, + BOOL *isCacheable) + NS_SWIFT_NAME(ComponentCreationBlock); + +/// Describes the timing of instantiation. Note: new components should default to lazy unless there +/// is a strong reason to be eager. +typedef NS_ENUM(NSInteger, FIRInstantiationTiming) { + FIRInstantiationTimingLazy, + FIRInstantiationTimingAlwaysEager, + FIRInstantiationTimingEagerInDefaultApp +} NS_SWIFT_NAME(InstantiationTiming); + +/// A component that can be used from other Firebase SDKs. +NS_SWIFT_NAME(Component) +@interface FIRComponent : NSObject + +/// The protocol describing functionality provided from the `Component`. +@property(nonatomic, strong, readonly) Protocol *protocol; + +/// The timing of instantiation. +@property(nonatomic, readonly) FIRInstantiationTiming instantiationTiming; + +/// A block to instantiate an instance of the component with the appropriate dependencies. +@property(nonatomic, copy, readonly) FIRComponentCreationBlock creationBlock; + +// There's an issue with long NS_SWIFT_NAMES that causes compilation to fail, disable clang-format +// for the next two methods. +// clang-format off + +/// Creates a component with no dependencies that will be lazily initialized. ++ (instancetype)componentWithProtocol:(Protocol *)protocol + creationBlock:(FIRComponentCreationBlock)creationBlock +NS_SWIFT_NAME(init(_:creationBlock:)); + +/// Creates a component to be registered with the component container. +/// +/// @param protocol - The protocol describing functionality provided by the component. +/// @param instantiationTiming - When the component should be initialized. Use .lazy unless there's +/// a good reason to be instantiated earlier. +/// @param creationBlock - A block to instantiate the component with a container, and if +/// @return A component that can be registered with the component container. ++ (instancetype)componentWithProtocol:(Protocol *)protocol + instantiationTiming:(FIRInstantiationTiming)instantiationTiming + creationBlock:(FIRComponentCreationBlock)creationBlock +NS_SWIFT_NAME(init(_:instantiationTiming:creationBlock:)); + +// clang-format on + +/// Unavailable. +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END + +#endif // FIREBASECORE_FIRCOMPONENT_H diff --git a/Pods/FirebaseCoreExtension/FirebaseCore/Extension/FIRComponentContainer.h b/Pods/FirebaseCoreExtension/FirebaseCore/Extension/FIRComponentContainer.h new file mode 100644 index 0000000..6864087 --- /dev/null +++ b/Pods/FirebaseCoreExtension/FirebaseCore/Extension/FIRComponentContainer.h @@ -0,0 +1,51 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FIREBASECORE_FIRCOMPONENTCONTAINER_H +#define FIREBASECORE_FIRCOMPONENTCONTAINER_H + +#import + +NS_ASSUME_NONNULL_BEGIN + +/// A type-safe macro to retrieve a component from a container. This should be used to retrieve +/// components instead of using the container directly. +#define FIR_COMPONENT(type, container) \ + [FIRComponentType> instanceForProtocol:@protocol(type) inContainer:container] + +@class FIRApp; + +/// A container that holds different components that are registered via the +/// `registerAsComponentRegistrant` call. These classes should conform to `ComponentRegistrant` +/// in order to properly register components for Core. +NS_SWIFT_NAME(FirebaseComponentContainer) +@interface FIRComponentContainer : NSObject + +/// A weak reference to the app that an instance of the container belongs to. +@property(nonatomic, weak, readonly) FIRApp *app; + +// TODO: See if we can get improved type safety here. +/// A Swift only API for fetching an instance since the top macro isn't available. +- (nullable id)__instanceForProtocol:(Protocol *)protocol NS_SWIFT_NAME(instance(for:)); + +/// Unavailable. Use the `container` property on `FirebaseApp`. +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END + +#endif // FIREBASECORE_FIRCOMPONENTCONTAINER_H diff --git a/Pods/FirebaseCoreExtension/FirebaseCore/Extension/FIRComponentType.h b/Pods/FirebaseCoreExtension/FirebaseCore/Extension/FIRComponentType.h new file mode 100644 index 0000000..92a5aab --- /dev/null +++ b/Pods/FirebaseCoreExtension/FirebaseCore/Extension/FIRComponentType.h @@ -0,0 +1,40 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FIREBASECORE_FIRCOMPONENTTYPE_H +#define FIREBASECORE_FIRCOMPONENTTYPE_H + +#import + +@class FIRComponentContainer; + +NS_ASSUME_NONNULL_BEGIN + +/// Do not use directly. A placeholder type in order to provide a macro that will warn users of +/// mis-matched protocols. +NS_SWIFT_NAME(ComponentType) +@interface FIRComponentType<__covariant T> : NSObject + +/// Do not use directly. A factory method to retrieve an instance that provides a specific +/// functionality. ++ (nullable T)instanceForProtocol:(Protocol *)protocol + inContainer:(FIRComponentContainer *)container; + +@end + +NS_ASSUME_NONNULL_END + +#endif // FIREBASECORE_FIRCOMPONENTTYPE_H diff --git a/Pods/FirebaseCoreExtension/FirebaseCore/Extension/FIRHeartbeatLogger.h b/Pods/FirebaseCoreExtension/FirebaseCore/Extension/FIRHeartbeatLogger.h new file mode 100644 index 0000000..95497d2 --- /dev/null +++ b/Pods/FirebaseCoreExtension/FirebaseCore/Extension/FIRHeartbeatLogger.h @@ -0,0 +1,110 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef FIREBASECORE_FIRHEARTBEATLOGGER_H +#define FIREBASECORE_FIRHEARTBEATLOGGER_H + +#import + +NS_ASSUME_NONNULL_BEGIN + +#ifndef FIREBASE_BUILD_CMAKE +@class FIRHeartbeatsPayload; +#endif // FIREBASE_BUILD_CMAKE + +/// Enum representing different daily heartbeat codes. +/// This enum is only used by clients using platform logging V1. This is because +/// the V1 payload only supports a single daily heartbeat. +typedef NS_ENUM(NSInteger, FIRDailyHeartbeatCode) { + /// Represents the absence of a daily heartbeat. + FIRDailyHeartbeatCodeNone = 0, + /// Represents the presence of a daily heartbeat. + FIRDailyHeartbeatCodeSome = 2, +}; + +NS_SWIFT_SENDABLE +@protocol FIRHeartbeatLoggerProtocol + +/// Asynchronously logs a heartbeat. +- (void)log; + +/// Gets the heartbeat code for today. +- (FIRDailyHeartbeatCode)heartbeatCodeForToday; + +#ifndef FIREBASE_BUILD_CMAKE +/// Returns the header value for the heartbeat logger via the given completion handler.. +- (void)asyncHeaderValueWithCompletionHandler:(void (^)(NSString *_Nullable))completionHandler + API_AVAILABLE(ios(13.0), macosx(10.15), macCatalyst(13.0), tvos(13.0), watchos(6.0)); + +/// Return the header value for the heartbeat logger. +- (NSString *_Nullable)headerValue; +#endif // FIREBASE_BUILD_CMAKE + +@end + +#ifndef FIREBASE_BUILD_CMAKE +/// Returns a nullable string header value from a given heartbeats payload. +/// +/// This API returns `nil` when the given heartbeats payload is considered empty. +/// +/// @param heartbeatsPayload The heartbeats payload. +NSString *_Nullable FIRHeaderValueFromHeartbeatsPayload(FIRHeartbeatsPayload *heartbeatsPayload); +#endif // FIREBASE_BUILD_CMAKE + +/// A thread safe, synchronized object that logs and flushes platform logging info. +@interface FIRHeartbeatLogger : NSObject + +/// Designated initializer. +/// +/// @param appID The app ID that this heartbeat logger corresponds to. +- (instancetype)initWithAppID:(NSString *)appID; + +/// Asynchronously logs a new heartbeat corresponding to the Firebase User Agent, if needed. +/// +/// @note This API is thread-safe. +- (void)log; + +#ifndef FIREBASE_BUILD_CMAKE +/// Synchronously flushes heartbeats from storage into a structured payload of heartbeats. +/// +/// This API is for clients using platform logging V2. +/// +/// @note This API is thread-safe. +/// @return A payload of heartbeats. +- (FIRHeartbeatsPayload *)flushHeartbeatsIntoPayload; + +/// Asynchronously flushes heartbeats from storage into a structured payload of heartbeats. +/// +/// This API is for clients using platform logging V2. +/// +/// @note This API is thread-safe. +/// @param completionHandler A completion handler to process the flushed payload of heartbeats. +- (void)flushHeartbeatsIntoPayloadWithCompletionHandler: + (void (^)(FIRHeartbeatsPayload *))completionHandler + API_AVAILABLE(ios(13.0), macosx(10.15), macCatalyst(13.0), tvos(13.0), watchos(6.0)); +#endif // FIREBASE_BUILD_CMAKE + +/// Gets today's corresponding heartbeat code. +/// +/// This API is for clients using platform logging V1. +/// +/// @note This API is thread-safe. +/// @return Heartbeat code indicating whether or not there is an unsent global heartbeat. +- (FIRDailyHeartbeatCode)heartbeatCodeForToday; + +@end + +NS_ASSUME_NONNULL_END + +#endif // FIREBASECORE_FIRHEARTBEATLOGGER_H diff --git a/Pods/FirebaseCoreExtension/FirebaseCore/Extension/FIRLibrary.h b/Pods/FirebaseCoreExtension/FirebaseCore/Extension/FIRLibrary.h new file mode 100644 index 0000000..fe256ad --- /dev/null +++ b/Pods/FirebaseCoreExtension/FirebaseCore/Extension/FIRLibrary.h @@ -0,0 +1,44 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FIREBASECORE_FIRLIBRARY_H +#define FIREBASECORE_FIRLIBRARY_H + +#ifndef FIRLibrary_h +#define FIRLibrary_h + +#import + +@class FIRApp; +@class FIRComponent; + +NS_ASSUME_NONNULL_BEGIN + +/// Provide an interface to register a library for userAgent logging and availability to others. +NS_SWIFT_NAME(Library) +@protocol FIRLibrary + +/// Returns one or more Components that will be registered in +/// FirebaseApp and participate in dependency resolution and injection. ++ (NSArray *)componentsToRegister; + +@end + +NS_ASSUME_NONNULL_END + +#endif /* FIRLibrary_h */ + +#endif // FIREBASECORE_FIRLIBRARY_H diff --git a/Pods/FirebaseCoreExtension/FirebaseCore/Extension/FIRLogger.h b/Pods/FirebaseCoreExtension/FirebaseCore/Extension/FIRLogger.h new file mode 100644 index 0000000..8117189 --- /dev/null +++ b/Pods/FirebaseCoreExtension/FirebaseCore/Extension/FIRLogger.h @@ -0,0 +1,198 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FIREBASECORE_FIRLOGGER_H +#define FIREBASECORE_FIRLOGGER_H + +#import + +typedef NS_ENUM(NSInteger, FIRLoggerLevel); + +NS_ASSUME_NONNULL_BEGIN + +/** + * The Firebase services used in Firebase logger. + */ +typedef NSString *const FIRLoggerService; + +extern NSString *const kFIRLoggerAnalytics; +extern NSString *const kFIRLoggerCrash; +extern NSString *const kFIRLoggerCore; +extern NSString *const kFIRLoggerRemoteConfig; + +/** + * The key used to store the logger's error count. + */ +extern NSString *const kFIRLoggerErrorCountKey; + +/** + * The key used to store the logger's warning count. + */ +extern NSString *const kFIRLoggerWarningCountKey; + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/** + * Enables or disables Analytics debug mode. + * If set to true, the logging level for Analytics will be set to FirebaseLoggerLevelDebug. + * Enabling the debug mode has no effect if the app is running from App Store. + * (required) analytics debug mode flag. + */ +void FIRSetAnalyticsDebugMode(BOOL analyticsDebugMode); + +/** + * Gets the current FIRLoggerLevel. + */ +FIRLoggerLevel FIRGetLoggerLevel(void); + +/** + * Changes the default logging level of FirebaseLoggerLevelNotice to a user-specified level. + * The default level cannot be set above FirebaseLoggerLevelNotice if the app is running from App + * Store. (required) log level (one of the FirebaseLoggerLevel enum values). + */ +void FIRSetLoggerLevel(FIRLoggerLevel loggerLevel); + +void FIRSetLoggerLevelNotice(void); +void FIRSetLoggerLevelWarning(void); +void FIRSetLoggerLevelError(void); +void FIRSetLoggerLevelDebug(void); + +/** + * Checks if the specified logger level is loggable given the current settings. + * (required) log level (one of the FirebaseLoggerLevel enum values). + * (required) whether or not this function is called from the Analytics component. + */ +BOOL FIRIsLoggableLevel(FIRLoggerLevel loggerLevel, BOOL analyticsComponent); + +BOOL FIRIsLoggableLevelNotice(void); +BOOL FIRIsLoggableLevelWarning(void); +BOOL FIRIsLoggableLevelError(void); +BOOL FIRIsLoggableLevelDebug(void); + +/** + * Logs a message to the Xcode console and the device log. If running from AppStore, will + * not log any messages with a level higher than FirebaseLoggerLevelNotice to avoid log spamming. + * (required) log level (one of the FirebaseLoggerLevel enum values). + * (required) service name of type FirebaseLoggerService. + * (required) message code starting with "I-" which means iOS, followed by a capitalized + * three-character service identifier and a six digit integer message ID that is unique + * within the service. + * An example of the message code is @"I-COR000001". + * (required) message string which can be a format string. + * (optional) variable arguments list obtained from calling va_start, used when message is a format + * string. + */ +extern void FIRLogBasic(FIRLoggerLevel level, + NSString *category, + NSString *messageCode, + NSString *message, +// On 64-bit simulators, va_list is not a pointer, so cannot be marked nullable +// See: http://stackoverflow.com/q/29095469 +#if __LP64__ && TARGET_OS_SIMULATOR || TARGET_OS_OSX + va_list args_ptr +#else + va_list _Nullable args_ptr +#endif +); + +/** + * The following functions accept the following parameters in order: + * (required) service name of type FirebaseLoggerService. + * (required) message code starting from "I-" which means iOS, followed by a capitalized + * three-character service identifier and a six digit integer message ID that is unique + * within the service. + * An example of the message code is @"I-COR000001". + * See go/firebase-log-proposal for details. + * (required) message string which can be a format string. + * (optional) the list of arguments to substitute into the format string. + * Example usage: + * FirebaseLogError(kFirebaseLoggerCore, @"I-COR000001", @"Configuration of %@ failed.", app.name); + */ +extern void FIRLogError(NSString *category, NSString *messageCode, NSString *message, ...) + NS_FORMAT_FUNCTION(3, 4); +extern void FIRLogWarning(NSString *category, NSString *messageCode, NSString *message, ...) + NS_FORMAT_FUNCTION(3, 4); +extern void FIRLogNotice(NSString *category, NSString *messageCode, NSString *message, ...) + NS_FORMAT_FUNCTION(3, 4); +extern void FIRLogInfo(NSString *category, NSString *messageCode, NSString *message, ...) + NS_FORMAT_FUNCTION(3, 4); +extern void FIRLogDebug(NSString *category, NSString *messageCode, NSString *message, ...) + NS_FORMAT_FUNCTION(3, 4); + +/** + * This function is similar to the one above, except it takes a `va_list` instead of the listed + * variables. + * + * The following functions accept the following parameters in order: (required) service + * name of type FirebaseLoggerService. + * + * (required) message code starting from "I-" which means iOS, + * followed by a capitalized three-character service identifier and a six digit integer message + * ID that is unique within the service. An example of the message code is @"I-COR000001". + * See go/firebase-log-proposal for details. + * (required) message string which can be a format string. + * (optional) A va_list + */ +extern void FIRLogBasicError(NSString *category, + NSString *messageCode, + NSString *message, + va_list args_ptr); +extern void FIRLogBasicWarning(NSString *category, + NSString *messageCode, + NSString *message, + va_list args_ptr); +extern void FIRLogBasicNotice(NSString *category, + NSString *messageCode, + NSString *message, + va_list args_ptr); +extern void FIRLogBasicInfo(NSString *category, + NSString *messageCode, + NSString *message, + va_list args_ptr); +extern void FIRLogBasicDebug(NSString *category, + NSString *messageCode, + NSString *message, + va_list args_ptr); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + +NS_SWIFT_NAME(FirebaseLogger) +@interface FIRLoggerWrapper : NSObject + +/// Logs a given message at a given log level. +/// +/// - Parameters: +/// - level: The log level to use (defined by `FirebaseLoggerLevel` enum values). +/// - category: The service name of type `FirebaseLoggerService`. +/// - code: The message code. Starting with "I-" which means iOS, followed by a capitalized +/// three-character service identifier and a six digit integer message ID that is unique within +/// the service. An example of the message code is @"I-COR000001". +/// - message: Formatted string to be used as the log's message. ++ (void)logWithLevel:(FIRLoggerLevel)level + service:(NSString *)category + code:(NSString *)code + message:(NSString *)message + __attribute__((__swift_name__("log(level:service:code:message:)"))); + +@end + +NS_ASSUME_NONNULL_END + +#endif // FIREBASECORE_FIRLOGGER_H diff --git a/Pods/FirebaseCoreExtension/FirebaseCore/Extension/FirebaseCoreInternal.h b/Pods/FirebaseCoreExtension/FirebaseCore/Extension/FirebaseCoreInternal.h new file mode 100644 index 0000000..2561008 --- /dev/null +++ b/Pods/FirebaseCoreExtension/FirebaseCore/Extension/FirebaseCoreInternal.h @@ -0,0 +1,28 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef FIREBASECORE_FIREBASECOREINTERNAL_H +#define FIREBASECORE_FIREBASECOREINTERNAL_H + +@import FirebaseCore; + +#import "FIRAppInternal.h" +#import "FIRComponent.h" +#import "FIRComponentContainer.h" +#import "FIRComponentType.h" +#import "FIRHeartbeatLogger.h" +#import "FIRLibrary.h" +#import "FIRLogger.h" + +#endif // FIREBASECORE_FIREBASECOREINTERNAL_H diff --git a/Pods/FirebaseCoreExtension/FirebaseCore/Extension/Resources/PrivacyInfo.xcprivacy b/Pods/FirebaseCoreExtension/FirebaseCore/Extension/Resources/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..c89c88f --- /dev/null +++ b/Pods/FirebaseCoreExtension/FirebaseCore/Extension/Resources/PrivacyInfo.xcprivacy @@ -0,0 +1,18 @@ + + + + + NSPrivacyTracking + + NSPrivacyTrackingDomains + + + NSPrivacyCollectedDataTypes + + + NSPrivacyAccessedAPITypes + + + + + diff --git a/Pods/FirebaseCoreExtension/FirebaseCore/Extension/dummy.m b/Pods/FirebaseCoreExtension/FirebaseCore/Extension/dummy.m new file mode 100644 index 0000000..2e503fe --- /dev/null +++ b/Pods/FirebaseCoreExtension/FirebaseCore/Extension/dummy.m @@ -0,0 +1,17 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Swift Package Manager needs at least one source file. diff --git a/Pods/FirebaseCoreExtension/LICENSE b/Pods/FirebaseCoreExtension/LICENSE new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/Pods/FirebaseCoreExtension/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/Pods/FirebaseCoreExtension/README.md b/Pods/FirebaseCoreExtension/README.md new file mode 100644 index 0000000..15a560d --- /dev/null +++ b/Pods/FirebaseCoreExtension/README.md @@ -0,0 +1,302 @@ +

+ + + + + + + + +
+ + + + + + +

+ +# Firebase Apple Open Source Development + +This repository contains the source code for all Apple platform Firebase SDKs except FirebaseAnalytics. + +Firebase is an app development platform with tools to help you build, grow, and +monetize your app. More information about Firebase can be found on the +[official Firebase website](https://firebase.google.com). + +## Installation + +See the subsections below for details about the different installation methods. Where +available, it's recommended to install any libraries with a `Swift` suffix to get the +best experience when writing your app in Swift. + +1. [Standard pod install](#standard-pod-install) +2. [Swift Package Manager](#swift-package-manager) +3. [Installing from the GitHub repo](#installing-from-github) +4. [Experimental Carthage](#carthage-ios-only) + +### Standard pod install + +For instructions on the standard pod install, visit: +[https://firebase.google.com/docs/ios/setup](https://firebase.google.com/docs/ios/setup). + +### Swift Package Manager + +Instructions for [Swift Package Manager](https://swift.org/package-manager/) support can be +found in the [SwiftPackageManager.md](SwiftPackageManager.md) Markdown file. + +### Installing from GitHub + +These instructions can be used to access the Firebase repo at other branches, +tags, or commits. + +#### Background + +See [the Podfile Syntax Reference](https://guides.cocoapods.org/syntax/podfile.html#pod) +for instructions and options about overriding pod source locations. + +#### Accessing Firebase Source Snapshots + +All official releases are tagged in this repo and available via CocoaPods. To access a local +source snapshot or unreleased branch, use Podfile directives like the following: + +To access FirebaseFirestore via a branch: +```ruby +pod 'FirebaseCore', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :branch => 'main' +pod 'FirebaseFirestore', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :branch => 'main' +``` + +To access FirebaseMessaging via a checked-out version of the firebase-ios-sdk repo: +```ruby +pod 'FirebaseCore', :path => '/path/to/firebase-ios-sdk' +pod 'FirebaseMessaging', :path => '/path/to/firebase-ios-sdk' +``` + +### Carthage (iOS only) + +Instructions for the experimental Carthage distribution can be found at +[Carthage.md](Carthage.md). + +### Using Firebase from a Framework or a library + +For details on using Firebase from a Framework or a library, refer to [firebase_in_libraries.md](docs/firebase_in_libraries.md). + +## Development + +To develop Firebase software in this repository, ensure that you have at least +the following software: + +* Xcode 16.2 (or later) + +CocoaPods is still the canonical way to develop, but much of the repo now supports +development with Swift Package Manager. + +### CocoaPods + +Install the following: +* CocoaPods 1.12.0 (or later) +* [CocoaPods generate](https://github.com/square/cocoapods-generate) + +For the pod that you want to develop: + +```ruby +pod gen Firebase{name here}.podspec --local-sources=./ --auto-open --platforms=ios +``` + +Note: If the CocoaPods cache is out of date, you may need to run +`pod repo update` before the `pod gen` command. + +Note: Set the `--platforms` option to `macos` or `tvos` to develop/test for +those platforms. Since 10.2, Xcode does not properly handle multi-platform +CocoaPods workspaces. + +Firestore has a self-contained Xcode project. See +[Firestore/README](Firestore/README.md) Markdown file. + +#### Development for Catalyst +* `pod gen {name here}.podspec --local-sources=./ --auto-open --platforms=ios` +* Check the Mac box in the App-iOS Build Settings +* Sign the App in the Settings Signing & Capabilities tab +* Click Pods in the Project Manager +* Add Signing to the iOS host app and unit test targets +* Select the Unit-unit scheme +* Run it to build and test + +Alternatively, disable signing in each target: +* Go to Build Settings tab +* Click `+` +* Select `Add User-Defined Setting` +* Add `CODE_SIGNING_REQUIRED` setting with a value of `NO` + +### Swift Package Manager +* To enable test schemes: `./scripts/setup_spm_tests.sh` +* `open Package.swift` or double click `Package.swift` in Finder. +* Xcode will open the project + * Choose a scheme for a library to build or test suite to run + * Choose a target platform by selecting the run destination along with the scheme + +### Adding a New Firebase Pod + +Refer to [AddNewPod](docs/AddNewPod.md) Markdown file for details. + +### Managing Headers and Imports + +For information about managing headers and imports, see [HeadersImports](HeadersImports.md) Markdown file. + +### Code Formatting + +To ensure that the code is formatted consistently, run the script +[./scripts/check.sh](https://github.com/firebase/firebase-ios-sdk/blob/main/scripts/check.sh) +before creating a pull request (PR). + +GitHub Actions will verify that any code changes are done in a style-compliant +way. Install `clang-format` and `mint`: + +```console +brew install clang-format@21 +brew install mint +``` + +### Running Unit Tests + +Select a scheme and press Command-u to build a component and run its unit tests. + +### Running Sample Apps +To run the sample apps and integration tests, you'll need a valid +`GoogleService-Info.plist +` file. The Firebase Xcode project contains dummy plist +files without real values, but they can be replaced with real plist files. To get your own +`GoogleService-Info.plist` files: + +1. Go to the [Firebase Console](https://console.firebase.google.com/) +2. Create a new Firebase project, if you don't already have one +3. For each sample app you want to test, create a new Firebase app with the sample app's bundle +identifier (e.g., `com.google.Database-Example`) +4. Download the resulting `GoogleService-Info.plist` and add it to the Xcode project. + +### Coverage Report Generation + +For coverage report generation instructions, see [scripts/code_coverage_report/README](scripts/code_coverage_report/README.md) Markdown file. + +## Specific Component Instructions +See the sections below for any special instructions for those components. + +### Firebase AI Logic + +See the [Firebase AI Logic README](FirebaseAI#development) for instructions +about building and testing the SDK. + +### Firebase Auth + +For specific Firebase Auth development, refer to the [Auth Sample README](FirebaseAuth/Tests/Sample/README.md) for instructions about +building and running the FirebaseAuth pod along with various samples and tests. + +### Firebase Database + +The Firebase Database Integration tests can be run against a locally running Database Emulator +or against a production instance. + +To run against a local emulator instance, invoke `./scripts/run_database_emulator.sh start` before +running the integration test. + +To run against a production instance, provide a valid `GoogleServices-Info.plist` and copy it to +`FirebaseDatabase/Tests/Resources/GoogleService-Info.plist`. Your Security Rule must be set to +[public](https://firebase.google.com/docs/database/security/quickstart) while your tests are +running. + +### Firebase Dynamic Links + +Firebase Dynamic Links is **deprecated** and should not be used in new projects. The service will shut down on August 25, 2025. + +Please see our [Dynamic Links Deprecation FAQ documentation](https://firebase.google.com/support/dynamic-links-faq) for more guidance. + +### Firebase Performance Monitoring + +For specific Firebase Performance Monitoring development, see +[the Performance README](FirebasePerformance/README.md) for instructions about building the SDK +and [the Performance TestApp README](FirebasePerformance/Tests/TestApp/README.md) for instructions about +integrating Performance with the dev test App. + +### Firebase Storage + +To run the Storage Integration tests, follow the instructions in +[StorageIntegration.swift](FirebaseStorage/Tests/Integration/StorageIntegration.swift). + +#### Push Notifications + +Push notifications can only be delivered to specially provisioned App IDs in the developer portal. +In order to test receiving push notifications, you will need to: + +1. Change the bundle identifier of the sample app to something you own in your Apple Developer +account and enable that App ID for push notifications. +2. You'll also need to +[upload your APNs Provider Authentication Key or certificate to the +Firebase Console](https://firebase.google.com/docs/cloud-messaging/ios/certs) +at **Project Settings > Cloud Messaging > [Your Firebase App]**. +3. Ensure your iOS device is added to your Apple Developer portal as a test device. + +#### iOS Simulator + +The iOS Simulator cannot register for remote notifications and will not receive push notifications. +To receive push notifications, follow the steps above and run the app on a physical device. + +## Building with Firebase on Apple platforms + +Firebase provides official beta support for macOS, Catalyst, and tvOS. visionOS and watchOS +are community supported. Thanks to community contributions for many of the multi-platform PRs. + +At this time, most of Firebase's products are available across Apple platforms. There are still +a few gaps, especially on visionOS and watchOS. For details about the current support matrix, see +[this chart](https://firebase.google.com/docs/ios/learn-more#firebase_library_support_by_platform) +in Firebase's documentation. + +### visionOS + +Where supported, visionOS works as expected with the exception of Firestore via Swift Package +Manager where it is required to use the source distribution. + +To enable the Firestore source distribution, quit Xcode and open the desired +project from the command line with the `FIREBASE_SOURCE_FIRESTORE` environment +variable: `open --env FIREBASE_SOURCE_FIRESTORE /path/to/project.xcodeproj`. +To go back to using the binary distribution of Firestore, quit Xcode and open +Xcode like normal, without the environment variable. + +### watchOS +Thanks to contributions from the community, many of Firebase SDKs now compile, run unit tests, and +work on watchOS. See the [Independent Watch App Sample](Example/watchOSSample). + +Keep in mind that watchOS is not officially supported by Firebase. While we can catch basic unit +test issues with GitHub Actions, there may be some changes where the SDK no longer works as expected +on watchOS. If you encounter this, please +[file an issue](https://github.com/firebase/firebase-ios-sdk/issues). + +During app setup in the console, you may get to a step that mentions something like "Checking if the +app has communicated with our servers". This relies on Analytics and will not work on watchOS. +**It's safe to ignore the message and continue**, the rest of the SDKs will work as expected. + +#### Additional Crashlytics Notes +* watchOS has limited support. Due to watchOS restrictions, mach exceptions and signal crashes are +not recorded. (Crashes in SwiftUI are generated as mach exceptions, so will not be recorded) + +## Combine +Thanks to contributions from the community, _FirebaseCombineSwift_ contains support for Apple's Combine +framework. This module is currently under development and not yet supported for use in production +environments. For more details, please refer to the [docs](FirebaseCombineSwift/README.md). + +## Roadmap + +See [Roadmap](ROADMAP.md) for more about the Firebase Apple SDK Open Source +plans and directions. + +## Contributing + +See [Contributing](CONTRIBUTING.md) for more information on contributing to the Firebase +Apple SDK. + +## License + +The contents of this repository are licensed under the +[Apache License, version 2.0](http://www.apache.org/licenses/LICENSE-2.0). + +Your use of Firebase is governed by the +[Terms of Service for Firebase Services](https://firebase.google.com/terms/). diff --git a/Pods/FirebaseCoreInternal/FirebaseCore/Internal/Sources/HeartbeatLogging/Heartbeat.swift b/Pods/FirebaseCoreInternal/FirebaseCore/Internal/Sources/HeartbeatLogging/Heartbeat.swift new file mode 100644 index 0000000..aa265ed --- /dev/null +++ b/Pods/FirebaseCoreInternal/FirebaseCore/Internal/Sources/HeartbeatLogging/Heartbeat.swift @@ -0,0 +1,76 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation + +/// An enumeration of time periods. +enum TimePeriod: Int, CaseIterable, Codable { + /// The raw value is the number of calendar days within each time period. + /// More types can be enabled in future iterations (i.e. `weekly = 7, monthly = 28`). + case daily = 1 + + /// The number of seconds in a given time period. + var timeInterval: TimeInterval { + Double(rawValue) * 86400 /* seconds in day */ + } +} + +/// A structure representing SDK usage. +struct Heartbeat: Codable, Equatable { + /// The version of the heartbeat. + private static let version: Int = 0 + + /// An anonymous string of information (i.e. user agent) to associate the heartbeat with. + let agent: String + + /// The date when the heartbeat was recorded. + let date: Date + + /// The heartbeat's model version. + let version: Int + + /// An array of `TimePeriod`s that the heartbeat is tagged with. See `TimePeriod`. + /// + /// Heartbeats represent anonymous data points that measure SDK usage in moving averages for + /// various time periods. Because a single heartbeat can help calculate moving averages for + /// multiple + /// time periods, this property serves to capture all the time periods that the heartbeat can + /// represent in + /// a moving average. + let timePeriods: [TimePeriod] + + /// Designated initializer. + /// - Parameters: + /// - agent: An anonymous string of information to associate the heartbeat with. + /// - date: The date when the heartbeat was recorded. + /// - version: The heartbeat's version. Defaults to the current version. + init(agent: String, + date: Date, + timePeriods: [TimePeriod] = [], + version: Int = version) { + self.agent = agent + self.date = date + self.timePeriods = timePeriods + self.version = version + } +} + +extension Heartbeat: HeartbeatsPayloadConvertible { + func makeHeartbeatsPayload() -> HeartbeatsPayload { + let userAgentPayloads = [ + HeartbeatsPayload.UserAgentPayload(agent: agent, dates: [date]), + ] + return HeartbeatsPayload(userAgentPayloads: userAgentPayloads) + } +} diff --git a/Pods/FirebaseCoreInternal/FirebaseCore/Internal/Sources/HeartbeatLogging/HeartbeatController.swift b/Pods/FirebaseCoreInternal/FirebaseCore/Internal/Sources/HeartbeatLogging/HeartbeatController.swift new file mode 100644 index 0000000..cbc0184 --- /dev/null +++ b/Pods/FirebaseCoreInternal/FirebaseCore/Internal/Sources/HeartbeatLogging/HeartbeatController.swift @@ -0,0 +1,185 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation + +/// An object that provides API to log and flush heartbeats from a synchronized storage container. +public final class HeartbeatController: Sendable { + /// Used for standardizing dates for calendar-day comparison. + private enum DateStandardizer { + private static let calendar: Calendar = { + var calendar = Calendar(identifier: .iso8601) + calendar.locale = Locale(identifier: "en_US_POSIX") + calendar.timeZone = TimeZone(secondsFromGMT: 0)! + return calendar + }() + + static func standardize(_ date: Date) -> (Date) { + return calendar.startOfDay(for: date) + } + } + + /// The thread-safe storage object to log and flush heartbeats from. + private let storage: any HeartbeatStorageProtocol + /// The max capacity of heartbeats to store in storage. + private static let heartbeatsStorageCapacity: Int = 30 + /// Current date provider. It is used for testability. + private let dateProvider: @Sendable () -> Date + /// Used for standardizing dates for calendar-day comparison. + private static let dateStandardizer = DateStandardizer.self + + /// Public initializer. + /// - Parameter id: The `id` to associate this controller's heartbeat storage with. + public convenience init(id: String) { + self.init(id: id, dateProvider: { Date() }) + } + + /// Convenience initializer. Mirrors the semantics of the public initializer with the added + /// benefit of + /// injecting a custom date provider for improved testability. + /// - Parameters: + /// - id: The id to associate this controller's heartbeat storage with. + /// - dateProvider: A date provider. + convenience init(id: String, dateProvider: @escaping @Sendable () -> Date) { + let storage = HeartbeatStorage.getInstance(id: id) + self.init(storage: storage, dateProvider: dateProvider) + } + + /// Designated initializer. + /// - Parameters: + /// - storage: A heartbeat storage container. + /// - dateProvider: A date provider. Defaults to providing the current date. + init(storage: HeartbeatStorageProtocol, + dateProvider: @escaping @Sendable () -> Date = { Date() }) { + self.storage = storage + self.dateProvider = { Self.dateStandardizer.standardize(dateProvider()) } + } + + /// Asynchronously logs a new heartbeat, if needed. + /// + /// - Note: This API is thread-safe. + /// - Parameter agent: The string agent (i.e. Firebase User Agent) to associate the logged + /// heartbeat with. + public func log(_ agent: String) { + let date = dateProvider() + + storage.readAndWriteAsync { heartbeatsBundle in + var heartbeatsBundle = heartbeatsBundle ?? + HeartbeatsBundle(capacity: Self.heartbeatsStorageCapacity) + + // Filter for the time periods where the last heartbeat to be logged for + // that time period was logged more than one time period (i.e. day) ago. + let timePeriods = heartbeatsBundle.lastAddedHeartbeatDates.filter { timePeriod, lastDate in + date.timeIntervalSince(lastDate) >= timePeriod.timeInterval + } + .map { timePeriod, _ in timePeriod } + + if !timePeriods.isEmpty { + // A heartbeat should only be logged if there is a time period(s) to + // associate it with. + let heartbeat = Heartbeat(agent: agent, date: date, timePeriods: timePeriods) + heartbeatsBundle.append(heartbeat) + } + + return heartbeatsBundle + } + } + + /// Synchronously flushes heartbeats from storage into a heartbeats payload. + /// + /// - Note: This API is thread-safe. + /// - Returns: The flushed heartbeats in the form of `HeartbeatsPayload`. + @discardableResult + public func flush() -> HeartbeatsPayload { + let resetTransform = { (heartbeatsBundle: HeartbeatsBundle?) -> HeartbeatsBundle? in + guard let oldHeartbeatsBundle = heartbeatsBundle else { + return nil // Storage was empty. + } + // The new value that's stored will use the old's cache to prevent the + // logging of duplicates after flushing. + return HeartbeatsBundle( + capacity: Self.heartbeatsStorageCapacity, + cache: oldHeartbeatsBundle.lastAddedHeartbeatDates + ) + } + + do { + // Synchronously gets and returns the stored heartbeats, resetting storage + // using the given transform. + let heartbeatsBundle = try storage.getAndSet(using: resetTransform) + // If no heartbeats bundle was stored, return an empty payload. + return heartbeatsBundle?.makeHeartbeatsPayload() ?? HeartbeatsPayload.emptyPayload + } catch { + // If the operation throws, assume no heartbeat(s) were retrieved or set. + return HeartbeatsPayload.emptyPayload + } + } + + public func flushAsync(completionHandler: @escaping @Sendable (HeartbeatsPayload) -> Void) { + let resetTransform = { @Sendable (heartbeatsBundle: HeartbeatsBundle?) -> HeartbeatsBundle? in + guard let oldHeartbeatsBundle = heartbeatsBundle else { + return nil // Storage was empty. + } + // The new value that's stored will use the old's cache to prevent the + // logging of duplicates after flushing. + return HeartbeatsBundle( + capacity: Self.heartbeatsStorageCapacity, + cache: oldHeartbeatsBundle.lastAddedHeartbeatDates + ) + } + + // Asynchronously gets and returns the stored heartbeats, resetting storage + // using the given transform. + storage.getAndSetAsync(using: resetTransform) { result in + switch result { + case let .success(heartbeatsBundle): + // If no heartbeats bundle was stored, return an empty payload. + completionHandler(heartbeatsBundle?.makeHeartbeatsPayload() ?? HeartbeatsPayload + .emptyPayload) + case .failure: + // If the operation throws, assume no heartbeat(s) were retrieved or set. + completionHandler(HeartbeatsPayload.emptyPayload) + } + } + } + + /// Synchronously flushes the heartbeat for today. + /// + /// If no heartbeat was logged today, the returned payload is empty. + /// + /// - Note: This API is thread-safe. + /// - Returns: A heartbeats payload for the flushed heartbeat. + @discardableResult + public func flushHeartbeatFromToday() -> HeartbeatsPayload { + let todaysDate = dateProvider() + var todaysHeartbeat: Heartbeat? + + storage.readAndWriteSync { heartbeatsBundle in + guard var heartbeatsBundle = heartbeatsBundle else { + return nil // Storage was empty. + } + + todaysHeartbeat = heartbeatsBundle.removeHeartbeat(from: todaysDate) + + return heartbeatsBundle + } + + // Note that `todaysHeartbeat` is updated in the above read/write block. + if todaysHeartbeat != nil { + return todaysHeartbeat!.makeHeartbeatsPayload() + } else { + return HeartbeatsPayload.emptyPayload + } + } +} diff --git a/Pods/FirebaseCoreInternal/FirebaseCore/Internal/Sources/HeartbeatLogging/HeartbeatLoggingTestUtils.swift b/Pods/FirebaseCoreInternal/FirebaseCore/Internal/Sources/HeartbeatLogging/HeartbeatLoggingTestUtils.swift new file mode 100644 index 0000000..96dbcf8 --- /dev/null +++ b/Pods/FirebaseCoreInternal/FirebaseCore/Internal/Sources/HeartbeatLogging/HeartbeatLoggingTestUtils.swift @@ -0,0 +1,140 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#if DEBUG + + import Foundation + + /// A utility class intended to be used only in testing contexts. + @objc(FIRHeartbeatLoggingTestUtils) + @objcMembers + public class HeartbeatLoggingTestUtils: NSObject { + /// This should mirror the `Constants` enum in the `HeartbeatLogging` module. + /// See `HeartbeatLogging/Sources/StorageFactory.swift`. + public enum Constants { + /// The name of the file system directory where heartbeat data is stored. + public static let heartbeatFileStorageDirectoryPath = "google-heartbeat-storage" + /// The name of the user defaults suite where heartbeat data is stored. + public static let heartbeatUserDefaultsSuiteName = "com.google.heartbeat.storage" + } + + public static var dateFormatter: DateFormatter { + HeartbeatsPayload.dateFormatter + } + + public static var emptyHeartbeatsPayload: _ObjC_HeartbeatsPayload { + let literalData = """ + { + "version": 2, + "heartbeats": [] + } + """ + .data(using: .utf8)! + + let decoder = JSONDecoder() + decoder.dateDecodingStrategy = .formatted(HeartbeatsPayload.dateFormatter) + + let heartbeatsPayload = try! decoder.decode(HeartbeatsPayload.self, from: literalData) + return _ObjC_HeartbeatsPayload(heartbeatsPayload) + } + + public static var nonEmptyHeartbeatsPayload: _ObjC_HeartbeatsPayload { + let literalData = """ + { + "version": 2, + "heartbeats": [ + { + "agent": "dummy_agent_1", + "dates": ["2021-11-01", "2021-11-02"] + }, + { + "agent": "dummy_agent_2", + "dates": ["2021-11-03"] + } + ] + } + """ + .data(using: .utf8)! + + let decoder = JSONDecoder() + decoder.dateDecodingStrategy = .formatted(HeartbeatsPayload.dateFormatter) + + let heartbeatsPayload = try! decoder.decode(HeartbeatsPayload.self, from: literalData) + return _ObjC_HeartbeatsPayload(heartbeatsPayload) + } + + @objc(assertEncodedPayloadString:isEqualToLiteralString:withError:) + public static func assertEqualPayloadStrings(_ encoded: String, _ literal: String) throws { + var encodedData = Data(base64URLEncoded: encoded)! + if encodedData.count > 0 { + encodedData = try! encodedData.unzipped() + } + + let literalData = literal.data(using: .utf8)! + + let decoder = JSONDecoder() + decoder.dateDecodingStrategy = .formatted(HeartbeatsPayload.dateFormatter) + + let payloadFromEncoded = try? decoder.decode(HeartbeatsPayload.self, from: encodedData) + + let payloadFromLiteral = try? decoder.decode(HeartbeatsPayload.self, from: literalData) + + let encoder = JSONEncoder() + encoder.dateEncodingStrategy = .formatted(HeartbeatsPayload.dateFormatter) + encoder.outputFormatting = .prettyPrinted + + let payloadDataFromEncoded = try! encoder.encode(payloadFromEncoded) + let payloadDataFromLiteral = try! encoder.encode(payloadFromLiteral) + + assert( + payloadFromEncoded == payloadFromLiteral, + """ + Mismatched payloads! + + Payload 1: + \(String(data: payloadDataFromEncoded, encoding: .utf8) ?? "") + + Payload 2: + \(String(data: payloadDataFromLiteral, encoding: .utf8) ?? "") + + """ + ) + } + + /// Removes all underlying storage containers used by the module. + /// - Throws: An error if the storage container could not be removed. + public static func removeUnderlyingHeartbeatStorageContainers() throws { + #if os(tvOS) + UserDefaults().removePersistentDomain(forName: Constants.heartbeatUserDefaultsSuiteName) + #else + + let applicationSupportDirectory = FileManager.default + .urls(for: .applicationSupportDirectory, in: .userDomainMask).first! + + let heartbeatsDirectoryURL = applicationSupportDirectory + .appendingPathComponent( + Constants.heartbeatFileStorageDirectoryPath, isDirectory: true + ) + do { + try FileManager.default.removeItem(at: heartbeatsDirectoryURL) + } catch CocoaError.fileNoSuchFile { + // Do nothing. + } catch { + throw error + } + #endif // os(tvOS) + } + } + +#endif // ENABLE_FIREBASE_CORE_INTERNAL_TESTING_UTILS diff --git a/Pods/FirebaseCoreInternal/FirebaseCore/Internal/Sources/HeartbeatLogging/HeartbeatStorage.swift b/Pods/FirebaseCoreInternal/FirebaseCore/Internal/Sources/HeartbeatLogging/HeartbeatStorage.swift new file mode 100644 index 0000000..c99c55b --- /dev/null +++ b/Pods/FirebaseCoreInternal/FirebaseCore/Internal/Sources/HeartbeatLogging/HeartbeatStorage.swift @@ -0,0 +1,211 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation + +/// A type that can perform atomic operations using block-based transformations. +protocol HeartbeatStorageProtocol: Sendable { + func readAndWriteSync(using transform: (HeartbeatsBundle?) -> HeartbeatsBundle?) + func readAndWriteAsync(using transform: @escaping @Sendable (HeartbeatsBundle?) + -> HeartbeatsBundle?) + func getAndSet(using transform: (HeartbeatsBundle?) -> HeartbeatsBundle?) throws + -> HeartbeatsBundle? + func getAndSetAsync(using transform: @escaping @Sendable (HeartbeatsBundle?) -> HeartbeatsBundle?, + completion: @escaping @Sendable (Result) -> Void) +} + +/// Thread-safe storage object designed for transforming heartbeat data that is persisted to disk. +final class HeartbeatStorage: Sendable, HeartbeatStorageProtocol { + /// The identifier used to differentiate instances. + private let id: String + /// The underlying storage container to read from and write to. + private let storage: any Storage + /// The encoder used for encoding heartbeat data. + private let encoder: JSONEncoder = .init() + /// The decoder used for decoding heartbeat data. + private let decoder: JSONDecoder = .init() + /// The queue for synchronizing storage operations. + private let queue: DispatchQueue + + /// Designated initializer. + /// - Parameters: + /// - id: A string identifier. + /// - storage: The underlying storage container where heartbeat data is stored. + init(id: String, + storage: Storage) { + self.id = id + self.storage = storage + queue = DispatchQueue(label: "com.heartbeat.storage.\(id)") + } + + // MARK: - Instance Management + + /// Statically allocated cache of `HeartbeatStorage` instances keyed by string IDs. + private static let cachedInstances: UnfairLock< + [String: WeakContainer] + > = UnfairLock([:]) + + /// Gets an existing `HeartbeatStorage` instance with the given `id` if one exists. Otherwise, + /// makes a new instance with the given `id`. + /// + /// - Parameter id: A string identifier. + /// - Returns: A `HeartbeatStorage` instance. + static func getInstance(id: String) -> HeartbeatStorage { + cachedInstances.withLock { cachedInstances in + if let cachedInstance = cachedInstances[id]?.object { + return cachedInstance + } else { + let newInstance = HeartbeatStorage.makeHeartbeatStorage(id: id) + cachedInstances[id] = WeakContainer(object: newInstance) + return newInstance + } + } + } + + /// Makes a `HeartbeatStorage` instance using a given `String` identifier. + /// + /// The created persistent storage object is platform dependent. For tvOS, user defaults + /// is used as the underlying storage container due to system storage limits. For all other + /// platforms, + /// the file system is used. + /// + /// - Parameter id: A `String` identifier used to create the `HeartbeatStorage`. + /// - Returns: A `HeartbeatStorage` instance. + private static func makeHeartbeatStorage(id: String) -> HeartbeatStorage { + #if os(tvOS) + let storage = UserDefaultsStorage.makeStorage(id: id) + #else + let storage = FileStorage.makeStorage(id: id) + #endif // os(tvOS) + return HeartbeatStorage(id: id, storage: storage) + } + + deinit { + // Removes the instance if it was cached. + Self.cachedInstances.withLock { value in + value.removeValue(forKey: id) + } + } + + // MARK: - HeartbeatStorageProtocol + + /// Synchronously reads from and writes to storage using the given transform block. + /// - Parameter transform: A block to transform the currently stored heartbeats bundle to a new + /// heartbeats bundle value. + func readAndWriteSync(using transform: (HeartbeatsBundle?) -> HeartbeatsBundle?) { + queue.sync { + let oldHeartbeatsBundle = try? load(from: storage) + let newHeartbeatsBundle = transform(oldHeartbeatsBundle) + try? save(newHeartbeatsBundle, to: storage) + } + } + + /// Asynchronously reads from and writes to storage using the given transform block. + /// - Parameter transform: A block to transform the currently stored heartbeats bundle to a new + /// heartbeats bundle value. + func readAndWriteAsync(using transform: @escaping @Sendable (HeartbeatsBundle?) + -> HeartbeatsBundle?) { + queue.async { [self] in + let oldHeartbeatsBundle = try? load(from: storage) + let newHeartbeatsBundle = transform(oldHeartbeatsBundle) + try? save(newHeartbeatsBundle, to: storage) + } + } + + /// Synchronously gets the current heartbeat data from storage and resets the storage using the + /// given transform block. + /// + /// This API is like any `getAndSet`-style API in that it gets (and returns) the current value and + /// uses + /// a block to transform the current value (or, soon-to-be old value) to a new value. + /// + /// - Parameter transform: An optional block used to reset the currently stored heartbeat. + /// - Returns: The heartbeat data that was stored (before the `transform` was applied). + @discardableResult + func getAndSet(using transform: (HeartbeatsBundle?) -> HeartbeatsBundle?) throws + -> HeartbeatsBundle? { + let heartbeatsBundle: HeartbeatsBundle? = try queue.sync { + let oldHeartbeatsBundle = try? load(from: storage) + let newHeartbeatsBundle = transform(oldHeartbeatsBundle) + try save(newHeartbeatsBundle, to: storage) + return oldHeartbeatsBundle + } + return heartbeatsBundle + } + + /// Asynchronously gets the current heartbeat data from storage and resets the storage using the + /// given transform block. + /// - Parameters: + /// - transform: An escaping block used to reset the currently stored heartbeat. + /// - completion: An escaping block used to process the heartbeat data that + /// was stored (before the `transform` was applied); otherwise, the error + /// that occurred. + func getAndSetAsync(using transform: @escaping @Sendable (HeartbeatsBundle?) -> HeartbeatsBundle?, + completion: @escaping @Sendable (Result) -> Void) { + queue.async { + do { + let oldHeartbeatsBundle = try? self.load(from: self.storage) + let newHeartbeatsBundle = transform(oldHeartbeatsBundle) + try self.save(newHeartbeatsBundle, to: self.storage) + completion(.success(oldHeartbeatsBundle)) + } catch { + completion(.failure(error)) + } + } + } + + /// Loads and decodes the stored heartbeats bundle from a given storage object. + /// - Parameter storage: The storage container to read from. + /// - Returns: The decoded `HeartbeatsBundle` loaded from storage; `nil` if storage is empty. + /// - Throws: An error if storage could not be read or the data could not be decoded. + private func load(from storage: Storage) throws -> HeartbeatsBundle? { + let data = try storage.read() + if data.isEmpty { + return nil + } else { + let heartbeatData = try data.decoded(using: decoder) as HeartbeatsBundle + return heartbeatData + } + } + + /// Saves the encoding of the given value to the given storage container. + /// - Parameters: + /// - heartbeatsBundle: The heartbeats bundle to encode and save. + /// - storage: The storage container to write to. + private func save(_ heartbeatsBundle: HeartbeatsBundle?, to storage: Storage) throws { + if let heartbeatsBundle { + let data = try heartbeatsBundle.encoded(using: encoder) + try storage.write(data) + } else { + try storage.write(nil) + } + } +} + +private extension Data { + /// Returns the decoded value of this `Data` using the given decoder. Defaults to `JSONDecoder`. + /// - Returns: The decoded value. + func decoded(using decoder: JSONDecoder = .init()) throws -> T where T: Decodable { + try decoder.decode(T.self, from: self) + } +} + +private extension Encodable { + /// Returns the `Data` encoding of this value using the given encoder. + /// - Parameter encoder: An encoder used to encode the value. Defaults to `JSONEncoder`. + /// - Returns: The data encoding of the value. + func encoded(using encoder: JSONEncoder = .init()) throws -> Data { + try encoder.encode(self) + } +} diff --git a/Pods/FirebaseCoreInternal/FirebaseCore/Internal/Sources/HeartbeatLogging/HeartbeatsBundle.swift b/Pods/FirebaseCoreInternal/FirebaseCore/Internal/Sources/HeartbeatLogging/HeartbeatsBundle.swift new file mode 100644 index 0000000..a6e258e --- /dev/null +++ b/Pods/FirebaseCoreInternal/FirebaseCore/Internal/Sources/HeartbeatLogging/HeartbeatsBundle.swift @@ -0,0 +1,151 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation + +/// A type that can be converted to a `HeartbeatsPayload`. +protocol HeartbeatsPayloadConvertible { + func makeHeartbeatsPayload() -> HeartbeatsPayload +} + +/// A codable collection of heartbeats that has a fixed capacity and optimizations for storing +/// heartbeats of +/// multiple time periods. +struct HeartbeatsBundle: Codable, HeartbeatsPayloadConvertible { + /// The maximum number of heartbeats that can be stored in the buffer. + let capacity: Int + /// A cache used for keeping track of the last heartbeat date recorded for a given time period. + /// + /// The cache contains the last added date for each time period. The reason only the date is + /// cached is + /// because it's the only piece of information that should be used by clients to determine whether + /// or not + /// to append a new heartbeat. + private(set) var lastAddedHeartbeatDates: [TimePeriod: Date] + /// A ring buffer of heartbeats. + private var buffer: RingBuffer + + /// A default cache provider that provides a dictionary of all time periods mapping to a default + /// date. + static var cacheProvider: () -> [TimePeriod: Date] { + let timePeriodsAndDates = TimePeriod.allCases.map { ($0, Date.distantPast) } + return { Dictionary(uniqueKeysWithValues: timePeriodsAndDates) } + } + + /// Designated initializer. + /// - Parameters: + /// - capacity: The heartbeat capacity of the initialized collection. + /// - cache: A cache of time periods mapping to dates. Defaults to using static `cacheProvider`. + init(capacity: Int, + cache: [TimePeriod: Date] = cacheProvider()) { + buffer = RingBuffer(capacity: capacity) + self.capacity = capacity + lastAddedHeartbeatDates = cache + } + + /// Appends a heartbeat to this collection. + /// - Parameter heartbeat: The heartbeat to append. + mutating func append(_ heartbeat: Heartbeat) { + guard capacity > 0 else { + return // Do not append if capacity is non-positive. + } + + do { + // Push the heartbeat to the back of the buffer. + if let overwrittenHeartbeat = try buffer.push(heartbeat) { + // If a heartbeat was overwritten, update the cache to ensure it's date + // is removed. + lastAddedHeartbeatDates = lastAddedHeartbeatDates.mapValues { date in + overwrittenHeartbeat.date == date ? .distantPast : date + } + } + + // Update cache with the new heartbeat's date. + for timePeriod in heartbeat.timePeriods { + lastAddedHeartbeatDates[timePeriod] = heartbeat.date + } + + } catch let error as RingBuffer.Error { + // A ring buffer error occurred while pushing to the buffer so the bundle + // is reset. + self = HeartbeatsBundle(capacity: capacity) + + // Create a diagnostic heartbeat to capture the failure and add it to the + // buffer. The failure is added as a key/value pair to the agent string. + // Given that the ring buffer has been reset, it is not expected for the + // second push attempt to fail. + let errorDescription = error.errorDescription.replacingOccurrences(of: " ", with: "-") + let diagnosticHeartbeat = Heartbeat( + agent: "\(heartbeat.agent) error/\(errorDescription)", + date: heartbeat.date, + timePeriods: heartbeat.timePeriods + ) + + let secondPushAttempt = Result { + try buffer.push(diagnosticHeartbeat) + } + + if case .success = secondPushAttempt { + // Update cache with the new heartbeat's date. + for timePeriod in diagnosticHeartbeat.timePeriods { + lastAddedHeartbeatDates[timePeriod] = diagnosticHeartbeat.date + } + } + } catch { + // Ignore other error. + } + } + + /// Removes the heartbeat associated with the given date. + /// - Parameter date: The date of the heartbeat needing removal. + /// - Returns: The heartbeat that was removed or `nil` if there was no heartbeat to remove. + @discardableResult + mutating func removeHeartbeat(from date: Date) -> Heartbeat? { + var removedHeartbeat: Heartbeat? + + var poppedHeartbeats: [Heartbeat] = [] + + while let poppedHeartbeat = buffer.pop() { + if poppedHeartbeat.date == date { + removedHeartbeat = poppedHeartbeat + break + } + poppedHeartbeats.append(poppedHeartbeat) + } + + for poppedHeartbeat in poppedHeartbeats.reversed() { + do { + try buffer.push(poppedHeartbeat) + } catch { + // Ignore error. + } + } + + return removedHeartbeat + } + + /// Makes and returns a `HeartbeatsPayload` from this heartbeats bundle. + /// - Returns: A heartbeats payload. + func makeHeartbeatsPayload() -> HeartbeatsPayload { + let agentAndDates = buffer.map { heartbeat in + (heartbeat.agent, [heartbeat.date]) + } + + let userAgentPayloads = [String: [Date]](agentAndDates, uniquingKeysWith: +) + .map(HeartbeatsPayload.UserAgentPayload.init) + .sorted { $0.agent < $1.agent } // Sort payloads by user agent. + + return HeartbeatsPayload(userAgentPayloads: userAgentPayloads) + } +} diff --git a/Pods/FirebaseCoreInternal/FirebaseCore/Internal/Sources/HeartbeatLogging/HeartbeatsPayload.swift b/Pods/FirebaseCoreInternal/FirebaseCore/Internal/Sources/HeartbeatLogging/HeartbeatsPayload.swift new file mode 100644 index 0000000..1604933 --- /dev/null +++ b/Pods/FirebaseCoreInternal/FirebaseCore/Internal/Sources/HeartbeatLogging/HeartbeatsPayload.swift @@ -0,0 +1,181 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation + +#if SWIFT_PACKAGE + internal import GoogleUtilities_NSData +#else + internal import GoogleUtilities +#endif // SWIFT_PACKAGE + +/// A type that provides a string representation for use in an HTTP header. +public protocol HTTPHeaderRepresentable { + func headerValue() -> String +} + +/// A value type representing a payload of heartbeat data intended for sending in network requests. +/// +/// This type's structure is optimized for type-safe encoding into a HTTP payload format. +/// The current encoding format for the payload's current version is: +/// +/// { +/// "version": 2, +/// "heartbeats": [ +/// { +/// "agent": "dummy_agent_1", +/// "dates": ["2021-11-01", "2021-11-02"] +/// }, +/// { +/// "agent": "dummy_agent_2", +/// "dates": ["2021-11-03"] +/// } +/// ] +/// } +/// +public struct HeartbeatsPayload: Codable, Sendable { + /// The version of the payload. See go/firebase-apple-heartbeats for details regarding current + /// version. + static let version: Int = 2 + + /// A payload component composed of a user agent and array of dates (heartbeats). + struct UserAgentPayload: Codable { + /// An anonymous agent string. + let agent: String + /// An array of dates where each date represents a "heartbeat". + let dates: [Date] + } + + /// An array of user agent payloads. + let userAgentPayloads: [UserAgentPayload] + /// The version of the payload structure. + let version: Int + + /// Alternative keys for properties so encoding follows platform-wide payload structure. + enum CodingKeys: String, CodingKey { + case userAgentPayloads = "heartbeats" + case version + } + + /// Designated initializer. + /// - Parameters: + /// - userAgentPayloads: An array of payloads containing heartbeat data corresponding to a + /// given user agent. + /// - version: A version of the payload. Defaults to the static default. + init(userAgentPayloads: [UserAgentPayload] = [], version: Int = version) { + self.userAgentPayloads = userAgentPayloads + self.version = version + } + + /// A Boolean value indicating whether the payload is empty. + public var isEmpty: Bool { + userAgentPayloads.isEmpty + } +} + +// MARK: - HTTPHeaderRepresentable + +extension HeartbeatsPayload: HTTPHeaderRepresentable { + /// Returns a processed payload string intended for use in a HTTP header. + /// - Returns: A string value from the heartbeats payload. + public func headerValue() -> String { + let encoder = JSONEncoder() + encoder.dateEncodingStrategy = .formatted(Self.dateFormatter) + #if DEBUG + // Sort keys in debug builds to simplify output comparisons in unit tests. + encoder.outputFormatting = .sortedKeys + #endif // DEBUG + + guard let data = try? encoder.encode(self) else { + // If encoding fails, fall back to encoding with an empty payload. + return Self.emptyPayload.headerValue() + } + + do { + let gzippedData = try data.zipped() + return gzippedData.base64URLEncodedString() + } catch { + // If gzipping fails, fall back to encoding with base64URL. + return data.base64URLEncodedString() + } + } +} + +// MARK: - Static Defaults + +extension HeartbeatsPayload { + /// Convenience instance that represents an empty payload. + static let emptyPayload = HeartbeatsPayload() + + /// A default date formatter that uses `yyyy-MM-dd` format. + public static let dateFormatter: DateFormatter = { + let formatter = DateFormatter() + formatter.dateFormat = "yyyy-MM-dd" + formatter.locale = Locale(identifier: "en_US_POSIX") + formatter.timeZone = TimeZone(secondsFromGMT: 0) + return formatter + }() +} + +// MARK: - Equatable + +extension HeartbeatsPayload: Equatable {} +extension HeartbeatsPayload.UserAgentPayload: Equatable {} + +// MARK: - Data + +public extension Data { + /// Returns a Base-64 URL-safe encoded string. + /// + /// - parameter options: The options to use for the encoding. Default value is `[]`. + /// - returns: The Base-64 URL-safe encoded string. + func base64URLEncodedString(options: Data.Base64EncodingOptions = []) -> String { + base64EncodedString() + .replacingOccurrences(of: "/", with: "_") + .replacingOccurrences(of: "+", with: "-") + .replacingOccurrences(of: "=", with: "") + } + + /// Initialize a `Data` from a Base-64 URL encoded String using the given options. + /// + /// Returns nil when the input is not recognized as valid Base-64. + /// - parameter base64URLString: The string to parse. + /// - parameter options: Encoding options. Default value is `[]`. + init?(base64URLEncoded base64URLString: String, options: Data.Base64DecodingOptions = []) { + var base64Encoded = base64URLString + .replacingOccurrences(of: "_", with: "/") + .replacingOccurrences(of: "-", with: "+") + + // Pad the string with "=" signs until the string's length is a multiple of 4. + while !base64Encoded.count.isMultiple(of: 4) { + base64Encoded.append("=") + } + + self.init(base64Encoded: base64Encoded, options: options) + } + + /// Returns the compressed data. + /// - Returns: The compressed data. + /// - Throws: An error if compression failed. + func zipped() throws -> Data { + try NSData.gul_data(byGzippingData: self) + } + + /// Returns the uncompressed data. + /// - Returns: The decompressed data. + /// - Throws: An error if decompression failed. + func unzipped() throws -> Data { + try NSData.gul_data(byInflatingGzippedData: self) + } +} diff --git a/Pods/FirebaseCoreInternal/FirebaseCore/Internal/Sources/HeartbeatLogging/RingBuffer.swift b/Pods/FirebaseCoreInternal/FirebaseCore/Internal/Sources/HeartbeatLogging/RingBuffer.swift new file mode 100644 index 0000000..74d08d7 --- /dev/null +++ b/Pods/FirebaseCoreInternal/FirebaseCore/Internal/Sources/HeartbeatLogging/RingBuffer.swift @@ -0,0 +1,111 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation + +/// A generic circular queue structure. +struct RingBuffer: Sequence { + /// An array of heartbeats treated as a circular queue and initialized with a fixed capacity. + private var circularQueue: [Element?] + /// The current "tail" and insert point for the `circularQueue`. + private var tailIndex: Array.Index + + /// Error types for `RingBuffer` operations. + enum Error: Swift.Error { + case outOfBoundsPush(pushIndex: Array.Index, endIndex: Array.Index) + + var errorDescription: String { + switch self { + case let .outOfBoundsPush(pushIndex, endIndex): + return "Out-of-bounds push at index \(pushIndex) to ring buffer with" + + "end index of \(endIndex)." + } + } + } + + /// Designated initializer. + /// - Parameter capacity: An `Int` representing the capacity. + init(capacity: Int) { + circularQueue = Array(repeating: nil, count: capacity) + tailIndex = circularQueue.startIndex + } + + /// Pushes an element to the back of the buffer, returning the element (`Element?`) that was + /// overwritten. + /// - Parameter element: The element to push to the back of the buffer. + /// - Returns: The element that was overwritten or `nil` if nothing was overwritten. + /// - Complexity: O(1) + @discardableResult + mutating func push(_ element: Element) throws -> Element? { + guard circularQueue.count > 0 else { + // Do not push if `circularQueue` is a fixed empty array. + return nil + } + + guard circularQueue.indices.contains(tailIndex) else { + // We have somehow entered an invalid state (#10025). + throw Self.Error.outOfBoundsPush( + pushIndex: tailIndex, + endIndex: circularQueue.endIndex + ) + } + + let replaced = circularQueue[tailIndex] + circularQueue[tailIndex] = element + + // Increment index, wrapping around to the start if needed. + tailIndex += 1 + if tailIndex >= circularQueue.endIndex { + tailIndex = circularQueue.startIndex + } + + return replaced + } + + /// Pops an element from the back of the buffer, returning the element (`Element?`) that was + /// popped. + /// - Returns: The element that was popped or `nil` if there was no element to pop. + /// - Complexity: O(1) + @discardableResult + mutating func pop() -> Element? { + guard circularQueue.count > 0 else { + // Do not pop if `circularQueue` is a fixed empty array. + return nil + } + + // Decrement index, wrapping around to the back if needed. + tailIndex -= 1 + if tailIndex < circularQueue.startIndex { + tailIndex = circularQueue.endIndex - 1 + } + + guard let popped = circularQueue[tailIndex] else { + return nil // There is no element to pop. + } + + circularQueue[tailIndex] = nil + + return popped + } + + func makeIterator() -> IndexingIterator<[Element]> { + circularQueue + .compactMap { $0 } // Remove `nil` elements. + .makeIterator() + } +} + +// MARK: - Codable + +extension RingBuffer: Codable where Element: Codable {} diff --git a/Pods/FirebaseCoreInternal/FirebaseCore/Internal/Sources/HeartbeatLogging/Storage.swift b/Pods/FirebaseCoreInternal/FirebaseCore/Internal/Sources/HeartbeatLogging/Storage.swift new file mode 100644 index 0000000..69bf613 --- /dev/null +++ b/Pods/FirebaseCoreInternal/FirebaseCore/Internal/Sources/HeartbeatLogging/Storage.swift @@ -0,0 +1,150 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation + +/// A type that reads from and writes to an underlying storage container. +protocol Storage: Sendable { + /// Reads and returns the data stored by this storage type. + /// - Returns: The data read from storage. + /// - Throws: An error if the read failed. + func read() throws -> Data + + /// Writes the given data to this storage type. + /// - Throws: An error if the write failed. + func write(_ data: Data?) throws +} + +/// Error types for `Storage` operations. +enum StorageError: Error { + case readError + case writeError +} + +// MARK: - FileStorage + +/// A object that provides API for reading and writing to a file system resource. +final class FileStorage: Storage { + /// A file system URL to the underlying file resource. + private let url: URL + + /// Designated initializer. + /// - Parameters: + /// - url: A file system URL for the underlying file resource. + init(url: URL) { + self.url = url + } + + /// Reads and returns the data from this object's associated file resource. + /// + /// - Returns: The data stored on disk. + /// - Throws: An error if reading the contents of the file resource fails (i.e. file doesn't + /// exist). + func read() throws -> Data { + do { + return try Data(contentsOf: url) + } catch { + throw StorageError.readError + } + } + + /// Writes the given data to this object's associated file resource. + /// + /// When the given `data` is `nil`, this object's associated file resource is emptied. + /// + /// - Parameter data: The `Data?` to write to this object's associated file resource. + func write(_ data: Data?) throws { + do { + try createDirectories(in: url.deletingLastPathComponent()) + if let data { + try data.write(to: url, options: .atomic) + } else { + let emptyData = Data() + try emptyData.write(to: url, options: .atomic) + } + } catch { + throw StorageError.writeError + } + } + + /// Creates all directories in the given file system URL. + /// + /// If the directory for the given URL already exists, the error is ignored because the directory + /// has already been created. + /// + /// - Parameter url: The URL to create directories in. + private func createDirectories(in url: URL) throws { + do { + try FileManager.default.createDirectory( + at: url, + withIntermediateDirectories: true + ) + } catch CocoaError.fileWriteFileExists { + // Directory already exists. + } catch { throw error } + } +} + +// MARK: - UserDefaultsStorage + +/// A object that provides API for reading and writing to a user defaults resource. +final class UserDefaultsStorage: Storage { + /// The suite name for the underlying defaults container. + private let suiteName: String + + /// The key mapping to the object's associated resource in `defaults`. + private let key: String + + /// The underlying defaults container. + private var defaults: UserDefaults { + // It's safe to force unwrap the below defaults instance because the + // initializer only returns `nil` when the bundle id or `globalDomain` + // is passed in as the `suiteName`. + UserDefaults(suiteName: suiteName)! + } + + /// Designated initializer. + /// - Parameters: + /// - suiteName: The suite name for the defaults container. + /// - key: The key mapping to the value stored in the defaults container. + init(suiteName: String, key: String) { + self.suiteName = suiteName + self.key = key + } + + /// Reads and returns the data from this object's associated defaults resource. + /// + /// - Returns: The data stored on disk. + /// - Throws: An error if no data has been stored to the defaults container. + func read() throws -> Data { + if let data = defaults.data(forKey: key) { + return data + } else { + throw StorageError.readError + } + } + + /// Writes the given data to this object's associated defaults. + /// + /// When the given `data` is `nil`, the associated default is removed. + /// + /// - Parameter data: The `Data?` to write to this object's associated defaults. + func write(_ data: Data?) throws { + if let data { + defaults.set(data, forKey: key) + } else { + defaults.removeObject(forKey: key) + } + } +} diff --git a/Pods/FirebaseCoreInternal/FirebaseCore/Internal/Sources/HeartbeatLogging/StorageFactory.swift b/Pods/FirebaseCoreInternal/FirebaseCore/Internal/Sources/HeartbeatLogging/StorageFactory.swift new file mode 100644 index 0000000..d6d97cf --- /dev/null +++ b/Pods/FirebaseCoreInternal/FirebaseCore/Internal/Sources/HeartbeatLogging/StorageFactory.swift @@ -0,0 +1,62 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation + +private enum Constants { + /// The name of the file system directory where heartbeat data is stored. + static let heartbeatFileStorageDirectoryPath = "google-heartbeat-storage" + /// The name of the user defaults suite where heartbeat data is stored. + static let heartbeatUserDefaultsSuiteName = "com.google.heartbeat.storage" +} + +/// A factory type for `Storage`. +protocol StorageFactory { + static func makeStorage(id: String) -> Storage +} + +// MARK: - FileStorage + StorageFactory + +extension FileStorage: StorageFactory { + static func makeStorage(id: String) -> Storage { + let rootDirectory = FileManager.default.applicationSupportDirectory + let heartbeatDirectoryPath = Constants.heartbeatFileStorageDirectoryPath + + // Sanitize the `id` so the heartbeat file name does not include a ":". + let sanitizedID = id.replacingOccurrences(of: ":", with: "_") + let heartbeatFilePath = "heartbeats-\(sanitizedID)" + + let storageURL = rootDirectory + .appendingPathComponent(heartbeatDirectoryPath, isDirectory: true) + .appendingPathComponent(heartbeatFilePath, isDirectory: false) + + return FileStorage(url: storageURL) + } +} + +extension FileManager { + var applicationSupportDirectory: URL { + urls(for: .applicationSupportDirectory, in: .userDomainMask).first! + } +} + +// MARK: - UserDefaultsStorage + StorageFactory + +extension UserDefaultsStorage: StorageFactory { + static func makeStorage(id: String) -> Storage { + let suiteName = Constants.heartbeatUserDefaultsSuiteName + let key = "heartbeats-\(id)" + return UserDefaultsStorage(suiteName: suiteName, key: key) + } +} diff --git a/Pods/FirebaseCoreInternal/FirebaseCore/Internal/Sources/HeartbeatLogging/WeakContainer.swift b/Pods/FirebaseCoreInternal/FirebaseCore/Internal/Sources/HeartbeatLogging/WeakContainer.swift new file mode 100644 index 0000000..d034fce --- /dev/null +++ b/Pods/FirebaseCoreInternal/FirebaseCore/Internal/Sources/HeartbeatLogging/WeakContainer.swift @@ -0,0 +1,22 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation + +/// A structure used to weakly box reference types. +struct WeakContainer { + weak var object: Object? +} + +extension WeakContainer: Sendable where Object: Sendable {} diff --git a/Pods/FirebaseCoreInternal/FirebaseCore/Internal/Sources/HeartbeatLogging/_ObjC_HeartbeatController.swift b/Pods/FirebaseCoreInternal/FirebaseCore/Internal/Sources/HeartbeatLogging/_ObjC_HeartbeatController.swift new file mode 100644 index 0000000..520e4f9 --- /dev/null +++ b/Pods/FirebaseCoreInternal/FirebaseCore/Internal/Sources/HeartbeatLogging/_ObjC_HeartbeatController.swift @@ -0,0 +1,70 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation + +/// An object that provides API to log and flush heartbeats from a synchronized storage container. +@objc(FIRHeartbeatController) +@objcMembers +public class _ObjC_HeartbeatController: NSObject { + /// The underlying Swift object. + private let heartbeatController: HeartbeatController + + /// Public initializer. + /// - Parameter id: The `id` to associate this controller's heartbeat storage with. + public init(id: String) { + heartbeatController = HeartbeatController(id: id) + } + + /// Asynchronously logs a new heartbeat, if needed. + /// + /// - Note: This API is thread-safe. + /// - Parameter agent: The string agent (i.e. Firebase User Agent) to associate the logged + /// heartbeat with. + public func log(_ agent: String) { + heartbeatController.log(agent) + } + + /// Synchronously flushes heartbeats from storage into a heartbeats payload. + /// + /// - Note: This API is thread-safe. + /// - Returns: A heartbeats payload for the flushed heartbeat(s). + public func flush() -> _ObjC_HeartbeatsPayload { + let heartbeatsPayload = heartbeatController.flush() + return _ObjC_HeartbeatsPayload(heartbeatsPayload) + } + + /// Asynchronously flushes heartbeats from storage into a heartbeats payload. + /// + /// - Note: This API is thread-safe. + /// - Returns: A heartbeats payload for the flushed heartbeat(s). + public func flushAsync(completionHandler: @escaping @Sendable (_ObjC_HeartbeatsPayload) -> Void) { + // TODO: When minimum version moves to iOS 13.0, restore the async version + // removed in #13952. + heartbeatController.flushAsync { heartbeatsPayload in + completionHandler(_ObjC_HeartbeatsPayload(heartbeatsPayload)) + } + } + + /// Synchronously flushes the heartbeat for today. + /// + /// If no heartbeat was logged today, the returned payload is empty. + /// + /// - Note: This API is thread-safe. + /// - Returns: A heartbeats payload for the flushed heartbeat. + public func flushHeartbeatFromToday() -> _ObjC_HeartbeatsPayload { + let heartbeatsPayload = heartbeatController.flushHeartbeatFromToday() + return _ObjC_HeartbeatsPayload(heartbeatsPayload) + } +} diff --git a/Pods/FirebaseCoreInternal/FirebaseCore/Internal/Sources/HeartbeatLogging/_ObjC_HeartbeatsPayload.swift b/Pods/FirebaseCoreInternal/FirebaseCore/Internal/Sources/HeartbeatLogging/_ObjC_HeartbeatsPayload.swift new file mode 100644 index 0000000..83d72a2 --- /dev/null +++ b/Pods/FirebaseCoreInternal/FirebaseCore/Internal/Sources/HeartbeatLogging/_ObjC_HeartbeatsPayload.swift @@ -0,0 +1,40 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation + +/// A model object representing a payload of heartbeat data intended for sending in network +/// requests. +@objc(FIRHeartbeatsPayload) +public class _ObjC_HeartbeatsPayload: NSObject, HTTPHeaderRepresentable { + /// The underlying Swift structure. + private let heartbeatsPayload: HeartbeatsPayload + + /// Designated initializer. + /// - Parameter heartbeatsPayload: A native-Swift heartbeats payload. + public init(_ heartbeatsPayload: HeartbeatsPayload) { + self.heartbeatsPayload = heartbeatsPayload + } + + /// Returns a processed payload string intended for use in a HTTP header. + /// - Returns: A string value from the heartbeats payload. + @objc public func headerValue() -> String { + heartbeatsPayload.headerValue() + } + + /// A Boolean value indicating whether the payload is empty. + @objc public var isEmpty: Bool { + heartbeatsPayload.isEmpty + } +} diff --git a/Pods/FirebaseCoreInternal/FirebaseCore/Internal/Sources/Resources/PrivacyInfo.xcprivacy b/Pods/FirebaseCoreInternal/FirebaseCore/Internal/Sources/Resources/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..3fb515f --- /dev/null +++ b/Pods/FirebaseCoreInternal/FirebaseCore/Internal/Sources/Resources/PrivacyInfo.xcprivacy @@ -0,0 +1,26 @@ + + + + + NSPrivacyTracking + + NSPrivacyTrackingDomains + + + NSPrivacyCollectedDataTypes + + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + NSPrivacyAccessedAPITypeReasons + + 1C8F.1 + + + + + + diff --git a/Pods/FirebaseCoreInternal/FirebaseCore/Internal/Sources/Utilities/UnfairLock.swift b/Pods/FirebaseCoreInternal/FirebaseCore/Internal/Sources/Utilities/UnfairLock.swift new file mode 100644 index 0000000..9028029 --- /dev/null +++ b/Pods/FirebaseCoreInternal/FirebaseCore/Internal/Sources/Utilities/UnfairLock.swift @@ -0,0 +1,66 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation +private import os.lock + +/// A reference wrapper around `os_unfair_lock`. Replace this class with +/// `OSAllocatedUnfairLock` once we support only iOS 16+. For an explanation +/// on why this is necessary, see the docs: +/// https://developer.apple.com/documentation/os/osallocatedunfairlock +public final class UnfairLock: @unchecked Sendable { + private var lockPointer: UnsafeMutablePointer + private var _value: Value + + public init(_ value: consuming sending Value) { + lockPointer = UnsafeMutablePointer + .allocate(capacity: 1) + lockPointer.initialize(to: os_unfair_lock()) + _value = value + } + + deinit { + lockPointer.deallocate() + } + + public func value() -> Value { + lock() + defer { unlock() } + return _value + } + + @discardableResult + public borrowing func withLock(_ body: (inout sending Value) throws + -> sending Result) rethrows -> sending Result { + lock() + defer { unlock() } + return try body(&_value) + } + + @discardableResult + public borrowing func withLock(_ body: (inout sending Value) -> sending Result) + -> sending Result { + lock() + defer { unlock() } + return body(&_value) + } + + private func lock() { + os_unfair_lock_lock(lockPointer) + } + + private func unlock() { + os_unfair_lock_unlock(lockPointer) + } +} diff --git a/Pods/FirebaseCoreInternal/LICENSE b/Pods/FirebaseCoreInternal/LICENSE new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/Pods/FirebaseCoreInternal/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/Pods/FirebaseCoreInternal/README.md b/Pods/FirebaseCoreInternal/README.md new file mode 100644 index 0000000..15a560d --- /dev/null +++ b/Pods/FirebaseCoreInternal/README.md @@ -0,0 +1,302 @@ +

+ + + + + + + + +
+ + + + + + +

+ +# Firebase Apple Open Source Development + +This repository contains the source code for all Apple platform Firebase SDKs except FirebaseAnalytics. + +Firebase is an app development platform with tools to help you build, grow, and +monetize your app. More information about Firebase can be found on the +[official Firebase website](https://firebase.google.com). + +## Installation + +See the subsections below for details about the different installation methods. Where +available, it's recommended to install any libraries with a `Swift` suffix to get the +best experience when writing your app in Swift. + +1. [Standard pod install](#standard-pod-install) +2. [Swift Package Manager](#swift-package-manager) +3. [Installing from the GitHub repo](#installing-from-github) +4. [Experimental Carthage](#carthage-ios-only) + +### Standard pod install + +For instructions on the standard pod install, visit: +[https://firebase.google.com/docs/ios/setup](https://firebase.google.com/docs/ios/setup). + +### Swift Package Manager + +Instructions for [Swift Package Manager](https://swift.org/package-manager/) support can be +found in the [SwiftPackageManager.md](SwiftPackageManager.md) Markdown file. + +### Installing from GitHub + +These instructions can be used to access the Firebase repo at other branches, +tags, or commits. + +#### Background + +See [the Podfile Syntax Reference](https://guides.cocoapods.org/syntax/podfile.html#pod) +for instructions and options about overriding pod source locations. + +#### Accessing Firebase Source Snapshots + +All official releases are tagged in this repo and available via CocoaPods. To access a local +source snapshot or unreleased branch, use Podfile directives like the following: + +To access FirebaseFirestore via a branch: +```ruby +pod 'FirebaseCore', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :branch => 'main' +pod 'FirebaseFirestore', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :branch => 'main' +``` + +To access FirebaseMessaging via a checked-out version of the firebase-ios-sdk repo: +```ruby +pod 'FirebaseCore', :path => '/path/to/firebase-ios-sdk' +pod 'FirebaseMessaging', :path => '/path/to/firebase-ios-sdk' +``` + +### Carthage (iOS only) + +Instructions for the experimental Carthage distribution can be found at +[Carthage.md](Carthage.md). + +### Using Firebase from a Framework or a library + +For details on using Firebase from a Framework or a library, refer to [firebase_in_libraries.md](docs/firebase_in_libraries.md). + +## Development + +To develop Firebase software in this repository, ensure that you have at least +the following software: + +* Xcode 16.2 (or later) + +CocoaPods is still the canonical way to develop, but much of the repo now supports +development with Swift Package Manager. + +### CocoaPods + +Install the following: +* CocoaPods 1.12.0 (or later) +* [CocoaPods generate](https://github.com/square/cocoapods-generate) + +For the pod that you want to develop: + +```ruby +pod gen Firebase{name here}.podspec --local-sources=./ --auto-open --platforms=ios +``` + +Note: If the CocoaPods cache is out of date, you may need to run +`pod repo update` before the `pod gen` command. + +Note: Set the `--platforms` option to `macos` or `tvos` to develop/test for +those platforms. Since 10.2, Xcode does not properly handle multi-platform +CocoaPods workspaces. + +Firestore has a self-contained Xcode project. See +[Firestore/README](Firestore/README.md) Markdown file. + +#### Development for Catalyst +* `pod gen {name here}.podspec --local-sources=./ --auto-open --platforms=ios` +* Check the Mac box in the App-iOS Build Settings +* Sign the App in the Settings Signing & Capabilities tab +* Click Pods in the Project Manager +* Add Signing to the iOS host app and unit test targets +* Select the Unit-unit scheme +* Run it to build and test + +Alternatively, disable signing in each target: +* Go to Build Settings tab +* Click `+` +* Select `Add User-Defined Setting` +* Add `CODE_SIGNING_REQUIRED` setting with a value of `NO` + +### Swift Package Manager +* To enable test schemes: `./scripts/setup_spm_tests.sh` +* `open Package.swift` or double click `Package.swift` in Finder. +* Xcode will open the project + * Choose a scheme for a library to build or test suite to run + * Choose a target platform by selecting the run destination along with the scheme + +### Adding a New Firebase Pod + +Refer to [AddNewPod](docs/AddNewPod.md) Markdown file for details. + +### Managing Headers and Imports + +For information about managing headers and imports, see [HeadersImports](HeadersImports.md) Markdown file. + +### Code Formatting + +To ensure that the code is formatted consistently, run the script +[./scripts/check.sh](https://github.com/firebase/firebase-ios-sdk/blob/main/scripts/check.sh) +before creating a pull request (PR). + +GitHub Actions will verify that any code changes are done in a style-compliant +way. Install `clang-format` and `mint`: + +```console +brew install clang-format@21 +brew install mint +``` + +### Running Unit Tests + +Select a scheme and press Command-u to build a component and run its unit tests. + +### Running Sample Apps +To run the sample apps and integration tests, you'll need a valid +`GoogleService-Info.plist +` file. The Firebase Xcode project contains dummy plist +files without real values, but they can be replaced with real plist files. To get your own +`GoogleService-Info.plist` files: + +1. Go to the [Firebase Console](https://console.firebase.google.com/) +2. Create a new Firebase project, if you don't already have one +3. For each sample app you want to test, create a new Firebase app with the sample app's bundle +identifier (e.g., `com.google.Database-Example`) +4. Download the resulting `GoogleService-Info.plist` and add it to the Xcode project. + +### Coverage Report Generation + +For coverage report generation instructions, see [scripts/code_coverage_report/README](scripts/code_coverage_report/README.md) Markdown file. + +## Specific Component Instructions +See the sections below for any special instructions for those components. + +### Firebase AI Logic + +See the [Firebase AI Logic README](FirebaseAI#development) for instructions +about building and testing the SDK. + +### Firebase Auth + +For specific Firebase Auth development, refer to the [Auth Sample README](FirebaseAuth/Tests/Sample/README.md) for instructions about +building and running the FirebaseAuth pod along with various samples and tests. + +### Firebase Database + +The Firebase Database Integration tests can be run against a locally running Database Emulator +or against a production instance. + +To run against a local emulator instance, invoke `./scripts/run_database_emulator.sh start` before +running the integration test. + +To run against a production instance, provide a valid `GoogleServices-Info.plist` and copy it to +`FirebaseDatabase/Tests/Resources/GoogleService-Info.plist`. Your Security Rule must be set to +[public](https://firebase.google.com/docs/database/security/quickstart) while your tests are +running. + +### Firebase Dynamic Links + +Firebase Dynamic Links is **deprecated** and should not be used in new projects. The service will shut down on August 25, 2025. + +Please see our [Dynamic Links Deprecation FAQ documentation](https://firebase.google.com/support/dynamic-links-faq) for more guidance. + +### Firebase Performance Monitoring + +For specific Firebase Performance Monitoring development, see +[the Performance README](FirebasePerformance/README.md) for instructions about building the SDK +and [the Performance TestApp README](FirebasePerformance/Tests/TestApp/README.md) for instructions about +integrating Performance with the dev test App. + +### Firebase Storage + +To run the Storage Integration tests, follow the instructions in +[StorageIntegration.swift](FirebaseStorage/Tests/Integration/StorageIntegration.swift). + +#### Push Notifications + +Push notifications can only be delivered to specially provisioned App IDs in the developer portal. +In order to test receiving push notifications, you will need to: + +1. Change the bundle identifier of the sample app to something you own in your Apple Developer +account and enable that App ID for push notifications. +2. You'll also need to +[upload your APNs Provider Authentication Key or certificate to the +Firebase Console](https://firebase.google.com/docs/cloud-messaging/ios/certs) +at **Project Settings > Cloud Messaging > [Your Firebase App]**. +3. Ensure your iOS device is added to your Apple Developer portal as a test device. + +#### iOS Simulator + +The iOS Simulator cannot register for remote notifications and will not receive push notifications. +To receive push notifications, follow the steps above and run the app on a physical device. + +## Building with Firebase on Apple platforms + +Firebase provides official beta support for macOS, Catalyst, and tvOS. visionOS and watchOS +are community supported. Thanks to community contributions for many of the multi-platform PRs. + +At this time, most of Firebase's products are available across Apple platforms. There are still +a few gaps, especially on visionOS and watchOS. For details about the current support matrix, see +[this chart](https://firebase.google.com/docs/ios/learn-more#firebase_library_support_by_platform) +in Firebase's documentation. + +### visionOS + +Where supported, visionOS works as expected with the exception of Firestore via Swift Package +Manager where it is required to use the source distribution. + +To enable the Firestore source distribution, quit Xcode and open the desired +project from the command line with the `FIREBASE_SOURCE_FIRESTORE` environment +variable: `open --env FIREBASE_SOURCE_FIRESTORE /path/to/project.xcodeproj`. +To go back to using the binary distribution of Firestore, quit Xcode and open +Xcode like normal, without the environment variable. + +### watchOS +Thanks to contributions from the community, many of Firebase SDKs now compile, run unit tests, and +work on watchOS. See the [Independent Watch App Sample](Example/watchOSSample). + +Keep in mind that watchOS is not officially supported by Firebase. While we can catch basic unit +test issues with GitHub Actions, there may be some changes where the SDK no longer works as expected +on watchOS. If you encounter this, please +[file an issue](https://github.com/firebase/firebase-ios-sdk/issues). + +During app setup in the console, you may get to a step that mentions something like "Checking if the +app has communicated with our servers". This relies on Analytics and will not work on watchOS. +**It's safe to ignore the message and continue**, the rest of the SDKs will work as expected. + +#### Additional Crashlytics Notes +* watchOS has limited support. Due to watchOS restrictions, mach exceptions and signal crashes are +not recorded. (Crashes in SwiftUI are generated as mach exceptions, so will not be recorded) + +## Combine +Thanks to contributions from the community, _FirebaseCombineSwift_ contains support for Apple's Combine +framework. This module is currently under development and not yet supported for use in production +environments. For more details, please refer to the [docs](FirebaseCombineSwift/README.md). + +## Roadmap + +See [Roadmap](ROADMAP.md) for more about the Firebase Apple SDK Open Source +plans and directions. + +## Contributing + +See [Contributing](CONTRIBUTING.md) for more information on contributing to the Firebase +Apple SDK. + +## License + +The contents of this repository are licensed under the +[Apache License, version 2.0](http://www.apache.org/licenses/LICENSE-2.0). + +Your use of Firebase is governed by the +[Terms of Service for Firebase Services](https://firebase.google.com/terms/). diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Components/FIRCLSApplication.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Components/FIRCLSApplication.h new file mode 100644 index 0000000..0661d31 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Components/FIRCLSApplication.h @@ -0,0 +1,91 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import +#if CLS_TARGET_OS_HAS_UIKIT +#import +#endif + +__BEGIN_DECLS + +#define FIRCLSApplicationActivityDefault \ + (NSActivitySuddenTerminationDisabled | NSActivityAutomaticTerminationDisabled) + +/** + * Type to indicate application installation source + */ +typedef NS_ENUM(NSInteger, FIRCLSApplicationInstallationSourceType) { + FIRCLSApplicationInstallationSourceTypeDeveloperInstall = 1, + // 2 and 3 are reserved for legacy values. + FIRCLSApplicationInstallationSourceTypeAppStore = 4 +}; + +/** + * Returns the application bundle identifier with occurrences of "/" replaced by "_" + */ +NSString* FIRCLSApplicationGetBundleIdentifier(void); + +/** + * Returns the SDK's bundle ID + */ +NSString* FIRCLSApplicationGetSDKBundleID(void); + +/** + * Returns the platform identifier, either: ios, mac, or tvos. + * Catalyst apps are treated as mac. + * This is a legacy function, for platform identification please use + * FIRCLSApplicationGetFirebasePlatform. + */ +NSString* FIRCLSApplicationGetPlatform(void); + +/** + * Returns the operating system for filtering. Should be kept consistent with Analytics. + */ +NSString* FIRCLSApplicationGetFirebasePlatform(void); + +/** + * Returns the user-facing app name + */ +NSString* FIRCLSApplicationGetName(void); + +/** + * Returns the build number + */ +NSString* FIRCLSApplicationGetBundleVersion(void); + +/** + * Returns the human-readable build version + */ +NSString* FIRCLSApplicationGetShortBundleVersion(void); + +/** + * Returns a number to indicate how the app has been installed: Developer / App Store + */ +FIRCLSApplicationInstallationSourceType FIRCLSApplicationInstallationSource(void); + +BOOL FIRCLSApplicationIsExtension(void); +NSString* FIRCLSApplicationExtensionPointIdentifier(void); + +#if CLS_TARGET_OS_HAS_UIKIT +UIApplication* FIRCLSApplicationSharedInstance(void); +#else +id FIRCLSApplicationSharedInstance(void); +#endif + +id FIRCLSApplicationBeginActivity(NSActivityOptions options, NSString* reason); +void FIRCLSApplicationEndActivity(id activity); + +void FIRCLSApplicationActivity(NSActivityOptions options, NSString* reason, void (^block)(void)); + +__END_DECLS diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Components/FIRCLSApplication.m b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Components/FIRCLSApplication.m new file mode 100644 index 0000000..67e452b --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Components/FIRCLSApplication.m @@ -0,0 +1,208 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "Crashlytics/Crashlytics/Components/FIRCLSApplication.h" + +#import "Crashlytics/Crashlytics/Components/FIRCLSHost.h" +#import "Crashlytics/Crashlytics/Helpers/FIRCLSUtility.h" + +#import + +#if CLS_TARGET_OS_OSX +#import +#endif + +#if CLS_TARGET_OS_HAS_UIKIT +#import +#endif + +NSString* FIRCLSApplicationGetBundleIdentifier(void) { + return [[[NSBundle mainBundle] bundleIdentifier] stringByReplacingOccurrencesOfString:@"/" + withString:@"_"]; +} + +NSString* FIRCLSApplicationGetSDKBundleID(void) { + return + [@"com.google.firebase.crashlytics." stringByAppendingString:FIRCLSApplicationGetPlatform()]; +} + +// Legacy function, we use FIRCLSApplicationGetFirebasePlatform now for platform specification. +// Can't clean the code since some endpoints setup depend on this function. +NSString* FIRCLSApplicationGetPlatform(void) { +#if defined(TARGET_OS_MACCATALYST) && TARGET_OS_MACCATALYST + return @"mac"; +#elif TARGET_OS_IOS + return @"ios"; +#elif TARGET_OS_OSX + return @"mac"; +#elif TARGET_OS_TV + return @"tvos"; +#elif TARGET_OS_WATCH + return @"ios"; +#elif defined(TARGET_OS_VISION) && TARGET_OS_VISION + return @"ios"; +#endif +} + +NSString* FIRCLSApplicationGetFirebasePlatform(void) { + NSString* firebasePlatform = [GULAppEnvironmentUtil applePlatform]; +#if TARGET_OS_IOS + // This check is necessary because iOS-only apps running on iPad + // will report UIUserInterfaceIdiomPhone via UI_USER_INTERFACE_IDIOM(). + if ([firebasePlatform isEqualToString:@"ios"] && + ([[UIDevice currentDevice].model.lowercaseString containsString:@"ipad"] || + [[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad)) { + return @"ipados"; + } +#endif + + return firebasePlatform; +} + +// these defaults match the FIRCLSInfoPlist helper in FIRCLSIDEFoundation +NSString* FIRCLSApplicationGetBundleVersion(void) { + return [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"]; +} + +NSString* FIRCLSApplicationGetShortBundleVersion(void) { + return [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"]; +} + +NSString* FIRCLSApplicationGetName(void) { + NSString* name; + NSBundle* mainBundle; + + mainBundle = [NSBundle mainBundle]; + + name = [mainBundle objectForInfoDictionaryKey:@"CFBundleDisplayName"]; + if (name) { + return name; + } + + name = [mainBundle objectForInfoDictionaryKey:@"CFBundleName"]; + if (name) { + return name; + } + + return FIRCLSApplicationGetBundleVersion(); +} + +BOOL FIRCLSApplicationHasAppStoreReceipt(void) { + NSURL* url = NSBundle.mainBundle.appStoreReceiptURL; + return [NSFileManager.defaultManager fileExistsAtPath:[url path]]; +} + +FIRCLSApplicationInstallationSourceType FIRCLSApplicationInstallationSource(void) { + if (FIRCLSApplicationHasAppStoreReceipt()) { + return FIRCLSApplicationInstallationSourceTypeAppStore; + } + + return FIRCLSApplicationInstallationSourceTypeDeveloperInstall; +} + +BOOL FIRCLSApplicationIsExtension(void) { + return FIRCLSApplicationExtensionPointIdentifier() != nil; +} + +NSString* FIRCLSApplicationExtensionPointIdentifier(void) { + id extensionDict = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"NSExtension"]; + + if (!extensionDict) { + return nil; + } + + if (![extensionDict isKindOfClass:[NSDictionary class]]) { + FIRCLSSDKLog("Error: NSExtension Info.plist entry is mal-formed\n"); + return nil; + } + + id typeValue = [(NSDictionary*)extensionDict objectForKey:@"NSExtensionPointIdentifier"]; + + if (![typeValue isKindOfClass:[NSString class]]) { + FIRCLSSDKLog("Error: NSExtensionPointIdentifier Info.plist entry is mal-formed\n"); + return nil; + } + + return typeValue; +} + +#if CLS_TARGET_OS_HAS_UIKIT +UIApplication* FIRCLSApplicationSharedInstance(void) { + if (FIRCLSApplicationIsExtension()) { + return nil; + } + + return [[UIApplication class] performSelector:@selector(sharedApplication)]; +} +#elif CLS_TARGET_OS_OSX +id FIRCLSApplicationSharedInstance(void) { + return [NSClassFromString(@"NSApplication") sharedApplication]; +} +#else +id FIRCLSApplicationSharedInstance(void) { + return nil; // FIXME: what do we actually return for watch? +} +#endif + +id FIRCLSApplicationBeginActivity(NSActivityOptions options, NSString* reason) { + if ([[NSProcessInfo processInfo] respondsToSelector:@selector(beginActivityWithOptions: + reason:)]) { + return [[NSProcessInfo processInfo] beginActivityWithOptions:options reason:reason]; + } + +#if CLS_TARGET_OS_OSX + if (options & NSActivitySuddenTerminationDisabled) { + [[NSProcessInfo processInfo] disableSuddenTermination]; + } + + if (options & NSActivityAutomaticTerminationDisabled) { + [[NSProcessInfo processInfo] disableAutomaticTermination:reason]; + } +#endif + + // encode the options, so we can undo our work later + return @{@"options" : @(options), @"reason" : reason}; +} + +void FIRCLSApplicationEndActivity(id activity) { + if (!activity) { + return; + } + + if ([[NSProcessInfo processInfo] respondsToSelector:@selector(endActivity:)]) { + [[NSProcessInfo processInfo] endActivity:activity]; + return; + } + +#if CLS_TARGET_OS_OSX + NSInteger options = [[(NSDictionary*)activity objectForKey:@"options"] integerValue]; + + if (options & NSActivitySuddenTerminationDisabled) { + [[NSProcessInfo processInfo] enableSuddenTermination]; + } + + if (options & NSActivityAutomaticTerminationDisabled) { + [[NSProcessInfo processInfo] + enableAutomaticTermination:[(NSDictionary*)activity objectForKey:@"reason"]]; + } +#endif +} + +void FIRCLSApplicationActivity(NSActivityOptions options, NSString* reason, void (^block)(void)) { + id activity = FIRCLSApplicationBeginActivity(options, reason); + + block(); + + FIRCLSApplicationEndActivity(activity); +} diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Components/FIRCLSBinaryImage.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Components/FIRCLSBinaryImage.h new file mode 100644 index 0000000..6e546ea --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Components/FIRCLSBinaryImage.h @@ -0,0 +1,80 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once + +#include +#include + +#include "Crashlytics/Crashlytics/Helpers/FIRCLSFeatures.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSFile.h" +#include "Crashlytics/Shared/FIRCLSMachO/FIRCLSMachO.h" + +__BEGIN_DECLS + +// Typically, apps seem to have ~700 binary images loaded +#define CLS_BINARY_IMAGE_RUNTIME_NODE_COUNT (1024) +#define CLS_BINARY_IMAGE_RUNTIME_NODE_NAME_SIZE (32) +#define CLS_BINARY_IMAGE_RUNTIME_NODE_RECORD_NAME 0 + +#define FIRCLSUUIDStringLength (33) + +typedef struct { + _Atomic(void *) volatile baseAddress; + uint64_t size; +#if CLS_DWARF_UNWINDING_SUPPORTED + const void *ehFrame; +#endif +#if CLS_COMPACT_UNWINDING_SUPPORTED + const void *unwindInfo; +#endif + const void *crashInfo; +#if CLS_BINARY_IMAGE_RUNTIME_NODE_RECORD_NAME + char name[CLS_BINARY_IMAGE_RUNTIME_NODE_NAME_SIZE]; +#endif +} FIRCLSBinaryImageRuntimeNode; + +typedef struct { + char uuidString[FIRCLSUUIDStringLength]; + bool encrypted; + FIRCLSMachOVersion builtSDK; + FIRCLSMachOVersion minSDK; + FIRCLSBinaryImageRuntimeNode node; + struct FIRCLSMachOSlice slice; + intptr_t vmaddr_slide; +} FIRCLSBinaryImageDetails; + +typedef struct { + const char *path; +} FIRCLSBinaryImageReadOnlyContext; + +typedef struct { + FIRCLSFile file; + FIRCLSBinaryImageRuntimeNode nodes[CLS_BINARY_IMAGE_RUNTIME_NODE_COUNT]; +} FIRCLSBinaryImageReadWriteContext; + +void FIRCLSBinaryImageInit(void); + +#if CLS_COMPACT_UNWINDING_SUPPORTED +bool FIRCLSBinaryImageSafeFindImageForAddress(uintptr_t address, + FIRCLSBinaryImageRuntimeNode *image); +bool FIRCLSBinaryImageSafeHasUnwindInfo(FIRCLSBinaryImageRuntimeNode *image); +#endif + +bool FIRCLSBinaryImageFindImageForUUID(const char *uuidString, + FIRCLSBinaryImageDetails *imageDetails); + +bool FIRCLSBinaryImageRecordMainExecutable(FIRCLSFile *file); + +__END_DECLS diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Components/FIRCLSBinaryImage.m b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Components/FIRCLSBinaryImage.m new file mode 100644 index 0000000..c7e1a60 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Components/FIRCLSBinaryImage.m @@ -0,0 +1,607 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "Crashlytics/Crashlytics/Components/FIRCLSBinaryImage.h" + +#include +#include + +#include + +#include + +#include "Crashlytics/Crashlytics/Components/FIRCLSGlobals.h" +#include "Crashlytics/Crashlytics/Components/FIRCLSHost.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSDefines.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSFeatures.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSFile.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSUtility.h" +#include "Crashlytics/Shared/FIRCLSByteUtility.h" +#include "Crashlytics/Shared/FIRCLSMachO/FIRCLSMachO.h" + +#include + +// this is defined only if __OPEN_SOURCE__ is *not* defined in the TVOS SDK's mach-o/loader.h +// also, it has not yet made it back to the OSX SDKs, for example +#ifndef LC_VERSION_MIN_TVOS +#define LC_VERSION_MIN_TVOS 0x2F +#endif + +#pragma mark Prototypes +static bool FIRCLSBinaryImageOpenIfNeeded(bool* needsClosing); + +static void FIRCLSBinaryImageAddedCallback(const struct mach_header* mh, intptr_t vmaddr_slide); +static void FIRCLSBinaryImageRemovedCallback(const struct mach_header* mh, intptr_t vmaddr_slide); +static void FIRCLSBinaryImageChanged(bool added, + const struct mach_header* mh, + intptr_t vmaddr_slide); +static bool FIRCLSBinaryImageFillInImageDetails(FIRCLSBinaryImageDetails* details); + +static void FIRCLSBinaryImageStoreNode(bool added, FIRCLSBinaryImageDetails imageDetails); +static void FIRCLSBinaryImageRecordSlice(bool added, const FIRCLSBinaryImageDetails imageDetails); + +#pragma mark - Core API +void FIRCLSBinaryImageInit(void) { + // initialize our node array to all zeros + memset(&_firclsContext.writable->binaryImage, 0, sizeof(_firclsContext.writable->binaryImage)); + _firclsContext.writable->binaryImage.file.fd = -1; + + dispatch_async(FIRCLSGetBinaryImageQueue(), ^{ + if (!FIRCLSUnlinkIfExists(_firclsContext.readonly->binaryimage.path)) { + FIRCLSSDKLog("Unable to reset the binary image log file %s\n", strerror(errno)); + } + + bool needsClosing; // unneeded + if (!FIRCLSBinaryImageOpenIfNeeded(&needsClosing)) { + FIRCLSSDKLog("Error: Unable to open the binary image log file during init\n"); + } + }); + + _dyld_register_func_for_add_image(FIRCLSBinaryImageAddedCallback); + _dyld_register_func_for_remove_image(FIRCLSBinaryImageRemovedCallback); + + dispatch_async(FIRCLSGetBinaryImageQueue(), ^{ + FIRCLSFileClose(&_firclsContext.writable->binaryImage.file); + }); +} + +static bool FIRCLSBinaryImageOpenIfNeeded(bool* needsClosing) { + if (!FIRCLSIsValidPointer(_firclsContext.writable)) { + return false; + } + + if (!FIRCLSIsValidPointer(_firclsContext.readonly)) { + return false; + } + + if (!FIRCLSIsValidPointer(needsClosing)) { + return false; + } + + *needsClosing = false; + + if (FIRCLSFileIsOpen(&_firclsContext.writable->binaryImage.file)) { + return true; + } + + if (!FIRCLSFileInitWithPath(&_firclsContext.writable->binaryImage.file, + _firclsContext.readonly->binaryimage.path, false)) { + FIRCLSSDKLog("Error: unable to open binary image log file\n"); + return false; + } + + *needsClosing = true; + + return true; +} + +#if CLS_COMPACT_UNWINDING_SUPPORTED +bool FIRCLSBinaryImageSafeFindImageForAddress(uintptr_t address, + FIRCLSBinaryImageRuntimeNode* image) { + if (!FIRCLSContextIsInitialized()) { + return false; + } + + if (address == 0) { + return false; + } + + if (!FIRCLSIsValidPointer(image)) { + return false; + } + + FIRCLSBinaryImageRuntimeNode* nodes = _firclsContext.writable->binaryImage.nodes; + if (!nodes) { + FIRCLSSDKLogError("The node structure is NULL\n"); + return false; + } + + for (uint32_t i = 0; i < CLS_BINARY_IMAGE_RUNTIME_NODE_COUNT; ++i) { + FIRCLSBinaryImageRuntimeNode* node = &nodes[i]; + if (!FIRCLSIsValidPointer(node)) { + FIRCLSSDKLog( + "Invalid node pointer encountered in context's writable binary image at index %i", i); + continue; + } + + if ((address >= (uintptr_t)node->baseAddress) && + (address < (uintptr_t)node->baseAddress + node->size)) { + *image = *node; // copy the image + return true; + } + } + + return false; +} + +bool FIRCLSBinaryImageSafeHasUnwindInfo(FIRCLSBinaryImageRuntimeNode* image) { + return FIRCLSIsValidPointer(image->unwindInfo); +} +#endif + +bool FIRCLSBinaryImageFindImageForUUID(const char* uuidString, + FIRCLSBinaryImageDetails* imageDetails) { + if (!imageDetails || !uuidString) { + FIRCLSSDKLog("null input\n"); + return false; + } + + uint32_t imageCount = _dyld_image_count(); + + for (uint32_t i = 0; i < imageCount; ++i) { + const struct mach_header* mh = _dyld_get_image_header(i); + + FIRCLSBinaryImageDetails image; + + image.slice = FIRCLSMachOSliceWithHeader((void*)mh); + FIRCLSBinaryImageFillInImageDetails(&image); + + if (strncmp(uuidString, image.uuidString, FIRCLSUUIDStringLength) == 0) { + *imageDetails = image; + return true; + } + } + + return false; +} + +#pragma mark - DYLD callback handlers +static void FIRCLSBinaryImageAddedCallback(const struct mach_header* mh, intptr_t vmaddr_slide) { + FIRCLSBinaryImageChanged(true, mh, vmaddr_slide); +} + +static void FIRCLSBinaryImageRemovedCallback(const struct mach_header* mh, intptr_t vmaddr_slide) { + FIRCLSBinaryImageChanged(false, mh, vmaddr_slide); +} + +#if CLS_BINARY_IMAGE_RUNTIME_NODE_RECORD_NAME +static bool FIRCLSBinaryImagePopulateRuntimeNodeName(FIRCLSBinaryImageDetails* details) { + if (!FIRCLSIsValidPointer(details)) { + return false; + } + + memset(details->node.name, 0, CLS_BINARY_IMAGE_RUNTIME_NODE_NAME_SIZE); + + // We have limited storage space for the name. And, we really want to store + // "CoreFoundation", not "/System/Library/Fram", so we have to play tricks + // to make sure we get the right side of the string. + const char* imageName = FIRCLSMachOSliceGetExecutablePath(&details->slice); + if (!imageName) { + return false; + } + + const size_t imageNameLength = strlen(imageName); + + // Remember to leave one character for null-termination. + if (imageNameLength > CLS_BINARY_IMAGE_RUNTIME_NODE_NAME_SIZE - 1) { + imageName = imageName + (imageNameLength - (CLS_BINARY_IMAGE_RUNTIME_NODE_NAME_SIZE - 1)); + } + + // subtract one to make sure the string is always null-terminated + strncpy(details->node.name, imageName, CLS_BINARY_IMAGE_RUNTIME_NODE_NAME_SIZE - 1); + + return true; +} +#endif + +// There were plans later to replace this with FIRCLSMachO +static FIRCLSMachOSegmentCommand FIRCLSBinaryImageMachOGetSegmentCommand( + const struct load_command* cmd) { + FIRCLSMachOSegmentCommand segmentCommand; + + memset(&segmentCommand, 0, sizeof(FIRCLSMachOSegmentCommand)); + + if (!cmd) { + return segmentCommand; + } + + if (cmd->cmd == LC_SEGMENT) { + struct segment_command* segCmd = (struct segment_command*)cmd; + + memcpy(segmentCommand.segname, segCmd->segname, 16); + segmentCommand.vmaddr = segCmd->vmaddr; + segmentCommand.vmsize = segCmd->vmsize; + } else if (cmd->cmd == LC_SEGMENT_64) { + struct segment_command_64* segCmd = (struct segment_command_64*)cmd; + + memcpy(segmentCommand.segname, segCmd->segname, 16); + segmentCommand.vmaddr = segCmd->vmaddr; + segmentCommand.vmsize = segCmd->vmsize; + } + + return segmentCommand; +} +#if !CLS_TARGET_OS_VISION +static bool FIRCLSBinaryImageMachOSliceInitSectionByName(FIRCLSMachOSliceRef slice, + const char* segName, + const char* sectionName, + FIRCLSMachOSection* section) { + if (!FIRCLSIsValidPointer(slice)) { + return false; + } + + if (!section) { + return false; + } + + memset(section, 0, sizeof(FIRCLSMachOSection)); + + if (FIRCLSMachOSliceIs64Bit(slice)) { + const struct section_64* sect = + getsectbynamefromheader_64(slice->startAddress, segName, sectionName); + if (!sect) { + return false; + } + + section->addr = sect->addr; + section->size = sect->size; + section->offset = sect->offset; + } else { + const struct section* sect = getsectbynamefromheader(slice->startAddress, segName, sectionName); + if (!sect) { + return false; + } + + section->addr = sect->addr; + section->size = sect->size; + section->offset = sect->offset; + } + + return true; +} +#endif + +static void FIRCLSPopulateImageDetailWithLoadCommand(uint32_t type, + uint32_t size, + const struct load_command* cmd, + void* context) { + FIRCLSBinaryImageDetails* details = context; + switch (type) { + case LC_UUID: { + const uint8_t* uuid = FIRCLSMachOGetUUID(cmd); + FIRCLSSafeHexToString(uuid, 16, details->uuidString); + } break; + case LC_ENCRYPTION_INFO: + details->encrypted = FIRCLSMachOGetEncrypted(cmd); + break; + case LC_SEGMENT: + case LC_SEGMENT_64: { + FIRCLSMachOSegmentCommand segmentCommand = FIRCLSBinaryImageMachOGetSegmentCommand(cmd); + + if (strncmp(segmentCommand.segname, SEG_TEXT, sizeof(SEG_TEXT)) == 0) { + details->node.size = segmentCommand.vmsize; + } + } break; + case LC_VERSION_MIN_MACOSX: + case LC_VERSION_MIN_IPHONEOS: + case LC_VERSION_MIN_TVOS: + case LC_VERSION_MIN_WATCHOS: + details->minSDK = FIRCLSMachOGetMinimumOSVersion(cmd); + details->builtSDK = FIRCLSMachOGetLinkedSDKVersion(cmd); + break; + } +} + +static bool FIRCLSBinaryImageFillInImageDetails(FIRCLSBinaryImageDetails* details) { + if (!FIRCLSIsValidPointer(details)) { + return false; + } + + if (!FIRCLSIsValidPointer(details->slice.startAddress)) { + return false; + } + +#if CLS_BINARY_IMAGE_RUNTIME_NODE_RECORD_NAME + // this is done for debugging purposes, so if it fails, its ok to continue + FIRCLSBinaryImagePopulateRuntimeNodeName(details); +#endif + + // This cast might look a little dubious, but its just because we're using the same + // struct types in a few different places. + details->node.baseAddress = (void* volatile)details->slice.startAddress; + + FIRCLSMachOSliceEnumerateLoadCommands_f(&details->slice, details, + FIRCLSPopulateImageDetailWithLoadCommand); + + // We look up the section we want, and we *should* be able to use: + // + // address of data we want = start address + section.offset + // + // However, the offset value is coming back funky in iOS 9. So, instead we look up the address + // the section should be loaded at, and compute the offset by looking up the address of the + // segment itself. + + FIRCLSMachOSection section; + +#if CLS_COMPACT_UNWINDING_SUPPORTED +#if !CLS_TARGET_OS_VISION + if (FIRCLSBinaryImageMachOSliceInitSectionByName(&details->slice, SEG_TEXT, "__unwind_info", + §ion)) { + details->node.unwindInfo = (void*)(section.addr + details->vmaddr_slide); + } +#else + unsigned long unwindInfoSize; + details->node.unwindInfo = (void*)getsectiondata(details->slice.startAddress, "__TEXT", + "__unwind_info", &unwindInfoSize); +#endif +#endif + +#if CLS_DWARF_UNWINDING_SUPPORTED +#if !CLS_TARGET_OS_VISION + if (FIRCLSBinaryImageMachOSliceInitSectionByName(&details->slice, SEG_TEXT, "__eh_frame", + §ion)) { + details->node.ehFrame = (void*)(section.addr + details->vmaddr_slide); + } +#else + unsigned long ehFrameSize; + details->node.ehFrame = + (void*)getsectiondata(details->slice.startAddress, "__TEXT", "__eh_frame", &ehFrameSize); +#endif +#endif + +#if !CLS_TARGET_OS_VISION + if (FIRCLSBinaryImageMachOSliceInitSectionByName(&details->slice, SEG_DATA, "__crash_info", + §ion)) { + details->node.crashInfo = (void*)(section.addr + details->vmaddr_slide); + } +#else + unsigned long crashInfoSize; + details->node.crashInfo = + (void*)getsectiondata(details->slice.startAddress, "__TEXT", "__crash_info", &crashInfoSize); +#endif + + return true; +} + +typedef struct { + FIRCLSBinaryImageDetails details; + bool added; +} FIRCLSImageChange; + +static void FIRCLSProcessBinaryImageChange(void* context) { + FIRCLSImageChange* imageChange = context; + // this is an atomic operation + FIRCLSBinaryImageStoreNode(imageChange->added, imageChange->details); + FIRCLSBinaryImageRecordSlice(imageChange->added, imageChange->details); + free(context); +} + +static void FIRCLSBinaryImageChanged(bool added, + const struct mach_header* mh, + intptr_t vmaddr_slide) { + // FIRCLSSDKLog("Binary image %s %p\n", added ? "loaded" : "unloaded", mh); + FIRCLSBinaryImageDetails imageDetails; + memset(&imageDetails, 0, sizeof(FIRCLSBinaryImageDetails)); + + imageDetails.slice = FIRCLSMachOSliceWithHeader((void*)mh); + imageDetails.vmaddr_slide = vmaddr_slide; + // fill imageDetails fields using slice & vmaddr_slide + FIRCLSBinaryImageFillInImageDetails(&imageDetails); + + FIRCLSImageChange* change = calloc(1, sizeof(FIRCLSImageChange)); + if (!change) return; + change->added = added; + change->details = imageDetails; + dispatch_async_f(FIRCLSGetBinaryImageQueue(), change, FIRCLSProcessBinaryImageChange); +} + +#pragma mark - In-Memory Storage +static void FIRCLSBinaryImageStoreNode(bool added, FIRCLSBinaryImageDetails imageDetails) { + // This function is mutating a structure that needs to be accessed at crash time. We + // need to make sure the structure is always in as valid a state as possible. + // FIRCLSSDKLog("Storing %s node %p\n", added ? "loaded" : "unloaded", + // (void*)imageDetails.node.baseAddress); + + if (!_firclsContext.writable) { + FIRCLSSDKLog("Error: Writable context is NULL\n"); + return; + } + + // looking for an empty space if an image added + void* searchAddress = NULL; + bool success = false; + FIRCLSBinaryImageRuntimeNode* nodes = _firclsContext.writable->binaryImage.nodes; + + if (!added) { + // capture the search address first + searchAddress = imageDetails.node.baseAddress; + + // If we are removing a node, we need to set its entries to zero. By clearing all of + // these values, we can just copy in imageDetails.node. Using memset here is slightly + // weird, since we have to restore one field. But, this way, if/when the structure changes, + // we still do the right thing. + memset(&imageDetails.node, 0, sizeof(FIRCLSBinaryImageRuntimeNode)); + + // restore the baseAddress, which just got zeroed, and is used for indexing + imageDetails.node.baseAddress = searchAddress; + } + + for (uint32_t i = 0; i < CLS_BINARY_IMAGE_RUNTIME_NODE_COUNT; ++i) { + FIRCLSBinaryImageRuntimeNode* node = &nodes[i]; + + if (!node) { + FIRCLSSDKLog("Error: Binary image storage is NULL\n"); + break; + } + + // navigate through the array, looking for our matching address + if (node->baseAddress != searchAddress) { + continue; + } + + // Attempt to swap the base address with whatever we are searching for. Success means that + // entry has been claims/cleared. Failure means some other thread beat us to it. + if (atomic_compare_exchange_strong(&node->baseAddress, &searchAddress, + imageDetails.node.baseAddress)) { + *node = imageDetails.node; + success = true; + + break; + } + + // If this is an unload, getting here means two threads unloaded at the same time. I think + // that's highly unlikely, and possibly even impossible. So, I'm choosing to abort the process + // at this point. + if (!added) { + FIRCLSSDKLog("Error: Failed to swap during image unload\n"); + break; + } + } + + if (!success) { + FIRCLSSDKLog("Error: Unable to track a %s node %p\n", added ? "loaded" : "unloaded", + (void*)imageDetails.node.baseAddress); + } +} + +#pragma mark - On-Disk Storage +static void FIRCLSBinaryImageRecordDetails(FIRCLSFile* file, + const FIRCLSBinaryImageDetails imageDetails) { + if (!file) { + FIRCLSSDKLog("Error: file is invalid\n"); + return; + } + + FIRCLSFileWriteHashEntryString(file, "uuid", imageDetails.uuidString); + FIRCLSFileWriteHashEntryUint64(file, "base", (uintptr_t)imageDetails.slice.startAddress); + FIRCLSFileWriteHashEntryUint64(file, "size", imageDetails.node.size); +} + +static void FIRCLSBinaryImageRecordLibraryFrameworkInfo(FIRCLSFile* file, const char* path) { + if (!file) { + FIRCLSSDKLog("Error: file is invalid\n"); + return; + } + + if (!path) { + return; + } + + // Because this function is so expensive, we've decided to omit this info for all Apple-supplied + // frameworks. This really isn't that bad, because we can know their info ahead of time (within a + // small margin of error). With this implementation, we will still record this info for any + // user-built framework, which in the end is the most important thing. + if (strncmp(path, "/System", 7) == 0) { + return; + } + + // check to see if this is a potential framework bundle + if (!strstr(path, ".framework")) { + return; + } + + // My.framework/Versions/A/My for OS X + // My.framework/My for iOS + + NSString* frameworkPath = [NSString stringWithUTF8String:path]; +#if TARGET_OS_IPHONE + frameworkPath = [frameworkPath stringByDeletingLastPathComponent]; +#else + frameworkPath = [frameworkPath stringByDeletingLastPathComponent]; // My.framework/Versions/A + frameworkPath = [frameworkPath stringByDeletingLastPathComponent]; // My.framework/Versions + frameworkPath = [frameworkPath stringByDeletingLastPathComponent]; // My.framework +#endif + + NSBundle* const bundle = [NSBundle bundleWithPath:frameworkPath]; + + if (!bundle) { + return; + } + + FIRCLSFileWriteHashEntryNSStringUnlessNilOrEmpty(file, "bundle_id", [bundle bundleIdentifier]); + FIRCLSFileWriteHashEntryNSStringUnlessNilOrEmpty( + file, "build_version", [bundle objectForInfoDictionaryKey:@"CFBundleVersion"]); + FIRCLSFileWriteHashEntryNSStringUnlessNilOrEmpty( + file, "display_version", [bundle objectForInfoDictionaryKey:@"CFBundleShortVersionString"]); +} + +static void FIRCLSBinaryImageRecordSlice(bool added, const FIRCLSBinaryImageDetails imageDetails) { + bool needsClosing = false; + if (!FIRCLSBinaryImageOpenIfNeeded(&needsClosing)) { + FIRCLSSDKLog("Error: unable to open binary image log file\n"); + return; + } + + FIRCLSFile* file = &_firclsContext.writable->binaryImage.file; + + FIRCLSFileWriteSectionStart(file, added ? "load" : "unload"); + + FIRCLSFileWriteHashStart(file); + + const char* path = FIRCLSMachOSliceGetExecutablePath((FIRCLSMachOSliceRef)&imageDetails.slice); + + FIRCLSFileWriteHashEntryString(file, "path", path); + + if (added) { + // this won't work if the binary has been unloaded + FIRCLSBinaryImageRecordLibraryFrameworkInfo(file, path); + } + + FIRCLSBinaryImageRecordDetails(file, imageDetails); + + FIRCLSFileWriteHashEnd(file); + + FIRCLSFileWriteSectionEnd(file); + + if (needsClosing) { + FIRCLSFileClose(file); + } +} + +bool FIRCLSBinaryImageRecordMainExecutable(FIRCLSFile* file) { + FIRCLSBinaryImageDetails imageDetails; + + memset(&imageDetails, 0, sizeof(FIRCLSBinaryImageDetails)); + + imageDetails.slice = FIRCLSMachOSliceGetCurrent(); + FIRCLSBinaryImageFillInImageDetails(&imageDetails); + + FIRCLSFileWriteSectionStart(file, "executable"); + FIRCLSFileWriteHashStart(file); + + FIRCLSFileWriteHashEntryString(file, "architecture", + FIRCLSMachOSliceGetArchitectureName(&imageDetails.slice)); + + FIRCLSBinaryImageRecordDetails(file, imageDetails); + FIRCLSFileWriteHashEntryBoolean(file, "encrypted", imageDetails.encrypted); + FIRCLSFileWriteHashEntryString(file, "minimum_sdk_version", + [FIRCLSMachOFormatVersion(&imageDetails.minSDK) UTF8String]); + FIRCLSFileWriteHashEntryString(file, "built_sdk_version", + [FIRCLSMachOFormatVersion(&imageDetails.builtSDK) UTF8String]); + + FIRCLSFileWriteHashEnd(file); + FIRCLSFileWriteSectionEnd(file); + + return true; +} diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Components/FIRCLSContext.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Components/FIRCLSContext.h new file mode 100644 index 0000000..edd421c --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Components/FIRCLSContext.h @@ -0,0 +1,103 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once + +#include "Crashlytics/Crashlytics/Components/FIRCLSBinaryImage.h" +#include "Crashlytics/Crashlytics/Components/FIRCLSHost.h" +#include "Crashlytics/Crashlytics/Components/FIRCLSUserLogging.h" +#include "Crashlytics/Crashlytics/Handlers/FIRCLSException.h" +#include "Crashlytics/Crashlytics/Handlers/FIRCLSMachException.h" +#include "Crashlytics/Crashlytics/Handlers/FIRCLSSignal.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSAllocate.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSFeatures.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSInternalLogging.h" + +#include +#include + +// The purpose of the crash context is to hold values that absolutely must be read and/or written at +// crash time. For robustness against memory corruption, they are protected with guard pages. +// Further, the context is separated into read-only and read-write sections. + +__BEGIN_DECLS + +#ifdef __OBJC__ +@class FIRCLSInternalReport; +@class FIRCLSSettings; +@class FIRCLSInstallIdentifierModel; +@class FIRCLSFileManager; +@class FIRCLSContextInitData; +@class FBLPromise; +#endif + +typedef struct { + volatile bool initialized; + volatile bool debuggerAttached; + const char* previouslyCrashedFileFullPath; + const char* logPath; + // Initial report path represents the report path used to initialized the context; + // where non-on-demand exceptions and other crashes will be written. + const char* initialReportPath; +#if CLS_USE_SIGALTSTACK + void* signalStack; +#endif +#if CLS_MACH_EXCEPTION_SUPPORTED + void* machStack; +#endif + + FIRCLSBinaryImageReadOnlyContext binaryimage; + FIRCLSExceptionReadOnlyContext exception; + FIRCLSHostReadOnlyContext host; +#if CLS_SIGNAL_SUPPORTED + FIRCLSSignalReadContext signal; +#endif +#if CLS_MACH_EXCEPTION_SUPPORTED + FIRCLSMachExceptionReadContext machException; +#endif + FIRCLSUserLoggingReadOnlyContext logging; +} FIRCLSReadOnlyContext; + +typedef struct { + FIRCLSInternalLoggingWritableContext internalLogging; + volatile bool crashOccurred; + FIRCLSBinaryImageReadWriteContext binaryImage; + FIRCLSUserLoggingWritableContext logging; + FIRCLSExceptionWritableContext exception; +} FIRCLSReadWriteContext; + +typedef struct { + FIRCLSReadOnlyContext* readonly; + FIRCLSReadWriteContext* writable; + FIRCLSAllocatorRef allocator; +} FIRCLSContext; +#ifdef __OBJC__ +FBLPromise* FIRCLSContextInitialize(FIRCLSContextInitData* initData, + FIRCLSFileManager* fileManager); +FIRCLSContextInitData* FIRCLSContextBuildInitData(FIRCLSInternalReport* report, + FIRCLSSettings* settings, + FIRCLSFileManager* fileManager, + NSString* appQualitySessionId); +bool FIRCLSContextRecordMetadata(NSString* rootPath, FIRCLSContextInitData* initData); +#endif + +void FIRCLSContextBaseInit(void); +void FIRCLSContextBaseDeinit(void); + +bool FIRCLSContextIsInitialized(void); +bool FIRCLSContextHasCrashed(void); +void FIRCLSContextMarkHasCrashed(void); +bool FIRCLSContextMarkAndCheckIfCrashed(void); + +__END_DECLS diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Components/FIRCLSContext.m b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Components/FIRCLSContext.m new file mode 100644 index 0000000..3242a08 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Components/FIRCLSContext.m @@ -0,0 +1,435 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "Crashlytics/Crashlytics/Components/FIRCLSContext.h" + +#include +#include + +#import "Crashlytics/Shared/FIRCLSConstants.h" + +#import "Crashlytics/Crashlytics/Models/FIRCLSFileManager.h" +#import "Crashlytics/Crashlytics/Models/FIRCLSInstallIdentifierModel.h" +#import "Crashlytics/Crashlytics/Models/FIRCLSInternalReport.h" +#import "Crashlytics/Crashlytics/Models/FIRCLSSettings.h" + +#include "Crashlytics/Crashlytics/Components/FIRCLSApplication.h" +#include "Crashlytics/Crashlytics/Components/FIRCLSCrashedMarkerFile.h" +#include "Crashlytics/Crashlytics/Components/FIRCLSGlobals.h" +#include "Crashlytics/Crashlytics/Components/FIRCLSProcess.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSContextInitData.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSDefines.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSFeatures.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSUtility.h" + +// The writable size is our handler stack plus whatever scratch we need. We have to use this space +// extremely carefully, however, because thread stacks always needs to be page-aligned. Only the +// first allocation is guaranteed to be page-aligned. +// +// CLS_SIGNAL_HANDLER_STACK_SIZE and CLS_MACH_EXCEPTION_HANDLER_STACK_SIZE are platform dependant, +// defined as 0 for tv/watch. +#define CLS_MINIMUM_READWRITE_SIZE \ + (CLS_SIGNAL_HANDLER_STACK_SIZE + CLS_MACH_EXCEPTION_HANDLER_STACK_SIZE + \ + sizeof(FIRCLSReadWriteContext)) + +// We need enough space here for the context, plus storage for strings. +#define CLS_MINIMUM_READABLE_SIZE (sizeof(FIRCLSReadOnlyContext) + 4096 * 4) + +static const char* FIRCLSContextAppendToRoot(NSString* root, NSString* component); +static void FIRCLSContextAllocate(FIRCLSContext* context); + +FIRCLSContextInitData* FIRCLSContextBuildInitData(FIRCLSInternalReport* report, + FIRCLSSettings* settings, + FIRCLSFileManager* fileManager, + NSString* appQualitySessionId) { + // Because we need to start the crash reporter right away, + // it starts up either with default settings, or cached settings + // from the last time they were fetched + + FIRCLSContextInitData* initData = [[FIRCLSContextInitData alloc] init]; + initData.customBundleId = nil; + initData.sessionId = [report identifier]; + initData.appQualitySessionId = appQualitySessionId; + initData.rootPath = [report path]; + initData.previouslyCrashedFileRootPath = [fileManager rootPath]; + initData.errorsEnabled = [settings errorReportingEnabled]; + initData.customExceptionsEnabled = [settings customExceptionsEnabled]; + initData.maxCustomExceptions = [settings maxCustomExceptions]; + initData.maxErrorLogSize = [settings errorLogBufferSize]; + initData.maxLogSize = [settings logBufferSize]; + initData.maxKeyValues = [settings maxCustomKeys]; + initData.betaToken = @""; + + return initData; +} + +FBLPromise* FIRCLSContextInitialize(FIRCLSContextInitData* initData, + FIRCLSFileManager* fileManager) { + if (!initData) { + return false; + } + + FIRCLSContextBaseInit(); + + dispatch_group_t group = dispatch_group_create(); + dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); + + if (!FIRCLSIsValidPointer(initData.rootPath)) { + return false; + } + + NSString* rootPath = initData.rootPath; + + // setup our SDK log file synchronously, because other calls may depend on it + _firclsContext.readonly->logPath = FIRCLSContextAppendToRoot(rootPath, @"sdk.log"); + _firclsContext.readonly->initialReportPath = FIRCLSDupString([[initData rootPath] UTF8String]); + if (!FIRCLSUnlinkIfExists(_firclsContext.readonly->logPath)) { + FIRCLSErrorLog(@"Unable to write initialize SDK write paths %s", strerror(errno)); + } + + // some values that aren't tied to particular subsystem + _firclsContext.readonly->debuggerAttached = FIRCLSProcessDebuggerAttached(); + + __block FBLPromise* initPromise = [FBLPromise pendingPromise]; + + dispatch_group_async(group, queue, ^{ + FIRCLSHostInitialize(&_firclsContext.readonly->host); + }); + + dispatch_group_async(group, queue, ^{ + _firclsContext.readonly->logging.errorStorage.maxSize = 0; + _firclsContext.readonly->logging.errorStorage.maxEntries = + initData.errorsEnabled ? initData.maxCustomExceptions : 0; + _firclsContext.readonly->logging.errorStorage.restrictBySize = false; + _firclsContext.readonly->logging.errorStorage.entryCount = + &_firclsContext.writable->logging.errorsCount; + _firclsContext.readonly->logging.errorStorage.aPath = + FIRCLSContextAppendToRoot(rootPath, FIRCLSReportErrorAFile); + _firclsContext.readonly->logging.errorStorage.bPath = + FIRCLSContextAppendToRoot(rootPath, FIRCLSReportErrorBFile); + + _firclsContext.readonly->logging.logStorage.maxSize = initData.maxLogSize; + _firclsContext.readonly->logging.logStorage.maxEntries = 0; + _firclsContext.readonly->logging.logStorage.restrictBySize = true; + _firclsContext.readonly->logging.logStorage.entryCount = NULL; + _firclsContext.readonly->logging.logStorage.aPath = + FIRCLSContextAppendToRoot(rootPath, FIRCLSReportLogAFile); + _firclsContext.readonly->logging.logStorage.bPath = + FIRCLSContextAppendToRoot(rootPath, FIRCLSReportLogBFile); + _firclsContext.readonly->logging.customExceptionStorage.aPath = + FIRCLSContextAppendToRoot(rootPath, FIRCLSReportCustomExceptionAFile); + _firclsContext.readonly->logging.customExceptionStorage.bPath = + FIRCLSContextAppendToRoot(rootPath, FIRCLSReportCustomExceptionBFile); + _firclsContext.readonly->logging.customExceptionStorage.maxSize = 0; + _firclsContext.readonly->logging.customExceptionStorage.restrictBySize = false; + _firclsContext.readonly->logging.customExceptionStorage.maxEntries = + initData.maxCustomExceptions; + _firclsContext.readonly->logging.customExceptionStorage.entryCount = + &_firclsContext.writable->exception.customExceptionCount; + + _firclsContext.readonly->logging.userKVStorage.maxCount = initData.maxKeyValues; + _firclsContext.readonly->logging.userKVStorage.incrementalPath = + FIRCLSContextAppendToRoot(rootPath, FIRCLSReportUserIncrementalKVFile); + _firclsContext.readonly->logging.userKVStorage.compactedPath = + FIRCLSContextAppendToRoot(rootPath, FIRCLSReportUserCompactedKVFile); + + _firclsContext.readonly->logging.internalKVStorage.maxCount = 32; // Hardcode = bad + _firclsContext.readonly->logging.internalKVStorage.incrementalPath = + FIRCLSContextAppendToRoot(rootPath, FIRCLSReportInternalIncrementalKVFile); + _firclsContext.readonly->logging.internalKVStorage.compactedPath = + FIRCLSContextAppendToRoot(rootPath, FIRCLSReportInternalCompactedKVFile); + + FIRCLSUserLoggingInit(&_firclsContext.readonly->logging, &_firclsContext.writable->logging); + }); + + dispatch_group_async(group, queue, ^{ + _firclsContext.readonly->binaryimage.path = + FIRCLSContextAppendToRoot(rootPath, FIRCLSReportBinaryImageFile); + + FIRCLSBinaryImageInit(); + }); + + dispatch_group_async(group, queue, ^{ + NSString* rootPath = initData.previouslyCrashedFileRootPath; + NSString* fileName = [NSString stringWithUTF8String:FIRCLSCrashedMarkerFileName]; + _firclsContext.readonly->previouslyCrashedFileFullPath = + FIRCLSContextAppendToRoot(rootPath, fileName); + }); + + // To initialize Crashlytics handlers even if the Xcode debugger is attached, replace this check + // with YES. Note that this is only possible to do on an actual device as it will cause the + // simulator to crash. + if (!_firclsContext.readonly->debuggerAttached) { +#if CLS_SIGNAL_SUPPORTED + dispatch_group_async(group, queue, ^{ + _firclsContext.readonly->signal.path = + FIRCLSContextAppendToRoot(rootPath, FIRCLSReportSignalFile); + + FIRCLSSignalInitialize(&_firclsContext.readonly->signal); + }); +#endif + +#if CLS_MACH_EXCEPTION_SUPPORTED + dispatch_group_async(group, queue, ^{ + _firclsContext.readonly->machException.path = + FIRCLSContextAppendToRoot(rootPath, FIRCLSReportMachExceptionFile); + + FIRCLSMachExceptionInit(&_firclsContext.readonly->machException); + }); +#endif + + dispatch_group_async(group, queue, ^{ + _firclsContext.readonly->exception.path = + FIRCLSContextAppendToRoot(rootPath, FIRCLSReportExceptionFile); + _firclsContext.readonly->exception.maxCustomExceptions = + initData.customExceptionsEnabled ? initData.maxCustomExceptions : 0; + + FIRCLSExceptionInitialize(&_firclsContext.readonly->exception, + &_firclsContext.writable->exception); + }); + } else { + FIRCLSSDKLog("Debugger present - not installing handlers\n"); + } + + dispatch_group_async(group, queue, ^{ + if (!FIRCLSContextRecordMetadata(rootPath, initData)) { + FIRCLSSDKLog("Unable to record context metadata\n"); + } + }); + + // At this point we need to do two things. First, we need to do our memory protection *only* after + // all of these initialization steps are really done. But, we also want to wait as long as + // possible for these to be complete. If we do not, there's a chance that we will not be able to + // correctly report a crash shortly after start. + + // Note at this will retain the group, so its totally fine to release the group here. + dispatch_group_notify(group, queue, ^{ + _firclsContext.readonly->initialized = true; + __sync_synchronize(); + + if (!FIRCLSAllocatorProtect(_firclsContext.allocator)) { + FIRCLSSDKLog("Error: Memory protection failed\n"); + } + [initPromise fulfill:nil]; + }); + + return initPromise; +} + +void FIRCLSContextBaseInit(void) { + NSString* sdkBundleID = FIRCLSApplicationGetSDKBundleID(); + + NSString* loggingQueueName = [sdkBundleID stringByAppendingString:@".logging"]; + NSString* binaryImagesQueueName = [sdkBundleID stringByAppendingString:@".binary-images"]; + NSString* exceptionQueueName = [sdkBundleID stringByAppendingString:@".exception"]; + + _firclsLoggingQueue = dispatch_queue_create([loggingQueueName UTF8String], DISPATCH_QUEUE_SERIAL); + _firclsBinaryImageQueue = + dispatch_queue_create([binaryImagesQueueName UTF8String], DISPATCH_QUEUE_SERIAL); + _firclsExceptionQueue = + dispatch_queue_create([exceptionQueueName UTF8String], DISPATCH_QUEUE_SERIAL); + + FIRCLSContextAllocate(&_firclsContext); + + _firclsContext.writable->internalLogging.logFd = -1; + _firclsContext.writable->internalLogging.logLevel = FIRCLSInternalLogLevelDebug; + _firclsContext.writable->crashOccurred = false; + + _firclsContext.readonly->initialized = false; + + __sync_synchronize(); +} + +static void FIRCLSContextAllocate(FIRCLSContext* context) { + // create the allocator, and the contexts + // The ordering here is really important, because the "stack" variable must be + // page-aligned. There's no mechanism to ask the allocator to do alignment, but we + // do know the very first allocation in a region is aligned to a page boundary. + + context->allocator = FIRCLSAllocatorCreate(CLS_MINIMUM_READWRITE_SIZE, CLS_MINIMUM_READABLE_SIZE); + + context->readonly = + FIRCLSAllocatorSafeAllocate(context->allocator, sizeof(FIRCLSReadOnlyContext), CLS_READONLY); + memset(context->readonly, 0, sizeof(FIRCLSReadOnlyContext)); + +#if CLS_MEMORY_PROTECTION_ENABLED +#if CLS_MACH_EXCEPTION_SUPPORTED + context->readonly->machStack = FIRCLSAllocatorSafeAllocate( + context->allocator, CLS_MACH_EXCEPTION_HANDLER_STACK_SIZE, CLS_READWRITE); +#endif +#if CLS_USE_SIGALTSTACK + context->readonly->signalStack = + FIRCLSAllocatorSafeAllocate(context->allocator, CLS_SIGNAL_HANDLER_STACK_SIZE, CLS_READWRITE); +#endif +#else +#if CLS_MACH_EXCEPTION_SUPPORTED + context->readonly->machStack = valloc(CLS_MACH_EXCEPTION_HANDLER_STACK_SIZE); +#endif +#if CLS_USE_SIGALTSTACK + context->readonly->signalStack = valloc(CLS_SIGNAL_HANDLER_STACK_SIZE); +#endif +#endif + +#if CLS_MACH_EXCEPTION_SUPPORTED + memset(_firclsContext.readonly->machStack, 0, CLS_MACH_EXCEPTION_HANDLER_STACK_SIZE); +#endif +#if CLS_USE_SIGALTSTACK + memset(_firclsContext.readonly->signalStack, 0, CLS_SIGNAL_HANDLER_STACK_SIZE); +#endif + + context->writable = FIRCLSAllocatorSafeAllocate(context->allocator, + sizeof(FIRCLSReadWriteContext), CLS_READWRITE); + memset(context->writable, 0, sizeof(FIRCLSReadWriteContext)); +} + +void FIRCLSContextBaseDeinit(void) { + _firclsContext.readonly->initialized = false; + + FIRCLSAllocatorDestroy(_firclsContext.allocator); +} + +bool FIRCLSContextIsInitialized(void) { + __sync_synchronize(); + if (!FIRCLSIsValidPointer(_firclsContext.readonly)) { + return false; + } + + return _firclsContext.readonly->initialized; +} + +bool FIRCLSContextHasCrashed(void) { + if (!FIRCLSContextIsInitialized()) { + return false; + } + + // we've already run a full barrier above, so this read is ok + return _firclsContext.writable->crashOccurred; +} + +void FIRCLSContextMarkHasCrashed(void) { + if (!FIRCLSContextIsInitialized()) { + return; + } + + _firclsContext.writable->crashOccurred = true; + __sync_synchronize(); +} + +bool FIRCLSContextMarkAndCheckIfCrashed(void) { + if (!FIRCLSContextIsInitialized()) { + return false; + } + + if (_firclsContext.writable->crashOccurred) { + return true; + } + + _firclsContext.writable->crashOccurred = true; + __sync_synchronize(); + + return false; +} + +static const char* FIRCLSContextAppendToRoot(NSString* root, NSString* component) { + return FIRCLSDupString( + [[root stringByAppendingPathComponent:component] fileSystemRepresentation]); +} + +static bool FIRCLSContextRecordIdentity(FIRCLSFile* file, + const char* sessionId, + const char* betaToken, + const char* appQualitySessionId) { + FIRCLSFileWriteSectionStart(file, "identity"); + + FIRCLSFileWriteHashStart(file); + + FIRCLSFileWriteHashEntryString(file, "generator", FIRCLSSDKGeneratorName().UTF8String); + FIRCLSFileWriteHashEntryString(file, "display_version", FIRCLSSDKVersion().UTF8String); + FIRCLSFileWriteHashEntryString(file, "build_version", FIRCLSSDKVersion().UTF8String); + FIRCLSFileWriteHashEntryUint64(file, "started_at", time(NULL)); + + FIRCLSFileWriteHashEntryString(file, "session_id", sessionId); + FIRCLSFileWriteHashEntryString(file, "app_quality_session_id", appQualitySessionId); + + // install_id is written into the proto directly. This is only left here to + // support Apple Report Converter. + FIRCLSFileWriteHashEntryString(file, "install_id", ""); + FIRCLSFileWriteHashEntryString(file, "beta_token", betaToken); + FIRCLSFileWriteHashEntryBoolean(file, "absolute_log_timestamps", true); + + FIRCLSFileWriteHashEnd(file); + FIRCLSFileWriteSectionEnd(file); + + return true; +} + +static bool FIRCLSContextRecordApplication(FIRCLSFile* file, const char* customBundleId) { + FIRCLSFileWriteSectionStart(file, "application"); + + FIRCLSFileWriteHashStart(file); + + FIRCLSFileWriteHashEntryString(file, "bundle_id", + [FIRCLSApplicationGetBundleIdentifier() UTF8String]); + FIRCLSFileWriteHashEntryString(file, "custom_bundle_id", customBundleId); + FIRCLSFileWriteHashEntryString(file, "build_version", + [FIRCLSApplicationGetBundleVersion() UTF8String]); + FIRCLSFileWriteHashEntryString(file, "display_version", + [FIRCLSApplicationGetShortBundleVersion() UTF8String]); + FIRCLSFileWriteHashEntryString(file, "extension_id", + [FIRCLSApplicationExtensionPointIdentifier() UTF8String]); + + FIRCLSFileWriteHashEnd(file); + FIRCLSFileWriteSectionEnd(file); + + return true; +} + +bool FIRCLSContextRecordMetadata(NSString* rootPath, const FIRCLSContextInitData* initData) { + const char* sessionId = [[initData sessionId] UTF8String]; + const char* betaToken = [[initData betaToken] UTF8String]; + const char* customBundleId = [[initData customBundleId] UTF8String]; + const char* appQualitySessionId = [[initData appQualitySessionId] UTF8String]; + const char* path = + [[rootPath stringByAppendingPathComponent:FIRCLSReportMetadataFile] fileSystemRepresentation]; + if (!FIRCLSUnlinkIfExists(path)) { + FIRCLSSDKLog("Unable to unlink existing metadata file %s\n", strerror(errno)); + } + + FIRCLSFile file; + + if (!FIRCLSFileInitWithPath(&file, path, false)) { + FIRCLSSDKLog("Unable to open metadata file %s\n", strerror(errno)); + return false; + } + + if (!FIRCLSContextRecordIdentity(&file, sessionId, betaToken, appQualitySessionId)) { + FIRCLSSDKLog("Unable to write out identity metadata\n"); + } + + if (!FIRCLSHostRecord(&file)) { + FIRCLSSDKLog("Unable to write out host metadata\n"); + } + + if (!FIRCLSContextRecordApplication(&file, customBundleId)) { + FIRCLSSDKLog("Unable to write out application metadata\n"); + } + + if (!FIRCLSBinaryImageRecordMainExecutable(&file)) { + FIRCLSSDKLog("Unable to write out executable metadata\n"); + } + + FIRCLSFileClose(&file); + + return true; +} diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Components/FIRCLSCrashedMarkerFile.c b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Components/FIRCLSCrashedMarkerFile.c new file mode 100644 index 0000000..5227278 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Components/FIRCLSCrashedMarkerFile.c @@ -0,0 +1,31 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "Crashlytics/Crashlytics/Components/FIRCLSCrashedMarkerFile.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSFile.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSUtility.h" + +const char *FIRCLSCrashedMarkerFileName = "previously-crashed"; + +void FIRCLSCreateCrashedMarkerFile(void) { + FIRCLSFile file; + + if (!FIRCLSFileInitWithPath(&file, _firclsContext.readonly->previouslyCrashedFileFullPath, false)) { + FIRCLSSDKLog("Unable to create the crashed marker file\n"); + return; + } + + FIRCLSFileClose(&file); + FIRCLSSDKLog("Created the crashed marker file\n"); +} diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Components/FIRCLSCrashedMarkerFile.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Components/FIRCLSCrashedMarkerFile.h new file mode 100644 index 0000000..ccf4276 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Components/FIRCLSCrashedMarkerFile.h @@ -0,0 +1,19 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include + +extern const char *FIRCLSCrashedMarkerFileName; + +void FIRCLSCreateCrashedMarkerFile(void); diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Components/FIRCLSGlobals.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Components/FIRCLSGlobals.h new file mode 100644 index 0000000..10173ed --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Components/FIRCLSGlobals.h @@ -0,0 +1,28 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "Crashlytics/Crashlytics/Components/FIRCLSContext.h" + +__BEGIN_DECLS + +extern FIRCLSContext _firclsContext; +extern dispatch_queue_t _firclsLoggingQueue; +extern dispatch_queue_t _firclsBinaryImageQueue; +extern dispatch_queue_t _firclsExceptionQueue; + +#define FIRCLSGetLoggingQueue() (_firclsLoggingQueue) +#define FIRCLSGetBinaryImageQueue() (_firclsBinaryImageQueue) +#define FIRCLSGetExceptionQueue() (_firclsExceptionQueue) + +__END_DECLS diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Components/FIRCLSHost.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Components/FIRCLSHost.h new file mode 100644 index 0000000..7142352 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Components/FIRCLSHost.h @@ -0,0 +1,39 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once + +#include +#include + +#include "Crashlytics/Crashlytics/Helpers/FIRCLSFile.h" + +typedef struct { + const char *documentDirectoryPath; + vm_size_t pageSize; +} FIRCLSHostReadOnlyContext; + +__BEGIN_DECLS + +void FIRCLSHostInitialize(FIRCLSHostReadOnlyContext *roContext); + +vm_size_t FIRCLSHostGetPageSize(void); + +bool FIRCLSHostRecord(FIRCLSFile *file); + +void FIRCLSHostWriteDiskUsage(FIRCLSFile *file); + +bool FIRCLSHostIsRosettaTranslated(void); + +__END_DECLS diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Components/FIRCLSHost.m b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Components/FIRCLSHost.m new file mode 100644 index 0000000..c1f41a0 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Components/FIRCLSHost.m @@ -0,0 +1,195 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "Crashlytics/Crashlytics/Components/FIRCLSHost.h" + +#include +#include + +#import "Crashlytics/Crashlytics/Components/FIRCLSApplication.h" +#include "Crashlytics/Crashlytics/Components/FIRCLSGlobals.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSDefines.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSFile.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSUtility.h" +#import "Crashlytics/Shared/FIRCLSFABHost.h" + +#if TARGET_OS_IPHONE +#import +#else +#import +#endif + +#define CLS_HOST_SYSCTL_BUFFER_SIZE (128) +#define CLS_MAX_ARM64_NATIVE_PAGE_SIZE (1024 * 16) + +#if CLS_CPU_ARM64 +#define CLS_MAX_NATIVE_PAGE_SIZE CLS_MAX_ARM64_NATIVE_PAGE_SIZE +#else +// return 4K, which is correct for all platforms except arm64, currently +#define CLS_MAX_NATIVE_PAGE_SIZE (1024 * 4) +#endif +#define CLS_MIN_NATIVE_PAGE_SIZE (1024 * 4) + +#pragma mark Prototypes +static void FIRCLSHostWriteSysctlEntry( + FIRCLSFile* file, const char* key, const char* sysctlKey, void* buffer, size_t bufferSize); +static void FIRCLSHostWriteModelInfo(FIRCLSFile* file); +static void FIRCLSHostWriteOSVersionInfo(FIRCLSFile* file); + +#pragma mark - API +void FIRCLSHostInitialize(FIRCLSHostReadOnlyContext* roContext) { + _firclsContext.readonly->host.pageSize = FIRCLSHostGetPageSize(); + _firclsContext.readonly->host.documentDirectoryPath = NULL; + + // determine where the document directory is mounted, so we can get file system statistics later + NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); + if ([paths count]) { + _firclsContext.readonly->host.documentDirectoryPath = + FIRCLSDupString([[paths objectAtIndex:0] fileSystemRepresentation]); + } +} + +vm_size_t FIRCLSHostGetPageSize(void) { + size_t size; + int pageSize; + + // hw.pagesize is defined as HW_PAGESIZE, which is an int. It's important to match + // these types. Turns out that sysctl will not init the data to zero, but it appears + // that sysctlbyname does. This API is nicer, but that's important to keep in mind. + + int maxNativePageSize = CLS_MAX_NATIVE_PAGE_SIZE; + + // On Apple Silicon, we need to use the arm64 page size + // even if we're in x86 land. + if (FIRCLSHostIsRosettaTranslated()) { + FIRCLSSDKLog("Running under Rosetta 2 emulation. Using the arm64 page size.\n"); + + maxNativePageSize = CLS_MAX_ARM64_NATIVE_PAGE_SIZE; + } + + pageSize = 0; + size = sizeof(pageSize); + if (sysctlbyname("hw.pagesize", &pageSize, &size, NULL, 0) != 0) { + FIRCLSSDKLog("sysctlbyname failed while trying to get hw.pagesize\n"); + + return maxNativePageSize; + } + + // if the returned size is not the expected value, abort + if (size != sizeof(pageSize)) { + return maxNativePageSize; + } + + // put in some guards to make sure our size is reasonable + if (pageSize > maxNativePageSize) { + return maxNativePageSize; + } + + if (pageSize < CLS_MIN_NATIVE_PAGE_SIZE) { + return CLS_MIN_NATIVE_PAGE_SIZE; + } + + return pageSize; +} + +// This comes from the Apple documentation here: +// https://developer.apple.com/documentation/apple_silicon/about_the_rosetta_translation_environment +bool FIRCLSHostIsRosettaTranslated(void) { +#if TARGET_OS_MAC + int result = 0; + size_t size = sizeof(result); + if (sysctlbyname("sysctl.proc_translated", &result, &size, NULL, 0) == -1) { + // If we get an error, or 0, we're going to treat this as x86_64 macOS native + if (errno == ENOENT) { + return false; + } + // This is the error case + FIRCLSSDKLog("sysctlbyname failed while trying to get sysctl.proc_translated for Rosetta 2 " + "translation\n"); + return false; + } + return result == 1; + +#else + return false; +#endif +} + +static void FIRCLSHostWriteSysctlEntry( + FIRCLSFile* file, const char* key, const char* sysctlKey, void* buffer, size_t bufferSize) { + if (sysctlbyname(sysctlKey, buffer, &bufferSize, NULL, 0) != 0) { + FIRCLSFileWriteHashEntryString(file, key, "(failed)"); + return; + } + + FIRCLSFileWriteHashEntryString(file, key, buffer); +} + +static void FIRCLSHostWriteModelInfo(FIRCLSFile* file) { + FIRCLSFileWriteHashEntryString(file, "model", [FIRCLSHostModelInfo() UTF8String]); + + // allocate a static buffer for the sysctl values, which are typically + // quite short + char buffer[CLS_HOST_SYSCTL_BUFFER_SIZE]; + +#if TARGET_OS_EMBEDDED + FIRCLSHostWriteSysctlEntry(file, "machine", "hw.model", buffer, CLS_HOST_SYSCTL_BUFFER_SIZE); +#else + FIRCLSHostWriteSysctlEntry(file, "machine", "hw.machine", buffer, CLS_HOST_SYSCTL_BUFFER_SIZE); + FIRCLSHostWriteSysctlEntry(file, "cpu", "machdep.cpu.brand_string", buffer, + CLS_HOST_SYSCTL_BUFFER_SIZE); +#endif +} + +static void FIRCLSHostWriteOSVersionInfo(FIRCLSFile* file) { + FIRCLSFileWriteHashEntryString(file, "os_build_version", [FIRCLSHostOSBuildVersion() UTF8String]); + FIRCLSFileWriteHashEntryString(file, "os_display_version", + [FIRCLSHostOSDisplayVersion() UTF8String]); + FIRCLSFileWriteHashEntryString(file, "platform", [FIRCLSApplicationGetPlatform() UTF8String]); + FIRCLSFileWriteHashEntryString(file, "firebase_platform", + [FIRCLSApplicationGetFirebasePlatform() UTF8String]); +} + +bool FIRCLSHostRecord(FIRCLSFile* file) { + FIRCLSFileWriteSectionStart(file, "host"); + + FIRCLSFileWriteHashStart(file); + + FIRCLSHostWriteModelInfo(file); + FIRCLSHostWriteOSVersionInfo(file); + FIRCLSFileWriteHashEntryString(file, "locale", + [[[NSLocale currentLocale] localeIdentifier] UTF8String]); + + FIRCLSFileWriteHashEnd(file); + + FIRCLSFileWriteSectionEnd(file); + + return true; +} + +void FIRCLSHostWriteDiskUsage(FIRCLSFile* file) { + FIRCLSFileWriteSectionStart(file, "storage"); + + FIRCLSFileWriteHashStart(file); + + // Due to Apple Privacy Manifests, Crashlytics is not collecting + // disk space using statfs. When we find a solution, we can update + // this to actually track disk space correctly. + FIRCLSFileWriteHashEntryUint64(file, "free", 0); + FIRCLSFileWriteHashEntryUint64(file, "total", 0); + + FIRCLSFileWriteHashEnd(file); + + FIRCLSFileWriteSectionEnd(file); +} diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Components/FIRCLSProcess.c b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Components/FIRCLSProcess.c new file mode 100644 index 0000000..89d6e28 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Components/FIRCLSProcess.c @@ -0,0 +1,840 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "Crashlytics/Crashlytics/Components/FIRCLSProcess.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSDefines.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSFeatures.h" +#include "Crashlytics/Crashlytics/Components/FIRCLSGlobals.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSThreadState.h" +#include "Crashlytics/Crashlytics/Unwind/FIRCLSUnwind.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSUtility.h" + +#include +#include +#include +#include + +#define THREAD_NAME_BUFFER_SIZE (64) + +#pragma mark Prototypes +static bool FIRCLSProcessGetThreadName(FIRCLSProcess *process, + thread_t thread, + char *buffer, + size_t length); +static const char *FIRCLSProcessGetThreadDispatchQueueName(FIRCLSProcess *process, thread_t thread); + +#pragma mark - API +bool FIRCLSProcessInit(FIRCLSProcess *process, thread_t crashedThread, void *uapVoid) { + if (!process) { + return false; + } + + process->task = mach_task_self(); + process->thisThread = mach_thread_self(); + process->crashedThread = crashedThread; + process->uapVoid = uapVoid; + + if (task_threads(process->task, &process->threads, &process->threadCount) != KERN_SUCCESS) { + // failed to get all threads + process->threadCount = 0; + FIRCLSSDKLog("Error: unable to get task threads\n"); + + return false; + } + + return true; +} + +// https://developer.apple.com/library/mac/#qa/qa2004/qa1361.html +bool FIRCLSProcessDebuggerAttached(void) { + int junk; + int mib[4]; + struct kinfo_proc info; + size_t size; + + // Initialize the flags so that, if sysctl fails for some bizarre + // reason, we get a predictable result. + info.kp_proc.p_flag = 0; + + // Initialize mib, which tells sysctl the info we want, in this case + // we're looking for information about a specific process ID. + mib[0] = CTL_KERN; + mib[1] = KERN_PROC; + mib[2] = KERN_PROC_PID; + mib[3] = getpid(); + + // Call sysctl. + size = sizeof(info); + junk = sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, NULL, 0); + if (junk != 0) { + FIRCLSSDKLog("sysctl failed while trying to get kinfo_proc\n"); + return false; + } + + // We're being debugged if the P_TRACED flag is set. + return (info.kp_proc.p_flag & P_TRACED) != 0; +} + +#pragma mark - Thread Support +static bool FIRCLSProcessIsCurrentThread(FIRCLSProcess *process, thread_t thread) { + return MACH_PORT_INDEX(process->thisThread) == MACH_PORT_INDEX(thread); +} + +static bool FIRCLSProcessIsCrashedThread(FIRCLSProcess *process, thread_t thread) { + return MACH_PORT_INDEX(process->crashedThread) == MACH_PORT_INDEX(thread); +} + +static uint32_t FIRCLSProcessGetThreadCount(FIRCLSProcess *process) { + return process->threadCount; +} + +static thread_t FIRCLSProcessGetThread(FIRCLSProcess *process, uint32_t index) { + if (index >= process->threadCount) { + return MACH_PORT_NULL; + } + + return process->threads[index]; +} + +bool FIRCLSProcessSuspendAllOtherThreads(FIRCLSProcess *process) { + mach_msg_type_number_t i; + bool success; + + success = true; + for (i = 0; i < process->threadCount; ++i) { + thread_t thread; + + thread = FIRCLSProcessGetThread(process, i); + + if (FIRCLSProcessIsCurrentThread(process, thread)) { + continue; + } + + // FIXME: workaround to get this building on watch, but we need to suspend/resume threads! +#if CLS_CAN_SUSPEND_THREADS + success = success && (thread_suspend(thread) == KERN_SUCCESS); +#endif + } + + return success; +} + +bool FIRCLSProcessResumeAllOtherThreads(FIRCLSProcess *process) { + mach_msg_type_number_t i; + bool success; + + success = true; + for (i = 0; i < process->threadCount; ++i) { + thread_t thread; + + thread = FIRCLSProcessGetThread(process, i); + + if (FIRCLSProcessIsCurrentThread(process, thread)) { + continue; + } + + // FIXME: workaround to get this building on watch, but we need to suspend/resume threads! +#if CLS_CAN_SUSPEND_THREADS + success = success && (thread_resume(thread) == KERN_SUCCESS); +#endif + } + + return success; +} + +#pragma mark - Thread Properties +void *FIRCLSThreadGetCurrentPC(void) { + return __builtin_return_address(0); +} + +static bool FIRCLSProcessGetThreadState(FIRCLSProcess *process, + thread_t thread, + FIRCLSThreadContext *context) { + if (!FIRCLSIsValidPointer(context)) { + FIRCLSSDKLogError("Invalid context supplied\n"); + return false; + } + + // If the thread context we should use is non-NULL, then just assign it here. Otherwise, + // query the thread state + if (FIRCLSProcessIsCrashedThread(process, thread) && FIRCLSIsValidPointer(process->uapVoid)) { + *context = *((_STRUCT_UCONTEXT *)process->uapVoid)->uc_mcontext; + return true; + } + + // Here's a wild trick: emulate what thread_get_state would do. It appears that + // we cannot reliably unwind out of thread_get_state. So, instead of trying, setup + // a thread context that resembles what the real thing would look like + if (FIRCLSProcessIsCurrentThread(process, thread)) { + FIRCLSSDKLog("Faking current thread\n"); + memset(context, 0, sizeof(FIRCLSThreadContext)); + + // Compute the frame address, and then base the stack value off of that. A frame pushes + // two pointers onto the stack, so we have to offset. + const uintptr_t frameAddress = (uintptr_t)__builtin_frame_address(0); + const uintptr_t stackAddress = FIRCLSUnwindStackPointerFromFramePointer(frameAddress); + +#if CLS_CPU_X86_64 + context->__ss.__rip = (uintptr_t)FIRCLSThreadGetCurrentPC(); + context->__ss.__rbp = frameAddress; + context->__ss.__rsp = stackAddress; +#elif CLS_CPU_I386 + context->__ss.__eip = (uintptr_t)FIRCLSThreadGetCurrentPC(); + context->__ss.__ebp = frameAddress; + context->__ss.__esp = stackAddress; +#elif CLS_CPU_ARM64 + FIRCLSThreadContextSetPC(context, (uintptr_t)FIRCLSThreadGetCurrentPC()); + FIRCLSThreadContextSetFramePointer(context, frameAddress); + FIRCLSThreadContextSetLinkRegister(context, (uintptr_t)__builtin_return_address(0)); + FIRCLSThreadContextSetStackPointer(context, stackAddress); +#elif CLS_CPU_ARM + context->__ss.__pc = (uintptr_t)FIRCLSThreadGetCurrentPC(); + context->__ss.__r[7] = frameAddress; + context->__ss.__lr = (uintptr_t)__builtin_return_address(0); + context->__ss.__sp = stackAddress; +#endif + + return true; + } + +#if !TARGET_OS_WATCH + // try to get the value by querying the thread state + mach_msg_type_number_t stateCount = FIRCLSThreadStateCount; + + // For unknown reasons, thread_get_state returns this value on Rosetta, + // but still succeeds. + const int ROSETTA_SUCCESS = 268435459; + kern_return_t status = thread_get_state(thread, FIRCLSThreadState, (thread_state_t)(&(context->__ss)), + &stateCount); + if (status != KERN_SUCCESS && status != ROSETTA_SUCCESS) { + FIRCLSSDKLogError("Failed to get thread state via thread_get_state for thread: %i\n", thread); + return false; + } + + return true; +#else + return false; +#endif +} + +static bool FIRCLSProcessGetThreadName(FIRCLSProcess *process, + thread_t thread, + char *buffer, + size_t length) { + pthread_t pthread; + + if (!buffer || length <= 0) { + return false; + } + + pthread = pthread_from_mach_thread_np(thread); + + return pthread_getname_np(pthread, buffer, length) == 0; +} + +static const char *FIRCLSProcessGetThreadDispatchQueueName(FIRCLSProcess *process, + thread_t thread) { + thread_identifier_info_data_t info; + mach_msg_type_number_t infoCount; + dispatch_queue_t *queueAddress; + dispatch_queue_t queue; + const char *string; + + infoCount = THREAD_IDENTIFIER_INFO_COUNT; + if (thread_info(thread, THREAD_IDENTIFIER_INFO, (thread_info_t)&info, &infoCount) != + KERN_SUCCESS) { + FIRCLSSDKLog("Unable to get thread info\n"); + return NULL; + } + + queueAddress = (dispatch_queue_t *)info.dispatch_qaddr; + if (queueAddress == NULL) { + return ""; + } + + // Sometimes a queue address is invalid. I cannot explain why this is, but + // it can cause a crash. + if (!FIRCLSReadMemory((vm_address_t)queueAddress, &queue, sizeof(void *))) { + return ""; + } + + // here, we know it is safe to de-reference this address, so attempt to get the queue name + if (!queue) { + return ""; + } + + string = dispatch_queue_get_label(queue); + + // but, we still don't if the entire string is valid, so check that too + if (!FIRCLSReadString((vm_address_t)string, (char **)&string, 128)) { + return ""; + } + + return string; +} + +#pragma mark - Data Recording +static bool FIRCLSProcessRecordThreadRegisters(FIRCLSThreadContext context, FIRCLSFile *file) { +#if CLS_CPU_ARM + FIRCLSFileWriteHashEntryUint64(file, "r0", context.__ss.__r[0]); + FIRCLSFileWriteHashEntryUint64(file, "r1", context.__ss.__r[1]); + FIRCLSFileWriteHashEntryUint64(file, "r2", context.__ss.__r[2]); + FIRCLSFileWriteHashEntryUint64(file, "r3", context.__ss.__r[3]); + FIRCLSFileWriteHashEntryUint64(file, "r4", context.__ss.__r[4]); + FIRCLSFileWriteHashEntryUint64(file, "r5", context.__ss.__r[5]); + FIRCLSFileWriteHashEntryUint64(file, "r6", context.__ss.__r[6]); + FIRCLSFileWriteHashEntryUint64(file, "r7", context.__ss.__r[7]); + FIRCLSFileWriteHashEntryUint64(file, "r8", context.__ss.__r[8]); + FIRCLSFileWriteHashEntryUint64(file, "r9", context.__ss.__r[9]); + FIRCLSFileWriteHashEntryUint64(file, "r10", context.__ss.__r[10]); + FIRCLSFileWriteHashEntryUint64(file, "r11", context.__ss.__r[11]); + FIRCLSFileWriteHashEntryUint64(file, "ip", context.__ss.__r[12]); + FIRCLSFileWriteHashEntryUint64(file, "sp", context.__ss.__sp); + FIRCLSFileWriteHashEntryUint64(file, "lr", context.__ss.__lr); + FIRCLSFileWriteHashEntryUint64(file, "pc", context.__ss.__pc); + FIRCLSFileWriteHashEntryUint64(file, "cpsr", context.__ss.__cpsr); +#elif CLS_CPU_ARM64 + FIRCLSFileWriteHashEntryUint64(file, "x0", context.__ss.__x[0]); + FIRCLSFileWriteHashEntryUint64(file, "x1", context.__ss.__x[1]); + FIRCLSFileWriteHashEntryUint64(file, "x2", context.__ss.__x[2]); + FIRCLSFileWriteHashEntryUint64(file, "x3", context.__ss.__x[3]); + FIRCLSFileWriteHashEntryUint64(file, "x4", context.__ss.__x[4]); + FIRCLSFileWriteHashEntryUint64(file, "x5", context.__ss.__x[5]); + FIRCLSFileWriteHashEntryUint64(file, "x6", context.__ss.__x[6]); + FIRCLSFileWriteHashEntryUint64(file, "x7", context.__ss.__x[7]); + FIRCLSFileWriteHashEntryUint64(file, "x8", context.__ss.__x[8]); + FIRCLSFileWriteHashEntryUint64(file, "x9", context.__ss.__x[9]); + FIRCLSFileWriteHashEntryUint64(file, "x10", context.__ss.__x[10]); + FIRCLSFileWriteHashEntryUint64(file, "x11", context.__ss.__x[11]); + FIRCLSFileWriteHashEntryUint64(file, "x12", context.__ss.__x[12]); + FIRCLSFileWriteHashEntryUint64(file, "x13", context.__ss.__x[13]); + FIRCLSFileWriteHashEntryUint64(file, "x14", context.__ss.__x[14]); + FIRCLSFileWriteHashEntryUint64(file, "x15", context.__ss.__x[15]); + FIRCLSFileWriteHashEntryUint64(file, "x16", context.__ss.__x[16]); + FIRCLSFileWriteHashEntryUint64(file, "x17", context.__ss.__x[17]); + FIRCLSFileWriteHashEntryUint64(file, "x18", context.__ss.__x[18]); + FIRCLSFileWriteHashEntryUint64(file, "x19", context.__ss.__x[19]); + FIRCLSFileWriteHashEntryUint64(file, "x20", context.__ss.__x[20]); + FIRCLSFileWriteHashEntryUint64(file, "x21", context.__ss.__x[21]); + FIRCLSFileWriteHashEntryUint64(file, "x22", context.__ss.__x[22]); + FIRCLSFileWriteHashEntryUint64(file, "x23", context.__ss.__x[23]); + FIRCLSFileWriteHashEntryUint64(file, "x24", context.__ss.__x[24]); + FIRCLSFileWriteHashEntryUint64(file, "x25", context.__ss.__x[25]); + FIRCLSFileWriteHashEntryUint64(file, "x26", context.__ss.__x[26]); + FIRCLSFileWriteHashEntryUint64(file, "x27", context.__ss.__x[27]); + FIRCLSFileWriteHashEntryUint64(file, "x28", context.__ss.__x[28]); + FIRCLSFileWriteHashEntryUint64(file, "fp", FIRCLSThreadContextGetFramePointer(&context)); + FIRCLSFileWriteHashEntryUint64(file, "sp", FIRCLSThreadContextGetStackPointer(&context)); + FIRCLSFileWriteHashEntryUint64(file, "lr", FIRCLSThreadContextGetLinkRegister(&context)); + FIRCLSFileWriteHashEntryUint64(file, "pc", FIRCLSThreadContextGetPC(&context)); + FIRCLSFileWriteHashEntryUint64(file, "cpsr", context.__ss.__cpsr); +#elif CLS_CPU_I386 + FIRCLSFileWriteHashEntryUint64(file, "eax", context.__ss.__eax); + FIRCLSFileWriteHashEntryUint64(file, "ebx", context.__ss.__ebx); + FIRCLSFileWriteHashEntryUint64(file, "ecx", context.__ss.__ecx); + FIRCLSFileWriteHashEntryUint64(file, "edx", context.__ss.__edx); + FIRCLSFileWriteHashEntryUint64(file, "edi", context.__ss.__edi); + FIRCLSFileWriteHashEntryUint64(file, "esi", context.__ss.__esi); + FIRCLSFileWriteHashEntryUint64(file, "ebp", context.__ss.__ebp); + FIRCLSFileWriteHashEntryUint64(file, "esp", context.__ss.__esp); + FIRCLSFileWriteHashEntryUint64(file, "ss", context.__ss.__ss); + FIRCLSFileWriteHashEntryUint64(file, "eflags", context.__ss.__eflags); + FIRCLSFileWriteHashEntryUint64(file, "eip", context.__ss.__eip); + FIRCLSFileWriteHashEntryUint64(file, "cs", context.__ss.__cs); + FIRCLSFileWriteHashEntryUint64(file, "ds", context.__ss.__ds); + FIRCLSFileWriteHashEntryUint64(file, "es", context.__ss.__es); + FIRCLSFileWriteHashEntryUint64(file, "fs", context.__ss.__fs); + FIRCLSFileWriteHashEntryUint64(file, "gs", context.__ss.__gs); + + // how do we get the cr2 register? +#elif CLS_CPU_X86_64 + FIRCLSFileWriteHashEntryUint64(file, "rax", context.__ss.__rax); + FIRCLSFileWriteHashEntryUint64(file, "rbx", context.__ss.__rbx); + FIRCLSFileWriteHashEntryUint64(file, "rcx", context.__ss.__rcx); + FIRCLSFileWriteHashEntryUint64(file, "rdx", context.__ss.__rdx); + FIRCLSFileWriteHashEntryUint64(file, "rdi", context.__ss.__rdi); + FIRCLSFileWriteHashEntryUint64(file, "rsi", context.__ss.__rsi); + FIRCLSFileWriteHashEntryUint64(file, "rbp", context.__ss.__rbp); + FIRCLSFileWriteHashEntryUint64(file, "rsp", context.__ss.__rsp); + FIRCLSFileWriteHashEntryUint64(file, "r8", context.__ss.__r8); + FIRCLSFileWriteHashEntryUint64(file, "r9", context.__ss.__r9); + FIRCLSFileWriteHashEntryUint64(file, "r10", context.__ss.__r10); + FIRCLSFileWriteHashEntryUint64(file, "r11", context.__ss.__r11); + FIRCLSFileWriteHashEntryUint64(file, "r12", context.__ss.__r12); + FIRCLSFileWriteHashEntryUint64(file, "r13", context.__ss.__r13); + FIRCLSFileWriteHashEntryUint64(file, "r14", context.__ss.__r14); + FIRCLSFileWriteHashEntryUint64(file, "r15", context.__ss.__r15); + FIRCLSFileWriteHashEntryUint64(file, "rip", context.__ss.__rip); + FIRCLSFileWriteHashEntryUint64(file, "rflags", context.__ss.__rflags); + FIRCLSFileWriteHashEntryUint64(file, "cs", context.__ss.__cs); + FIRCLSFileWriteHashEntryUint64(file, "fs", context.__ss.__fs); + FIRCLSFileWriteHashEntryUint64(file, "gs", context.__ss.__gs); +#endif + + return true; +} + +static bool FIRCLSProcessRecordThread(FIRCLSProcess *process, thread_t thread, FIRCLSFile *file) { + FIRCLSUnwindContext unwindContext; + FIRCLSThreadContext context; + + if (!FIRCLSProcessGetThreadState(process, thread, &context)) { + FIRCLSSDKLogError("Unable to get thread state\n"); + return false; + } + + if (!FIRCLSUnwindInit(&unwindContext, context)) { + FIRCLSSDKLog("Unable to init unwind context\n"); + + return false; + } + + FIRCLSFileWriteHashStart(file); + + // registers + FIRCLSFileWriteHashKey(file, "registers"); + FIRCLSFileWriteHashStart(file); + + FIRCLSProcessRecordThreadRegisters(context, file); + + FIRCLSFileWriteHashEnd(file); + + // stacktrace + FIRCLSFileWriteHashKey(file, "stacktrace"); + + // stacktrace is an array of integers + FIRCLSFileWriteArrayStart(file); + + uint32_t repeatedPCCount = 0; + uint64_t repeatedPC = 0; + const FIRCLSInternalLogLevel level = _firclsContext.writable->internalLogging.logLevel; + + while (FIRCLSUnwindNextFrame(&unwindContext)) { + const uintptr_t pc = FIRCLSUnwindGetPC(&unwindContext); + const uint32_t frameCount = FIRCLSUnwindGetFrameRepeatCount(&unwindContext); + + if (repeatedPC == pc && repeatedPC != 0) { + // actively counting a recursion + repeatedPCCount = frameCount; + continue; + } + + if (frameCount >= FIRCLSUnwindInfiniteRecursionCountThreshold && repeatedPC == 0) { + repeatedPC = pc; + FIRCLSSDKLogWarn("Possible infinite recursion - suppressing logging\n"); + _firclsContext.writable->internalLogging.logLevel = FIRCLSInternalLogLevelWarn; + continue; + } + + if (repeatedPC != 0) { + // at this point, we've recorded a repeated PC, but it is now no longer + // repeating, so we can restore the logging + _firclsContext.writable->internalLogging.logLevel = level; + } + + FIRCLSFileWriteArrayEntryUint64(file, pc); + } + + FIRCLSFileWriteArrayEnd(file); + + // crashed? + if (FIRCLSProcessIsCrashedThread(process, thread)) { + FIRCLSFileWriteHashEntryBoolean(file, "crashed", true); + } + + if (repeatedPC != 0) { + FIRCLSFileWriteHashEntryUint64(file, "repeated_pc", repeatedPC); + FIRCLSFileWriteHashEntryUint64(file, "repeat_count", repeatedPCCount); + } + + // Just for extra safety, restore the logging level again. The logic + // above is fairly tricky, this is cheap, and no logging is a real pain. + _firclsContext.writable->internalLogging.logLevel = level; + + // end thread info + FIRCLSFileWriteHashEnd(file); + + return true; +} + +bool FIRCLSProcessRecordAllThreads(FIRCLSProcess *process, FIRCLSFile *file) { + uint32_t threadCount; + uint32_t i; + + threadCount = FIRCLSProcessGetThreadCount(process); + + FIRCLSFileWriteSectionStart(file, "threads"); + + FIRCLSFileWriteArrayStart(file); + + for (i = 0; i < threadCount; ++i) { + thread_t thread; + + thread = FIRCLSProcessGetThread(process, i); + + FIRCLSSDKLogInfo("recording thread %d data\n", i); + if (!FIRCLSProcessRecordThread(process, thread, file)) { + FIRCLSSDKLogError("Failed to record thread state. Closing threads JSON to prevent malformed crash report.\n"); + + FIRCLSFileWriteArrayEnd(file); + + FIRCLSFileWriteSectionEnd(file); + return false; + } + } + + FIRCLSFileWriteArrayEnd(file); + + FIRCLSFileWriteSectionEnd(file); + + FIRCLSSDKLogInfo("Completed recording all thread data\n"); + + return true; +} + +void FIRCLSProcessRecordThreadNames(FIRCLSProcess *process, FIRCLSFile *file) { + uint32_t threadCount; + uint32_t i; + + FIRCLSFileWriteSectionStart(file, "thread_names"); + + FIRCLSFileWriteArrayStart(file); + + threadCount = FIRCLSProcessGetThreadCount(process); + for (i = 0; i < threadCount; ++i) { + thread_t thread; + char name[THREAD_NAME_BUFFER_SIZE]; + + thread = FIRCLSProcessGetThread(process, i); + + name[0] = 0; // null-terminate, just in case nothing is written + + FIRCLSProcessGetThreadName(process, thread, name, THREAD_NAME_BUFFER_SIZE); + + FIRCLSFileWriteArrayEntryString(file, name); + } + + FIRCLSFileWriteArrayEnd(file); + FIRCLSFileWriteSectionEnd(file); +} + +void FIRCLSProcessRecordDispatchQueueNames(FIRCLSProcess *process, FIRCLSFile *file) { + uint32_t threadCount; + uint32_t i; + + FIRCLSFileWriteSectionStart(file, "dispatch_queue_names"); + + FIRCLSFileWriteArrayStart(file); + + threadCount = FIRCLSProcessGetThreadCount(process); + for (i = 0; i < threadCount; ++i) { + thread_t thread; + const char *name; + + thread = FIRCLSProcessGetThread(process, i); + + name = FIRCLSProcessGetThreadDispatchQueueName(process, thread); + + // Apple Report Converter will fail to parse this when "name" is null, + // so we will use an empty string instead. + if (name == NULL) { + name = ""; + } + FIRCLSFileWriteArrayEntryString(file, name); + } + + FIRCLSFileWriteArrayEnd(file); + FIRCLSFileWriteSectionEnd(file); +} + +#pragma mark - Other Process Info +bool FIRCLSProcessGetMemoryUsage(uint64_t *active, + uint64_t *inactive, + uint64_t *wired, + uint64_t *freeMem) { + mach_port_t hostPort; + mach_msg_type_number_t hostSize; + vm_size_t pageSize; + vm_statistics_data_t vmStat; + + hostPort = mach_host_self(); + + hostSize = sizeof(vm_statistics_data_t) / sizeof(integer_t); + + pageSize = _firclsContext.readonly->host.pageSize; + + if (host_statistics(hostPort, HOST_VM_INFO, (host_info_t)&vmStat, &hostSize) != KERN_SUCCESS) { + FIRCLSSDKLog("Failed to get vm statistics\n"); + return false; + } + + if (!(active && inactive && wired && freeMem)) { + FIRCLSSDKLog("Invalid pointers\n"); + return false; + } + + // compute the sizes in bytes and return the values + *active = vmStat.active_count * pageSize; + *inactive = vmStat.inactive_count * pageSize; + *wired = vmStat.wire_count * pageSize; + *freeMem = vmStat.free_count * pageSize; + + return true; +} + +bool FIRCLSProcessGetInfo(FIRCLSProcess *process, + uint64_t *virtualSize, + uint64_t *residentSize, + time_value_t *userTime, + time_value_t *systemTime) { + struct task_basic_info_64 taskInfo; + mach_msg_type_number_t count; + + count = TASK_BASIC_INFO_64_COUNT; + if (task_info(process->task, TASK_BASIC_INFO_64, (task_info_t)&taskInfo, &count) != + KERN_SUCCESS) { + FIRCLSSDKLog("Failed to get task info\n"); + return false; + } + + if (!(virtualSize && residentSize && userTime && systemTime)) { + FIRCLSSDKLog("Invalid pointers\n"); + return false; + } + + *virtualSize = taskInfo.virtual_size; + *residentSize = taskInfo.resident_size; + *userTime = taskInfo.user_time; + *systemTime = taskInfo.system_time; + + return true; +} + +void FIRCLSProcessRecordStats(FIRCLSProcess *process, FIRCLSFile *file) { + uint64_t active; + uint64_t inactive; + uint64_t virtualSize; + uint64_t residentSize; + uint64_t wired; + uint64_t freeMem; + time_value_t userTime; + time_value_t systemTime; + + if (!FIRCLSProcessGetMemoryUsage(&active, &inactive, &wired, &freeMem)) { + FIRCLSSDKLog("Unable to get process memory usage\n"); + return; + } + + if (!FIRCLSProcessGetInfo(process, &virtualSize, &residentSize, &userTime, &systemTime)) { + FIRCLSSDKLog("Unable to get process stats\n"); + return; + } + + FIRCLSFileWriteSectionStart(file, "process_stats"); + + FIRCLSFileWriteHashStart(file); + + FIRCLSFileWriteHashEntryUint64(file, "active", active); + FIRCLSFileWriteHashEntryUint64(file, "inactive", inactive); + FIRCLSFileWriteHashEntryUint64(file, "wired", wired); + FIRCLSFileWriteHashEntryUint64(file, "freeMem", freeMem); // Intentionally left in, for now. Arg. + FIRCLSFileWriteHashEntryUint64(file, "free_mem", freeMem); + FIRCLSFileWriteHashEntryUint64(file, "virtual", virtualSize); + FIRCLSFileWriteHashEntryUint64(file, "resident", active); + FIRCLSFileWriteHashEntryUint64(file, "user_time", + (userTime.seconds * 1000 * 1000) + userTime.microseconds); + FIRCLSFileWriteHashEntryUint64(file, "sys_time", + (systemTime.seconds * 1000 * 1000) + systemTime.microseconds); + + FIRCLSFileWriteHashEnd(file); + + FIRCLSFileWriteSectionEnd(file); +} + +#pragma mark - Runtime Info +#define OBJC_MSG_SEND_START ((vm_address_t)objc_msgSend) +#define OBJC_MSG_SEND_SUPER_START ((vm_address_t)objc_msgSendSuper) +#define OBJC_MSG_SEND_END (OBJC_MSG_SEND_START + 66) +#define OBJC_MSG_SEND_SUPER_END (OBJC_MSG_SEND_SUPER_START + 66) + +#if !CLS_CPU_ARM64 +#define OBJC_MSG_SEND_STRET_START ((vm_address_t)objc_msgSend_stret) +#define OBJC_MSG_SEND_SUPER_STRET_START ((vm_address_t)objc_msgSendSuper_stret) +#define OBJC_MSG_SEND_STRET_END (OBJC_MSG_SEND_STRET_START + 66) +#define OBJC_MSG_SEND_SUPER_STRET_END (OBJC_MSG_SEND_SUPER_STRET_START + 66) +#endif + +#if CLS_CPU_X86 +#define OBJC_MSG_SEND_FPRET_START ((vm_address_t)objc_msgSend_fpret) +#define OBJC_MSG_SEND_FPRET_END (OBJC_MSG_SEND_FPRET_START + 66) +#endif + +static const char *FIRCLSProcessGetObjCSelectorName(FIRCLSThreadContext registers) { + void *selectorAddress; + void *selRegister; +#if !CLS_CPU_ARM64 + void *stretSelRegister; +#endif + vm_address_t pc; + + // First, did we crash in objc_msgSend? The two ways I can think + // of doing this are to use dladdr, and then comparing the strings to + // objc_msg*, or looking up the symbols, and guessing if we are "close enough". + + selectorAddress = NULL; + +#if CLS_CPU_ARM + pc = registers.__ss.__pc; + selRegister = (void *)registers.__ss.__r[1]; + stretSelRegister = (void *)registers.__ss.__r[2]; +#elif CLS_CPU_ARM64 + pc = FIRCLSThreadContextGetPC(®isters); + selRegister = (void *)registers.__ss.__x[1]; +#elif CLS_CPU_I386 + pc = registers.__ss.__eip; + selRegister = (void *)registers.__ss.__ecx; + stretSelRegister = (void *)registers.__ss.__ecx; +#elif CLS_CPU_X86_64 + pc = registers.__ss.__rip; + selRegister = (void *)registers.__ss.__rsi; + stretSelRegister = (void *)registers.__ss.__rdx; +#endif + + if ((pc >= OBJC_MSG_SEND_START) && (pc <= OBJC_MSG_SEND_END)) { + selectorAddress = selRegister; + } + +#if !CLS_CPU_ARM64 + if ((pc >= OBJC_MSG_SEND_SUPER_START) && (pc <= OBJC_MSG_SEND_SUPER_END)) { + selectorAddress = selRegister; + } + + if ((pc >= OBJC_MSG_SEND_STRET_START) && (pc <= OBJC_MSG_SEND_STRET_END)) { + selectorAddress = stretSelRegister; + } + + if ((pc >= OBJC_MSG_SEND_SUPER_STRET_START) && (pc <= OBJC_MSG_SEND_SUPER_STRET_END)) { + selectorAddress = stretSelRegister; + } + +#if CLS_CPU_X86 + if ((pc >= OBJC_MSG_SEND_FPRET_START) && (pc <= OBJC_MSG_SEND_FPRET_END)) { + selectorAddress = selRegister; + } +#endif +#endif + + if (!selectorAddress) { + return ""; + } + + if (!FIRCLSReadString((vm_address_t)selectorAddress, (char **)&selectorAddress, 128)) { + FIRCLSSDKLog("Unable to read the selector string\n"); + return ""; + } + + return selectorAddress; +} + +#define CRASH_ALIGN __attribute__((aligned(8))) +typedef struct { + unsigned version CRASH_ALIGN; + const char *message CRASH_ALIGN; + const char *signature CRASH_ALIGN; + const char *backtrace CRASH_ALIGN; + const char *message2 CRASH_ALIGN; + void *reserved CRASH_ALIGN; + void *reserved2 CRASH_ALIGN; +} crash_info_t; + +static void FIRCLSProcessRecordCrashInfo(FIRCLSFile *file) { + // TODO: this should be abstracted into binary images, if possible + FIRCLSBinaryImageRuntimeNode *nodes = _firclsContext.writable->binaryImage.nodes; + if (!nodes) { + FIRCLSSDKLogError("The node structure is NULL\n"); + return; + } + + for (uint32_t i = 0; i < CLS_BINARY_IMAGE_RUNTIME_NODE_COUNT; ++i) { + FIRCLSBinaryImageRuntimeNode *node = &nodes[i]; + + if (!node->crashInfo) { + continue; + } + + crash_info_t info; + + if (!FIRCLSReadMemory((vm_address_t)node->crashInfo, &info, sizeof(crash_info_t))) { + continue; + } + + FIRCLSSDKLogDebug("Found crash info with version %d\n", info.version); + + // Currently support versions 0 through 5. + // 4 was in use for a long time, but it appears that with iOS 9 / swift 2.0, the version has + // been bumped. + if (info.version > 5) { + continue; + } + + if (!info.message) { + continue; + } + +#if CLS_BINARY_IMAGE_RUNTIME_NODE_RECORD_NAME + FIRCLSSDKLogInfo("Found crash info for %s\n", node->name); +#endif + + FIRCLSSDKLogDebug("attempting to read crash info string\n"); + + char *string = NULL; + + if (!FIRCLSReadString((vm_address_t)info.message, &string, 256)) { + FIRCLSSDKLogError("Failed to copy crash info string\n"); + continue; + } + + // The crash_info_t's message may contain the device's UDID, in this case, + // make sure that we do our best to redact that information before writing the + // rest of the message to disk. This also has the effect of not uploading that + // information in the subsequent crash report. + FIRCLSRedactUUID(string); + + FIRCLSFileWriteArrayEntryHexEncodedString(file, string); + } +} + +void FIRCLSProcessRecordRuntimeInfo(FIRCLSProcess *process, FIRCLSFile *file) { + FIRCLSThreadContext mcontext; + + if (!FIRCLSProcessGetThreadState(process, process->crashedThread, &mcontext)) { + FIRCLSSDKLogError("unable to get crashed thread state"); + } + + FIRCLSFileWriteSectionStart(file, "runtime"); + + FIRCLSFileWriteHashStart(file); + + FIRCLSFileWriteHashEntryString(file, "objc_selector", FIRCLSProcessGetObjCSelectorName(mcontext)); + + FIRCLSFileWriteHashKey(file, "crash_info_entries"); + + FIRCLSFileWriteArrayStart(file); + FIRCLSProcessRecordCrashInfo(file); + FIRCLSFileWriteArrayEnd(file); + + FIRCLSFileWriteHashEnd(file); + + FIRCLSFileWriteSectionEnd(file); +} diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Components/FIRCLSProcess.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Components/FIRCLSProcess.h new file mode 100644 index 0000000..165f0c8 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Components/FIRCLSProcess.h @@ -0,0 +1,44 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once + +#include +#include + +#include "Crashlytics/Crashlytics/Helpers/FIRCLSFile.h" + +typedef struct { + // task info + mach_port_t task; + + // thread stuff + thread_t thisThread; + thread_t crashedThread; + thread_act_array_t threads; + mach_msg_type_number_t threadCount; + void *uapVoid; // current thread state +} FIRCLSProcess; + +bool FIRCLSProcessInit(FIRCLSProcess *process, thread_t crashedThread, void *uapVoid); +bool FIRCLSProcessDebuggerAttached(void); + +bool FIRCLSProcessSuspendAllOtherThreads(FIRCLSProcess *process); +bool FIRCLSProcessResumeAllOtherThreads(FIRCLSProcess *process); + +void FIRCLSProcessRecordThreadNames(FIRCLSProcess *process, FIRCLSFile *file); +void FIRCLSProcessRecordDispatchQueueNames(FIRCLSProcess *process, FIRCLSFile *file); +bool FIRCLSProcessRecordAllThreads(FIRCLSProcess *process, FIRCLSFile *file); +void FIRCLSProcessRecordStats(FIRCLSProcess *process, FIRCLSFile *file); +void FIRCLSProcessRecordRuntimeInfo(FIRCLSProcess *process, FIRCLSFile *file); diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Components/FIRCLSUserLogging.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Components/FIRCLSUserLogging.h new file mode 100644 index 0000000..0b2aa39 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Components/FIRCLSUserLogging.h @@ -0,0 +1,115 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once + +#include "Crashlytics/Crashlytics/Helpers/FIRCLSFile.h" + +__BEGIN_DECLS + +#ifdef __OBJC__ +extern NSString* const FIRCLSStartTimeKey; +extern NSString* const FIRCLSFirstRunloopTurnTimeKey; +extern NSString* const FIRCLSInBackgroundKey; +#if TARGET_OS_IPHONE +extern NSString* const FIRCLSDeviceOrientationKey; +extern NSString* const FIRCLSUIOrientationKey; +#endif +extern NSString* const FIRCLSUserIdentifierKey; +extern NSString* const FIRCLSUserNameKey; +extern NSString* const FIRCLSUserEmailKey; +extern NSString* const FIRCLSDevelopmentPlatformNameKey; +extern NSString* const FIRCLSDevelopmentPlatformVersionKey; +extern NSString* const FIRCLSOnDemandRecordedExceptionsKey; +extern NSString* const FIRCLSOnDemandDroppedExceptionsKey; +#endif + +extern const uint32_t FIRCLSUserLoggingMaxKVEntries; + +typedef struct { + const char* incrementalPath; + const char* compactedPath; + + uint32_t maxIncrementalCount; + uint32_t maxCount; +} FIRCLSUserLoggingKVStorage; + +typedef struct { + const char* aPath; + const char* bPath; + uint32_t maxSize; + uint32_t maxEntries; + bool restrictBySize; + uint32_t* entryCount; +} FIRCLSUserLoggingABStorage; + +typedef struct { + FIRCLSUserLoggingKVStorage userKVStorage; + FIRCLSUserLoggingKVStorage internalKVStorage; + + FIRCLSUserLoggingABStorage logStorage; + FIRCLSUserLoggingABStorage errorStorage; + FIRCLSUserLoggingABStorage customExceptionStorage; +} FIRCLSUserLoggingReadOnlyContext; + +typedef struct { + const char* activeUserLogPath; + const char* activeErrorLogPath; + const char* activeCustomExceptionPath; + uint32_t userKVCount; + uint32_t internalKVCount; + uint32_t errorsCount; +} FIRCLSUserLoggingWritableContext; + +void FIRCLSUserLoggingInit(FIRCLSUserLoggingReadOnlyContext* roContext, + FIRCLSUserLoggingWritableContext* rwContext); + +#ifdef __OBJC__ +void FIRCLSUserLoggingRecordUserKeyValue(NSString* key, id value); +void FIRCLSUserLoggingRecordUserKeysAndValues(NSDictionary* keysAndValues); +void FIRCLSUserLoggingRecordInternalKeyValue(NSString* key, id value); +void FIRCLSUserLoggingWriteInternalKeyValue(NSString* key, NSString* value); + +void FIRCLSUserLoggingRecordError(NSError* error, + NSDictionary* additionalUserInfo, + NSString* rolloutsInfoJSON); + +NSDictionary* FIRCLSUserLoggingGetCompactedKVEntries(FIRCLSUserLoggingKVStorage* storage, + bool decodeHex); +void FIRCLSUserLoggingCompactKVEntries(FIRCLSUserLoggingKVStorage* storage); + +void FIRCLSUserLoggingRecordKeyValue(NSString* key, + id value, + FIRCLSUserLoggingKVStorage* storage, + uint32_t* counter); + +void FIRCLSUserLoggingRecordKeysAndValues(NSDictionary* keysAndValues, + FIRCLSUserLoggingKVStorage* storage, + uint32_t* counter); + +void FIRCLSUserLoggingWriteAndCheckABFiles(FIRCLSUserLoggingABStorage* storage, + const char** activePath, + void (^openedFileBlock)(FIRCLSFile* file)); + +NSArray* FIRCLSUserLoggingStoredKeyValues(const char* path); + +OBJC_EXTERN void FIRCLSLog(NSString* format, ...) NS_FORMAT_FUNCTION(1, 2); +OBJC_EXTERN void FIRCLSLogToStorage(FIRCLSUserLoggingABStorage* storage, + const char** activePath, + NSString* format, + ...) NS_FORMAT_FUNCTION(3, 4); + +#endif + +__END_DECLS diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Components/FIRCLSUserLogging.m b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Components/FIRCLSUserLogging.m new file mode 100644 index 0000000..4da93b4 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Components/FIRCLSUserLogging.m @@ -0,0 +1,612 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "Crashlytics/Crashlytics/Components/FIRCLSUserLogging.h" + +#include + +#include "Crashlytics/Crashlytics/Components/FIRCLSGlobals.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSUtility.h" + +#import "Crashlytics/Crashlytics/Controllers/FIRCLSReportManager_Private.h" + +NSString *const FIRCLSStartTimeKey = @"com.crashlytics.kit-start-time"; +NSString *const FIRCLSFirstRunloopTurnTimeKey = @"com.crashlytics.first-run-loop-time"; +NSString *const FIRCLSInBackgroundKey = @"com.crashlytics.in-background"; +#if TARGET_OS_IPHONE +NSString *const FIRCLSDeviceOrientationKey = @"com.crashlytics.device-orientation"; +NSString *const FIRCLSUIOrientationKey = @"com.crashlytics.ui-orientation"; +#endif +NSString *const FIRCLSUserIdentifierKey = @"com.crashlytics.user-id"; +NSString *const FIRCLSDevelopmentPlatformNameKey = @"com.crashlytics.development-platform-name"; +NSString *const FIRCLSDevelopmentPlatformVersionKey = + @"com.crashlytics.development-platform-version"; +NSString *const FIRCLSOnDemandRecordedExceptionsKey = + @"com.crashlytics.on-demand.recorded-exceptions"; +NSString *const FIRCLSOnDemandDroppedExceptionsKey = + @"com.crashlytics.on-demand.dropped-exceptions"; + +// Empty string object synchronized on to prevent a race condition when accessing AB file path +NSString *const FIRCLSSynchronizedPathKey = @""; + +const uint32_t FIRCLSUserLoggingMaxKVEntries = 64; + +#pragma mark - Prototypes +static void FIRCLSUserLoggingWriteKeysAndValues(NSDictionary *keysAndValues, + FIRCLSUserLoggingKVStorage *storage, + uint32_t *counter, + BOOL containsNullValue); +static void FIRCLSUserLoggingCheckAndSwapABFiles(FIRCLSUserLoggingABStorage *storage, + const char **activePath, + off_t fileSize); +void FIRCLSLogInternal(FIRCLSUserLoggingABStorage *storage, + const char **activePath, + NSString *message); + +#pragma mark - Setup +void FIRCLSUserLoggingInit(FIRCLSUserLoggingReadOnlyContext *roContext, + FIRCLSUserLoggingWritableContext *rwContext) { + rwContext->activeUserLogPath = roContext->logStorage.aPath; + rwContext->activeErrorLogPath = roContext->errorStorage.aPath; + rwContext->activeCustomExceptionPath = roContext->customExceptionStorage.aPath; + + rwContext->userKVCount = 0; + rwContext->internalKVCount = 0; + rwContext->errorsCount = 0; + + roContext->userKVStorage.maxIncrementalCount = FIRCLSUserLoggingMaxKVEntries; + roContext->internalKVStorage.maxIncrementalCount = roContext->userKVStorage.maxIncrementalCount; +} + +#pragma mark - KV Logging +void FIRCLSUserLoggingRecordInternalKeyValue(NSString *key, id value) { + FIRCLSUserLoggingRecordKeyValue(key, value, &_firclsContext.readonly->logging.internalKVStorage, + &_firclsContext.writable->logging.internalKVCount); +} + +void FIRCLSUserLoggingWriteInternalKeyValue(NSString *key, NSString *value) { + // Unsynchronized - must be run on the correct queue + NSDictionary *keysAndValues = key ? @{key : value ?: [NSNull null]} : nil; + FIRCLSUserLoggingWriteKeysAndValues(keysAndValues, + &_firclsContext.readonly->logging.internalKVStorage, + &_firclsContext.writable->logging.internalKVCount, NO); +} + +void FIRCLSUserLoggingRecordUserKeyValue(NSString *key, id value) { + FIRCLSUserLoggingRecordKeyValue(key, value, &_firclsContext.readonly->logging.userKVStorage, + &_firclsContext.writable->logging.userKVCount); +} + +void FIRCLSUserLoggingRecordUserKeysAndValues(NSDictionary *keysAndValues) { + FIRCLSUserLoggingRecordKeysAndValues(keysAndValues, + &_firclsContext.readonly->logging.userKVStorage, + &_firclsContext.writable->logging.userKVCount); +} + +static id FIRCLSUserLoggingGetComponent(NSDictionary *entry, + NSString *componentName, + bool decodeHex) { + id value = [entry objectForKey:componentName]; + + return (decodeHex && value != [NSNull null]) ? FIRCLSFileHexDecodeString([value UTF8String]) + : value; +} + +static NSString *FIRCLSUserLoggingGetKey(NSDictionary *entry, bool decodeHex) { + return FIRCLSUserLoggingGetComponent(entry, @"key", decodeHex); +} + +static id FIRCLSUserLoggingGetValue(NSDictionary *entry, bool decodeHex) { + return FIRCLSUserLoggingGetComponent(entry, @"value", decodeHex); +} + +NSDictionary *FIRCLSUserLoggingGetCompactedKVEntries(FIRCLSUserLoggingKVStorage *storage, + bool decodeHex) { + if (!FIRCLSIsValidPointer(storage)) { + FIRCLSSDKLogError("storage invalid\n"); + return nil; + } + + NSArray *incrementalKVs = FIRCLSUserLoggingStoredKeyValues(storage->incrementalPath); + NSArray *compactedKVs = FIRCLSUserLoggingStoredKeyValues(storage->compactedPath); + + NSMutableDictionary *finalKVSet = [NSMutableDictionary new]; + + // These should all be unique, so there might be a more efficient way to + // do this + for (NSDictionary *entry in compactedKVs) { + NSString *key = FIRCLSUserLoggingGetKey(entry, decodeHex); + NSString *value = FIRCLSUserLoggingGetValue(entry, decodeHex); + + if (!key || !value) { + FIRCLSSDKLogError("compacted key/value contains a nil and must be dropped\n"); + continue; + } + + [finalKVSet setObject:value forKey:key]; + } + + // Now, assign the incremental values, in file order, so we overwrite any older values. + for (NSDictionary *entry in incrementalKVs) { + NSString *key = FIRCLSUserLoggingGetKey(entry, decodeHex); + NSString *value = FIRCLSUserLoggingGetValue(entry, decodeHex); + + if (!key || !value) { + FIRCLSSDKLogError("incremental key/value contains a nil and must be dropped\n"); + continue; + } + + if ([value isEqual:[NSNull null]]) { + [finalKVSet removeObjectForKey:key]; + } else { + [finalKVSet setObject:value forKey:key]; + } + } + + return finalKVSet; +} + +static void FIRCLSUserLoggingWriteKVEntriesToFile( + NSDictionary *keysAndValues, BOOL shouldHexEncode, FIRCLSFile *file) { + for (NSString *key in keysAndValues) { + NSString *valueObject = [keysAndValues objectForKey:key]; + + // map `NSNull` into nil + const char *value = (valueObject == (NSString *)[NSNull null] ? nil : [valueObject UTF8String]); + + FIRCLSFileWriteSectionStart(file, "kv"); + FIRCLSFileWriteHashStart(file); + + if (shouldHexEncode) { + FIRCLSFileWriteHashEntryHexEncodedString(file, "key", [key UTF8String]); + FIRCLSFileWriteHashEntryHexEncodedString(file, "value", value); + } else { + FIRCLSFileWriteHashEntryString(file, "key", [key UTF8String]); + FIRCLSFileWriteHashEntryString(file, "value", value); + } + + FIRCLSFileWriteHashEnd(file); + FIRCLSFileWriteSectionEnd(file); + } +} + +void FIRCLSUserLoggingCompactKVEntries(FIRCLSUserLoggingKVStorage *storage) { + if (!FIRCLSIsValidPointer(storage)) { + FIRCLSSDKLogError("Error: storage invalid\n"); + return; + } + + NSDictionary *finalKVs = FIRCLSUserLoggingGetCompactedKVEntries(storage, false); + + if (unlink(storage->compactedPath) != 0) { + FIRCLSSDKLog("Error: Unable to remove compacted KV store before compaction %s\n", + strerror(errno)); + } + + FIRCLSFile file; + + if (!FIRCLSFileInitWithPath(&file, storage->compactedPath, true)) { + FIRCLSSDKLog("Error: Unable to open compacted k-v file\n"); + return; + } + + uint32_t maxCount = storage->maxCount; + if ([finalKVs count] > maxCount) { + // We need to remove keys, to avoid going over the max. + // This is just about the worst way to go about doing this. There are lots of smarter ways, + // but it's very uncommon to go down this path. + NSArray *keys = [finalKVs allKeys]; + + FIRCLSSDKLogInfo("Truncating %d keys from KV set, which is above max %d\n", + (uint32_t)(finalKVs.count - maxCount), maxCount); + + finalKVs = + [finalKVs dictionaryWithValuesForKeys:[keys subarrayWithRange:NSMakeRange(0, maxCount)]]; + } + + FIRCLSUserLoggingWriteKVEntriesToFile(finalKVs, false, &file); + FIRCLSFileClose(&file); + + if (unlink(storage->incrementalPath) != 0) { + FIRCLSSDKLog("Error: Unable to remove incremental KV store after compaction %s\n", + strerror(errno)); + } +} + +void FIRCLSUserLoggingRecordKeyValue(NSString *key, + id value, + FIRCLSUserLoggingKVStorage *storage, + uint32_t *counter) { + if (!FIRCLSIsValidPointer(key)) { + FIRCLSSDKLogWarn("User provided bad key\n"); + return; + } + + NSDictionary *keysAndValues = @{key : (value ?: [NSNull null])}; + FIRCLSUserLoggingRecordKeysAndValues(keysAndValues, storage, counter); +} + +void FIRCLSUserLoggingRecordKeysAndValues(NSDictionary *keysAndValues, + FIRCLSUserLoggingKVStorage *storage, + uint32_t *counter) { + if (!FIRCLSContextIsInitialized()) { + return; + } + + if (keysAndValues.count == 0) { + FIRCLSSDKLogWarn("User provided empty key/value dictionary\n"); + return; + } + + if (!FIRCLSIsValidPointer(keysAndValues)) { + FIRCLSSDKLogWarn("User provided bad key/value dictionary\n"); + return; + } + + NSMutableDictionary *sanitizedKeysAndValues = [keysAndValues mutableCopy]; + BOOL containsNullValue = NO; + + for (NSString *key in keysAndValues) { + if (!FIRCLSIsValidPointer(key)) { + FIRCLSSDKLogWarn("User provided bad key\n"); + return; + } + + id value = keysAndValues[key]; + + // ensure that any invalid pointer is actually set to nil + if (!FIRCLSIsValidPointer(value) && value != nil) { + FIRCLSSDKLogWarn("Bad value pointer being clamped to nil\n"); + sanitizedKeysAndValues[key] = [NSNull null]; + } + + if ([value respondsToSelector:@selector(description)] && ![value isEqual:[NSNull null]]) { + sanitizedKeysAndValues[key] = [value description]; + } else { + // passing nil will result in a JSON null being written, which is deserialized as [NSNull + // null], signaling to remove the key during compaction + sanitizedKeysAndValues[key] = [NSNull null]; + containsNullValue = YES; + } + } + + dispatch_sync(FIRCLSGetLoggingQueue(), ^{ + FIRCLSUserLoggingWriteKeysAndValues(sanitizedKeysAndValues, storage, counter, + containsNullValue); + }); +} + +static void FIRCLSUserLoggingWriteKeysAndValues(NSDictionary *keysAndValues, + FIRCLSUserLoggingKVStorage *storage, + uint32_t *counter, + BOOL containsNullValue) { + FIRCLSFile file; + + if (!FIRCLSIsValidPointer(storage) || !FIRCLSIsValidPointer(counter)) { + FIRCLSSDKLogError("Bad parameters\n"); + return; + } + + if (!FIRCLSFileInitWithPath(&file, storage->incrementalPath, true)) { + FIRCLSSDKLogError("Unable to open k-v file\n"); + return; + } + + FIRCLSUserLoggingWriteKVEntriesToFile(keysAndValues, true, &file); + FIRCLSFileClose(&file); + + *counter += keysAndValues.count; + if (*counter >= storage->maxIncrementalCount || containsNullValue) { + dispatch_async(FIRCLSGetLoggingQueue(), ^{ + FIRCLSUserLoggingCompactKVEntries(storage); + *counter = 0; + }); + } +} + +NSArray *FIRCLSUserLoggingStoredKeyValues(const char *path) { + if (!FIRCLSContextIsInitialized()) { + return nil; + } + + return FIRCLSFileReadSections(path, true, ^NSObject *(id obj) { + return [obj objectForKey:@"kv"]; + }); +} + +#pragma mark - NSError Logging +static void FIRCLSUserLoggingRecordErrorUserInfo(FIRCLSFile *file, + const char *fileKey, + NSDictionary *userInfo) { + if ([userInfo count] == 0) { + return; + } + + FIRCLSFileWriteHashKey(file, fileKey); + FIRCLSFileWriteArrayStart(file); + + for (id key in userInfo) { + id value = [userInfo objectForKey:key]; + if (![value respondsToSelector:@selector(description)]) { + continue; + } + + FIRCLSFileWriteArrayStart(file); + FIRCLSFileWriteArrayEntryHexEncodedString(file, [key UTF8String]); + FIRCLSFileWriteArrayEntryHexEncodedString(file, [[value description] UTF8String]); + FIRCLSFileWriteArrayEnd(file); + } + + FIRCLSFileWriteArrayEnd(file); +} + +static void FIRCLSUserLoggingWriteError(FIRCLSFile *file, + NSError *error, + NSDictionary *additionalUserInfo, + NSArray *addresses, + uint64_t timestamp, + NSString *rolloutsInfoJSON) { + FIRCLSFileWriteSectionStart(file, "error"); + FIRCLSFileWriteHashStart(file); + FIRCLSFileWriteHashEntryHexEncodedString(file, "domain", [[error domain] UTF8String]); + FIRCLSFileWriteHashEntryInt64(file, "code", [error code]); + FIRCLSFileWriteHashEntryUint64(file, "time", timestamp); + + // addresses + FIRCLSFileWriteHashKey(file, "stacktrace"); + FIRCLSFileWriteArrayStart(file); + for (NSNumber *address in addresses) { + FIRCLSFileWriteArrayEntryUint64(file, [address unsignedLongLongValue]); + } + FIRCLSFileWriteArrayEnd(file); + + // user-info + FIRCLSUserLoggingRecordErrorUserInfo(file, "info", [error userInfo]); + FIRCLSUserLoggingRecordErrorUserInfo(file, "extra_info", additionalUserInfo); + + // rollouts + if (rolloutsInfoJSON) { + FIRCLSFileWriteHashKey(file, "rollouts"); + FIRCLSFileWriteStringUnquoted(file, [rolloutsInfoJSON UTF8String]); + FIRCLSFileWriteHashEnd(file); + } + + FIRCLSFileWriteHashEnd(file); + FIRCLSFileWriteSectionEnd(file); +} + +void FIRCLSUserLoggingRecordError(NSError *error, + NSDictionary *additionalUserInfo, + NSString *rolloutsInfoJSON) { + if (!error) { + return; + } + + if (!FIRCLSContextIsInitialized()) { + return; + } + + // record the stacktrace and timestamp here, so we + // are as close as possible to the user's log statement + NSArray *addresses = [NSThread callStackReturnAddresses]; + uint64_t timestamp = time(NULL); + + FIRCLSUserLoggingWriteAndCheckABFiles( + &_firclsContext.readonly->logging.errorStorage, + &_firclsContext.writable->logging.activeErrorLogPath, ^(FIRCLSFile *file) { + FIRCLSUserLoggingWriteError(file, error, additionalUserInfo, addresses, timestamp, + rolloutsInfoJSON); + }); +} + +#pragma mark - CLSLog Support +void FIRCLSLog(NSString *format, ...) { + // If the format is nil do nothing just like NSLog. + if (!format) { + return; + } + + va_list args; + va_start(args, format); + NSString *msg = [[NSString alloc] initWithFormat:format arguments:args]; + va_end(args); + + FIRCLSUserLoggingABStorage *currentStorage = &_firclsContext.readonly->logging.logStorage; + const char **activePath = &_firclsContext.writable->logging.activeUserLogPath; + FIRCLSLogInternal(currentStorage, activePath, msg); +} + +void FIRCLSLogToStorage(FIRCLSUserLoggingABStorage *storage, + const char **activePath, + NSString *format, + ...) { + // If the format is nil do nothing just like NSLog. + if (!format) { + return; + } + + va_list args; + va_start(args, format); + NSString *msg = [[NSString alloc] initWithFormat:format arguments:args]; + va_end(args); + + FIRCLSLogInternal(storage, activePath, msg); +} + +#pragma mark - Properties +uint32_t FIRCLSUserLoggingMaxLogSize(void) { + // don't forget that the message encoding overhead is 2x, and we + // wrap everything in a json structure with time. So, there is + // quite a penalty + + uint32_t size = 1024 * 64; + + return size * 2; +} + +uint32_t FIRCLSUserLoggingMaxErrorSize(void) { + return FIRCLSUserLoggingMaxLogSize(); +} + +#pragma mark - AB Logging +void FIRCLSUserLoggingCheckAndSwapABFiles(FIRCLSUserLoggingABStorage *storage, + const char **activePath, + off_t fileSize) { + if (!activePath || !storage) { + return; + } + + if (!*activePath) { + return; + } + + if (storage->restrictBySize) { + if (fileSize <= storage->maxSize) { + return; + } + } else { + if (!FIRCLSIsValidPointer(storage->entryCount)) { + FIRCLSSDKLogError("Error: storage has invalid pointer, but is restricted by entry count\n"); + return; + } + + if (*storage->entryCount < storage->maxEntries) { + return; + } + + // Here we have rolled over, so we have to reset our counter. + *storage->entryCount = 0; + } + + // if it is too big: + // - reset the other log + // - make it active + const char *otherPath = NULL; + + if (*activePath == storage->aPath) { + otherPath = storage->bPath; + } else { + // take this path if the pointer is invalid as well, to reset + otherPath = storage->aPath; + } + + // guard here against path being nil or empty + NSString *pathString = [NSString stringWithUTF8String:otherPath]; + + if ([pathString length] > 0) { + // ignore the error, because there is nothing we can do to recover here, and its likely + // any failures would be intermittent + + [[NSFileManager defaultManager] removeItemAtPath:pathString error:nil]; + } + + @synchronized(FIRCLSSynchronizedPathKey) { + *activePath = otherPath; + } +} + +void FIRCLSUserLoggingWriteAndCheckABFiles(FIRCLSUserLoggingABStorage *storage, + const char **activePath, + void (^openedFileBlock)(FIRCLSFile *file)) { + if (!storage || !activePath || !openedFileBlock) { + return; + } + + @synchronized(FIRCLSSynchronizedPathKey) { + if (!*activePath) { + return; + } + } + + if (storage->restrictBySize) { + if (storage->maxSize == 0) { + return; + } + } else { + if (storage->maxEntries == 0) { + return; + } + } + + dispatch_sync(FIRCLSGetLoggingQueue(), ^{ + FIRCLSFile file; + + if (!FIRCLSFileInitWithPath(&file, *activePath, true)) { + FIRCLSSDKLog("Unable to open log file\n"); + return; + } + + openedFileBlock(&file); + + off_t fileSize = 0; + FIRCLSFileCloseWithOffset(&file, &fileSize); + + // increment the count before calling FIRCLSUserLoggingCheckAndSwapABFiles, so the value + // reflects the actual amount of stuff written + if (!storage->restrictBySize && FIRCLSIsValidPointer(storage->entryCount)) { + *storage->entryCount += 1; + } + + dispatch_async(FIRCLSGetLoggingQueue(), ^{ + FIRCLSUserLoggingCheckAndSwapABFiles(storage, activePath, fileSize); + }); + }); +} + +void FIRCLSLogInternalWrite(FIRCLSFile *file, NSString *message, uint64_t time) { + FIRCLSFileWriteSectionStart(file, "log"); + FIRCLSFileWriteHashStart(file); + FIRCLSFileWriteHashEntryHexEncodedString(file, "msg", [message UTF8String]); + FIRCLSFileWriteHashEntryUint64(file, "time", time); + FIRCLSFileWriteHashEnd(file); + FIRCLSFileWriteSectionEnd(file); +} + +void FIRCLSLogInternal(FIRCLSUserLoggingABStorage *storage, + const char **activePath, + NSString *message) { + if (!message) { + return; + } + + if (!FIRCLSContextIsInitialized()) { + FIRCLSWarningLog(@"WARNING: FIRCLSLog has been used before (or concurrently with) " + @"Crashlytics initialization and cannot be recorded. The message was: \n%@", + message); + return; + } + struct timeval te; + + NSUInteger messageLength = [message length]; + int maxLogSize = storage->maxSize; + + if (messageLength > maxLogSize) { + FIRCLSWarningLog( + @"WARNING: Attempted to write %zd bytes, but %d is the maximum size of the log. " + @"Truncating to %d bytes.\n", + messageLength, maxLogSize, maxLogSize); + message = [message substringToIndex:maxLogSize]; + } + + // unable to get time - abort + if (gettimeofday(&te, NULL) != 0) { + return; + } + + const uint64_t time = te.tv_sec * 1000LL + te.tv_usec / 1000; + + FIRCLSUserLoggingWriteAndCheckABFiles(storage, activePath, ^(FIRCLSFile *file) { + FIRCLSLogInternalWrite(file, message, time); + }); +} diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSAnalyticsManager.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSAnalyticsManager.h new file mode 100644 index 0000000..dce3eb3 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSAnalyticsManager.h @@ -0,0 +1,53 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +NS_ASSUME_NONNULL_BEGIN + +@class FIRCLSSettings; +@protocol FIRAnalyticsInterop; +@protocol FIRAnalyticsInteropListener; + +/* + * Registers a listener for Analytics events in Crashlytics + * logs (aka. breadcrumbs), and sends events to the + * Analytics SDK for Crash Free Users. + */ +@interface FIRCLSAnalyticsManager : NSObject + +- (instancetype)initWithAnalytics:(nullable id)analytics; +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)new NS_UNAVAILABLE; + +/* + * Starts listening for Analytics events for Breadcrumbs. + */ +- (void)registerAnalyticsListener; + +/* + * Logs a Crashlytics crash session to Firebase Analytics for Crash Free Users. + * @param crashTimeStamp The time stamp of the crash to be logged. + */ ++ (void)logCrashWithTimeStamp:(NSTimeInterval)crashTimeStamp + toAnalytics:(id)analytics; + +/* + * Public for testing. + */ +NSString *FIRCLSFIRAEventDictionaryToJSON(NSDictionary *eventAsDictionary); + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSAnalyticsManager.m b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSAnalyticsManager.m new file mode 100644 index 0000000..3256dda --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSAnalyticsManager.m @@ -0,0 +1,135 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "Crashlytics/Crashlytics/Controllers/FIRCLSAnalyticsManager.h" + +#import "Crashlytics/Crashlytics/Components/FIRCLSUserLogging.h" +#import "Crashlytics/Crashlytics/Helpers/FIRCLSInternalLogging.h" + +#import "Interop/Analytics/Public/FIRAnalyticsInterop.h" +#import "Interop/Analytics/Public/FIRAnalyticsInteropListener.h" + +static NSString *FIRCLSFirebaseAnalyticsEventLogFormat = @"$A$:%@"; + +// Origin for events and user properties generated by Crashlytics. +static NSString *const kFIREventOriginCrash = @"clx"; + +// App exception event name. +static NSString *const kFIREventAppException = @"_ae"; + +// Timestamp key for the event payload. +static NSString *const kFIRParameterTimestamp = @"timestamp"; + +// Fatal key for the event payload. +static NSString *const kFIRParameterFatal = @"fatal"; + +FOUNDATION_STATIC_INLINE NSNumber *timeIntervalInMillis(NSTimeInterval timeInterval) { + return @(llrint(timeInterval * 1000.0)); +} + +@interface FIRCLSAnalyticsManager () + +@property(nonatomic, strong) id analytics; + +@property(nonatomic, assign) BOOL registeredAnalyticsEventListener; + +@end + +@implementation FIRCLSAnalyticsManager + +- (instancetype)initWithAnalytics:(nullable id)analytics { + self = [super init]; + if (!self) { + return nil; + } + + _analytics = analytics; + + return self; +} + +- (void)registerAnalyticsListener { + if (self.registeredAnalyticsEventListener) { + return; + } + + if (self.analytics == nil) { + FIRCLSDeveloperLog(@"Crashlytics:Crash:Reports:Event", + "Firebase Analytics SDK not detected. Crash-free statistics and " + "breadcrumbs will not be reported"); + return; + } + + [self.analytics registerAnalyticsListener:self withOrigin:kFIREventOriginCrash]; + + FIRCLSDeveloperLog(@"Crashlytics:Crash:Reports:Event", + "Registered Firebase Analytics event listener to receive breadcrumb logs"); + + self.registeredAnalyticsEventListener = YES; +} + +- (void)messageTriggered:(NSString *)name parameters:(NSDictionary *)parameters { + NSDictionary *event = @{ + @"name" : name, + @"parameters" : parameters, + }; + NSString *json = FIRCLSFIRAEventDictionaryToJSON(event); + if (json != nil) { + FIRCLSLog(FIRCLSFirebaseAnalyticsEventLogFormat, json); + } +} + ++ (void)logCrashWithTimeStamp:(NSTimeInterval)crashTimeStamp + toAnalytics:(id)analytics { + if (analytics == nil) { + return; + } + + FIRCLSDeveloperLog(@"Crashlytics:Crash:Reports:Event", + "Sending app_exception event to Firebase Analytics for crash-free statistics"); + + NSDictionary *params = @{ + kFIRParameterTimestamp : timeIntervalInMillis(crashTimeStamp), + kFIRParameterFatal : @(INT64_C(1)) + }; + + [analytics logEventWithOrigin:kFIREventOriginCrash name:kFIREventAppException parameters:params]; +} + +NSString *FIRCLSFIRAEventDictionaryToJSON(NSDictionary *eventAsDictionary) { + NSError *error = nil; + + if (eventAsDictionary == nil) { + return nil; + } + + if (![NSJSONSerialization isValidJSONObject:eventAsDictionary]) { + FIRCLSSDKLog("Firebase Analytics event is not valid JSON"); + return nil; + } + + NSData *jsonData = [NSJSONSerialization dataWithJSONObject:eventAsDictionary + options:0 + error:&error]; + + if (error == nil) { + NSString *json = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; + return json; + } else { + FIRCLSSDKLog("Unable to convert Firebase Analytics event to json"); + return nil; + } +} + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSContextManager.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSContextManager.h new file mode 100644 index 0000000..125fc1c --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSContextManager.h @@ -0,0 +1,43 @@ +// +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +#import "Crashlytics/Crashlytics/Models/FIRCLSFileManager.h" +#import "Crashlytics/Crashlytics/Models/FIRCLSInternalReport.h" +#import "Crashlytics/Crashlytics/Models/FIRCLSSettings.h" + +NS_ASSUME_NONNULL_BEGIN + +/// +/// The ContextManager determines when to build the context object, +/// and write its metadata. It was created because the FIRCLSContext +/// is interacted with via functions, which makes it hard to include in tests. +/// In addition, we this class is responsible for re-writing the Metadata object +/// when the App Quality Session ID changes. +/// +@interface FIRCLSContextManager : NSObject + +/// This should be set immediately when the FirebaseSessions SDK generates +/// a new Session ID. +@property(nonatomic, copy) NSString *appQualitySessionId; + +- (FBLPromise *)setupContextWithReport:(FIRCLSInternalReport *)report + settings:(FIRCLSSettings *)settings + fileManager:(FIRCLSFileManager *)fileManager; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSContextManager.m b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSContextManager.m new file mode 100644 index 0000000..68429b3 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSContextManager.m @@ -0,0 +1,78 @@ +// +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "Crashlytics/Crashlytics/Controllers/FIRCLSContextManager.h" + +#import "Crashlytics/Crashlytics/Components/FIRCLSContext.h" + +@interface FIRCLSContextManager () + +@property(nonatomic, assign) BOOL hasInitializedContext; + +@property(nonatomic, strong) FIRCLSInternalReport *report; +@property(nonatomic, strong) FIRCLSSettings *settings; +@property(nonatomic, strong) FIRCLSFileManager *fileManager; + +@end + +@implementation FIRCLSContextManager + +- (instancetype)init { + self = [super init]; + if (!self) { + return self; + } + + _appQualitySessionId = @""; + + return self; +} + +- (FBLPromise *)setupContextWithReport:(FIRCLSInternalReport *)report + settings:(FIRCLSSettings *)settings + fileManager:(FIRCLSFileManager *)fileManager { + _report = report; + _settings = settings; + _fileManager = fileManager; + + _hasInitializedContext = true; + + FIRCLSContextInitData *initDataObj = self.buildInitData; + return FIRCLSContextInitialize(initDataObj, self.fileManager); +} + +- (void)setAppQualitySessionId:(NSString *)appQualitySessionId { + _appQualitySessionId = appQualitySessionId; + + // This may be called before the context is originally initialized. In that case + // skip the write because it will be written as soon as the context is initialized. + // On future Session ID updates, this will be true and the context metadata will be + // rewritten. + if (!self.hasInitializedContext) { + return; + } + + FIRCLSContextInitData *initDataObj = self.buildInitData; + if (!FIRCLSContextRecordMetadata(self.report.path, initDataObj)) { + FIRCLSErrorLog(@"Failed to write context file while updating App Quality Session ID"); + } +} + +- (FIRCLSContextInitData *)buildInitData { + return FIRCLSContextBuildInitData(self.report, self.settings, self.fileManager, + self.appQualitySessionId); +} + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSExistingReportManager.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSExistingReportManager.h new file mode 100644 index 0000000..147ff0b --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSExistingReportManager.h @@ -0,0 +1,83 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +NS_ASSUME_NONNULL_BEGIN + +@class FIRCLSManagerData; +@class FIRCLSReportUploader; +@class FIRCLSDataCollectionToken; +@class FIRCrashlyticsReport; + +FOUNDATION_EXPORT NSUInteger const FIRCLSMaxUnsentReports; + +@interface FIRCLSExistingReportManager : NSObject + +/** + * Returns the number of unsent reports on the device, ignoring empty reports in + * the active folder, and ignoring any reports in "processing" or "prepared". + * + * In the past, this would count reports in the processed or prepared + * folders. This has been changed because reports in those paths have already + * been cleared for upload, so there isn't any point in asking for permission + * or possibly spamming end-users if a report gets stuck. + * + * The tricky part is, customers will NOT be alerted in `checkForUnsentReports` + * for reports in these paths, but when they choose `sendUnsentReports` / enable data + * collection, reports in those directories will be re-managed. This should be ok and + * just an edge case because reports should only be in processing or prepared for a split second as + * they do on-device symbolication and get converted into a GDTEvent. After a report is handed off + * to GoogleDataTransport, it is uploaded regardless of Crashlytics data collection. + */ +@property(nonatomic, readonly) NSUInteger unsentReportsCount; + +/** + * This value needs to stay in sync with `numUnsentReports`, so if there is > 0 `numUnsentReports`, + * `newestUnsentReport` needs to return a value. Otherwise it needs to return nil. + * + * `FIRCLSContext` needs to be initialized before the `CrashlyticsReport` is instantiated. + */ +@property(nonatomic, readonly) FIRCrashlyticsReport *_Nullable newestUnsentReport; + +- (instancetype)initWithManagerData:(FIRCLSManagerData *)managerData + reportUploader:(FIRCLSReportUploader *)reportUploader; + +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)new NS_UNAVAILABLE; + +/** + * This is important to call once, early in startup, before the + * new report for this run of the app has been created. Any + * reports in `ExistingReportManager` will be uploaded or deleted + * and we don't want to do that for the current run of the app. + * + * If there are over MAX_UNSENT_REPORTS valid reports, this will delete them. + * + * This methods is slow and should be called only once. + */ +- (void)collectExistingReports; + +/** + * This is the side-effect of calling `deleteUnsentReports`, or collect_reports setting + * being false. + */ +- (void)deleteUnsentReports; + +- (void)sendUnsentReportsWithToken:(FIRCLSDataCollectionToken *)dataCollectionToken + asUrgent:(BOOL)urgent; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSExistingReportManager.m b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSExistingReportManager.m new file mode 100644 index 0000000..e90475b --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSExistingReportManager.m @@ -0,0 +1,274 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "Crashlytics/Crashlytics/Controllers/FIRCLSExistingReportManager.h" + +#import "Crashlytics/Crashlytics/Controllers/FIRCLSManagerData.h" +#import "Crashlytics/Crashlytics/Controllers/FIRCLSReportUploader.h" +#import "Crashlytics/Crashlytics/DataCollection/FIRCLSDataCollectionArbiter.h" +#import "Crashlytics/Crashlytics/DataCollection/FIRCLSDataCollectionToken.h" +#import "Crashlytics/Crashlytics/Helpers/FIRCLSLogger.h" +#import "Crashlytics/Crashlytics/Models/FIRCLSFileManager.h" +#import "Crashlytics/Crashlytics/Models/FIRCLSInternalReport.h" +#import "Crashlytics/Crashlytics/Models/FIRCLSSettings.h" +#import "Crashlytics/Crashlytics/Private/FIRCLSOnDemandModel_Private.h" +#import "Crashlytics/Crashlytics/Private/FIRCrashlyticsReport_Private.h" +#import "Crashlytics/Crashlytics/Public/FirebaseCrashlytics/FIRCrashlyticsReport.h" + +// This value should stay in sync with the Android SDK +NSUInteger const FIRCLSMaxUnsentReports = 4; + +@interface FIRCLSExistingReportManager () + +@property(nonatomic, strong) FIRCLSFileManager *fileManager; +@property(nonatomic, strong) FIRCLSReportUploader *reportUploader; +@property(nonatomic, strong) NSOperationQueue *operationQueue; +@property(nonatomic, strong) FIRCLSSettings *settings; +@property(nonatomic, strong) FIRCLSDataCollectionArbiter *dataArbiter; +@property(nonatomic, strong) FIRCLSOnDemandModel *onDemandModel; + +// This list of active reports excludes the brand new active report that will be created this run of +// the app. +@property(nonatomic, strong) NSArray *existingUnemptyActiveReportPaths; +@property(nonatomic, strong) NSArray *processingReportPaths; +@property(nonatomic, strong) NSArray *preparedReportPaths; + +@property(nonatomic, strong) FIRCLSInternalReport *newestInternalReport; + +@end + +@implementation FIRCLSExistingReportManager + +- (instancetype)initWithManagerData:(FIRCLSManagerData *)managerData + reportUploader:(FIRCLSReportUploader *)reportUploader { + self = [super init]; + if (!self) { + return nil; + } + + _fileManager = managerData.fileManager; + _settings = managerData.settings; + _operationQueue = managerData.operationQueue; + _dataArbiter = managerData.dataArbiter; + _reportUploader = reportUploader; + _onDemandModel = managerData.onDemandModel; + + return self; +} + +NSInteger compareNewer(FIRCLSInternalReport *reportA, + FIRCLSInternalReport *reportB, + void *context) { + // Compare naturally sorts with oldest first, so swap A and B + return [reportB.dateCreated compare:reportA.dateCreated]; +} + +- (void)collectExistingReports { + self.existingUnemptyActiveReportPaths = + [self getUnsentActiveReportsAndDeleteEmptyOrOld:self.fileManager.activePathContents]; + self.processingReportPaths = self.fileManager.processingPathContents; + self.preparedReportPaths = self.fileManager.preparedPathContents; +} + +- (FIRCrashlyticsReport *)newestUnsentReport { + if (self.unsentReportsCount <= 0) { + return nil; + } + + return [[FIRCrashlyticsReport alloc] initWithInternalReport:self.newestInternalReport]; +} + +- (NSUInteger)unsentReportsCount { + // There are nuances about why we only count active reports. + // See the header comment for more information. + return self.existingUnemptyActiveReportPaths.count; +} + +/* + * This has the side effect of deleting any reports over the max, starting with oldest reports. + */ +- (NSArray *)getUnsentActiveReportsAndDeleteEmptyOrOld:(NSArray *)reportPaths { + NSMutableArray *validReports = [NSMutableArray array]; + NSMutableArray *reports = [NSMutableArray array]; + + for (NSString *path in reportPaths) { + FIRCLSInternalReport *_Nullable report = [FIRCLSInternalReport reportWithPath:path]; + if (!report) { + continue; + } + + [reports addObject:report]; + } + + if (reports.count == 0) { + return @[]; + } + + [reports sortUsingFunction:compareNewer context:nil]; + NSString *newestReportPath = [reports firstObject].path; + + // If there was a MetricKit event recorded on the last run of the app, add it to the newest + // report. + if (self.settings.metricKitCollectionEnabled && + [self.fileManager metricKitDiagnosticFileExists]) { + [self.fileManager createEmptyMetricKitFile:newestReportPath]; + } + + for (FIRCLSInternalReport *report in reports) { + // Delete reports without any crashes or non-fatals + if (![report hasAnyEvents]) { + [self.operationQueue addOperationWithBlock:^{ + [self.fileManager removeItemAtPath:report.path]; + }]; + continue; + } + + [validReports addObject:report]; + } + + if (validReports.count == 0) { + return @[]; + } + + // Sort with the newest at the end + [validReports sortUsingFunction:compareNewer context:nil]; + + // Set our report for updating in checkAndUpdateUnsentReports + self.newestInternalReport = [validReports firstObject]; + + // Delete any reports above the limit, starting with the oldest + // which should be at the start of the array. + if (validReports.count > FIRCLSMaxUnsentReports) { + NSUInteger deletingCount = validReports.count - FIRCLSMaxUnsentReports; + FIRCLSInfoLog( + @"Automatic data collection is disabled. Deleting %lu unsent reports over the limit of %lu " + @"to prevent disk space from " + @"filling up. To take action on these reports, call send/deleteUnsentReports. To turn on " + @"automatic data collection, call setCrashlyticsCollectionEnabled with true", + deletingCount, FIRCLSMaxUnsentReports); + } + + // Not that validReports is sorted, delete any reports at indices > MAX_UNSENT_REPORTS, and + // collect the rest of the reports to return. + NSMutableArray *validReportPaths = [NSMutableArray array]; + for (int i = 0; i < validReports.count; i++) { + if (i >= FIRCLSMaxUnsentReports) { + [self.operationQueue addOperationWithBlock:^{ + NSString *path = [[validReports objectAtIndex:i] path]; + [self.fileManager removeItemAtPath:path]; + }]; + } else { + [validReportPaths addObject:[[validReports objectAtIndex:i] path]]; + } + } + + return validReportPaths; +} + +- (void)sendUnsentReportsWithToken:(FIRCLSDataCollectionToken *)dataCollectionToken + asUrgent:(BOOL)urgent { + for (NSString *path in self.existingUnemptyActiveReportPaths) { + [self processExistingActiveReportPath:path + dataCollectionToken:dataCollectionToken + asUrgent:urgent]; + } + + for (NSString *path in self.onDemandModel.storedActiveReportPaths) { + [self processExistingActiveReportPath:path + dataCollectionToken:dataCollectionToken + asUrgent:urgent]; + } + [self.onDemandModel.storedActiveReportPaths removeAllObjects]; + + // deal with stuff in processing more carefully - do not process again + [self.operationQueue addOperationWithBlock:^{ + for (NSString *path in self.processingReportPaths) { + FIRCLSInternalReport *report = [FIRCLSInternalReport reportWithPath:path]; + [self.reportUploader prepareAndSubmitReport:report + dataCollectionToken:dataCollectionToken + asUrgent:NO + withProcessing:NO]; + } + }]; + + // Because this could happen quite a bit after the initial set of files was + // captured, some could be completed (deleted). So, just double-check to make sure + // the file still exists. + [self.operationQueue addOperationWithBlock:^{ + for (NSString *path in self.preparedReportPaths) { + if (![self.fileManager fileExistsAtPath:path]) { + continue; + } + [self.reportUploader uploadPackagedReportAtPath:path + dataCollectionToken:dataCollectionToken + asUrgent:NO]; + } + }]; +} + +- (void)processExistingActiveReportPath:(NSString *)path + dataCollectionToken:(FIRCLSDataCollectionToken *)dataCollectionToken + asUrgent:(BOOL)urgent { + FIRCLSInternalReport *report = [FIRCLSInternalReport reportWithPath:path]; + + // TODO: hasAnyEvents should really be called on the background queue. + if (![report hasAnyEvents]) { + [self.operationQueue addOperationWithBlock:^{ + [self.fileManager removeItemAtPath:path]; + }]; + + return; + } + + if (urgent && [dataCollectionToken isValid]) { + // We can proceed without the delegate. + [self.reportUploader prepareAndSubmitReport:report + dataCollectionToken:dataCollectionToken + asUrgent:urgent + withProcessing:YES]; + return; + } + + [self.operationQueue addOperationWithBlock:^{ + [self.reportUploader prepareAndSubmitReport:report + dataCollectionToken:dataCollectionToken + asUrgent:NO + withProcessing:YES]; + }]; +} + +- (void)deleteUnsentReports { + NSArray *reportPaths = @[]; + reportPaths = [reportPaths arrayByAddingObjectsFromArray:self.existingUnemptyActiveReportPaths]; + reportPaths = [reportPaths arrayByAddingObjectsFromArray:self.processingReportPaths]; + reportPaths = [reportPaths arrayByAddingObjectsFromArray:self.preparedReportPaths]; + + [self.operationQueue addOperationWithBlock:^{ + for (NSString *path in reportPaths) { + [self.fileManager removeItemAtPath:path]; + } + }]; +} + +- (void)handleOnDemandReportUpload:(NSString *)path + dataCollectionToken:(FIRCLSDataCollectionToken *)dataCollectionToken + asUrgent:(BOOL)urgent { + dispatch_async(self.operationQueue.underlyingQueue, ^{ + [self processExistingActiveReportPath:path + dataCollectionToken:dataCollectionToken + asUrgent:YES]; + }); +} + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSManagerData.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSManagerData.h new file mode 100644 index 0000000..fbd43f0 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSManagerData.h @@ -0,0 +1,93 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +NS_ASSUME_NONNULL_BEGIN + +@class FIRCLSFileManager; +@class FIRInstallations; +@class FIRCLSDataCollectionArbiter; +@class FIRCLSApplicationIdentifierModel; +@class FIRCLSInstallIdentifierModel; +@class FIRCLSExecutionIdentifierModel; +@class FIRCLSOnDemandModel; +@class FIRCLSSettings; +@class FIRCLSLaunchMarkerModel; +@class FIRCLSContextManager; +@class GDTCORTransport; +@protocol FIRAnalyticsInterop; + +/* + * FIRCLSManagerData's purpose is to simplify the adding and removing of + * dependencies from each of the Manager classes so that it's easier + * to inject mock classes during testing. A lot of the Manager classes + * share these dependencies, but don't use all of them. + * + * If you plan on adding interdependencies between Managers, do not add a pointer + * to the dependency here. Instead add them as a new value to the constructor of + * the Manager, and construct them in FirebaseCrashlytics. This data structure should + * be for Models and other SDKs / Interops Crashlytics depends on. + */ +@interface FIRCLSManagerData : NSObject + +- (instancetype)initWithGoogleAppID:(NSString *)googleAppID + googleTransport:(GDTCORTransport *)googleTransport + installations:(FIRInstallations *)installations + analytics:(nullable id)analytics + fileManager:(FIRCLSFileManager *)fileManager + dataArbiter:(FIRCLSDataCollectionArbiter *)dataArbiter + settings:(FIRCLSSettings *)settings + onDemandModel:(FIRCLSOnDemandModel *)onDemandModel NS_DESIGNATED_INITIALIZER; + +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)new NS_UNAVAILABLE; + +@property(nonatomic, readonly) NSString *googleAppID; + +@property(nonatomic, strong) GDTCORTransport *googleTransport; + +@property(nonatomic, strong) FIRInstallations *installations; + +@property(nonatomic, strong) id analytics; + +@property(nonatomic, strong) FIRCLSFileManager *fileManager; + +@property(nonatomic, strong) FIRCLSDataCollectionArbiter *dataArbiter; + +// Uniquely identifies a build / binary of the app +@property(nonatomic, strong) FIRCLSApplicationIdentifierModel *appIDModel; + +// Uniquely identifies an install of the app +@property(nonatomic, strong) FIRCLSInstallIdentifierModel *installIDModel; + +// Uniquely identifies a run of the app +@property(nonatomic, strong) FIRCLSExecutionIdentifierModel *executionIDModel; + +// Handles storing and uploading of on-demand events +@property(nonatomic, readonly) FIRCLSOnDemandModel *onDemandModel; + +// Settings fetched from the server +@property(nonatomic, strong) FIRCLSSettings *settings; + +// Sets up the Context and writes Metadata files to the crash report +@property(nonatomic, strong) FIRCLSContextManager *contextManager; + +// These queues function together as a single startup queue +@property(nonatomic, strong) NSOperationQueue *operationQueue; +@property(nonatomic, strong) dispatch_queue_t dispatchQueue; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSManagerData.m b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSManagerData.m new file mode 100644 index 0000000..c6f1577 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSManagerData.m @@ -0,0 +1,65 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "Crashlytics/Crashlytics/Controllers/FIRCLSManagerData.h" + +#import "Crashlytics/Crashlytics/Components/FIRCLSApplication.h" +#import "Crashlytics/Crashlytics/Controllers/FIRCLSContextManager.h" +#import "Crashlytics/Crashlytics/Models/FIRCLSExecutionIdentifierModel.h" +#import "Crashlytics/Crashlytics/Models/FIRCLSInstallIdentifierModel.h" +#import "Crashlytics/Crashlytics/Models/FIRCLSSettings.h" +#import "Crashlytics/Crashlytics/Private/FIRCLSOnDemandModel_Private.h" +#import "Crashlytics/Crashlytics/Settings/Models/FIRCLSApplicationIdentifierModel.h" + +@implementation FIRCLSManagerData + +- (instancetype)initWithGoogleAppID:(NSString *)googleAppID + googleTransport:(GDTCORTransport *)googleTransport + installations:(FIRInstallations *)installations + analytics:(nullable id)analytics + fileManager:(FIRCLSFileManager *)fileManager + dataArbiter:(FIRCLSDataCollectionArbiter *)dataArbiter + settings:(FIRCLSSettings *)settings + onDemandModel:(FIRCLSOnDemandModel *)onDemandModel { + self = [super init]; + if (!self) { + return nil; + } + + _googleAppID = googleAppID; + _googleTransport = googleTransport; + _installations = installations; + _analytics = analytics; + _fileManager = fileManager; + _dataArbiter = dataArbiter; + _settings = settings; + _onDemandModel = onDemandModel; + _contextManager = [[FIRCLSContextManager alloc] init]; + + _appIDModel = [[FIRCLSApplicationIdentifierModel alloc] init]; + _installIDModel = [[FIRCLSInstallIdentifierModel alloc] initWithInstallations:installations]; + _executionIDModel = [[FIRCLSExecutionIdentifierModel alloc] init]; + + NSString *sdkBundleID = FIRCLSApplicationGetSDKBundleID(); + _operationQueue = [NSOperationQueue new]; + [_operationQueue setMaxConcurrentOperationCount:1]; + [_operationQueue setName:[sdkBundleID stringByAppendingString:@".work-queue"]]; + + _dispatchQueue = dispatch_queue_create("com.google.firebase.crashlytics.startup", 0); + _operationQueue.underlyingQueue = _dispatchQueue; + + return self; +} + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSMetricKitManager.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSMetricKitManager.h new file mode 100644 index 0000000..ee490eb --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSMetricKitManager.h @@ -0,0 +1,47 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include +#import + +#import "Crashlytics/Crashlytics/Helpers/FIRCLSDefines.h" + +#if CLS_METRICKIT_SUPPORTED +#import + +#import "Crashlytics/Crashlytics/Controllers/FIRCLSExistingReportManager.h" +#import "Crashlytics/Crashlytics/Models/FIRCLSFileManager.h" + +#if __has_include() +#import +#else +#import "FBLPromises.h" +#endif + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRCLSMetricKitManager : NSObject + +- (instancetype)initWithManagerData:(FIRCLSManagerData *)managerData + existingReportManager:(FIRCLSExistingReportManager *)existingReportManager + fileManager:(FIRCLSFileManager *)fileManager; + +- (instancetype)init NS_UNAVAILABLE; +- (void)registerMetricKitManager; +- (FBLPromise *)waitForMetricKitDataAvailable; + +@end + +NS_ASSUME_NONNULL_END +#endif // CLS_METRICKIT_SUPPORTED diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSMetricKitManager.m b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSMetricKitManager.m new file mode 100644 index 0000000..0c081df --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSMetricKitManager.m @@ -0,0 +1,449 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +#import "Crashlytics/Crashlytics/Controllers/FIRCLSMetricKitManager.h" + +#if CLS_METRICKIT_SUPPORTED + +#import "Crashlytics/Crashlytics/Controllers/FIRCLSManagerData.h" +#include "Crashlytics/Crashlytics/Handlers/FIRCLSMachException.h" +#include "Crashlytics/Crashlytics/Handlers/FIRCLSSignal.h" +#import "Crashlytics/Crashlytics/Helpers/FIRCLSCallStackTree.h" +#import "Crashlytics/Crashlytics/Helpers/FIRCLSFile.h" +#import "Crashlytics/Crashlytics/Helpers/FIRCLSLogger.h" +#import "Crashlytics/Crashlytics/Models/FIRCLSExecutionIdentifierModel.h" +#import "Crashlytics/Crashlytics/Models/FIRCLSInternalReport.h" +#import "Crashlytics/Crashlytics/Public/FirebaseCrashlytics/FIRCrashlytics.h" +#import "Crashlytics/Crashlytics/Public/FirebaseCrashlytics/FIRCrashlyticsReport.h" + +@interface FIRCLSMetricKitManager () + +@property FBLPromise *metricKitDataAvailable; +@property FIRCLSExistingReportManager *existingReportManager; +@property FIRCLSFileManager *fileManager; +@property FIRCLSManagerData *managerData; +@property BOOL metricKitPromiseFulfilled; + +@end + +@implementation FIRCLSMetricKitManager + +- (instancetype)initWithManagerData:(FIRCLSManagerData *)managerData + existingReportManager:(FIRCLSExistingReportManager *)existingReportManager + fileManager:(FIRCLSFileManager *)fileManager { + _existingReportManager = existingReportManager; + _fileManager = fileManager; + _managerData = managerData; + _metricKitPromiseFulfilled = NO; + return self; +} + +/* + * Registers the MetricKit manager to receive MetricKit reports by adding self to the + * MXMetricManager subscribers. Also initializes the promise that we'll use to ensure that any + * MetricKit report files are included in Crashylytics fatal reports. If no crash occurred on the + * last run of the app, this promise is immediately resolved so that the upload of any nonfatal + * events can proceed. + */ +- (void)registerMetricKitManager API_AVAILABLE(ios(14)) { + [[MXMetricManager sharedManager] addSubscriber:self]; + self.metricKitDataAvailable = [FBLPromise pendingPromise]; + + // If there was no crash on the last run of the app or there's no diagnostic report in the + // MetricKit directory, then we aren't expecting a MetricKit diagnostic report and should resolve + // the promise immediately. If MetricKit captured a fatal event and Crashlytics did not, then + // we'll still process the MetricKit crash but won't upload it until the app restarts again. + if (![self.fileManager didCrashOnPreviousExecution] || + ![self.fileManager metricKitDiagnosticFileExists]) { + @synchronized(self) { + [self fulfillMetricKitPromise]; + } + } + + // If we haven't resolved this promise within three seconds, resolve it now so that we're not + // waiting indefinitely for MetricKit payloads that won't arrive. + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 3 * NSEC_PER_SEC), self.managerData.dispatchQueue, + ^{ + @synchronized(self) { + if (!self.metricKitPromiseFulfilled) { + FIRCLSDebugLog(@"Resolving MetricKit promise after three seconds"); + [self fulfillMetricKitPromise]; + } + } + }); + + FIRCLSDebugLog(@"Finished registering metrickit manager"); +} + +/* + * This method receives diagnostic payloads from MetricKit whenever a fatal or nonfatal MetricKit + * event occurs. If a fatal event, this method will be called when the app restarts. Since we're + * including a MetricKit report file in the Crashlytics report to be sent to the backend, we need + * to make sure that we process the payloads and write the included information to file before + * the report is sent up. If this method is called due to a nonfatal event, it will be called + * immediately after the event. Since we send nonfatal events on the next run of the app, we can + * write out the information but won't need to resolve the promise. + */ +- (void)didReceiveDiagnosticPayloads:(NSArray *)payloads + API_AVAILABLE(ios(14)) { + BOOL processedFatalPayload = NO; + for (MXDiagnosticPayload *diagnosticPayload in payloads) { + if (!diagnosticPayload) { + continue; + } + + BOOL processedPayload = [self processMetricKitPayload:diagnosticPayload + skipCrashEvent:processedFatalPayload]; + if (processedPayload && ([diagnosticPayload.crashDiagnostics count] > 0)) { + processedFatalPayload = YES; + } + } + // Once we've processed all the payloads, resolve the promise so that reporting uploading + // continues. If there was not a crash on the previous run of the app, the promise will already + // have been resolved. + @synchronized(self) { + [self fulfillMetricKitPromise]; + } +} + +// Helper method to write a MetricKit payload's data to file. +- (BOOL)processMetricKitPayload:(MXDiagnosticPayload *)diagnosticPayload + skipCrashEvent:(BOOL)skipCrashEvent API_AVAILABLE(ios(14)) { + BOOL writeFailed = NO; + + // Write out each type of diagnostic if it exists in the report + BOOL hasCrash = [diagnosticPayload.crashDiagnostics count] > 0; + BOOL hasHang = [diagnosticPayload.hangDiagnostics count] > 0; + BOOL hasCPUException = [diagnosticPayload.cpuExceptionDiagnostics count] > 0; + BOOL hasDiskWriteException = [diagnosticPayload.diskWriteExceptionDiagnostics count] > 0; + + // If there are no diagnostics in the report, return before writing out any files. + if (!hasCrash && !hasHang && !hasCPUException && !hasDiskWriteException) { + return false; + } + + // MXDiagnosticPayload have both a timeStampBegin and timeStampEnd. Now that these events are + // real-time, both refer to the same time - record both values anyway. + NSTimeInterval beginSecondsSince1970 = [diagnosticPayload.timeStampBegin timeIntervalSince1970]; + NSTimeInterval endSecondsSince1970 = [diagnosticPayload.timeStampEnd timeIntervalSince1970]; + + // Get file path for the active reports directory. + NSString *activePath = [[self.fileManager activePath] stringByAppendingString:@"/"]; + + // If there is a crash diagnostic in the payload, then this method was called for a fatal event. + // Also ensure that there is a report from the last run of the app that we can write to. + NSString *metricKitFatalReportFile; + NSString *metricKitNonfatalReportFile; + + NSString *newestUnsentReportID = + self.existingReportManager.newestUnsentReport.reportID + ? [self.existingReportManager.newestUnsentReport.reportID stringByAppendingString:@"/"] + : nil; + NSString *currentReportID = + [_managerData.executionIDModel.executionID stringByAppendingString:@"/"]; + BOOL crashlyticsFatalReported = + ([diagnosticPayload.crashDiagnostics count] > 0) && (newestUnsentReportID != nil) && + ([self.fileManager + fileExistsAtPath:[activePath stringByAppendingString:newestUnsentReportID]]); + + // Set the MetricKit fatal path appropriately depending on whether we also captured a Crashlytics + // fatal event and whether the diagnostic report came from a fatal or nonfatal event. + if (crashlyticsFatalReported) { + metricKitFatalReportFile = [[activePath stringByAppendingString:newestUnsentReportID] + stringByAppendingString:FIRCLSMetricKitFatalReportFile]; + } else { + metricKitFatalReportFile = [[activePath stringByAppendingString:currentReportID] + stringByAppendingString:FIRCLSMetricKitFatalReportFile]; + } + metricKitNonfatalReportFile = [[activePath stringByAppendingString:currentReportID] + stringByAppendingString:FIRCLSMetricKitNonfatalReportFile]; + + if (!metricKitFatalReportFile || !metricKitNonfatalReportFile) { + FIRCLSDebugLog(@"Error finding MetricKit files"); + return NO; + } + + FIRCLSDebugLog(@"File paths for MetricKit report: %@, %@", metricKitFatalReportFile, + metricKitNonfatalReportFile); + if (hasCrash && ![_fileManager fileExistsAtPath:metricKitFatalReportFile]) { + [_fileManager createFileAtPath:metricKitFatalReportFile contents:nil attributes:nil]; + } + if ((hasHang | hasCPUException | hasDiskWriteException) && + ![_fileManager fileExistsAtPath:metricKitNonfatalReportFile]) { + [_fileManager createFileAtPath:metricKitNonfatalReportFile contents:nil attributes:nil]; + } + NSFileHandle *nonfatalFile = + [NSFileHandle fileHandleForUpdatingAtPath:metricKitNonfatalReportFile]; + if ((hasHang | hasCPUException | hasDiskWriteException) && nonfatalFile == nil) { + FIRCLSDebugLog(@"Unable to create or open nonfatal MetricKit file."); + return false; + } + NSFileHandle *fatalFile = [NSFileHandle fileHandleForUpdatingAtPath:metricKitFatalReportFile]; + if (hasCrash && fatalFile == nil) { + FIRCLSDebugLog(@"Unable to create or open fatal MetricKit file."); + return false; + } + + NSData *newLineData = [@"\n" dataUsingEncoding:NSUTF8StringEncoding]; + + // For each diagnostic type, write out a section in the MetricKit report file. This section will + // have subsections for threads, metadata, and event specific metadata. + if (hasCrash && !skipCrashEvent) { + // Write out time information to the MetricKit report file. Time needs to be a value for + // backend serialization, so we write out end_time separately. + + MXCrashDiagnostic *crashDiagnostic = [diagnosticPayload.crashDiagnostics objectAtIndex:0]; + + NSArray *threadArray = [self convertThreadsToArray:crashDiagnostic.callStackTree]; + NSDictionary *metadataDict = [self convertMetadataToDictionary:crashDiagnostic.metaData]; + + NSString *nilString = @""; + + // On the backend, we process name, code name, and address into the subtitle of an issue. + // Mach exception name and code should be preferred over signal name and code if available. + const char *signalName = NULL; + const char *signalCodeName = NULL; + FIRCLSSignalNameLookup([crashDiagnostic.signal intValue], 0, &signalName, &signalCodeName); + // signalName is the default name, so should never be NULL + if (signalName == NULL) { + signalName = "UNKNOWN"; + } + if (signalCodeName == NULL) { + signalCodeName = ""; + } + + const char *machExceptionName = NULL; + const char *machExceptionCodeName = NULL; +#if CLS_MACH_EXCEPTION_SUPPORTED + FIRCLSMachExceptionNameLookup( + [crashDiagnostic.exceptionType intValue], + (mach_exception_data_type_t)[crashDiagnostic.exceptionCode intValue], &machExceptionName, + &machExceptionCodeName); +#endif + if (machExceptionCodeName == NULL) { + machExceptionCodeName = ""; + } + + NSString *name = machExceptionName != NULL ? [NSString stringWithUTF8String:machExceptionName] + : [NSString stringWithUTF8String:signalName]; + NSString *codeName = machExceptionName != NULL + ? [NSString stringWithUTF8String:machExceptionCodeName] + : [NSString stringWithUTF8String:signalCodeName]; + + NSDictionary *crashDictionary = @{ + @"metric_kit_fatal" : @{ + @"time" : [NSNumber numberWithLong:beginSecondsSince1970], + @"end_time" : [NSNumber numberWithLong:endSecondsSince1970], + @"metadata" : metadataDict, + @"termination_reason" : + (crashDiagnostic.terminationReason) ? crashDiagnostic.terminationReason : nilString, + @"virtual_memory_region_info" : (crashDiagnostic.virtualMemoryRegionInfo) + ? crashDiagnostic.virtualMemoryRegionInfo + : nilString, + @"exception_type" : crashDiagnostic.exceptionType, + @"exception_code" : crashDiagnostic.exceptionCode, + @"signal" : crashDiagnostic.signal, + @"app_version" : crashDiagnostic.applicationVersion, + @"code_name" : codeName, + @"name" : name + } + }; + writeFailed = ![self writeDictionaryToFile:crashDictionary + file:fatalFile + newLineData:newLineData]; + writeFailed = writeFailed | ![self writeDictionaryToFile:@{@"threads" : threadArray} + file:fatalFile + newLineData:newLineData]; + } + + if (hasHang) { + MXHangDiagnostic *hangDiagnostic = [diagnosticPayload.hangDiagnostics objectAtIndex:0]; + + NSArray *threadArray = [self convertThreadsToArray:hangDiagnostic.callStackTree]; + NSDictionary *metadataDict = [self convertMetadataToDictionary:hangDiagnostic.metaData]; + + NSDictionary *hangDictionary = @{ + @"exception" : @{ + @"type" : @"metrickit_nonfatal", + @"name" : @"hang_event", + @"time" : [NSNumber numberWithLong:beginSecondsSince1970], + @"end_time" : [NSNumber numberWithLong:endSecondsSince1970], + @"threads" : threadArray, + @"metadata" : metadataDict, + @"hang_duration" : [NSNumber numberWithDouble:[hangDiagnostic.hangDuration doubleValue]], + @"app_version" : hangDiagnostic.applicationVersion + } + }; + + writeFailed = ![self writeDictionaryToFile:hangDictionary + file:nonfatalFile + newLineData:newLineData]; + } + + if (hasCPUException) { + MXCPUExceptionDiagnostic *cpuExceptionDiagnostic = + [diagnosticPayload.cpuExceptionDiagnostics objectAtIndex:0]; + + NSArray *threadArray = [self convertThreadsToArray:cpuExceptionDiagnostic.callStackTree]; + NSDictionary *metadataDict = [self convertMetadataToDictionary:cpuExceptionDiagnostic.metaData]; + + NSDictionary *cpuDictionary = @{ + @"exception" : @{ + @"type" : @"metrickit_nonfatal", + @"name" : @"cpu_exception_event", + @"time" : [NSNumber numberWithLong:beginSecondsSince1970], + @"end_time" : [NSNumber numberWithLong:endSecondsSince1970], + @"threads" : threadArray, + @"metadata" : metadataDict, + @"total_cpu_time" : + [NSNumber numberWithDouble:[cpuExceptionDiagnostic.totalCPUTime doubleValue]], + @"total_sampled_time" : + [NSNumber numberWithDouble:[cpuExceptionDiagnostic.totalSampledTime doubleValue]], + @"app_version" : cpuExceptionDiagnostic.applicationVersion + } + }; + writeFailed = ![self writeDictionaryToFile:cpuDictionary + file:nonfatalFile + newLineData:newLineData]; + } + + if (hasDiskWriteException) { + MXDiskWriteExceptionDiagnostic *diskWriteExceptionDiagnostic = + [diagnosticPayload.diskWriteExceptionDiagnostics objectAtIndex:0]; + + NSArray *threadArray = [self convertThreadsToArray:diskWriteExceptionDiagnostic.callStackTree]; + NSDictionary *metadataDict = + [self convertMetadataToDictionary:diskWriteExceptionDiagnostic.metaData]; + + NSDictionary *diskWriteDictionary = @{ + @"exception" : @{ + @"type" : @"metrickit_nonfatal", + @"name" : @"disk_write_exception_event", + @"time" : [NSNumber numberWithLong:beginSecondsSince1970], + @"end_time" : [NSNumber numberWithLong:endSecondsSince1970], + @"threads" : threadArray, + @"metadata" : metadataDict, + @"app_version" : diskWriteExceptionDiagnostic.applicationVersion, + @"total_writes_caused" : + [NSNumber numberWithDouble:[diskWriteExceptionDiagnostic.totalWritesCaused doubleValue]] + } + }; + writeFailed = ![self writeDictionaryToFile:diskWriteDictionary + file:nonfatalFile + newLineData:newLineData]; + } + + return !writeFailed; +} +/* + * Required for MXMetricManager subscribers. Since we aren't currently collecting any MetricKit + * metrics, this method is left empty. + */ +- (void)didReceiveMetricPayloads:(NSArray *)payloads API_AVAILABLE(ios(13)) { +} + +- (FBLPromise *)waitForMetricKitDataAvailable { + FBLPromise *result = nil; + @synchronized(self) { + result = self.metricKitDataAvailable; + } + return result; +} + +/* + * Helper method to convert threads for a MetricKit fatal diagnostic event to an array of threads. + */ +- (NSArray *)convertThreadsToArray:(MXCallStackTree *)mxCallStackTree API_AVAILABLE(ios(14)) { + FIRCLSCallStackTree *tree = [[FIRCLSCallStackTree alloc] initWithMXCallStackTree:mxCallStackTree]; + return [tree getArrayRepresentation]; +} + +/* + * Helper method to convert threads for a MetricKit nonfatal diagnostic event to an array of frames. + */ +- (NSArray *)convertThreadsToArrayForNonfatal:(MXCallStackTree *)mxCallStackTree + API_AVAILABLE(ios(14)) { + FIRCLSCallStackTree *tree = [[FIRCLSCallStackTree alloc] initWithMXCallStackTree:mxCallStackTree]; + return [tree getFramesOfBlamedThread]; +} + +/* + * Helper method to convert metadata for a MetricKit diagnostic event to a dictionary. MXMetadata + * has a dictionaryRepresentation method but it is deprecated. + */ +- (NSDictionary *)convertMetadataToDictionary:(MXMetaData *)metadata API_AVAILABLE(ios(14)) { + NSError *error = nil; + NSDictionary *metadataDictionary = + [NSJSONSerialization JSONObjectWithData:[metadata JSONRepresentation] options:0 error:&error]; + return metadataDictionary; +} + +/* + * Helper method to fulfill the metricKitDataAvailable promise and track that it has been fulfilled. + */ +- (void)fulfillMetricKitPromise { + if (self.metricKitPromiseFulfilled) return; + + [self.metricKitDataAvailable fulfill:nil]; + self.metricKitPromiseFulfilled = YES; +} + +/* + * Helper method to write a dictionary of event information to file. Returns whether it succeeded. + */ +- (BOOL)writeDictionaryToFile:(NSDictionary *)dictionary + file:(NSFileHandle *)file + newLineData:(NSData *)newLineData { + NSError *dataError = nil; + NSData *data = [NSJSONSerialization dataWithJSONObject:dictionary options:0 error:&dataError]; + if (dataError) { + FIRCLSDebugLog(@"Unable to write out dictionary."); + return NO; + } + + [file seekToEndOfFile]; + [file writeData:data]; + [file writeData:newLineData]; + + return YES; +} + +- (NSString *)getSignalName:(NSNumber *)signalCode { + int signal = [signalCode intValue]; + switch (signal) { + case SIGABRT: + return @"SIGABRT"; + case SIGBUS: + return @"SIGBUS"; + case SIGFPE: + return @"SIGFPE"; + case SIGILL: + return @"SIGILL"; + case SIGSEGV: + return @"SIGSEGV"; + case SIGSYS: + return @"SIGSYS"; + case SIGTRAP: + return @"SIGTRAP"; + default: + return @"UNKNOWN"; + } + return @"UNKNOWN"; +} + +@end + +#endif // CLS_METRICKIT_SUPPORTED diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSNotificationManager.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSNotificationManager.h new file mode 100644 index 0000000..684a26b --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSNotificationManager.h @@ -0,0 +1,27 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRCLSNotificationManager : NSObject + ++ (instancetype)new NS_UNAVAILABLE; + +- (void)registerNotificationListener; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSNotificationManager.m b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSNotificationManager.m new file mode 100644 index 0000000..9ac4e1e --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSNotificationManager.m @@ -0,0 +1,113 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "Crashlytics/Crashlytics/Controllers/FIRCLSNotificationManager.h" + +#import "Crashlytics/Crashlytics/Components/FIRCLSApplication.h" +#import "Crashlytics/Crashlytics/Components/FIRCLSGlobals.h" +#import "Crashlytics/Crashlytics/Components/FIRCLSUserLogging.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSDefines.h" + +#if TARGET_OS_IPHONE +#import +#else +#import +#endif + +@implementation FIRCLSNotificationManager + +- (void)registerNotificationListener { + [self captureInitialNotificationStates]; + +#if TARGET_OS_IOS + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(willBecomeActive:) + name:UIApplicationWillEnterForegroundNotification + object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(didBecomeInactive:) + name:UIApplicationDidEnterBackgroundNotification + object:nil]; +#if !CLS_TARGET_OS_VISION + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(didChangeOrientation:) + name:UIDeviceOrientationDidChangeNotification + object:nil]; + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + [[NSNotificationCenter defaultCenter] + addObserver:self + selector:@selector(didChangeUIOrientation:) + name:UIApplicationDidChangeStatusBarOrientationNotification + object:nil]; +#pragma clang diagnostic pop +#endif // !CLS_TARGET_OS_VISION + +#elif CLS_TARGET_OS_OSX + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(willBecomeActive:) + name:@"NSApplicationWillBecomeActiveNotification" + object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(didBecomeInactive:) + name:@"NSApplicationDidResignActiveNotification" + object:nil]; +#endif +} + +- (void)captureInitialNotificationStates { +#if TARGET_OS_IOS && (!CLS_TARGET_OS_VISION) + UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation]; + UIInterfaceOrientation statusBarOrientation = + [FIRCLSApplicationSharedInstance() statusBarOrientation]; +#endif // TARGET_OS_IOS && (!CLS_TARGET_OS_VISION) + + // It's nice to do this async, so we don't hold up the main thread while doing three + // consecutive IOs here. + dispatch_async(FIRCLSGetLoggingQueue(), ^{ + FIRCLSUserLoggingWriteInternalKeyValue(FIRCLSInBackgroundKey, @"0"); +#if TARGET_OS_IOS && (!CLS_TARGET_OS_VISION) + FIRCLSUserLoggingWriteInternalKeyValue(FIRCLSDeviceOrientationKey, + [@(orientation) description]); + FIRCLSUserLoggingWriteInternalKeyValue(FIRCLSUIOrientationKey, + [@(statusBarOrientation) description]); +#endif // TARGET_OS_IOS && (!CLS_TARGET_OS_VISION) + }); +} + +- (void)willBecomeActive:(NSNotification *)notification { + FIRCLSUserLoggingRecordInternalKeyValue(FIRCLSInBackgroundKey, @NO); +} + +- (void)didBecomeInactive:(NSNotification *)notification { + FIRCLSUserLoggingRecordInternalKeyValue(FIRCLSInBackgroundKey, @YES); +} + +#if TARGET_OS_IOS && (!CLS_TARGET_OS_VISION) +- (void)didChangeOrientation:(NSNotification *)notification { + UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation]; + + FIRCLSUserLoggingRecordInternalKeyValue(FIRCLSDeviceOrientationKey, @(orientation)); +} + +- (void)didChangeUIOrientation:(NSNotification *)notification { + UIInterfaceOrientation statusBarOrientation = + [FIRCLSApplicationSharedInstance() statusBarOrientation]; + + FIRCLSUserLoggingRecordInternalKeyValue(FIRCLSUIOrientationKey, @(statusBarOrientation)); +} +#endif // TARGET_OS_IOS && (!CLS_TARGET_OS_VISION) + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSReportManager.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSReportManager.h new file mode 100644 index 0000000..1b17edb --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSReportManager.h @@ -0,0 +1,47 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +#import "Crashlytics/Crashlytics/Public/FirebaseCrashlytics/FIRCrashlytics.h" + +@class FBLPromise; +@class FIRCLSExistingReportManager; +@class FIRCLSAnalyticsManager; +@class FIRCLSManagerData; +@class FIRCLSContextManager; + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRCLSReportManager : NSObject + +- (instancetype)initWithManagerData:(FIRCLSManagerData *)managerData + existingReportManager:(FIRCLSExistingReportManager *)existingReportManager + analyticsManager:(FIRCLSAnalyticsManager *)analyticsManager + NS_DESIGNATED_INITIALIZER; +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)new NS_UNAVAILABLE; + +- (FBLPromise *)startWithProfiling; + +- (FBLPromise *)checkForUnsentReports; +- (FBLPromise *)sendUnsentReports; +- (FBLPromise *)deleteUnsentReports; + +@end + +extern NSString *const FIRCLSConfigSubmitReportsKey; +extern NSString *const FIRCLSConfigPackageReportsKey; + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSReportManager.m b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSReportManager.m new file mode 100644 index 0000000..941dfa5 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSReportManager.m @@ -0,0 +1,512 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +// The report manager has the ability to send to two different endpoints. +// +// The old legacy flow for a report goes through the following states/folders: +// 1. active - .clsrecords optimized for crash time persistence +// 2. processing - .clsrecords with attempted symbolication +// 3. prepared-legacy - .multipartmime of compressed .clsrecords +// +// The new flow for a report goes through the following states/folders: +// 1. active - .clsrecords optimized for crash time persistence +// 2. processing - .clsrecords with attempted symbolication +// 3. prepared - .clsrecords moved from processing with no changes +// +// The code was designed so the report processing workflows are not dramatically different from one +// another. The design will help avoid having a lot of conditional code blocks throughout the +// codebase. +// + +#include + +#if __has_include() +#import +#else +#import "FBLPromises.h" +#endif + +#import "Crashlytics/Crashlytics/Components/FIRCLSApplication.h" +#import "Crashlytics/Crashlytics/Components/FIRCLSUserLogging.h" +#import "Crashlytics/Crashlytics/Controllers/FIRCLSAnalyticsManager.h" +#import "Crashlytics/Crashlytics/Controllers/FIRCLSContextManager.h" +#import "Crashlytics/Crashlytics/Controllers/FIRCLSExistingReportManager.h" +#import "Crashlytics/Crashlytics/Controllers/FIRCLSManagerData.h" +#import "Crashlytics/Crashlytics/Controllers/FIRCLSMetricKitManager.h" +#import "Crashlytics/Crashlytics/Controllers/FIRCLSNotificationManager.h" +#import "Crashlytics/Crashlytics/DataCollection/FIRCLSDataCollectionArbiter.h" +#import "Crashlytics/Crashlytics/DataCollection/FIRCLSDataCollectionToken.h" +#import "Crashlytics/Crashlytics/Helpers/FIRCLSDefines.h" +#import "Crashlytics/Crashlytics/Helpers/FIRCLSFeatures.h" +#import "Crashlytics/Crashlytics/Helpers/FIRCLSLogger.h" +#import "Crashlytics/Crashlytics/Models/FIRCLSFileManager.h" +#import "Crashlytics/Crashlytics/Models/FIRCLSInternalReport.h" +#import "Crashlytics/Crashlytics/Models/FIRCLSLaunchMarkerModel.h" +#import "Crashlytics/Crashlytics/Models/FIRCLSSettings.h" +#import "Crashlytics/Crashlytics/Models/FIRCLSSymbolResolver.h" +#import "Crashlytics/Crashlytics/Operations/Reports/FIRCLSProcessReportOperation.h" +#import "Crashlytics/Crashlytics/Settings/Models/FIRCLSApplicationIdentifierModel.h" + +#include "Crashlytics/Crashlytics/Components/FIRCLSGlobals.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSUtility.h" + +#import "Crashlytics/Crashlytics/Models/FIRCLSExecutionIdentifierModel.h" +#import "Crashlytics/Crashlytics/Models/FIRCLSInstallIdentifierModel.h" +#import "Crashlytics/Crashlytics/Settings/FIRCLSSettingsManager.h" +#import "Crashlytics/Shared/FIRCLSConstants.h" + +#import "Crashlytics/Crashlytics/Controllers/FIRCLSReportManager_Private.h" + +#if TARGET_OS_IPHONE +#import +#else +#import +#endif + +/** + * A FirebaseReportAction is used to indicate how to handle unsent reports. + */ +typedef NS_ENUM(NSInteger, FIRCLSReportAction) { + /** Upload the reports to Crashlytics. */ + FIRCLSReportActionSend, + /** Delete the reports without uploading them. */ + FIRCLSReportActionDelete, +}; + +/** + * This is just a helper to make code using FirebaseReportAction more readable. + */ +typedef NSNumber FIRCLSWrappedReportAction; +@implementation NSNumber (FIRCLSWrappedReportAction) +- (FIRCLSReportAction)reportActionValue { + return [self intValue]; +} +@end + +@interface FIRCLSReportManager () { + FIRCLSFileManager *_fileManager; + dispatch_queue_t _dispatchQueue; + NSOperationQueue *_operationQueue; + id _analytics; + + // A promise that will be resolved when unsent reports are found on the device, and + // processReports: can be called to decide how to deal with them. + FBLPromise *_unsentReportsAvailable; + + // A promise that will be resolved when the user has provided an action that they want to perform + // for all the unsent reports. + FBLPromise *_reportActionProvided; + + // A promise that will be resolved when all unsent reports have been "handled". They won't + // necessarily have been uploaded, but we will know whether they should be sent or deleted, and + // the initial work to make that happen will have been processed on the work queue. + // + // Currently only used for testing + FBLPromise *_unsentReportsHandled; + + // A token to make sure that checkForUnsentReports only gets called once. + atomic_bool _checkForUnsentReportsCalled; + + BOOL _registeredAnalyticsEventListener; +} + +@property(nonatomic, readonly) NSString *googleAppID; +@property(nonatomic, strong) GDTCORTransport *googleTransport; + +@property(nonatomic, strong) FIRCLSDataCollectionArbiter *dataArbiter; +@property(nonatomic, strong) FIRCLSSettings *settings; +@property(nonatomic, strong) FIRCLSLaunchMarkerModel *launchMarker; + +@property(nonatomic, strong) FIRCLSApplicationIdentifierModel *appIDModel; +@property(nonatomic, strong) FIRCLSInstallIdentifierModel *installIDModel; +@property(nonatomic, strong) FIRCLSExecutionIdentifierModel *executionIDModel; + +@property(nonatomic, strong) FIRCLSAnalyticsManager *analyticsManager; +@property(nonatomic, strong) FIRCLSExistingReportManager *existingReportManager; + +@property(nonatomic, strong) FIRCLSContextManager *contextManager; + +// Internal Managers +@property(nonatomic, strong) FIRCLSSettingsManager *settingsManager; +@property(nonatomic, strong) FIRCLSNotificationManager *notificationManager; +#if CLS_METRICKIT_SUPPORTED +@property(nonatomic, strong) FIRCLSMetricKitManager *metricKitManager; +#endif + +@end + +@implementation FIRCLSReportManager + +- (instancetype)initWithManagerData:(FIRCLSManagerData *)managerData + existingReportManager:(FIRCLSExistingReportManager *)existingReportManager + analyticsManager:(FIRCLSAnalyticsManager *)analyticsManager { + self = [super init]; + if (!self) { + return nil; + } + + _fileManager = managerData.fileManager; + _analytics = managerData.analytics; + _googleAppID = [managerData.googleAppID copy]; + _dataArbiter = managerData.dataArbiter; + _googleTransport = managerData.googleTransport; + _operationQueue = managerData.operationQueue; + _dispatchQueue = managerData.dispatchQueue; + _appIDModel = managerData.appIDModel; + _installIDModel = managerData.installIDModel; + _settings = managerData.settings; + _executionIDModel = managerData.executionIDModel; + _contextManager = managerData.contextManager; + + _existingReportManager = existingReportManager; + _analyticsManager = analyticsManager; + + _unsentReportsAvailable = [FBLPromise pendingPromise]; + _reportActionProvided = [FBLPromise pendingPromise]; + _unsentReportsHandled = [FBLPromise pendingPromise]; + + _checkForUnsentReportsCalled = NO; + + _settingsManager = [[FIRCLSSettingsManager alloc] initWithAppIDModel:self.appIDModel + installIDModel:self.installIDModel + settings:self.settings + fileManager:self.fileManager + googleAppID:self.googleAppID]; + + _notificationManager = [[FIRCLSNotificationManager alloc] init]; + + // This needs to be called before any values are read from settings + NSTimeInterval currentTimestamp = [NSDate timeIntervalSinceReferenceDate]; + [self.settings reloadFromCacheWithGoogleAppID:self.googleAppID currentTimestamp:currentTimestamp]; + +#if CLS_METRICKIT_SUPPORTED + if (@available(iOS 15, *)) { + if (self.settings.metricKitCollectionEnabled) { + FIRCLSDebugLog(@"MetricKit data collection enabled."); + _metricKitManager = [[FIRCLSMetricKitManager alloc] initWithManagerData:managerData + existingReportManager:existingReportManager + fileManager:_fileManager]; + } + } +#endif + + _launchMarker = [[FIRCLSLaunchMarkerModel alloc] initWithFileManager:_fileManager]; + + return self; +} + +// This method returns a promise that is resolved with a wrapped FirebaseReportAction once the user +// has indicated whether they want to upload currently cached reports. This method should only be +// called when we have determined there is at least 1 unsent report. This method waits until either: +// 1. Data collection becomes enabled, in which case, the promise will be resolved with Send. +// 2. The developer uses the processCrashReports API to indicate whether the report +// should be sent or deleted, at which point the promise will be resolved with the action. +- (FBLPromise *)waitForReportAction { + FIRCrashlyticsReport *unsentReport = self.existingReportManager.newestUnsentReport; + [_unsentReportsAvailable fulfill:unsentReport]; + + // If data collection gets enabled while we are waiting for an action, go ahead and send the + // reports, and any subsequent explicit response will be ignored. + FBLPromise *collectionEnabled = + [[self.dataArbiter waitForCrashlyticsCollectionEnabled] + then:^id _Nullable(NSNumber *_Nullable value) { + return @(FIRCLSReportActionSend); + }]; + + // Wait for either the processReports callback to be called, or data collection to be enabled. + return [FBLPromise race:@[ collectionEnabled, _reportActionProvided ]]; +} + +/* + * This method returns a promise that is resolved once + * MetricKit diagnostic reports have been received by `metricKitManager`. + */ +- (FBLPromise *)waitForMetricKitData { + // If the platform is not iOS or the iOS version is less than 15, immediately resolve the promise + // since no MetricKit diagnostics will be available. + FBLPromise *promise = [FBLPromise resolvedWith:nil]; +#if CLS_METRICKIT_SUPPORTED + if (@available(iOS 15, *)) { + if (self.settings.metricKitCollectionEnabled) { + promise = [self.metricKitManager waitForMetricKitDataAvailable]; + } + } + return promise; +#endif + return promise; +} + +- (FBLPromise *)checkForUnsentReports { + bool expectedCalled = NO; + if (!atomic_compare_exchange_strong(&_checkForUnsentReportsCalled, &expectedCalled, YES)) { + FIRCLSErrorLog(@"Either checkForUnsentReports or checkAndUpdateUnsentReports should be called " + @"once per execution."); + return [FBLPromise resolvedWith:nil]; + } + return _unsentReportsAvailable; +} + +- (FBLPromise *)sendUnsentReports { + [_reportActionProvided fulfill:@(FIRCLSReportActionSend)]; + return _unsentReportsHandled; +} + +- (FBLPromise *)deleteUnsentReports { + [_reportActionProvided fulfill:@(FIRCLSReportActionDelete)]; + return _unsentReportsHandled; +} + +- (FBLPromise *)startWithProfiling { + NSString *executionIdentifier = self.executionIDModel.executionID; + + // This needs to be called before the new report is created for + // this run of the app. + [self.existingReportManager collectExistingReports]; + + if (![self validateAppIdentifiers]) { + return [FBLPromise resolvedWith:@NO]; + } + +#if DEBUG + FIRCLSDebugLog(@"Root: %@", [_fileManager rootPath]); +#endif + + if (![_fileManager createReportDirectories]) { + return [FBLPromise resolvedWith:@NO]; + } + + BOOL launchFailure = [self.launchMarker checkForAndCreateLaunchMarker]; + + __block FIRCLSInternalReport *report = [self setupCurrentReport:executionIdentifier]; + if (!report) { + FIRCLSErrorLog(@"Unable to setup a new report"); + } + + FBLPromise *reportProfilingPromise; + reportProfilingPromise = + [[self startCrashReporterWithProfilingReport:report] then:^id _Nullable(id _Nullable value) { + if ([value isEqual:@NO]) { + FIRCLSErrorLog(@"Unable to start crash reporter"); + report = nil; + return [FBLPromise resolvedWith:@NO]; + } + + // empty for disabled start-up time + dispatch_async(FIRCLSGetLoggingQueue(), ^{ + FIRCLSUserLoggingWriteInternalKeyValue(FIRCLSStartTimeKey, @""); + }); + return [FBLPromise resolvedWith:@YES]; + }]; + +#if CLS_METRICKIT_SUPPORTED + if (@available(iOS 15, *)) { + if (self.settings.metricKitCollectionEnabled) { + [self.metricKitManager registerMetricKitManager]; + } + } +#endif + + FBLPromise *promise; + + if ([self.dataArbiter isCrashlyticsCollectionEnabled]) { + FIRCLSDebugLog(@"Automatic data collection is enabled."); + FIRCLSDebugLog(@"Unsent reports will be uploaded at startup"); + FIRCLSDataCollectionToken *dataCollectionToken = [FIRCLSDataCollectionToken validToken]; + + [self beginSettingsWithToken:dataCollectionToken]; + + // Wait for MetricKit data to be available, then continue to send reports and resolve promise. + promise = [[reportProfilingPromise onQueue:_dispatchQueue + then:^id _Nullable(id _Nullable value) { + return [self waitForMetricKitData]; + }] + onQueue:_dispatchQueue + then:^id _Nullable(id _Nullable value) { + [self beginReportUploadsWithToken:dataCollectionToken blockingSend:launchFailure]; + + // If data collection is enabled, the SDK will not notify the user + // when unsent reports are available, or respect Send / DeleteUnsentReports + [self->_unsentReportsAvailable fulfill:nil]; + return @(report != nil); + }]; + } else { + FIRCLSDebugLog(@"Automatic data collection is disabled."); + FIRCLSDebugLog(@"[Crashlytics:Crash] %d unsent reports are available. Waiting for " + @"send/deleteUnsentReports to be called.", + self.existingReportManager.unsentReportsCount); + + // Wait for an action to get sent, either from processReports: or automatic data collection, + // and for MetricKit data to be available. + promise = [[reportProfilingPromise + onQueue:_dispatchQueue + then:^id _Nullable(id _Nullable value) { + return [FBLPromise all:@[ [self waitForReportAction], [self waitForMetricKitData] ]]; + }] onQueue:_dispatchQueue + then:^id _Nullable(NSArray *_Nullable wrappedActionAndData) { + // Process the actions for the reports on disk. + FIRCLSReportAction action = + [[wrappedActionAndData firstObject] reportActionValue]; + + if (action == FIRCLSReportActionSend) { + FIRCLSDebugLog(@"Sending unsent reports."); + FIRCLSDataCollectionToken *dataCollectionToken = + [FIRCLSDataCollectionToken validToken]; + + [self beginSettingsWithToken:dataCollectionToken]; + + [self beginReportUploadsWithToken:dataCollectionToken blockingSend:NO]; + + } else if (action == FIRCLSReportActionDelete) { + FIRCLSDebugLog(@"Deleting unsent reports."); + [self.existingReportManager deleteUnsentReports]; + } else { + FIRCLSErrorLog(@"Unknown report action: %d", action); + } + return @(report != nil); + }]; + } + + // To make the code more predictable and therefore testable, don't resolve the startup promise + // until the operations that got queued up for processing reports have been processed through the + // work queue. + NSOperationQueue *__weak queue = _operationQueue; + FBLPromise *__weak unsentReportsHandled = _unsentReportsHandled; + promise = [promise then:^id _Nullable(NSNumber *_Nullable value) { + FBLPromise *allOpsFinished = [FBLPromise pendingPromise]; + [queue addOperationWithBlock:^{ + [allOpsFinished fulfill:nil]; + }]; + + return [allOpsFinished onQueue:dispatch_get_main_queue() + then:^id _Nullable(id _Nullable allOpsFinishedValue) { + // Signal that to callers of processReports that everything is + // finished. + [unsentReportsHandled fulfill:nil]; + return value; + }]; + }]; + + return promise; +} + +- (void)beginSettingsWithToken:(FIRCLSDataCollectionToken *)token { + if (self.settings.isCacheExpired) { + // This method can be called more than once if the user calls + // SendUnsentReports again, so don't repeat the settings fetch + static dispatch_once_t settingsFetchOnceToken; + dispatch_once(&settingsFetchOnceToken, ^{ + [self.settingsManager beginSettingsWithGoogleAppId:self.googleAppID token:token]; + }); + } +} + +- (void)beginReportUploadsWithToken:(FIRCLSDataCollectionToken *)token + blockingSend:(BOOL)blockingSend { + if (self.settings.collectReportsEnabled) { + [self.existingReportManager sendUnsentReportsWithToken:token asUrgent:blockingSend]; + + } else { + FIRCLSInfoLog(@"Collect crash reports is disabled"); + [self.existingReportManager deleteUnsentReports]; + } +} + +- (FBLPromise *)startCrashReporterWithProfilingReport:(FIRCLSInternalReport *)report { + if (!report) { + return [FBLPromise resolvedWith:@NO]; + } + + return [[self.contextManager setupContextWithReport:report + settings:self.settings + fileManager:_fileManager] + then:^id _Nullable(id _Nullable value) { + [self.notificationManager registerNotificationListener]; + + [self.analyticsManager registerAnalyticsListener]; + + [self crashReportingSetupCompleted]; + + return [FBLPromise resolvedWith:@YES]; + }]; +} + +- (void)crashReportingSetupCompleted { + // check our handlers + FIRCLSDispatchAfter(2.0, dispatch_get_main_queue(), ^{ + FIRCLSExceptionCheckHandlers((__bridge void *)(self)); +#if CLS_SIGNAL_SUPPORTED + FIRCLSSignalCheckHandlers(); +#endif +#if CLS_MACH_EXCEPTION_SUPPORTED + FIRCLSMachExceptionCheckHandlers(); +#endif + }); + + // remove the launch failure marker and records and empty string since + // we're avoiding mach_absolute_time calls. + dispatch_async(dispatch_get_main_queue(), ^{ + [self.launchMarker removeLaunchFailureMarker]; + dispatch_async(FIRCLSGetLoggingQueue(), ^{ + FIRCLSUserLoggingWriteInternalKeyValue(FIRCLSFirstRunloopTurnTimeKey, @""); + }); + }); +} + +- (BOOL)validateAppIdentifiers { + // When the ApplicationIdentifierModel fails to initialize, it is usually due to + // failing computeExecutableInfo. This can happen if the user sets the + // Exported Symbols File in Build Settings, and leaves off the one symbol + // that Crashlytics needs, "__mh_execute_header" (which is defined in mach-o/ldsyms.h as + // _MH_EXECUTE_SYM). From https://github.com/firebase/firebase-ios-sdk/issues/5020 + if (!self.appIDModel) { + FIRCLSErrorLog(@"Crashlytics could not find the symbol for the app's main function and cannot " + @"start up. This can be resolved 2 ways depending on your setup:\n 1. If you " + @"have Exported Symbols File set in your Build Settings, add " + @"\"__mh_execute_header\" as a newline in your Exported Symbols File.\n 2. If " + @"you have -exported_symbols_list in your linker flags, remove it."); + return NO; + } + + if (self.appIDModel.bundleID.length == 0) { + FIRCLSErrorLog(@"An application must have a valid bundle identifier in its Info.plist"); + return NO; + } + + if ([self.dataArbiter isLegacyDataCollectionKeyInPlist]) { + FIRCLSErrorLog(@"Found legacy data collection key in app's Info.plist: " + @"firebase_crashlytics_collection_enabled"); + FIRCLSErrorLog(@"Please update your Info.plist to use the new data collection key: " + @"FirebaseCrashlyticsCollectionEnabled"); + FIRCLSErrorLog(@"The legacy data collection Info.plist value could be overridden by " + @"calling: [Fabric with:...]"); + FIRCLSErrorLog(@"The new value can be overridden by calling: [[FIRCrashlytics " + @"crashlytics] setCrashlyticsCollectionEnabled:]"); + + return NO; + } + + return YES; +} + +- (FIRCLSInternalReport *)setupCurrentReport:(NSString *)executionIdentifier { + [self.launchMarker createLaunchFailureMarker]; + + NSString *reportPath = [_fileManager setupNewPathForExecutionIdentifier:executionIdentifier]; + + return [[FIRCLSInternalReport alloc] initWithPath:reportPath + executionIdentifier:executionIdentifier]; +} + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSReportManager_Private.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSReportManager_Private.h new file mode 100644 index 0000000..5aa49dd --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSReportManager_Private.h @@ -0,0 +1,32 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "Crashlytics/Crashlytics/Controllers/FIRCLSReportManager.h" +#import "Crashlytics/Crashlytics/Controllers/FIRCLSReportUploader.h" +#import "Crashlytics/Crashlytics/Models/FIRCLSLaunchMarkerModel.h" + +@class FIRCLSInstallIdentifierModel; + +@interface FIRCLSReportManager () + +@property(nonatomic, strong) NSOperationQueue *operationQueue; +@property(nonatomic, strong) FIRCLSFileManager *fileManager; + +@end + +@interface FIRCLSReportManager (PrivateMethods) + +@property(nonatomic, strong) FIRCLSLaunchMarkerModel *launchMarker; + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSReportUploader.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSReportUploader.h new file mode 100644 index 0000000..3723a50 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSReportUploader.h @@ -0,0 +1,42 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +@class FIRCLSDataCollectionToken; +@class FIRCLSInternalReport; +@class FIRCLSManagerData; +@class FIRCLSFileManager; + +@interface FIRCLSReportUploader : NSObject + +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)new NS_UNAVAILABLE; +- (instancetype)initWithManagerData:(FIRCLSManagerData *)managerData NS_DESIGNATED_INITIALIZER; + +@property(nonatomic, readonly) NSOperationQueue *operationQueue; +@property(nonatomic, readonly) FIRCLSFileManager *fileManager; +@property(nonatomic, copy) NSString *fiid; +@property(nonatomic, copy) NSString *authToken; + +- (void)prepareAndSubmitReport:(FIRCLSInternalReport *)report + dataCollectionToken:(FIRCLSDataCollectionToken *)dataCollectionToken + asUrgent:(BOOL)urgent + withProcessing:(BOOL)shouldProcess; + +- (void)uploadPackagedReportAtPath:(NSString *)path + dataCollectionToken:(FIRCLSDataCollectionToken *)dataCollectionToken + asUrgent:(BOOL)urgent; + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSReportUploader.m b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSReportUploader.m new file mode 100644 index 0000000..d9d6b90 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSReportUploader.m @@ -0,0 +1,239 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "Interop/Analytics/Public/FIRAnalyticsInterop.h" + +#import "Crashlytics/Crashlytics/Components/FIRCLSApplication.h" +#import "Crashlytics/Crashlytics/Controllers/FIRCLSAnalyticsManager.h" +#import "Crashlytics/Crashlytics/Controllers/FIRCLSManagerData.h" +#import "Crashlytics/Crashlytics/Controllers/FIRCLSReportUploader_Private.h" +#import "Crashlytics/Crashlytics/DataCollection/FIRCLSDataCollectionToken.h" +#import "Crashlytics/Crashlytics/Helpers/FIRCLSDefines.h" +#import "Crashlytics/Crashlytics/Models/FIRCLSFileManager.h" +#import "Crashlytics/Crashlytics/Models/FIRCLSInstallIdentifierModel.h" +#import "Crashlytics/Crashlytics/Models/FIRCLSInternalReport.h" +#import "Crashlytics/Crashlytics/Models/FIRCLSSettings.h" +#import "Crashlytics/Crashlytics/Models/FIRCLSSymbolResolver.h" +#import "Crashlytics/Crashlytics/Models/Record/FIRCLSReportAdapter.h" +#import "Crashlytics/Crashlytics/Operations/Reports/FIRCLSProcessReportOperation.h" + +#include "Crashlytics/Crashlytics/Helpers/FIRCLSUtility.h" + +#import "Crashlytics/Shared/FIRCLSConstants.h" +#import "Crashlytics/Shared/FIRCLSNetworking/FIRCLSURLBuilder.h" + +#import + +@interface FIRCLSReportUploader () { + id _analytics; +} + +@property(nonatomic, strong) GDTCORTransport *googleTransport; +@property(nonatomic, strong) FIRCLSInstallIdentifierModel *installIDModel; + +@property(nonatomic, readonly) NSString *googleAppID; + +@end + +@implementation FIRCLSReportUploader + +- (instancetype)initWithManagerData:(FIRCLSManagerData *)managerData { + self = [super init]; + if (!self) { + return nil; + } + + _operationQueue = managerData.operationQueue; + _googleAppID = managerData.googleAppID; + _googleTransport = managerData.googleTransport; + _installIDModel = managerData.installIDModel; + _fileManager = managerData.fileManager; + _analytics = managerData.analytics; + + return self; +} + +#pragma mark - Packaging and Submission + +/* + * For a crash report, this is the initial code path for uploading. A report + * will not repeat this code path after it's happened because this code path + * will move the report from the "active" folder into "processing" and then + * "prepared". Once in prepared, the report can be re-uploaded any number of times + * with uploadPackagedReportAtPath in the case of an upload failure. + */ +- (void)prepareAndSubmitReport:(FIRCLSInternalReport *)report + dataCollectionToken:(FIRCLSDataCollectionToken *)dataCollectionToken + asUrgent:(BOOL)urgent + withProcessing:(BOOL)shouldProcess { + if (![dataCollectionToken isValid]) { + FIRCLSErrorLog(@"Data collection disabled and report will not be submitted"); + return; + } + + // This activity is still relevant using GoogleDataTransport because the on-device + // symbolication operation may be computationally intensive. + FIRCLSApplicationActivity( + FIRCLSApplicationActivityDefault, @"Crashlytics Crash Report Processing", ^{ + // Check to see if the FID has rotated before we construct the payload + // so that the payload has an updated value. + // + // If we're in urgent mode, this will be running on the main thread. Since + // the FIID callback is run on the main thread, this call can deadlock in + // urgent mode. Since urgent mode happens when the app is in a crash loop, + // we can safely assume users aren't rotating their FIID, so this can be skipped. + if (!urgent) { + [self.installIDModel regenerateInstallIDIfNeededWithBlock:^( + NSString *_Nonnull newFIID, NSString *_Nonnull authToken) { + self.fiid = [newFIID copy]; + self.authToken = [authToken copy]; + }]; + } else { + FIRCLSWarningLog( + @"Crashlytics skipped rotating the Install ID during urgent mode because it is run " + @"on the main thread, which can't succeed. This can happen if the app crashed the " + @"last run and Crashlytics is uploading urgently."); + } + + // Run on-device symbolication before packaging if we should process + if (shouldProcess) { + if (![self.fileManager moveItemAtPath:report.path + toDirectory:self.fileManager.processingPath]) { + FIRCLSErrorLog(@"Unable to move report for processing"); + return; + } + + // adjust the report's path, and process it + [report setPath:[self.fileManager.processingPath + stringByAppendingPathComponent:report.directoryName]]; + + FIRCLSSymbolResolver *resolver = [[FIRCLSSymbolResolver alloc] init]; + + FIRCLSProcessReportOperation *processOperation = + [[FIRCLSProcessReportOperation alloc] initWithReport:report resolver:resolver]; + + [processOperation start]; + } + + // With the new report endpoint, the report is deleted once it is written to GDT + // Check if the report has a crash file before the report is moved or deleted + BOOL isCrash = report.isCrash; + + // For the new endpoint, just move the .clsrecords from "processing" -> "prepared". + // In the old endpoint this was for packaging the report as a multipartmime file, + // so this can probably be removed for GoogleDataTransport. + if (![self.fileManager moveItemAtPath:report.path + toDirectory:self.fileManager.preparedPath]) { + FIRCLSErrorLog(@"Unable to move report to prepared"); + return; + } + + NSString *packagedPath = [self.fileManager.preparedPath + stringByAppendingPathComponent:report.path.lastPathComponent]; + + FIRCLSInfoLog(@"[Firebase/Crashlytics] Packaged report with id '%@' for submission", + report.identifier); + + [self uploadPackagedReportAtPath:packagedPath + dataCollectionToken:dataCollectionToken + asUrgent:urgent]; + + // We don't check for success here for 2 reasons: + // 1) If we can't upload a crash for whatever reason, but we can upload analytics + // it's better for the customer to get accurate Crash Free Users. + // 2) In the past we did try to check for success, but it was a useless check because + // sendDataEvent is async (unless we're sending urgently). + if (isCrash) { + [FIRCLSAnalyticsManager logCrashWithTimeStamp:report.crashedOnDate.timeIntervalSince1970 + toAnalytics:self->_analytics]; + } + }); + + return; +} + +/* + * This code path can be repeated any number of times for a prepared crash report if + * the report is failing to upload. + * + * Therefore, side effects (like logging to Analytics) should not go in this method or + * else they will re-trigger when failures happen. + * + * When a crash report fails to upload, it will stay in the "prepared" folder. Upon next + * run of the app, the ReportManager will attempt to re-upload prepared reports using this + * method. + */ +- (void)uploadPackagedReportAtPath:(NSString *)path + dataCollectionToken:(FIRCLSDataCollectionToken *)dataCollectionToken + asUrgent:(BOOL)urgent { + FIRCLSDebugLog(@"Submitting report %@", urgent ? @"urgently" : @"async"); + + if (![dataCollectionToken isValid]) { + FIRCLSErrorLog(@"A report upload was requested with an invalid data collection token."); + return; + } + + FIRCLSReportAdapter *adapter = [[FIRCLSReportAdapter alloc] initWithPath:path + googleAppId:self.googleAppID + installIDModel:self.installIDModel + fiid:self.fiid + authToken:self.authToken]; + + GDTCOREvent *event = [self.googleTransport eventForTransport]; + event.dataObject = adapter; + event.qosTier = GDTCOREventQoSFast; // Bypass batching, send immediately + + dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); + + [self.googleTransport + sendDataEvent:event + onComplete:^(BOOL wasWritten, NSError *error) { + if (!wasWritten) { + FIRCLSErrorLog( + @"Failed to send crash report due to failure writing GoogleDataTransport event"); + dispatch_semaphore_signal(semaphore); + return; + } + + if (error) { + FIRCLSErrorLog(@"Failed to send crash report due to GoogleDataTransport error: %@", + error.localizedDescription); + dispatch_semaphore_signal(semaphore); + return; + } + + FIRCLSInfoLog(@"Completed report submission with id: %@", path.lastPathComponent); + + if (urgent) { + dispatch_semaphore_signal(semaphore); + } + + [self cleanUpSubmittedReportAtPath:path]; + }]; + + if (urgent) { + dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); + } +} + +- (BOOL)cleanUpSubmittedReportAtPath:(NSString *)path { + if (![[self fileManager] removeItemAtPath:path]) { + FIRCLSErrorLog(@"Unable to remove packaged submission"); + return NO; + } + + return YES; +} + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSReportUploader_Private.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSReportUploader_Private.h new file mode 100644 index 0000000..020890d --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSReportUploader_Private.h @@ -0,0 +1,23 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "Crashlytics/Crashlytics/Controllers/FIRCLSReportUploader.h" + +@interface FIRCLSReportUploader (PrivateMethods) + +@property(nonatomic, readonly) NSURL *reportURL; + +- (NSMutableURLRequest *)mutableRequestWithURL:(NSURL *)url timeout:(NSTimeInterval)timeout; + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSRolloutsPersistenceManager.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSRolloutsPersistenceManager.h new file mode 100644 index 0000000..adbac49 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSRolloutsPersistenceManager.h @@ -0,0 +1,36 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#if SWIFT_PACKAGE +@import FirebaseCrashlyticsSwift; +#elif __has_include() +#import +#elif __has_include("FirebaseCrashlytics-Swift.h") +// If frameworks are not available, fall back to importing the header as it +// should be findable from a header search path pointing to the build +// directory. See #12611 for more context. +#import "FirebaseCrashlytics-Swift.h" +#endif + +@interface FIRCLSRolloutsPersistenceManager : NSObject + +- (instancetype _Nullable)initWithFileManager:(FIRCLSFileManager *_Nonnull)fileManager + andQueue:(dispatch_queue_t _Nonnull)queue; +- (instancetype _Nonnull)init NS_UNAVAILABLE; ++ (instancetype _Nonnull)new NS_UNAVAILABLE; + +- (void)updateRolloutsStateToPersistenceWithRollouts:(NSData *_Nonnull)rollouts + reportID:(NSString *_Nonnull)reportID; +- (void)debugLogWithMessage:(NSString *_Nonnull)message; +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSRolloutsPersistenceManager.m b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSRolloutsPersistenceManager.m new file mode 100644 index 0000000..3087607 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Controllers/FIRCLSRolloutsPersistenceManager.m @@ -0,0 +1,91 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import +#include "Crashlytics/Crashlytics/Components/FIRCLSUserLogging.h" +#import "Crashlytics/Crashlytics/Helpers/FIRCLSLogger.h" +#import "Crashlytics/Crashlytics/Models/FIRCLSFileManager.h" +#import "Crashlytics/Crashlytics/Models/FIRCLSInternalReport.h" + +#if SWIFT_PACKAGE +@import FirebaseCrashlyticsSwift; +#elif __has_include() +#import +#elif __has_include("FirebaseCrashlytics-Swift.h") +// If frameworks are not available, fall back to importing the header as it +// should be findable from a header search path pointing to the build +// directory. See #12611 for more context. +#import "FirebaseCrashlytics-Swift.h" +#endif + +@interface FIRCLSRolloutsPersistenceManager : NSObject +@property(nonatomic, readonly) FIRCLSFileManager *fileManager; +@property(nonnull, nonatomic, readonly) dispatch_queue_t rolloutsLoggingQueue; +@end + +@implementation FIRCLSRolloutsPersistenceManager +- (instancetype)initWithFileManager:(FIRCLSFileManager *)fileManager + andQueue:(dispatch_queue_t)queue { + self = [super init]; + if (!self) { + return nil; + } + _fileManager = fileManager; + + if (!queue) { + FIRCLSDebugLog(@"Failed to initialize FIRCLSRolloutsPersistenceManager, logging queue is nil"); + return nil; + } + _rolloutsLoggingQueue = queue; + return self; +} + +- (void)updateRolloutsStateToPersistenceWithRollouts:(NSData *_Nonnull)rollouts + reportID:(NSString *_Nonnull)reportID { + NSString *rolloutsPath = [[[_fileManager activePath] stringByAppendingPathComponent:reportID] + stringByAppendingPathComponent:FIRCLSReportRolloutsFile]; + if (![_fileManager fileExistsAtPath:rolloutsPath]) { + if (![_fileManager createFileAtPath:rolloutsPath contents:nil attributes:nil]) { + FIRCLSDebugLog(@"Could not create rollouts.clsrecord file. Error was code: %d - message: %s", + errno, strerror(errno)); + return; + } + } + + NSFileHandle *rolloutsFile = [NSFileHandle fileHandleForUpdatingAtPath:rolloutsPath]; + + if (!_rolloutsLoggingQueue) { + FIRCLSDebugLog(@"Rollouts logging queue is dealloccated"); + return; + } + + dispatch_async(_rolloutsLoggingQueue, ^{ + @try { + [rolloutsFile seekToEndOfFile]; + NSMutableData *rolloutsWithNewLineData = [rollouts mutableCopy]; + [rolloutsWithNewLineData appendData:[@"\n" dataUsingEncoding:NSUTF8StringEncoding]]; + [rolloutsFile writeData:rolloutsWithNewLineData]; + [rolloutsFile closeFile]; + } @catch (NSException *exception) { + FIRCLSDebugLog(@"Failed to write new rollouts. Exception name: %s - message: %s", + exception.name, exception.reason); + } + }); +} + +- (void)debugLogWithMessage:(NSString *_Nonnull)message { + FIRCLSDebugLog(message); +} + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/DataCollection/FIRCLSDataCollectionArbiter.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/DataCollection/FIRCLSDataCollectionArbiter.h new file mode 100644 index 0000000..147bc7b --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/DataCollection/FIRCLSDataCollectionArbiter.h @@ -0,0 +1,39 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +@class FIRApp; +@class FBLPromise; + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRCLSDataCollectionArbiter : NSObject + +- (instancetype)init NS_UNAVAILABLE; + +- (instancetype)initWithApp:(FIRApp *)app withAppInfo:(NSDictionary *)dict; + +- (BOOL)isLegacyDataCollectionKeyInPlist; + +- (BOOL)isCrashlyticsCollectionEnabled; + +- (void)setCrashlyticsCollectionEnabled:(BOOL)enabled; + +// Returns a promise that is fulfilled once data collection is enabled. +- (FBLPromise *)waitForCrashlyticsCollectionEnabled; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/DataCollection/FIRCLSDataCollectionArbiter.m b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/DataCollection/FIRCLSDataCollectionArbiter.m new file mode 100644 index 0000000..834e7e8 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/DataCollection/FIRCLSDataCollectionArbiter.m @@ -0,0 +1,147 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "Crashlytics/Crashlytics/DataCollection/FIRCLSDataCollectionArbiter.h" + +#if __has_include() +#import +#else +#import "FBLPromises.h" +#endif + +#import "FirebaseCore/Extension/FirebaseCoreInternal.h" + +#import "Crashlytics/Crashlytics/FIRCLSUserDefaults/FIRCLSUserDefaults.h" + +// The legacy data collection setting allows Fabric customers to turn off auto- +// initialization, but can be overridden by calling [Fabric with:]. +// +// While we support Fabric, we must have two different versions, because +// they require these slightly different semantics. +NSString *const FIRCLSLegacyCrashlyticsCollectionKey = @"firebase_crashlytics_collection_enabled"; + +// The new data collection setting can be set by an API that is stored in FIRCLSUserDefaults +NSString *const FIRCLSDataCollectionEnabledKey = @"com.crashlytics.data_collection"; + +// The new data collection setting also allows Firebase customers to turn off data +// collection in their Info.plist, and can be overridden by setting it to true using +// the setCrashlyticsCollectionEnabled API. +NSString *const FIRCLSCrashlyticsCollectionKey = @"FirebaseCrashlyticsCollectionEnabled"; + +typedef NS_ENUM(NSInteger, FIRCLSDataCollectionSetting) { + FIRCLSDataCollectionSettingNotSet = 0, + FIRCLSDataCollectionSettingEnabled = 1, + FIRCLSDataCollectionSettingDisabled = 2, +}; + +@interface FIRCLSDataCollectionArbiter () { + NSLock *_mutex; + FBLPromise *_dataCollectionEnabled; + BOOL _promiseResolved; + FIRApp *_app; + NSDictionary *_appInfo; +} +@end + +@implementation FIRCLSDataCollectionArbiter + +- (instancetype)initWithApp:(FIRApp *)app withAppInfo:(NSDictionary *)dict { + self = [super init]; + if (self) { + _mutex = [[NSLock alloc] init]; + _appInfo = dict; + _app = app; + if ([FIRCLSDataCollectionArbiter isCrashlyticsCollectionEnabledWithApp:app withAppInfo:dict]) { + _dataCollectionEnabled = [FBLPromise resolvedWith:nil]; + _promiseResolved = YES; + } else { + _dataCollectionEnabled = [FBLPromise pendingPromise]; + _promiseResolved = NO; + } + } + + return self; +} + +/* + * Legacy collection key that we provide for customers to disable Crash reporting. + * Customers can later turn on Crashlytics using Fabric.with if they choose to do so. + * + * This flag is unsupported for the "New SDK" + */ +- (BOOL)isLegacyDataCollectionKeyInPlist { + if ([_appInfo objectForKey:FIRCLSLegacyCrashlyticsCollectionKey]) { + return true; + } + + return false; +} + +// This functionality is called in the initializer before self is fully initialized, +// so a class method is used. The instance method below allows for a consistent clean API. ++ (BOOL)isCrashlyticsCollectionEnabledWithApp:(FIRApp *)app withAppInfo:(NSDictionary *)dict { + FIRCLSDataCollectionSetting stickySetting = [FIRCLSDataCollectionArbiter stickySetting]; + if (stickySetting != FIRCLSDataCollectionSettingNotSet) { + return stickySetting == FIRCLSDataCollectionSettingEnabled; + } + + id firebaseCrashlyticsCollectionEnabled = [dict objectForKey:FIRCLSCrashlyticsCollectionKey]; + if ([firebaseCrashlyticsCollectionEnabled isKindOfClass:[NSString class]] || + [firebaseCrashlyticsCollectionEnabled isKindOfClass:[NSNumber class]]) { + return [firebaseCrashlyticsCollectionEnabled boolValue]; + } + return [app isDataCollectionDefaultEnabled]; +} + +- (BOOL)isCrashlyticsCollectionEnabled { + return [FIRCLSDataCollectionArbiter isCrashlyticsCollectionEnabledWithApp:_app + withAppInfo:_appInfo]; +} + +- (void)setCrashlyticsCollectionEnabled:(BOOL)enabled { + FIRCLSUserDefaults *userDefaults = [FIRCLSUserDefaults standardUserDefaults]; + FIRCLSDataCollectionSetting setting = + enabled ? FIRCLSDataCollectionSettingEnabled : FIRCLSDataCollectionSettingDisabled; + [userDefaults setInteger:setting forKey:FIRCLSDataCollectionEnabledKey]; + [userDefaults synchronize]; + + [_mutex lock]; + if (enabled) { + if (!_promiseResolved) { + [_dataCollectionEnabled fulfill:nil]; + _promiseResolved = YES; + } + } else { + if (_promiseResolved) { + _dataCollectionEnabled = [FBLPromise pendingPromise]; + _promiseResolved = NO; + } + } + [_mutex unlock]; +} + ++ (FIRCLSDataCollectionSetting)stickySetting { + FIRCLSUserDefaults *userDefaults = [FIRCLSUserDefaults standardUserDefaults]; + return [userDefaults integerForKey:FIRCLSDataCollectionEnabledKey]; +} + +- (FBLPromise *)waitForCrashlyticsCollectionEnabled { + FBLPromise *result = nil; + [_mutex lock]; + result = _dataCollectionEnabled; + [_mutex unlock]; + return result; +} + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/DataCollection/FIRCLSDataCollectionToken.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/DataCollection/FIRCLSDataCollectionToken.h new file mode 100644 index 0000000..769164b --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/DataCollection/FIRCLSDataCollectionToken.h @@ -0,0 +1,46 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + * A FIRCLSDataCollectionToken represents having permission to upload data. A data collection token + * is either valid or nil. Every function that directly initiates a network operation that will + * result in data collection must check to make sure it has been passed a valid token. Tokens should + * only be created when either (1) automatic data collection is enabled, or (2) the user has + * explicitly given permission to collect data for a particular purpose, using the API. For all the + * functions in between, the data collection token getting passed as an argument helps to document + * and enforce the flow of data collection permission through the SDK. + */ +@interface FIRCLSDataCollectionToken : NSObject + +/** + * Creates a valid token. Only call this method when either (1) automatic data collection is + * enabled, or (2) the user has explicitly given permission to collect data for a particular + * purpose, using the API. + */ ++ (instancetype)validToken; + +/** + * Use this to verify that a token is valid. If this is called on a nil instance, it will return + * false. + * @return true. + */ +- (BOOL)isValid; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/DataCollection/FIRCLSDataCollectionToken.m b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/DataCollection/FIRCLSDataCollectionToken.m new file mode 100644 index 0000000..5dbde6e --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/DataCollection/FIRCLSDataCollectionToken.m @@ -0,0 +1,27 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "Crashlytics/Crashlytics/DataCollection/FIRCLSDataCollectionToken.h" + +@implementation FIRCLSDataCollectionToken + ++ (instancetype)validToken { + return [[FIRCLSDataCollectionToken alloc] init]; +} + +- (BOOL)isValid { + return YES; +} + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/FIRCLSUserDefaults/FIRCLSUserDefaults.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/FIRCLSUserDefaults/FIRCLSUserDefaults.h new file mode 100644 index 0000000..6df1532 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/FIRCLSUserDefaults/FIRCLSUserDefaults.h @@ -0,0 +1,42 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +extern NSString *const FIRCLSUserDefaultsPathComponent; + +@interface FIRCLSUserDefaults : NSObject + ++ (instancetype)standardUserDefaults; + +- (id)objectForKey:(NSString *)key; +- (NSString *)stringForKey:(NSString *)key; +- (BOOL)boolForKey:(NSString *)key; +- (NSInteger)integerForKey:(NSString *)key; + +- (void)setObject:(id)object forKey:(NSString *)key; +- (void)setString:(NSString *)string forKey:(NSString *)key; +- (void)setBool:(BOOL)boolean forKey:(NSString *)key; +- (void)setInteger:(NSInteger)integer forKey:(NSString *)key; + +- (void)removeObjectForKey:(NSString *)key; +- (void)removeAllObjects; + +- (NSDictionary *)dictionaryRepresentation; + +- (void)migrateFromNSUserDefaults:(NSArray *)keysToMigrate; +- (id)objectForKeyByMigratingFromNSUserDefaults:(NSString *)keyToMigrateOrNil; +- (void)synchronize; + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/FIRCLSUserDefaults/FIRCLSUserDefaults.m b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/FIRCLSUserDefaults/FIRCLSUserDefaults.m new file mode 100644 index 0000000..a9b4577 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/FIRCLSUserDefaults/FIRCLSUserDefaults.m @@ -0,0 +1,372 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "Crashlytics/Crashlytics/FIRCLSUserDefaults/FIRCLSUserDefaults.h" + +#import "Crashlytics/Crashlytics/Components/FIRCLSApplication.h" +#import "Crashlytics/Crashlytics/Helpers/FIRCLSLogger.h" + +#define CLS_USER_DEFAULTS_SERIAL_DISPATCH_QUEUE "com.crashlytics.CLSUserDefaults.access" +#define CLS_USER_DEFAULTS_SYNC_QUEUE "com.crashlytics.CLSUserDefaults.io" + +#define CLS_TARGET_CAN_WRITE_TO_DISK !TARGET_OS_TV + +// These values are required to stay the same between versions of the SDK so +// that when end users upgrade, their crashlytics data is still saved on disk. +#if !CLS_TARGET_CAN_WRITE_TO_DISK +static NSString *const FIRCLSNSUserDefaultsDataDictionaryKey = + @"com.crashlytics.CLSUserDefaults.user-default-key.data-dictionary"; +#endif + +NSString *const FIRCLSUserDefaultsPathComponent = @"CLSUserDefaults"; + +/** + * This class is an isolated re-implementation of UserDefaults which isolates our storage + * from that of our customers. This solves a number of issues we have seen in production, firstly + * that customers often delete or clear UserDefaults, unintentionally deleting our data. + * Further, we have seen thread safety issues in production with UserDefaults, as well as a number + * of bugs related to accessing UserDefaults before the device has been unlocked due to the + * FileProtection of UserDefaults. + */ +@interface FIRCLSUserDefaults () +@property(nonatomic, readwrite) BOOL synchronizeWroteToDisk; +#if CLS_TARGET_CAN_WRITE_TO_DISK +@property(nonatomic, copy, readonly) NSURL *directoryURL; +@property(nonatomic, copy, readonly) NSURL *fileURL; +#endif +@property(nonatomic, copy, readonly) + NSDictionary *persistedDataDictionary; // May only be safely accessed on the DictionaryQueue +@property(nonatomic, copy, readonly) + NSMutableDictionary *dataDictionary; // May only be safely accessed on the DictionaryQueue +@property(nonatomic, readonly) dispatch_queue_t + serialDictionaryQueue; // The queue on which all access to the dataDictionary occurs. +@property(nonatomic, readonly) + dispatch_queue_t synchronizationQueue; // The queue on which all disk access occurs. + +@end + +@implementation FIRCLSUserDefaults + +#pragma mark - singleton + ++ (instancetype)standardUserDefaults { + static FIRCLSUserDefaults *standardUserDefaults = nil; + static dispatch_once_t onceToken; + + dispatch_once(&onceToken, ^{ + standardUserDefaults = [[super allocWithZone:NULL] init]; + }); + + return standardUserDefaults; +} + +- (id)copyWithZone:(NSZone *)zone { + return self; +} + +- (id)init { + if (self = [super init]) { + _serialDictionaryQueue = + dispatch_queue_create(CLS_USER_DEFAULTS_SERIAL_DISPATCH_QUEUE, DISPATCH_QUEUE_SERIAL); + _synchronizationQueue = + dispatch_queue_create(CLS_USER_DEFAULTS_SYNC_QUEUE, DISPATCH_QUEUE_SERIAL); + + dispatch_sync(self.serialDictionaryQueue, ^{ +#if CLS_TARGET_CAN_WRITE_TO_DISK + self->_directoryURL = [self generateDirectoryURL]; + self->_fileURL = [[self->_directoryURL + URLByAppendingPathComponent:FIRCLSUserDefaultsPathComponent + isDirectory:NO] URLByAppendingPathExtension:@"plist"]; +#endif + self->_persistedDataDictionary = [self loadDefaults]; + if (!self->_persistedDataDictionary) { + self->_persistedDataDictionary = [NSDictionary dictionary]; + } + self->_dataDictionary = [self->_persistedDataDictionary mutableCopy]; + }); + } + return self; +} + +- (NSURL *)generateDirectoryURL { + NSURL *directoryBaseURL = + [[[NSFileManager defaultManager] URLsForDirectory:NSApplicationSupportDirectory + inDomains:NSUserDomainMask] lastObject]; + NSString *hostAppBundleIdentifier = [self getEscapedAppBundleIdentifier]; + return [self generateDirectoryURLForBaseURL:directoryBaseURL + hostAppBundleIdentifier:hostAppBundleIdentifier]; +} + +- (NSURL *)generateDirectoryURLForBaseURL:(NSURL *)directoryBaseURL + hostAppBundleIdentifier:(NSString *)hostAppBundleIdentifier { + NSURL *directoryURL = directoryBaseURL; + // On iOS NSApplicationSupportDirectory is contained in the app's bundle. On OSX, it is not (it is + // ~/Library/Application Support/). On OSX we create a directory + // ~/Library/Application Support//com.crashlytics/ for storing files. + // Mac App Store review process requires files to be written to + // ~/Library/Application Support//, + // so ~/Library/Application Support/com.crashlytics// cannot be used. +#if !TARGET_OS_SIMULATOR && !TARGET_OS_EMBEDDED + if (hostAppBundleIdentifier) { + directoryURL = [directoryURL URLByAppendingPathComponent:hostAppBundleIdentifier]; + } +#endif + directoryURL = [directoryURL URLByAppendingPathComponent:@"com.crashlytics"]; + return directoryURL; +} + +- (NSString *)getEscapedAppBundleIdentifier { + return FIRCLSApplicationGetBundleIdentifier(); +} + +#pragma mark - fetch object + +- (id)objectForKey:(NSString *)key { + __block id result; + + dispatch_sync(self.serialDictionaryQueue, ^{ + result = [self->_dataDictionary objectForKey:key]; + }); + + return result; +} + +- (NSString *)stringForKey:(NSString *)key { + id result = [self objectForKey:key]; + + if (result != nil && [result isKindOfClass:[NSString class]]) { + return (NSString *)result; + } else { + return nil; + } +} + +- (BOOL)boolForKey:(NSString *)key { + id result = [self objectForKey:key]; + if (result != nil && [result isKindOfClass:[NSNumber class]]) { + return [(NSNumber *)result boolValue]; + } else { + return NO; + } +} + +// Defaults to 0 +- (NSInteger)integerForKey:(NSString *)key { + id result = [self objectForKey:key]; + if (result && [result isKindOfClass:[NSNumber class]]) { + return [(NSNumber *)result integerValue]; + } else { + return 0; + } +} + +#pragma mark - set object + +- (void)setObject:(id)object forKey:(NSString *)key { + dispatch_sync(self.serialDictionaryQueue, ^{ + [self->_dataDictionary setValue:object forKey:key]; + }); +} + +- (void)setString:(NSString *)string forKey:(NSString *)key { + [self setObject:string forKey:key]; +} + +- (void)setBool:(BOOL)boolean forKey:(NSString *)key { + [self setObject:[NSNumber numberWithBool:boolean] forKey:key]; +} + +- (void)setInteger:(NSInteger)integer forKey:(NSString *)key { + [self setObject:[NSNumber numberWithInteger:integer] forKey:key]; +} + +#pragma mark - removing objects + +- (void)removeObjectForKey:(NSString *)key { + dispatch_sync(self.serialDictionaryQueue, ^{ + [self->_dataDictionary removeObjectForKey:key]; + }); +} + +- (void)removeAllObjects { + dispatch_sync(self.serialDictionaryQueue, ^{ + [self->_dataDictionary removeAllObjects]; + }); +} + +#pragma mark - dictionary representation + +- (NSDictionary *)dictionaryRepresentation { + __block NSDictionary *result; + + dispatch_sync(self.serialDictionaryQueue, ^{ + result = [self->_dataDictionary copy]; + }); + + return result; +} + +#pragma mark - synchronization + +- (void)synchronize { + __block BOOL dirty = NO; + + // only write to the disk if the dictionaries have changed + dispatch_sync(self.serialDictionaryQueue, ^{ + dirty = ![self->_persistedDataDictionary isEqualToDictionary:self->_dataDictionary]; + }); + + _synchronizeWroteToDisk = dirty; + if (!dirty) { + return; + } + + NSDictionary *state = [self dictionaryRepresentation]; + dispatch_sync(self.synchronizationQueue, ^{ +#if CLS_TARGET_CAN_WRITE_TO_DISK + BOOL isDirectory = NO; + BOOL pathExists = [[NSFileManager defaultManager] fileExistsAtPath:[self->_directoryURL path] + isDirectory:&isDirectory]; + + if (!pathExists) { + NSError *error; + if (![[NSFileManager defaultManager] createDirectoryAtURL:self->_directoryURL + withIntermediateDirectories:YES + attributes:nil + error:&error]) { + FIRCLSErrorLog(@"Failed to create directory with error: %@", error); + } + } + + if (![state writeToURL:self->_fileURL atomically:YES]) { + FIRCLSErrorLog(@"Unable to open file for writing at path %@", [self->_fileURL path]); + } else { +#if TARGET_OS_IOS + // We disable NSFileProtection on our file in order to allow us to access it even if the + // device is locked. + NSError *error; + if (![[NSFileManager defaultManager] + setAttributes:@{NSFileProtectionKey : NSFileProtectionNone} + ofItemAtPath:[self->_fileURL path] + error:&error]) { + FIRCLSErrorLog(@"Error setting NSFileProtection: %@", error); + } +#endif + } +#else + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + [defaults setObject:state forKey:FIRCLSNSUserDefaultsDataDictionaryKey]; + [defaults synchronize]; +#endif + }); + + dispatch_sync(self.serialDictionaryQueue, ^{ + self->_persistedDataDictionary = [self->_dataDictionary copy]; + }); +} + +- (NSDictionary *)loadDefaults { + __block NSDictionary *state = nil; + dispatch_sync(self.synchronizationQueue, ^{ +#if CLS_TARGET_CAN_WRITE_TO_DISK + BOOL isDirectory = NO; + BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:[self->_fileURL path] + isDirectory:&isDirectory]; + + if (fileExists && !isDirectory) { + state = [NSDictionary dictionaryWithContentsOfURL:self->_fileURL]; + if (nil == state) { + FIRCLSErrorLog(@"Failed to read existing UserDefaults file"); + } + } else if (!fileExists) { + // No file found. This is expected on first launch. + } else if (fileExists && isDirectory) { + FIRCLSErrorLog(@"Found directory where file expected. Removing conflicting directory"); + + NSError *error; + if (![[NSFileManager defaultManager] removeItemAtURL:self->_fileURL error:&error]) { + FIRCLSErrorLog(@"Error removing conflicting directory: %@", error); + } + } +#else + state = [[NSUserDefaults standardUserDefaults] dictionaryForKey:FIRCLSNSUserDefaultsDataDictionaryKey]; +#endif + }); + return state; +} + +#pragma mark - migration + +// This method migrates all keys specified from UserDefaults to FIRCLSUserDefaults +// To do so, we copy all known key-value pairs into FIRCLSUserDefaults, synchronize it, then +// remove the keys from UserDefaults and synchronize it. +- (void)migrateFromNSUserDefaults:(NSArray *)keysToMigrate { + BOOL didFindKeys = NO; + + // First, copy all of the keysToMigrate which are stored UserDefaults + for (NSString *key in keysToMigrate) { + id oldValue = [[NSUserDefaults standardUserDefaults] objectForKey:(NSString *)key]; + if (nil != oldValue) { + didFindKeys = YES; + [self setObject:oldValue forKey:key]; + } + } + + if (didFindKeys) { + // First synchronize FIRCLSUserDefaults such that all keysToMigrate in UserDefaults are stored + // in FIRCLSUserDefaults. At this point, data is duplicated. + [[FIRCLSUserDefaults standardUserDefaults] synchronize]; + + for (NSString *key in keysToMigrate) { + [[NSUserDefaults standardUserDefaults] removeObjectForKey:(NSString *)key]; + } + + // This should be our last interaction with UserDefaults. All data is migrated into + // FIRCLSUserDefaults + [[NSUserDefaults standardUserDefaults] synchronize]; + } +} + +// This method first queries FIRCLSUserDefaults to see if the key exist, and upon failure, +// searches for the key in UserDefaults, and migrates it if found. +- (id)objectForKeyByMigratingFromNSUserDefaults:(NSString *)keyToMigrateOrNil { + if (!keyToMigrateOrNil) { + return nil; + } + + id clsUserDefaultsValue = [self objectForKey:keyToMigrateOrNil]; + if (clsUserDefaultsValue != nil) { + return clsUserDefaultsValue; // if the value exists in FIRCLSUserDefaults, return it. + } + + id oldNSUserDefaultsValue = + [[NSUserDefaults standardUserDefaults] objectForKey:keyToMigrateOrNil]; + if (!oldNSUserDefaultsValue) { + return nil; // if the value also does not exist in UserDefaults, return nil. + } + + // Otherwise, the key exists in UserDefaults. Migrate it to FIRCLSUserDefaults + // and then return the associated value. + + // First store it in FIRCLSUserDefaults so in the event of a crash, data is not lost. + [self setObject:oldNSUserDefaultsValue forKey:keyToMigrateOrNil]; + [[FIRCLSUserDefaults standardUserDefaults] synchronize]; + + [[NSUserDefaults standardUserDefaults] removeObjectForKey:keyToMigrateOrNil]; + [[NSUserDefaults standardUserDefaults] synchronize]; + + return oldNSUserDefaultsValue; +} + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/FIRCLSUserDefaults/FIRCLSUserDefaults_private.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/FIRCLSUserDefaults/FIRCLSUserDefaults_private.h new file mode 100644 index 0000000..b8415d5 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/FIRCLSUserDefaults/FIRCLSUserDefaults_private.h @@ -0,0 +1,23 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import +#import "Crashlytics/Crashlytics/FIRCLSUserDefaults/FIRCLSUserDefaults.h" + +@interface FIRCLSUserDefaults (Private) +- (BOOL)synchronizeWroteToDisk; +- (NSDictionary *)loadDefaults; +- (NSURL *)generateDirectoryURLForBaseURL:(NSURL *)directoryBaseURL + hostAppBundleIdentifier:(NSString *)hostAppBundleIdentifier; +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/FIRCrashlytics.m b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/FIRCrashlytics.m new file mode 100644 index 0000000..09e7339 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/FIRCrashlytics.m @@ -0,0 +1,469 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include + +#if __has_include() +#import +#else +#import "FBLPromises.h" +#endif + +#include "Crashlytics/Crashlytics/Components/FIRCLSCrashedMarkerFile.h" +#include "Crashlytics/Crashlytics/Components/FIRCLSGlobals.h" +#import "Crashlytics/Crashlytics/Components/FIRCLSHost.h" +#include "Crashlytics/Crashlytics/Components/FIRCLSUserLogging.h" +#import "Crashlytics/Crashlytics/DataCollection/FIRCLSDataCollectionArbiter.h" +#import "Crashlytics/Crashlytics/DataCollection/FIRCLSDataCollectionToken.h" +#import "Crashlytics/Crashlytics/FIRCLSUserDefaults/FIRCLSUserDefaults.h" +#include "Crashlytics/Crashlytics/Handlers/FIRCLSException.h" +#import "Crashlytics/Crashlytics/Helpers/FIRCLSDefines.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSUtility.h" +#import "Crashlytics/Crashlytics/Models/FIRCLSExecutionIdentifierModel.h" +#import "Crashlytics/Crashlytics/Models/FIRCLSFileManager.h" +#import "Crashlytics/Crashlytics/Models/FIRCLSSettings.h" +#import "Crashlytics/Crashlytics/Settings/Models/FIRCLSApplicationIdentifierModel.h" + +#import "Crashlytics/Crashlytics/Helpers/FIRCLSLogger.h" +#import "Crashlytics/Shared/FIRCLSByteUtility.h" +#import "Crashlytics/Shared/FIRCLSConstants.h" +#import "Crashlytics/Shared/FIRCLSFABHost.h" + +#import "Crashlytics/Crashlytics/Controllers/FIRCLSAnalyticsManager.h" +#import "Crashlytics/Crashlytics/Controllers/FIRCLSContextManager.h" +#import "Crashlytics/Crashlytics/Controllers/FIRCLSExistingReportManager.h" +#import "Crashlytics/Crashlytics/Controllers/FIRCLSManagerData.h" +#import "Crashlytics/Crashlytics/Controllers/FIRCLSNotificationManager.h" +#import "Crashlytics/Crashlytics/Controllers/FIRCLSReportManager.h" +#import "Crashlytics/Crashlytics/Controllers/FIRCLSReportUploader.h" +#import "Crashlytics/Crashlytics/Controllers/FIRCLSRolloutsPersistenceManager.h" +#import "Crashlytics/Crashlytics/Private/FIRCLSExistingReportManager_Private.h" +#import "Crashlytics/Crashlytics/Private/FIRCLSOnDemandModel_Private.h" +#import "Crashlytics/Crashlytics/Private/FIRExceptionModel_Private.h" + +#import "FirebaseCore/Extension/FirebaseCoreInternal.h" +#import "FirebaseInstallations/Source/Library/Private/FirebaseInstallationsInternal.h" +#import "Interop/Analytics/Public/FIRAnalyticsInterop.h" + +#import + +@import FirebaseSessions; +@import FirebaseRemoteConfigInterop; +#if SWIFT_PACKAGE +@import FirebaseCrashlyticsSwift; +#elif __has_include() +#import +#elif __has_include("FirebaseCrashlytics-Swift.h") +// If frameworks are not available, fall back to importing the header as it +// should be findable from a header search path pointing to the build +// directory. See #12611 for more context. +#import "FirebaseCrashlytics-Swift.h" +#endif + +#if TARGET_OS_IPHONE +#import +#endif + +FIRCLSContext _firclsContext; +dispatch_queue_t _firclsLoggingQueue; +dispatch_queue_t _firclsBinaryImageQueue; +dispatch_queue_t _firclsExceptionQueue; + +static atomic_bool _hasInitializedInstance; + +NSString *const FIRCLSGoogleTransportMappingID = @"1206"; + +/// Empty protocol to register with FirebaseCore's component system. +@protocol FIRCrashlyticsInstanceProvider +@end + +@interface FIRCrashlytics () + +@property(nonatomic) BOOL didPreviouslyCrash; +@property(nonatomic, copy) NSString *googleAppID; +@property(nonatomic) FIRCLSDataCollectionArbiter *dataArbiter; +@property(nonatomic) FIRCLSFileManager *fileManager; + +@property(nonatomic) FIRCLSReportManager *reportManager; + +@property(nonatomic) FIRCLSReportUploader *reportUploader; + +@property(nonatomic, strong) FIRCLSExistingReportManager *existingReportManager; + +@property(nonatomic, strong) FIRCLSAnalyticsManager *analyticsManager; + +@property(nonatomic, strong) FIRCLSRemoteConfigManager *remoteConfigManager; + +// Dependencies common to each of the Controllers +@property(nonatomic, strong) FIRCLSManagerData *managerData; + +@property(nonatomic, nullable) FBLPromise *contextInitPromise; + +@end + +@implementation FIRCrashlytics + +#pragma mark - Singleton Support + +- (instancetype)initWithApp:(FIRApp *)app + appInfo:(NSDictionary *)appInfo + installations:(FIRInstallations *)installations + analytics:(id)analytics + sessions:(id)sessions + remoteConfig:(id)remoteConfig { + self = [super init]; + + if (self) { + bool expectedCalled = NO; + if (!atomic_compare_exchange_strong(&_hasInitializedInstance, &expectedCalled, YES)) { + FIRCLSErrorLog(@"Cannot instantiate more than one instance of Crashlytics."); + return nil; + } + + NSLog(@"[Firebase/Crashlytics] Version %@", FIRCLSSDKVersion()); + + FIRCLSDeveloperLog("Crashlytics", @"Running on %@, %@ (%@)", FIRCLSHostModelInfo(), + FIRCLSHostOSDisplayVersion(), FIRCLSHostOSBuildVersion()); + + GDTCORTransport *googleTransport = + [[GDTCORTransport alloc] initWithMappingID:FIRCLSGoogleTransportMappingID + transformers:nil + target:kGDTCORTargetCSH]; + + _fileManager = [[FIRCLSFileManager alloc] init]; + _googleAppID = app.options.googleAppID; + _dataArbiter = [[FIRCLSDataCollectionArbiter alloc] initWithApp:app withAppInfo:appInfo]; + + FIRCLSApplicationIdentifierModel *appModel = [[FIRCLSApplicationIdentifierModel alloc] init]; + FIRCLSSettings *settings = [[FIRCLSSettings alloc] initWithFileManager:_fileManager + appIDModel:appModel]; + + FIRCLSOnDemandModel *onDemandModel = + [[FIRCLSOnDemandModel alloc] initWithFIRCLSSettings:settings fileManager:_fileManager]; + _managerData = [[FIRCLSManagerData alloc] initWithGoogleAppID:_googleAppID + googleTransport:googleTransport + installations:installations + analytics:analytics + fileManager:_fileManager + dataArbiter:_dataArbiter + settings:settings + onDemandModel:onDemandModel]; + + if (sessions) { + FIRCLSDebugLog(@"Registering Sessions SDK subscription for session data"); + + // Subscription should be made after the DataCollectionArbiter + // is initialized so that the Sessions SDK can immediately get + // the data collection state. + // + // It should also be made after managerData is initialized so + // that the ContextManager can accept data + [sessions registerWithSubscriber:self]; + } + + _reportUploader = [[FIRCLSReportUploader alloc] initWithManagerData:_managerData]; + + _existingReportManager = + [[FIRCLSExistingReportManager alloc] initWithManagerData:_managerData + reportUploader:_reportUploader]; + + _analyticsManager = [[FIRCLSAnalyticsManager alloc] initWithAnalytics:analytics]; + + _reportManager = [[FIRCLSReportManager alloc] initWithManagerData:_managerData + existingReportManager:_existingReportManager + analyticsManager:_analyticsManager]; + + _didPreviouslyCrash = [_fileManager didCrashOnPreviousExecution]; + // Process did crash during previous execution + if (_didPreviouslyCrash) { + // Delete the crash file marker in the background ensure start up is as fast as possible + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ + NSString *crashedMarkerFileFullPath = [[self.fileManager rootPath] + stringByAppendingPathComponent:[NSString + stringWithUTF8String:FIRCLSCrashedMarkerFileName]]; + [self.fileManager removeItemAtPath:crashedMarkerFileFullPath]; + }); + } + + _contextInitPromise = + [[[_reportManager startWithProfiling] then:^id _Nullable(NSNumber *_Nullable value) { + if (![value boolValue]) { + FIRCLSErrorLog(@"Crash reporting could not be initialized"); + } + return value; + }] catch:^void(NSError *error) { + FIRCLSErrorLog(@"Crash reporting failed to initialize with error: %@", error); + }]; + + // RemoteConfig subscription should be made after session report directory created. + if (remoteConfig) { + FIRCLSDebugLog(@"Registering RemoteConfig SDK subscription for rollouts data"); + + FIRCLSRolloutsPersistenceManager *persistenceManager = + [[FIRCLSRolloutsPersistenceManager alloc] + initWithFileManager:_fileManager + andQueue:dispatch_queue_create( + "com.google.firebase.FIRCLSRolloutsPersistence", + DISPATCH_QUEUE_SERIAL)]; + _remoteConfigManager = + [[FIRCLSRemoteConfigManager alloc] initWithRemoteConfig:remoteConfig + persistenceDelegate:persistenceManager]; + [remoteConfig registerRolloutsStateSubscriber:self for:FIRRemoteConfigConstants.FIRNamespaceGoogleMobilePlatform]; + } + } + return self; +} + ++ (void)load { + [FIRApp registerInternalLibrary:(Class)self withName:@"firebase-crashlytics"]; + [FIRSessionsDependencies addDependencyWithName:FIRSessionsSubscriberNameCrashlytics]; +} + ++ (NSArray *)componentsToRegister { + FIRComponentCreationBlock creationBlock = + ^id _Nullable(FIRComponentContainer *container, BOOL *isCacheable) { + if (!container.app.isDefaultApp) { + FIRCLSErrorLog(@"Crashlytics must be used with the default Firebase app."); + return nil; + } + + id analytics = FIR_COMPONENT(FIRAnalyticsInterop, container); + id sessions = FIR_COMPONENT(FIRSessionsProvider, container); + id remoteConfig = FIR_COMPONENT(FIRRemoteConfigInterop, container); + + FIRInstallations *installations = [FIRInstallations installationsWithApp:container.app]; + + *isCacheable = YES; + + return [[FIRCrashlytics alloc] initWithApp:container.app + appInfo:NSBundle.mainBundle.infoDictionary + installations:installations + analytics:analytics + sessions:sessions + remoteConfig:remoteConfig]; + }; + + FIRComponent *component = + [FIRComponent componentWithProtocol:@protocol(FIRCrashlyticsInstanceProvider) + instantiationTiming:FIRInstantiationTimingEagerInDefaultApp + creationBlock:creationBlock]; + return @[ component ]; +} + ++ (instancetype)crashlytics { + // The container will return the same instance since isCacheable is set + + FIRApp *defaultApp = [FIRApp defaultApp]; // Missing configure will be logged here. + + // Get the instance from the `FIRApp`'s container. This will create a new instance the + // first time it is called, and since `isCacheable` is set in the component creation + // block, it will return the existing instance on subsequent calls. + id instance = + FIR_COMPONENT(FIRCrashlyticsInstanceProvider, defaultApp.container); + + // In the component creation block, we return an instance of `FIRCrashlytics`. Cast it and + // return it. + return (FIRCrashlytics *)instance; +} + +- (void)setCrashlyticsCollectionEnabled:(BOOL)enabled { + [self.dataArbiter setCrashlyticsCollectionEnabled:enabled]; +} + +- (BOOL)isCrashlyticsCollectionEnabled { + return [self.dataArbiter isCrashlyticsCollectionEnabled]; +} + +#pragma mark - API: didCrashDuringPreviousExecution + +- (BOOL)didCrashDuringPreviousExecution { + return self.didPreviouslyCrash; +} + +- (void)processDidCrashDuringPreviousExecution { + NSString *crashedMarkerFileName = [NSString stringWithUTF8String:FIRCLSCrashedMarkerFileName]; + NSString *crashedMarkerFileFullPath = + [[self.fileManager rootPath] stringByAppendingPathComponent:crashedMarkerFileName]; + self.didPreviouslyCrash = [self.fileManager fileExistsAtPath:crashedMarkerFileFullPath]; + + if (self.didPreviouslyCrash) { + // Delete the crash file marker in the background ensure start up is as fast as possible + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ + [self.fileManager removeItemAtPath:crashedMarkerFileFullPath]; + }); + } +} + +#pragma mark - API: Logging +- (void)log:(NSString *)msg { + FIRCLSLog(@"%@", msg); +} + +- (void)logWithFormat:(NSString *)format, ... { + va_list args; + va_start(args, format); + [self logWithFormat:format arguments:args]; + va_end(args); +} + +- (void)logWithFormat:(NSString *)format arguments:(va_list)args { + [self log:[[NSString alloc] initWithFormat:format arguments:args]]; +} + +#pragma mark - API: Accessors + +- (void)checkForUnsentReportsWithCompletion:(void (^)(BOOL))completion { + [[self.reportManager checkForUnsentReports] + then:^id _Nullable(FIRCrashlyticsReport *_Nullable value) { + completion(value ? true : false); + return nil; + }]; +} + +- (void)checkAndUpdateUnsentReportsWithCompletion: + (void (^)(FIRCrashlyticsReport *_Nonnull))completion { + [[self.reportManager checkForUnsentReports] + then:^id _Nullable(FIRCrashlyticsReport *_Nullable value) { + completion(value); + return nil; + }]; +} + +- (void)sendUnsentReports { + [self.reportManager sendUnsentReports]; +} + +- (void)deleteUnsentReports { + [self.reportManager deleteUnsentReports]; +} + +#pragma mark - API: setUserID +- (void)setUserID:(nullable NSString *)userID { + FIRCLSUserLoggingRecordInternalKeyValue(FIRCLSUserIdentifierKey, userID); +} + +#pragma mark - API: setCustomValue + +- (void)setCustomValue:(nullable id)value forKey:(NSString *)key { + FIRCLSUserLoggingRecordUserKeyValue(key, value); +} + +- (void)setCustomKeysAndValues:(NSDictionary *)keysAndValues { + FIRCLSUserLoggingRecordUserKeysAndValues(keysAndValues); +} + +#pragma mark - API: Development Platform +// These two methods are deprecated by our own API, so +// its ok to implement them +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-implementations" ++ (void)setDevelopmentPlatformName:(NSString *)name { + [[self crashlytics] setDevelopmentPlatformName:name]; +} + ++ (void)setDevelopmentPlatformVersion:(NSString *)version { + [[self crashlytics] setDevelopmentPlatformVersion:version]; +} +#pragma clang diagnostic pop + +- (NSString *)developmentPlatformName { + FIRCLSErrorLog(@"developmentPlatformName is write-only"); + return nil; +} + +- (void)setDevelopmentPlatformName:(NSString *)developmentPlatformName { + [self waitForContextInit:developmentPlatformName + callback:^{ + FIRCLSUserLoggingRecordInternalKeyValue(FIRCLSDevelopmentPlatformNameKey, + developmentPlatformName); + }]; +} + +- (NSString *)developmentPlatformVersion { + FIRCLSErrorLog(@"developmentPlatformVersion is write-only"); + return nil; +} + +- (void)setDevelopmentPlatformVersion:(NSString *)developmentPlatformVersion { + [self waitForContextInit:developmentPlatformVersion + callback:^{ + FIRCLSUserLoggingRecordInternalKeyValue(FIRCLSDevelopmentPlatformVersionKey, + developmentPlatformVersion); + }]; +} + +#pragma mark - API: Errors and Exceptions +- (void)recordError:(NSError *)error { + [self recordError:error userInfo:nil]; +} + +- (void)recordError:(NSError *)error userInfo:(NSDictionary *)userInfo { + NSString *rolloutsInfoJSON = [_remoteConfigManager getRolloutAssignmentsEncodedJsonString]; + FIRCLSUserLoggingRecordError(error, userInfo, rolloutsInfoJSON); +} + +- (void)recordExceptionModel:(FIRExceptionModel *)exceptionModel { + NSString *rolloutsInfoJSON = [_remoteConfigManager getRolloutAssignmentsEncodedJsonString]; + FIRCLSExceptionRecordModel(exceptionModel, rolloutsInfoJSON); +} + +- (void)recordOnDemandExceptionModel:(FIRExceptionModel *)exceptionModel { + [self.managerData.onDemandModel + recordOnDemandExceptionIfQuota:exceptionModel + withDataCollectionEnabled:[self.dataArbiter isCrashlyticsCollectionEnabled] + usingExistingReportManager:self.existingReportManager]; +} + +#pragma mark - FIRSessionsSubscriber + +- (void)onSessionChanged:(FIRSessionDetails *_Nonnull)session { + FIRCLSDebugLog(@"Session ID changed: %@", session.sessionId.copy); + + [self.managerData.contextManager setAppQualitySessionId:session.sessionId.copy]; +} + +- (BOOL)isDataCollectionEnabled { + return self.dataArbiter.isCrashlyticsCollectionEnabled; +} + +- (FIRSessionsSubscriberName)sessionsSubscriberName { + return FIRSessionsSubscriberNameCrashlytics; +} + +#pragma mark - FIRRolloutsStateSubscriber +- (void)rolloutsStateDidChange:(FIRRolloutsState *_Nonnull)rolloutsState { + if (!_remoteConfigManager) { + FIRCLSDebugLog(@"rolloutsStateDidChange gets called without init the rc manager."); + return; + } + NSString *currentReportID = _managerData.executionIDModel.executionID; + [_remoteConfigManager updateRolloutsStateWithRolloutsState:rolloutsState + reportID:currentReportID]; +} + +#pragma mark - Private Helpsers +- (void)waitForContextInit:(NSString *)contextLog callback:(void (^)(void))callback { + if (!_contextInitPromise) { + FIRCLSErrorLog(@"Crashlytics method called before SDK was initialized: %@", contextLog); + return; + } + [_contextInitPromise then:^id _Nullable(id _Nullable value) { + callback(); + return nil; + }]; +} +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/FIRCrashlyticsReport.m b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/FIRCrashlyticsReport.m new file mode 100644 index 0000000..97e22b1 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/FIRCrashlyticsReport.m @@ -0,0 +1,197 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "Crashlytics/Crashlytics/Public/FirebaseCrashlytics/FIRCrashlyticsReport.h" + +#import "Crashlytics/Crashlytics/Components/FIRCLSContext.h" +#import "Crashlytics/Crashlytics/Components/FIRCLSGlobals.h" +#import "Crashlytics/Crashlytics/Helpers/FIRCLSLogger.h" +#import "Crashlytics/Crashlytics/Models/FIRCLSInternalReport.h" + +@interface FIRCrashlyticsReport () { + NSString *_reportID; + NSDate *_dateCreated; + BOOL _hasCrash; + + FIRCLSUserLoggingABStorage _logStorage; + const char *_activeLogPath; + + uint32_t _internalKVCounter; + FIRCLSUserLoggingKVStorage _internalKVStorage; + + uint32_t _userKVCounter; + FIRCLSUserLoggingKVStorage _userKVStorage; +} + +@property(nonatomic, strong) FIRCLSInternalReport *internalReport; + +@end + +@implementation FIRCrashlyticsReport + +- (instancetype)initWithInternalReport:(FIRCLSInternalReport *)internalReport { + self = [super init]; + if (!self) { + return nil; + } + + _internalReport = internalReport; + _reportID = [[internalReport identifier] copy]; + _dateCreated = [[internalReport dateCreated] copy]; + _hasCrash = [internalReport isCrash]; + + _logStorage.maxSize = _firclsContext.readonly->logging.logStorage.maxSize; + _logStorage.maxEntries = _firclsContext.readonly->logging.logStorage.maxEntries; + _logStorage.restrictBySize = _firclsContext.readonly->logging.logStorage.restrictBySize; + _logStorage.entryCount = _firclsContext.readonly->logging.logStorage.entryCount; + _logStorage.aPath = [FIRCrashlyticsReport filesystemPathForContentFile:FIRCLSReportLogAFile + inInternalReport:internalReport]; + _logStorage.bPath = [FIRCrashlyticsReport filesystemPathForContentFile:FIRCLSReportLogBFile + inInternalReport:internalReport]; + + _activeLogPath = _logStorage.aPath; + + // TODO: correct kv accounting + // The internal report will have non-zero compacted and incremental keys. The right thing to do + // is count them, so we can kick off compactions/pruning at the right times. By + // setting this value to zero, we're allowing more entries to be made than there really + // should be. Not the end of the world, but we should do better eventually. + _internalKVCounter = 0; + _userKVCounter = 0; + + _userKVStorage.maxCount = _firclsContext.readonly->logging.userKVStorage.maxCount; + _userKVStorage.maxIncrementalCount = + _firclsContext.readonly->logging.userKVStorage.maxIncrementalCount; + _userKVStorage.compactedPath = + [FIRCrashlyticsReport filesystemPathForContentFile:FIRCLSReportUserCompactedKVFile + inInternalReport:internalReport]; + _userKVStorage.incrementalPath = + [FIRCrashlyticsReport filesystemPathForContentFile:FIRCLSReportUserIncrementalKVFile + inInternalReport:internalReport]; + + _internalKVStorage.maxCount = _firclsContext.readonly->logging.internalKVStorage.maxCount; + _internalKVStorage.maxIncrementalCount = + _firclsContext.readonly->logging.internalKVStorage.maxIncrementalCount; + _internalKVStorage.compactedPath = + [FIRCrashlyticsReport filesystemPathForContentFile:FIRCLSReportInternalCompactedKVFile + inInternalReport:internalReport]; + _internalKVStorage.incrementalPath = + [FIRCrashlyticsReport filesystemPathForContentFile:FIRCLSReportInternalIncrementalKVFile + inInternalReport:internalReport]; + + return self; +} + ++ (const char *)filesystemPathForContentFile:(NSString *)contentFile + inInternalReport:(FIRCLSInternalReport *)internalReport { + if (!internalReport) { + return nil; + } + + // We need to be defensive because strdup will crash + // if given a nil. + NSString *objCString = [internalReport pathForContentFile:contentFile]; + const char *fileSystemString = [objCString fileSystemRepresentation]; + if (!objCString || !fileSystemString) { + return nil; + } + + // Paths need to be duplicated because fileSystemRepresentation returns C strings + // that are freed outside of this context. + return strdup(fileSystemString); +} + +- (BOOL)checkContextForMethod:(NSString *)methodName { + if (!FIRCLSContextIsInitialized()) { + FIRCLSErrorLog(@"%@ failed for FIRCrashlyticsReport because Crashlytics context isn't " + @"initialized.", + methodName); + return false; + } + return true; +} + +#pragma mark - API: Getters + +- (NSString *)reportID { + return _reportID; +} + +- (NSDate *)dateCreated { + return _dateCreated; +} + +- (BOOL)hasCrash { + return _hasCrash; +} + +#pragma mark - API: Logging + +- (void)log:(NSString *)msg { + if (![self checkContextForMethod:@"log:"]) { + return; + } + + FIRCLSLogToStorage(&_logStorage, &_activeLogPath, @"%@", msg); +} + +- (void)logWithFormat:(NSString *)format, ... { + if (![self checkContextForMethod:@"logWithFormat:"]) { + return; + } + + va_list args; + va_start(args, format); + [self logWithFormat:format arguments:args]; + va_end(args); +} + +- (void)logWithFormat:(NSString *)format arguments:(va_list)args { + if (![self checkContextForMethod:@"logWithFormat:arguments:"]) { + return; + } + + [self log:[[NSString alloc] initWithFormat:format arguments:args]]; +} + +#pragma mark - API: setUserID + +- (void)setUserID:(nullable NSString *)userID { + if (![self checkContextForMethod:@"setUserID:"]) { + return; + } + + FIRCLSUserLoggingRecordKeyValue(FIRCLSUserIdentifierKey, userID, &_internalKVStorage, + &_internalKVCounter); +} + +#pragma mark - API: setCustomValue + +- (void)setCustomValue:(nullable id)value forKey:(NSString *)key { + if (![self checkContextForMethod:@"setCustomValue:forKey:"]) { + return; + } + + FIRCLSUserLoggingRecordKeyValue(key, value, &_userKVStorage, &_userKVCounter); +} + +- (void)setCustomKeysAndValues:(NSDictionary *)keysAndValues { + if (![self checkContextForMethod:@"setCustomKeysAndValues:"]) { + return; + } + + FIRCLSUserLoggingRecordKeysAndValues(keysAndValues, &_userKVStorage, &_userKVCounter); +} + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/FIRExceptionModel.m b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/FIRExceptionModel.m new file mode 100644 index 0000000..2bd9924 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/FIRExceptionModel.m @@ -0,0 +1,44 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "Crashlytics/Crashlytics/Public/FirebaseCrashlytics/FIRExceptionModel.h" + +@interface FIRExceptionModel () + +@property(nonatomic, copy) NSString *name; +@property(nonatomic, copy) NSString *reason; +@property(nonatomic) BOOL isFatal; +@property(nonatomic) BOOL onDemand; + +@end + +@implementation FIRExceptionModel + +- (instancetype)initWithName:(NSString *)name reason:(NSString *)reason { + self = [super init]; + if (!self) { + return nil; + } + + _name = [name copy]; + _reason = [reason copy]; + + return self; +} + ++ (instancetype)exceptionModelWithName:(NSString *)name reason:(NSString *)reason { + return [[FIRExceptionModel alloc] initWithName:name reason:reason]; +} + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/FIRStackFrame.m b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/FIRStackFrame.m new file mode 100644 index 0000000..ffdeb41 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/FIRStackFrame.m @@ -0,0 +1,94 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "Crashlytics/Crashlytics/Private/FIRStackFrame_Private.h" + +@interface FIRStackFrame () + +@property(nonatomic, copy, nullable) NSString *symbol; +@property(nonatomic, copy, nullable) NSString *rawSymbol; +@property(nonatomic, copy, nullable) NSString *library; +@property(nonatomic, copy, nullable) NSString *fileName; +@property(nonatomic, assign) uint32_t lineNumber; +@property(nonatomic, assign) uint64_t offset; +@property(nonatomic, assign) uint64_t address; + +@property(nonatomic, assign) BOOL isSymbolicated; + +@end + +@implementation FIRStackFrame + +#pragma mark - Public Methods + +- (instancetype)initWithSymbol:(NSString *)symbol file:(NSString *)file line:(NSInteger)line { + self = [super init]; + if (!self) { + return nil; + } + + _symbol = [symbol copy]; + _fileName = [file copy]; + _lineNumber = (uint32_t)line; + + _isSymbolicated = true; + + return self; +} + ++ (instancetype)stackFrameWithAddress:(NSUInteger)address { + FIRStackFrame *frame = [self stackFrame]; + + [frame setAddress:address]; + + return frame; +} + ++ (instancetype)stackFrameWithSymbol:(NSString *)symbol file:(NSString *)file line:(NSInteger)line { + return [[FIRStackFrame alloc] initWithSymbol:symbol file:file line:line]; +} + +#pragma mark - Internal Methods + ++ (instancetype)stackFrame { + return [[self alloc] init]; +} + ++ (instancetype)stackFrameWithSymbol:(NSString *)symbol { + FIRStackFrame *frame = [self stackFrame]; + + frame.symbol = symbol; + frame.rawSymbol = symbol; + + return frame; +} + +#pragma mark - Overrides + +- (NSString *)description { + if (self.isSymbolicated) { + return [NSString + stringWithFormat:@"{%@ - %@:%u}", [self fileName], [self symbol], [self lineNumber]]; + } + + if (self.fileName) { + return [NSString stringWithFormat:@"{[0x%llx] %@ - %@:%u}", [self address], [self fileName], + [self symbol], [self lineNumber]]; + } + + return [NSString + stringWithFormat:@"{[0x%llx + %u] %@}", [self address], [self lineNumber], [self symbol]]; +} + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Handlers/FIRCLSException.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Handlers/FIRCLSException.h new file mode 100644 index 0000000..d8c229f --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Handlers/FIRCLSException.h @@ -0,0 +1,84 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once + +#include +#include + +#ifdef __OBJC__ +#import +@class FIRStackFrame; +@class FIRExceptionModel; +#endif + +#define CLS_EXCEPTION_STRING_LENGTH_MAX (1024 * 16) + +typedef enum { + FIRCLSExceptionTypeUnknown = 0, + FIRCLSExceptionTypeObjectiveC = 1, + FIRCLSExceptionTypeCpp = 2, + // 3 was FIRCLSExceptionTypeJavascript + // Keeping these numbers the same just to be safe + FIRCLSExceptionTypeCustom = 4 +} FIRCLSExceptionType; + +typedef struct { + const char* path; + + void (*originalTerminateHandler)(void); + +#if !TARGET_OS_IPHONE + void* originalNSApplicationReportException; +#endif + + uint32_t maxCustomExceptions; +} FIRCLSExceptionReadOnlyContext; + +typedef struct { + uint32_t customExceptionCount; +} FIRCLSExceptionWritableContext; + +__BEGIN_DECLS + +void FIRCLSExceptionInitialize(FIRCLSExceptionReadOnlyContext* roContext, + FIRCLSExceptionWritableContext* rwContext); +void FIRCLSExceptionCheckHandlers(void* delegate); + +void FIRCLSExceptionRaiseTestObjCException(void) __attribute((noreturn)); +void FIRCLSExceptionRaiseTestCppException(void) __attribute((noreturn)); + +#ifdef __OBJC__ +void FIRCLSExceptionRecordModel(FIRExceptionModel* exceptionModel, NSString* rolloutsInfoJSON); +NSString* FIRCLSExceptionRecordOnDemandModel(FIRExceptionModel* exceptionModel, + int previousRecordedOnDemandExceptions, + int previousDroppedOnDemandExceptions, + BOOL shouldSuspendThread); +void FIRCLSExceptionRecordNSException(NSException* exception); +void FIRCLSExceptionRecord(FIRCLSExceptionType type, + const char* name, + const char* reason, + NSArray* frames, + NSString* rolloutsInfoJSON); +NSString* FIRCLSExceptionRecordOnDemand(FIRCLSExceptionType type, + const char* name, + const char* reason, + NSArray* frames, + BOOL fatal, + int previousRecordedOnDemandExceptions, + int previousDroppedOnDemandExceptions, + BOOL shouldSuspendThread); +#endif + +__END_DECLS diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Handlers/FIRCLSException.mm b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Handlers/FIRCLSException.mm new file mode 100644 index 0000000..2ee85fb --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Handlers/FIRCLSException.mm @@ -0,0 +1,541 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +#include "Crashlytics/Crashlytics/Handlers/FIRCLSException.h" + +#import "Crashlytics/Crashlytics/Private/FIRExceptionModel_Private.h" +#import "Crashlytics/Crashlytics/Private/FIRStackFrame_Private.h" + +#include "Crashlytics/Crashlytics/Components/FIRCLSApplication.h" +#include "Crashlytics/Crashlytics/Components/FIRCLSContext.h" +#include "Crashlytics/Crashlytics/Components/FIRCLSGlobals.h" +#include "Crashlytics/Crashlytics/Components/FIRCLSProcess.h" +#import "Crashlytics/Crashlytics/Components/FIRCLSUserLogging.h" + +#include "Crashlytics/Crashlytics/Handlers/FIRCLSHandler.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSFile.h" +#import "Crashlytics/Crashlytics/Helpers/FIRCLSLogger.h" +#import "Crashlytics/Crashlytics/Helpers/FIRCLSUtility.h" + +#import "Crashlytics/Crashlytics/Controllers/FIRCLSReportManager_Private.h" +#import "Crashlytics/Crashlytics/Models/FIRCLSExecutionIdentifierModel.h" +#import "Crashlytics/Crashlytics/Models/FIRCLSFileManager.h" +#import "Crashlytics/Crashlytics/Models/FIRCLSInternalReport.h" +#include "Crashlytics/Crashlytics/Operations/Symbolication/FIRCLSDemangleOperation.h" + +// C++/Objective-C exception handling +#include +#include +#include +#include + +#if !TARGET_OS_IPHONE +#import +#import +#endif + +#pragma mark Prototypes +static void FIRCLSTerminateHandler(void); +#if !TARGET_OS_IPHONE +void FIRCLSNSApplicationReportException(id self, SEL cmd, NSException *exception); + +typedef void (*NSApplicationReportExceptionFunction)(id, SEL, NSException *); + +static BOOL FIRCLSIsNSApplicationCrashOnExceptionsEnabled(void); +static NSApplicationReportExceptionFunction FIRCLSOriginalNSExceptionReportExceptionFunction(void); +static Method FIRCLSGetNSApplicationReportExceptionMethod(void); + +#endif + +#pragma mark - API +void FIRCLSExceptionInitialize(FIRCLSExceptionReadOnlyContext *roContext, + FIRCLSExceptionWritableContext *rwContext) { + if (!FIRCLSUnlinkIfExists(roContext->path)) { + FIRCLSSDKLog("Unable to reset the exception file %s\n", strerror(errno)); + } + + roContext->originalTerminateHandler = std::set_terminate(FIRCLSTerminateHandler); + +#if !TARGET_OS_IPHONE + // If FIRCLSApplicationSharedInstance is null, we don't need this + if (FIRCLSIsNSApplicationCrashOnExceptionsEnabled() && FIRCLSApplicationSharedInstance()) { + Method m = FIRCLSGetNSApplicationReportExceptionMethod(); + + roContext->originalNSApplicationReportException = + (void *)method_setImplementation(m, (IMP)FIRCLSNSApplicationReportException); + } +#endif + + rwContext->customExceptionCount = 0; +} + +void FIRCLSExceptionRecordModel(FIRExceptionModel *exceptionModel, NSString *rolloutsInfoJSON) { + const char *name = [[exceptionModel.name copy] UTF8String]; + const char *reason = [[exceptionModel.reason copy] UTF8String] ?: ""; + FIRCLSExceptionRecord(FIRCLSExceptionTypeCustom, name, reason, [exceptionModel.stackTrace copy], + rolloutsInfoJSON); +} + +NSString *FIRCLSExceptionRecordOnDemandModel(FIRExceptionModel *exceptionModel, + int previousRecordedOnDemandExceptions, + int previousDroppedOnDemandExceptions, + BOOL shouldSuspendThread) { + const char *name = [[exceptionModel.name copy] UTF8String]; + const char *reason = [[exceptionModel.reason copy] UTF8String] ?: ""; + + return FIRCLSExceptionRecordOnDemand(FIRCLSExceptionTypeCustom, name, reason, + [exceptionModel.stackTrace copy], exceptionModel.isFatal, + previousRecordedOnDemandExceptions, + previousDroppedOnDemandExceptions, shouldSuspendThread); +} + +void FIRCLSExceptionRecordNSException(NSException *exception) { + FIRCLSSDKLog("Recording an NSException\n"); + + NSArray *returnAddresses = [exception callStackReturnAddresses]; + + NSString *name = [exception name]; + NSString *reason = [exception reason] ?: @""; + + // It's tempting to try to make use of callStackSymbols here. But, the output + // of that function is not intended to be machine-readable. We could parse it, + // but that isn't really worthwhile, considering that address-based symbolication + // needs to work anyways. + + // package our frames up into the appropriate format + NSMutableArray *frames = [NSMutableArray new]; + + for (NSNumber *address in returnAddresses) { + [frames addObject:[FIRStackFrame stackFrameWithAddress:[address unsignedIntegerValue]]]; + } + + FIRCLSExceptionRecord(FIRCLSExceptionTypeObjectiveC, [name UTF8String], [reason UTF8String], + frames, nil); +} + +static void FIRCLSExceptionRecordFrame(FIRCLSFile *file, FIRStackFrame *frame) { + FIRCLSFileWriteHashStart(file); + + FIRCLSFileWriteHashEntryUint64(file, "pc", [frame address]); + + NSString *string = [frame symbol]; + if (string) { + FIRCLSFileWriteHashEntryHexEncodedString(file, "symbol", [string UTF8String]); + } + + FIRCLSFileWriteHashEntryUint64(file, "offset", [frame offset]); + + string = [frame library]; + if (string) { + FIRCLSFileWriteHashEntryHexEncodedString(file, "library", [string UTF8String]); + } + + string = [frame fileName]; + if (string) { + FIRCLSFileWriteHashEntryHexEncodedString(file, "file", [string UTF8String]); + } + + FIRCLSFileWriteHashEntryUint64(file, "line", [frame lineNumber]); + + FIRCLSFileWriteHashEnd(file); +} + +static bool FIRCLSExceptionIsNative(FIRCLSExceptionType type) { + return type == FIRCLSExceptionTypeObjectiveC || type == FIRCLSExceptionTypeCpp; +} + +static const char *FIRCLSExceptionNameForType(FIRCLSExceptionType type) { + switch (type) { + case FIRCLSExceptionTypeObjectiveC: + return "objective-c"; + case FIRCLSExceptionTypeCpp: + return "c++"; + case FIRCLSExceptionTypeCustom: + return "custom"; + default: + break; + } + + return "unknown"; +} + +void FIRCLSExceptionWrite(FIRCLSFile *file, + FIRCLSExceptionType type, + const char *name, + const char *reason, + NSArray *frames, + NSString *rolloutsInfoJSON) { + FIRCLSFileWriteSectionStart(file, "exception"); + + FIRCLSFileWriteHashStart(file); + + FIRCLSFileWriteHashEntryString(file, "type", FIRCLSExceptionNameForType(type)); + FIRCLSFileWriteHashEntryHexEncodedString(file, "name", name); + FIRCLSFileWriteHashEntryHexEncodedString(file, "reason", reason); + FIRCLSFileWriteHashEntryUint64(file, "time", time(NULL)); + + if ([frames count]) { + FIRCLSFileWriteHashKey(file, "frames"); + FIRCLSFileWriteArrayStart(file); + + for (FIRStackFrame *frame in frames) { + FIRCLSExceptionRecordFrame(file, frame); + } + + FIRCLSFileWriteArrayEnd(file); + } + + if (rolloutsInfoJSON) { + FIRCLSFileWriteHashKey(file, "rollouts"); + FIRCLSFileWriteStringUnquoted(file, [rolloutsInfoJSON UTF8String]); + FIRCLSFileWriteHashEnd(file); + } + + FIRCLSFileWriteHashEnd(file); + + FIRCLSFileWriteSectionEnd(file); +} + +void FIRCLSExceptionRecord(FIRCLSExceptionType type, + const char *name, + const char *reason, + NSArray *frames, + NSString *rolloutsInfoJSON) { + if (!FIRCLSContextIsInitialized()) { + return; + } + + bool native = FIRCLSExceptionIsNative(type); + + FIRCLSSDKLog("Recording an exception structure (%d)\n", native); + + // exceptions can happen on multiple threads at the same time + if (native) { + dispatch_sync(_firclsExceptionQueue, ^{ + const char *path = _firclsContext.readonly->exception.path; + FIRCLSFile file; + + if (!FIRCLSFileInitWithPath(&file, path, false)) { + FIRCLSSDKLog("Unable to open exception file\n"); + return; + } + + FIRCLSExceptionWrite(&file, type, name, reason, frames, nil); + + // We only want to do this work if we have the expectation that we'll actually crash + FIRCLSHandler(&file, mach_thread_self(), NULL, YES); + + FIRCLSFileClose(&file); + }); + } else { + FIRCLSUserLoggingWriteAndCheckABFiles( + &_firclsContext.readonly->logging.customExceptionStorage, + &_firclsContext.writable->logging.activeCustomExceptionPath, ^(FIRCLSFile *file) { + FIRCLSExceptionWrite(file, type, name, reason, frames, rolloutsInfoJSON); + }); + } + + FIRCLSSDKLog("Finished recording an exception structure\n"); +} + +// Prepares a new active report for on-demand delivery and returns the path to the report. +// Should only be used for platforms in which exceptions do not crash the app (flutter, Unity, etc). +NSString *FIRCLSExceptionRecordOnDemand(FIRCLSExceptionType type, + const char *name, + const char *reason, + NSArray *frames, + BOOL fatal, + int previousRecordedOnDemandExceptions, + int previousDroppedOnDemandExceptions, + BOOL shouldSuspendThread) { + if (!FIRCLSContextIsInitialized()) { + return nil; + } + + FIRCLSSDKLog("Recording an exception structure on demand\n"); + + FIRCLSFileManager *fileManager = [[FIRCLSFileManager alloc] init]; + + // Create paths for new report. + NSString *currentReportPath = + [NSString stringWithUTF8String:_firclsContext.readonly->initialReportPath]; + NSString *newReportID = [[[FIRCLSExecutionIdentifierModel alloc] init] executionID]; + NSString *newReportPath = [fileManager.activePath stringByAppendingPathComponent:newReportID]; + NSString *customFatalIndicatorFilePath = + [newReportPath stringByAppendingPathComponent:FIRCLSCustomFatalIndicatorFile]; + NSString *newKVPath = + [newReportPath stringByAppendingPathComponent:FIRCLSReportInternalIncrementalKVFile]; + + // Create new report and copy into it the current state of custom keys and log and the sdk.log, + // binary_images.clsrecord, and metadata.clsrecord files. + // Also copy rollouts.clsrecord if applicable. + NSError *error = nil; + BOOL copied = [fileManager.underlyingFileManager copyItemAtPath:currentReportPath + toPath:newReportPath + error:&error]; + if (error || !copied) { + FIRCLSSDKLog("Unable to create a new report to record on-demand exeption."); + return nil; + } + + // Once the report is copied, remove non-fatal events from current report. + if ([fileManager + fileExistsAtPath:[NSString stringWithUTF8String:_firclsContext.readonly->logging + .customExceptionStorage.aPath]]) { + [fileManager + removeItemAtPath:[NSString stringWithUTF8String:_firclsContext.readonly->logging + .customExceptionStorage.aPath]]; + } + if ([fileManager + fileExistsAtPath:[NSString stringWithUTF8String:_firclsContext.readonly->logging + .customExceptionStorage.bPath]]) { + [fileManager + removeItemAtPath:[NSString stringWithUTF8String:_firclsContext.readonly->logging + .customExceptionStorage.bPath]]; + } + *_firclsContext.readonly->logging.customExceptionStorage.entryCount = 0; + _firclsContext.writable->exception.customExceptionCount = 0; + + // Record how many on-demand exceptions occurred before this one as well as how many were dropped. + FIRCLSFile kvFile; + if (!FIRCLSFileInitWithPath(&kvFile, [newKVPath UTF8String], true)) { + FIRCLSSDKLogError("Unable to open k-v file\n"); + return nil; + } + FIRCLSFileWriteSectionStart(&kvFile, "kv"); + FIRCLSFileWriteHashStart(&kvFile); + FIRCLSFileWriteHashEntryHexEncodedString(&kvFile, "key", + [FIRCLSOnDemandRecordedExceptionsKey UTF8String]); + FIRCLSFileWriteHashEntryHexEncodedString( + &kvFile, "value", + [[[NSNumber numberWithInt:previousRecordedOnDemandExceptions] stringValue] UTF8String]); + FIRCLSFileWriteHashEnd(&kvFile); + FIRCLSFileWriteSectionEnd(&kvFile); + FIRCLSFileWriteSectionStart(&kvFile, "kv"); + FIRCLSFileWriteHashStart(&kvFile); + FIRCLSFileWriteHashEntryHexEncodedString(&kvFile, "key", + [FIRCLSOnDemandDroppedExceptionsKey UTF8String]); + FIRCLSFileWriteHashEntryHexEncodedString( + &kvFile, "value", + [[[NSNumber numberWithInt:previousDroppedOnDemandExceptions] stringValue] UTF8String]); + FIRCLSFileWriteHashEnd(&kvFile); + FIRCLSFileWriteSectionEnd(&kvFile); + FIRCLSFileClose(&kvFile); + + // If the event was fatal, write out an empty file to indicate that the report contains a fatal + // event. This is used to report events to Analytics for CFU calculations. + if (fatal && ![fileManager createFileAtPath:customFatalIndicatorFilePath + contents:nil + attributes:nil]) { + FIRCLSSDKLog("Unable to create custom exception file. On demand exception will not be logged " + "with analytics."); + } + + // Write out the exception in the new report. + const char *newActiveCustomExceptionPath = + fatal ? [[newReportPath stringByAppendingPathComponent:FIRCLSReportExceptionFile] UTF8String] + : [[newReportPath stringByAppendingPathComponent:FIRCLSReportCustomExceptionAFile] + UTF8String]; + FIRCLSFile file; + if (!FIRCLSFileInitWithPath(&file, newActiveCustomExceptionPath, true)) { + FIRCLSSDKLog("Unable to open log file for on demand custom exception\n"); + return nil; + } + FIRCLSExceptionWrite(&file, type, name, reason, frames, nil); + + FIRCLSHandler(&file, mach_thread_self(), NULL, shouldSuspendThread); + FIRCLSFileClose(&file); + + // Return the path to the new report. + FIRCLSSDKLog("Finished recording on demand exception structure\n"); + return newReportPath; +} + +// Ignore this message here, because we know that this call will not leak. +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Winvalid-noreturn" +void FIRCLSExceptionRaiseTestObjCException(void) { + [NSException raise:@"CrashlyticsTestException" + format:@"This is an Objective-C exception used for testing."]; +} + +void FIRCLSExceptionRaiseTestCppException(void) { + throw "Crashlytics C++ Test Exception"; +} +#pragma clang diagnostic pop + +static const char *FIRCLSExceptionDemangle(const char *symbol) { + return [[FIRCLSDemangleOperation demangleCppSymbol:symbol] UTF8String]; +} + +static void FIRCLSCatchAndRecordActiveException(std::type_info *typeInfo) { + if (!FIRCLSIsValidPointer(typeInfo)) { + FIRCLSSDKLog("Error: invalid parameter\n"); + return; + } + + const char *name = typeInfo->name(); + FIRCLSSDKLog("Recording exception of type '%s'\n", name); + + // This is a funny technique to get the exception object. The inner @try + // has the ability to capture NSException-derived objects. It seems that + // c++ tries can do that in some cases, but I was warned by the WWDC labs + // that there are cases where that will not work (like for NSException subclasses). + try { + @try { + // This could potentially cause a call to std::terminate() if there is actually no active + // exception. + throw; + } @catch (NSException *exception) { +#if TARGET_OS_IPHONE + FIRCLSExceptionRecordNSException(exception); +#else + // There's no need to record this here, because we're going to get + // the value forward to us by AppKit + FIRCLSSDKLog("Skipping ObjC exception at this point\n"); +#endif + } + } catch (const char *exc) { + FIRCLSExceptionRecord(FIRCLSExceptionTypeCpp, "const char *", exc, nil, nil); + } catch (const std::string &exc) { + FIRCLSExceptionRecord(FIRCLSExceptionTypeCpp, "std::string", exc.c_str(), nil, nil); + } catch (const std::exception &exc) { + FIRCLSExceptionRecord(FIRCLSExceptionTypeCpp, FIRCLSExceptionDemangle(name), exc.what(), nil, + nil); + } catch (const std::exception *exc) { + FIRCLSExceptionRecord(FIRCLSExceptionTypeCpp, FIRCLSExceptionDemangle(name), exc->what(), nil, + nil); + } catch (const std::bad_alloc &exc) { + // it is especially important to avoid demangling in this case, because the expectation at this + // point is that all allocations could fail + FIRCLSExceptionRecord(FIRCLSExceptionTypeCpp, "std::bad_alloc", exc.what(), nil, nil); + } catch (...) { + FIRCLSExceptionRecord(FIRCLSExceptionTypeCpp, FIRCLSExceptionDemangle(name), "", nil, nil); + } +} + +#pragma mark - Handlers +static void FIRCLSTerminateHandler(void) { + FIRCLSSDKLog("C++ terminate handler invoked\n"); + + void (*handler)(void) = _firclsContext.readonly->exception.originalTerminateHandler; + if (handler == FIRCLSTerminateHandler) { + FIRCLSSDKLog("Error: original handler was set recursively\n"); + handler = NULL; + } + + // Restore pre-existing handler, if any. Do this early, so that + // if std::terminate is called while we are executing here, we do not recurse. + if (handler) { + FIRCLSSDKLog("restoring pre-existing handler\n"); + + // To prevent infinite recursion in this function, check that we aren't resetting the terminate + // handler to the same function again, which would be this function in the event that we can't + // actually change the handler during a terminate. + if (std::set_terminate(handler) == handler) { + FIRCLSSDKLog("handler has already been restored, aborting\n"); + abort(); + } + } + + // we can use typeInfo to record the type of the exception, + // but we must use a catch to get the value + std::type_info *typeInfo = __cxxabiv1::__cxa_current_exception_type(); + if (typeInfo) { + FIRCLSCatchAndRecordActiveException(typeInfo); + } else { + FIRCLSSDKLog("no active exception\n"); + } + + // only do this if there was a pre-existing handler + if (handler) { + FIRCLSSDKLog("invoking pre-existing handler\n"); + handler(); + } + + FIRCLSSDKLog("aborting\n"); + abort(); +} + +void FIRCLSExceptionCheckHandlers(void *delegate) { +#if !TARGET_OS_IPHONE + // Check this on OS X all the time, even if the debugger is attached. This is a common + // source of errors, so we want to be extra verbose in this case. + if (FIRCLSApplicationSharedInstance()) { + if (!FIRCLSIsNSApplicationCrashOnExceptionsEnabled()) { + FIRCLSWarningLog(@"Warning: NSApplicationCrashOnExceptions is not set. This will " + @"result in poor top-level uncaught exception reporting."); + } + } +#endif + + if (_firclsContext.readonly->debuggerAttached) { + return; + } + + void *ptr = NULL; + + ptr = (void *)std::get_terminate(); + if (ptr != FIRCLSTerminateHandler) { + FIRCLSLookupFunctionPointer(ptr, ^(const char *name, const char *lib) { + FIRCLSWarningLog(@"Warning: std::get_terminate is '%s' in '%s'", name, lib); + }); + } + +#if TARGET_OS_IPHONE + ptr = (void *)NSGetUncaughtExceptionHandler(); + if (ptr) { + FIRCLSLookupFunctionPointer(ptr, ^(const char *name, const char *lib) { + FIRCLSWarningLog(@"Warning: NSUncaughtExceptionHandler is '%s' in '%s'", name, lib); + }); + } +#else + if (FIRCLSApplicationSharedInstance() && FIRCLSIsNSApplicationCrashOnExceptionsEnabled()) { + // In this case, we *might* be able to intercept exceptions. But, verify we've still + // swizzled the method. + Method m = FIRCLSGetNSApplicationReportExceptionMethod(); + + if (method_getImplementation(m) != (IMP)FIRCLSNSApplicationReportException) { + FIRCLSWarningLog( + @"Warning: top-level NSApplication-reported exceptions cannot be intercepted"); + } + } +#endif +} + +#pragma mark - AppKit Handling +#if !TARGET_OS_IPHONE +static BOOL FIRCLSIsNSApplicationCrashOnExceptionsEnabled(void) { + return [[NSUserDefaults standardUserDefaults] boolForKey:@"NSApplicationCrashOnExceptions"]; +} + +static Method FIRCLSGetNSApplicationReportExceptionMethod(void) { + return class_getInstanceMethod(NSClassFromString(@"NSApplication"), @selector(reportException:)); +} + +static NSApplicationReportExceptionFunction FIRCLSOriginalNSExceptionReportExceptionFunction(void) { + return (NSApplicationReportExceptionFunction) + _firclsContext.readonly->exception.originalNSApplicationReportException; +} + +void FIRCLSNSApplicationReportException(id self, SEL cmd, NSException *exception) { + FIRCLSExceptionRecordNSException(exception); + + // Call the original implementation + FIRCLSOriginalNSExceptionReportExceptionFunction()(self, cmd, exception); +} + +#endif diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Handlers/FIRCLSHandler.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Handlers/FIRCLSHandler.h new file mode 100644 index 0000000..8e76659 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Handlers/FIRCLSHandler.h @@ -0,0 +1,28 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once + +#include + +#include "Crashlytics/Crashlytics/Helpers/FIRCLSFile.h" + +__BEGIN_DECLS + +void FIRCLSHandler(FIRCLSFile *file, + thread_t crashedThread, + void *uapVoid, + bool shouldSuspendThread); + +__END_DECLS diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Handlers/FIRCLSHandler.m b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Handlers/FIRCLSHandler.m new file mode 100644 index 0000000..b9348f0 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Handlers/FIRCLSHandler.m @@ -0,0 +1,56 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "Crashlytics/Crashlytics/Handlers/FIRCLSHandler.h" + +#include "Crashlytics/Crashlytics/Components/FIRCLSCrashedMarkerFile.h" +#include "Crashlytics/Crashlytics/Components/FIRCLSGlobals.h" +#include "Crashlytics/Crashlytics/Components/FIRCLSHost.h" +#include "Crashlytics/Crashlytics/Components/FIRCLSProcess.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSUtility.h" + +#import "Crashlytics/Crashlytics/Controllers/FIRCLSReportManager_Private.h" + +void FIRCLSHandler(FIRCLSFile* file, + thread_t crashedThread, + void* uapVoid, + bool shouldSuspendThread) { + FIRCLSProcess process; + + FIRCLSProcessInit(&process, crashedThread, uapVoid); + + if (shouldSuspendThread) { + FIRCLSProcessSuspendAllOtherThreads(&process); + } + + FIRCLSProcessRecordAllThreads(&process, file); + + FIRCLSProcessRecordRuntimeInfo(&process, file); + // Get dispatch queue and thread names. Note that getting the thread names + // can hang, so let's do that last + FIRCLSProcessRecordDispatchQueueNames(&process, file); + FIRCLSProcessRecordThreadNames(&process, file); + + // this stuff isn't super important, but we can try + FIRCLSProcessRecordStats(&process, file); + FIRCLSHostWriteDiskUsage(file); + + // This is the first common point where various crash handlers call into + // Store a crash file marker to indicate that a crash has occurred + FIRCLSCreateCrashedMarkerFile(); + + if (shouldSuspendThread) { + FIRCLSProcessResumeAllOtherThreads(&process); + } +} diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Handlers/FIRCLSMachException.c b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Handlers/FIRCLSMachException.c new file mode 100644 index 0000000..048a975 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Handlers/FIRCLSMachException.c @@ -0,0 +1,534 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "Crashlytics/Crashlytics/Helpers/FIRCLSDefines.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSFeatures.h" + +#if CLS_MACH_EXCEPTION_SUPPORTED + +#include "Crashlytics/Crashlytics/Components/FIRCLSGlobals.h" +#include "Crashlytics/Crashlytics/Handlers/FIRCLSHandler.h" +#include "Crashlytics/Crashlytics/Handlers/FIRCLSMachException.h" +#include "Crashlytics/Crashlytics/Components/FIRCLSProcess.h" +#include "Crashlytics/Crashlytics/Handlers/FIRCLSSignal.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSUtility.h" + +#include +#include +#include +#include + +#pragma mark Prototypes +static void* FIRCLSMachExceptionServer(void* argument); +static bool FIRCLSMachExceptionThreadStart(FIRCLSMachExceptionReadContext* context); +static bool FIRCLSMachExceptionReadMessage(FIRCLSMachExceptionReadContext* context, + MachExceptionMessage* message); +static kern_return_t FIRCLSMachExceptionDispatchMessage(FIRCLSMachExceptionReadContext* context, + MachExceptionMessage* message); +static bool FIRCLSMachExceptionReply(FIRCLSMachExceptionReadContext* context, + MachExceptionMessage* message, + kern_return_t result); +static bool FIRCLSMachExceptionRegister(FIRCLSMachExceptionReadContext* context); +static bool FIRCLSMachExceptionUnregister(FIRCLSMachExceptionOriginalPorts* originalPorts, + exception_mask_t mask); +static bool FIRCLSMachExceptionRecord(FIRCLSMachExceptionReadContext* context, + MachExceptionMessage* message); + +#pragma mark - Initialization +void FIRCLSMachExceptionInit(FIRCLSMachExceptionReadContext* context) { + if (!FIRCLSUnlinkIfExists(context->path)) { + FIRCLSSDKLog("Unable to reset the mach exception file %s\n", strerror(errno)); + } + + if (!FIRCLSMachExceptionRegister(context)) { + FIRCLSSDKLog("Unable to register mach exception handler\n"); + return; + } + + if (!FIRCLSMachExceptionThreadStart(context)) { + FIRCLSSDKLog("Unable to start thread\n"); + FIRCLSMachExceptionUnregister(&context->originalPorts, context->mask); + } +} + +void FIRCLSMachExceptionCheckHandlers(void) { + if (_firclsContext.readonly->debuggerAttached) { + return; + } + + // It isn't really critical that this be done, as its extremely uncommon to run into + // preexisting handlers. + // Can use task_get_exception_ports for this. +} + +static exception_mask_t FIRCLSMachExceptionMask(void) { + exception_mask_t mask; + + // EXC_BAD_ACCESS + // EXC_BAD_INSTRUCTION + // EXC_ARITHMETIC + // EXC_EMULATION - non-failure + // EXC_SOFTWARE - non-failure + // EXC_BREAKPOINT - trap instructions, from the debugger and code. Needs special treatment. + // EXC_SYSCALL - non-failure + // EXC_MACH_SYSCALL - non-failure + // EXC_RPC_ALERT - non-failure + // EXC_CRASH - see below + // EXC_RESOURCE - non-failure, happens when a process exceeds a resource limit + // EXC_GUARD - see below + // + // EXC_CRASH is a special kind of exception. It is handled by launchd, and treated special by + // the kernel. Seems that we cannot safely catch it - our handler will never be called. This + // is a confirmed kernel bug. Lacking access to EXC_CRASH means we must use signal handlers to + // cover all types of crashes. + // EXC_GUARD is relatively new, and isn't available on all OS versions. You have to be careful, + // because you cannot successfully register handlers if there are any unrecognized masks. We've + // dropped support for old OS versions that didn't have EXC_GUARD (iOS 5 and below, macOS 10.6 and + // below) so we always add it now + + mask = EXC_MASK_BAD_ACCESS | EXC_MASK_BAD_INSTRUCTION | EXC_MASK_ARITHMETIC | + EXC_MASK_BREAKPOINT | EXC_MASK_GUARD; + + return mask; +} + +static bool FIRCLSMachExceptionThreadStart(FIRCLSMachExceptionReadContext* context) { + pthread_attr_t attr; + + if (pthread_attr_init(&attr) != 0) { + FIRCLSSDKLog("pthread_attr_init %s\n", strerror(errno)); + pthread_attr_destroy(&attr); + return false; + } + + if (pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED) != 0) { + FIRCLSSDKLog("pthread_attr_setdetachstate %s\n", strerror(errno)); + pthread_attr_destroy(&attr); + return false; + } + + // Use to pre-allocate a stack for this thread + // The stack must be page-aligned + if (pthread_attr_setstack(&attr, _firclsContext.readonly->machStack, + CLS_MACH_EXCEPTION_HANDLER_STACK_SIZE) != 0) { + FIRCLSSDKLog("pthread_attr_setstack %s\n", strerror(errno)); + pthread_attr_destroy(&attr); + return false; + } + + if (pthread_create(&context->thread, &attr, FIRCLSMachExceptionServer, context) != 0) { + FIRCLSSDKLog("pthread_create %s\n", strerror(errno)); + pthread_attr_destroy(&attr); + return false; + } + + pthread_attr_destroy(&attr); + + return true; +} + +exception_mask_t FIRCLSMachExceptionMaskForSignal(int signal) { + switch (signal) { + case SIGTRAP: + return EXC_MASK_BREAKPOINT; + case SIGSEGV: + return EXC_MASK_BAD_ACCESS; + case SIGBUS: + return EXC_MASK_BAD_ACCESS; + case SIGILL: + return EXC_MASK_BAD_INSTRUCTION; + case SIGABRT: + return EXC_MASK_CRASH; + case SIGSYS: + return EXC_MASK_CRASH; + case SIGFPE: + return EXC_MASK_ARITHMETIC; + } + + return 0; +} + +#pragma mark - Message Handling +static void* FIRCLSMachExceptionServer(void* argument) { + FIRCLSMachExceptionReadContext* context = argument; + + pthread_setname_np("com.google.firebase.crashlytics.MachExceptionServer"); + + while (1) { + MachExceptionMessage message; + + // read the exception message + if (!FIRCLSMachExceptionReadMessage(context, &message)) { + break; + } + + // handle it, and possibly forward + kern_return_t result = FIRCLSMachExceptionDispatchMessage(context, &message); + + // and now, reply + if (!FIRCLSMachExceptionReply(context, &message, result)) { + break; + } + } + + FIRCLSSDKLog("Mach exception server thread exiting\n"); + + return NULL; +} + +static bool FIRCLSMachExceptionReadMessage(FIRCLSMachExceptionReadContext* context, + MachExceptionMessage* message) { + mach_msg_return_t r; + + memset(message, 0, sizeof(MachExceptionMessage)); + + r = mach_msg(&message->head, MACH_RCV_MSG | MACH_RCV_LARGE, 0, sizeof(MachExceptionMessage), + context->port, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL); + if (r != MACH_MSG_SUCCESS) { + FIRCLSSDKLog("Error receiving mach_msg (%d)\n", r); + return false; + } + + FIRCLSSDKLog("Accepted mach exception message\n"); + + return true; +} + +static kern_return_t FIRCLSMachExceptionDispatchMessage(FIRCLSMachExceptionReadContext* context, + MachExceptionMessage* message) { + FIRCLSSDKLog("Mach exception: 0x%x, count: %d, code: 0x%llx 0x%llx\n", message->exception, + message->codeCnt, message->codeCnt > 0 ? message->code[0] : -1, + message->codeCnt > 1 ? message->code[1] : -1); + + // This will happen if a child process raises an exception, as the exception ports are + // inherited. + if (message->task.name != mach_task_self()) { + FIRCLSSDKLog("Mach exception task mis-match, returning failure\n"); + return KERN_FAILURE; + } + + FIRCLSSDKLog("Unregistering handler\n"); + if (!FIRCLSMachExceptionUnregister(&context->originalPorts, context->mask)) { + FIRCLSSDKLog("Failed to unregister\n"); + return KERN_FAILURE; + } + + FIRCLSSDKLog("Restoring original signal handlers\n"); + if (!FIRCLSSignalSafeInstallPreexistingHandlers(& _firclsContext.readonly->signal, -1, NULL, NULL)) { + FIRCLSSDKLog("Failed to restore signal handlers\n"); + return KERN_FAILURE; + } + + FIRCLSSDKLog("Recording mach exception\n"); + if (!FIRCLSMachExceptionRecord(context, message)) { + FIRCLSSDKLog("Failed to record mach exception\n"); + return KERN_FAILURE; + } + + return KERN_SUCCESS; +} + +static bool FIRCLSMachExceptionReply(FIRCLSMachExceptionReadContext* context, + MachExceptionMessage* message, + kern_return_t result) { + MachExceptionReply reply; + mach_msg_return_t r; + + // prepare the reply + reply.head.msgh_bits = MACH_MSGH_BITS(MACH_MSGH_BITS_REMOTE(message->head.msgh_bits), 0); + reply.head.msgh_remote_port = message->head.msgh_remote_port; + reply.head.msgh_size = (mach_msg_size_t)sizeof(MachExceptionReply); + reply.head.msgh_local_port = MACH_PORT_NULL; + reply.head.msgh_id = message->head.msgh_id + 100; + + reply.NDR = NDR_record; + + reply.retCode = result; + + FIRCLSSDKLog("Sending exception reply\n"); + + // send it + r = mach_msg(&reply.head, MACH_SEND_MSG, reply.head.msgh_size, 0, MACH_PORT_NULL, + MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL); + if (r != MACH_MSG_SUCCESS) { + FIRCLSSDKLog("mach_msg reply failed (%d)\n", r); + return false; + } + + FIRCLSSDKLog("Exception reply delivered\n"); + + return true; +} + +#pragma mark - Registration +static bool FIRCLSMachExceptionRegister(FIRCLSMachExceptionReadContext* context) { + mach_port_t task = mach_task_self(); + + kern_return_t kr = mach_port_allocate(task, MACH_PORT_RIGHT_RECEIVE, &context->port); + if (kr != KERN_SUCCESS) { + FIRCLSSDKLog("Error: mach_port_allocate failed %d\n", kr); + return false; + } + + kr = mach_port_insert_right(task, context->port, context->port, MACH_MSG_TYPE_MAKE_SEND); + if (kr != KERN_SUCCESS) { + FIRCLSSDKLog("Error: mach_port_insert_right failed %d\n", kr); + mach_port_deallocate(task, context->port); + return false; + } + + // Get the desired mask, which covers all the mach exceptions we are capable of handling, + // but clear out any that are in our ignore list. We do this by ANDing with the bitwise + // negation. Because we are only clearing bits, there's no way to set an incorrect mask + // using ignoreMask. + context->mask = FIRCLSMachExceptionMask(); + + // ORing with MACH_EXCEPTION_CODES will produce 64-bit exception data + kr = task_swap_exception_ports(task, context->mask, context->port, + EXCEPTION_DEFAULT | MACH_EXCEPTION_CODES, THREAD_STATE_NONE, + context->originalPorts.masks, &context->originalPorts.count, + context->originalPorts.ports, context->originalPorts.behaviors, + context->originalPorts.flavors); + if (kr != KERN_SUCCESS) { + FIRCLSSDKLog("Error: task_swap_exception_ports %d\n", kr); + return false; + } + + for (int i = 0; i < context->originalPorts.count; ++i) { + FIRCLSSDKLog("original 0x%x 0x%x 0x%x 0x%x\n", context->originalPorts.ports[i], + context->originalPorts.masks[i], context->originalPorts.behaviors[i], + context->originalPorts.flavors[i]); + } + + return true; +} + +static bool FIRCLSMachExceptionUnregister(FIRCLSMachExceptionOriginalPorts* originalPorts, + exception_mask_t mask) { + kern_return_t kr; + + // Re-register all the old ports. + for (mach_msg_type_number_t i = 0; i < originalPorts->count; ++i) { + // clear the bits from this original mask + mask &= ~originalPorts->masks[i]; + + kr = + task_set_exception_ports(mach_task_self(), originalPorts->masks[i], originalPorts->ports[i], + originalPorts->behaviors[i], originalPorts->flavors[i]); + if (kr != KERN_SUCCESS) { + FIRCLSSDKLog("unable to restore original port: %d", originalPorts->ports[i]); + } + } + + // Finally, mark any masks we registered for that do not have an original port as unused. + kr = task_set_exception_ports(mach_task_self(), mask, MACH_PORT_NULL, + EXCEPTION_DEFAULT | MACH_EXCEPTION_CODES, THREAD_STATE_NONE); + if (kr != KERN_SUCCESS) { + FIRCLSSDKLog("unable to unset unregistered mask: 0x%x", mask); + return false; + } + + return true; +} + +#pragma mark - Recording +void FIRCLSMachExceptionNameLookup(exception_type_t number, + mach_exception_data_type_t code, + const char** name, + const char** codeName) { + if (!name || !codeName) { + return; + } + + *name = NULL; + *codeName = NULL; + + switch (number) { + case EXC_BAD_ACCESS: + *name = "EXC_BAD_ACCESS"; + switch (code) { + case KERN_INVALID_ADDRESS: + *codeName = "KERN_INVALID_ADDRESS"; + break; + case KERN_PROTECTION_FAILURE: + *codeName = "KERN_PROTECTION_FAILURE"; + break; + } + + break; + case EXC_BAD_INSTRUCTION: + *name = "EXC_BAD_INSTRUCTION"; +#if CLS_CPU_X86 + *codeName = "EXC_I386_INVOP"; +#endif + break; + case EXC_ARITHMETIC: + *name = "EXC_ARITHMETIC"; +#if CLS_CPU_X86 + switch (code) { + case EXC_I386_DIV: + *codeName = "EXC_I386_DIV"; + break; + case EXC_I386_INTO: + *codeName = "EXC_I386_INTO"; + break; + case EXC_I386_NOEXT: + *codeName = "EXC_I386_NOEXT"; + break; + case EXC_I386_EXTOVR: + *codeName = "EXC_I386_EXTOVR"; + break; + case EXC_I386_EXTERR: + *codeName = "EXC_I386_EXTERR"; + break; + case EXC_I386_EMERR: + *codeName = "EXC_I386_EMERR"; + break; + case EXC_I386_BOUND: + *codeName = "EXC_I386_BOUND"; + break; + case EXC_I386_SSEEXTERR: + *codeName = "EXC_I386_SSEEXTERR"; + break; + } +#endif + break; + case EXC_BREAKPOINT: + *name = "EXC_BREAKPOINT"; +#if CLS_CPU_X86 + switch (code) { + case EXC_I386_DIVERR: + *codeName = "EXC_I386_DIVERR"; + break; + case EXC_I386_SGLSTP: + *codeName = "EXC_I386_SGLSTP"; + break; + case EXC_I386_NMIFLT: + *codeName = "EXC_I386_NMIFLT"; + break; + case EXC_I386_BPTFLT: + *codeName = "EXC_I386_BPTFLT"; + break; + case EXC_I386_INTOFLT: + *codeName = "EXC_I386_INTOFLT"; + break; + case EXC_I386_BOUNDFLT: + *codeName = "EXC_I386_BOUNDFLT"; + break; + case EXC_I386_INVOPFLT: + *codeName = "EXC_I386_INVOPFLT"; + break; + case EXC_I386_NOEXTFLT: + *codeName = "EXC_I386_NOEXTFLT"; + break; + case EXC_I386_EXTOVRFLT: + *codeName = "EXC_I386_EXTOVRFLT"; + break; + case EXC_I386_INVTSSFLT: + *codeName = "EXC_I386_INVTSSFLT"; + break; + case EXC_I386_SEGNPFLT: + *codeName = "EXC_I386_SEGNPFLT"; + break; + case EXC_I386_STKFLT: + *codeName = "EXC_I386_STKFLT"; + break; + case EXC_I386_GPFLT: + *codeName = "EXC_I386_GPFLT"; + break; + case EXC_I386_PGFLT: + *codeName = "EXC_I386_PGFLT"; + break; + case EXC_I386_EXTERRFLT: + *codeName = "EXC_I386_EXTERRFLT"; + break; + case EXC_I386_ALIGNFLT: + *codeName = "EXC_I386_ALIGNFLT"; + break; + case EXC_I386_ENDPERR: + *codeName = "EXC_I386_ENDPERR"; + break; + case EXC_I386_ENOEXTFLT: + *codeName = "EXC_I386_ENOEXTFLT"; + break; + } +#endif + break; + case EXC_GUARD: + *name = "EXC_GUARD"; + break; + } +} + +static bool FIRCLSMachExceptionRecord(FIRCLSMachExceptionReadContext* context, + MachExceptionMessage* message) { + if (!context || !message) { + return false; + } + + if (FIRCLSContextMarkAndCheckIfCrashed()) { + FIRCLSSDKLog("Error: aborting mach exception handler because crash has already occurred\n"); + exit(1); + return false; + } + + FIRCLSFile file; + + if (!FIRCLSFileInitWithPath(&file, context->path, false)) { + FIRCLSSDKLog("Unable to open mach exception file\n"); + return false; + } + + FIRCLSFileWriteSectionStart(&file, "mach_exception"); + + FIRCLSFileWriteHashStart(&file); + + FIRCLSFileWriteHashEntryUint64(&file, "exception", message->exception); + + // record the codes + FIRCLSFileWriteHashKey(&file, "codes"); + FIRCLSFileWriteArrayStart(&file); + for (mach_msg_type_number_t i = 0; i < message->codeCnt; ++i) { + FIRCLSFileWriteArrayEntryUint64(&file, message->code[i]); + } + FIRCLSFileWriteArrayEnd(&file); + + const char* name = NULL; + const char* codeName = NULL; + + FIRCLSMachExceptionNameLookup(message->exception, message->codeCnt > 0 ? message->code[0] : 0, + &name, &codeName); + + FIRCLSFileWriteHashEntryString(&file, "name", name); + FIRCLSFileWriteHashEntryString(&file, "code_name", codeName); + + FIRCLSFileWriteHashEntryUint64(&file, "original_ports", context->originalPorts.count); + FIRCLSFileWriteHashEntryUint64(&file, "time", time(NULL)); + + FIRCLSFileWriteHashEnd(&file); + + FIRCLSFileWriteSectionEnd(&file); + + FIRCLSHandler(&file, message->thread.name, NULL, true); + + FIRCLSFileClose(&file); + + return true; +} + +#else + +INJECT_STRIP_SYMBOL(cls_mach_exception) + +#endif diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Handlers/FIRCLSMachException.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Handlers/FIRCLSMachException.h new file mode 100644 index 0000000..ca85501 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Handlers/FIRCLSMachException.h @@ -0,0 +1,81 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "Crashlytics/Crashlytics/Helpers/FIRCLSFeatures.h" + +#pragma once + +#if CLS_MACH_EXCEPTION_SUPPORTED + +#include +#include +#include + +// must be at least PTHREAD_STACK_MIN size +#define CLS_MACH_EXCEPTION_HANDLER_STACK_SIZE (256 * 1024) + +#pragma mark Structures +#pragma pack(push, 4) +typedef struct { + mach_msg_header_t head; + /* start of the kernel processed data */ + mach_msg_body_t msgh_body; + mach_msg_port_descriptor_t thread; + mach_msg_port_descriptor_t task; + /* end of the kernel processed data */ + NDR_record_t NDR; + exception_type_t exception; + mach_msg_type_number_t codeCnt; + mach_exception_data_type_t code[EXCEPTION_CODE_MAX]; + mach_msg_trailer_t trailer; +} MachExceptionMessage; + +typedef struct { + mach_msg_header_t head; + NDR_record_t NDR; + kern_return_t retCode; +} MachExceptionReply; +#pragma pack(pop) + +typedef struct { + mach_msg_type_number_t count; + exception_mask_t masks[EXC_TYPES_COUNT]; + exception_handler_t ports[EXC_TYPES_COUNT]; + exception_behavior_t behaviors[EXC_TYPES_COUNT]; + thread_state_flavor_t flavors[EXC_TYPES_COUNT]; +} FIRCLSMachExceptionOriginalPorts; + +typedef struct { + mach_port_t port; + pthread_t thread; + const char *path; + + exception_mask_t mask; + FIRCLSMachExceptionOriginalPorts originalPorts; +} FIRCLSMachExceptionReadContext; + +#pragma mark - API +void FIRCLSMachExceptionInit(FIRCLSMachExceptionReadContext *context); + +void FIRCLSMachExceptionCheckHandlers(void); + +void FIRCLSMachExceptionNameLookup(exception_type_t number, + mach_exception_data_type_t code, + const char **name, + const char **codeName); +#else + +#define CLS_MACH_EXCEPTION_HANDLER_STACK_SIZE 0 + +#endif diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Handlers/FIRCLSSignal.c b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Handlers/FIRCLSSignal.c new file mode 100644 index 0000000..155490c --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Handlers/FIRCLSSignal.c @@ -0,0 +1,334 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "Crashlytics/Crashlytics/Handlers/FIRCLSSignal.h" +#include "Crashlytics/Crashlytics/Components/FIRCLSGlobals.h" +#include "Crashlytics/Crashlytics/Handlers/FIRCLSHandler.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSUtility.h" + +#include +#include + +#if CLS_SIGNAL_SUPPORTED +static const int FIRCLSFatalSignals[FIRCLSSignalCount] = {SIGABRT, SIGBUS, SIGFPE, SIGILL, + SIGSEGV, SIGSYS, SIGTRAP}; + +#if CLS_USE_SIGALTSTACK +static void FIRCLSSignalInstallAltStack(FIRCLSSignalReadContext *roContext); +#endif +static void FIRCLSSignalInstallHandlers(FIRCLSSignalReadContext *roContext); +static void FIRCLSSignalHandler(int signal, siginfo_t *info, void *uapVoid); + +void FIRCLSSignalInitialize(FIRCLSSignalReadContext *roContext) { + if (!FIRCLSUnlinkIfExists(roContext->path)) { + FIRCLSSDKLog("Unable to reset the signal log file %s\n", strerror(errno)); + } + +#if CLS_USE_SIGALTSTACK + FIRCLSSignalInstallAltStack(roContext); +#endif + FIRCLSSignalInstallHandlers(roContext); +#if TARGET_IPHONE_SIMULATOR + // prevent the OpenGL stack (by way of OpenGLES.framework/libLLVMContainer.dylib) from installing + // signal handlers that do not chain back + // TODO: I don't believe this is necessary as of recent iOS releases + bool *ptr = dlsym(RTLD_DEFAULT, "_ZN4llvm23DisablePrettyStackTraceE"); + if (ptr) { + *ptr = true; + } +#endif +} + +void FIRCLSSignalEnumerateHandledSignals(void (^block)(int idx, int signal)) { + for (int i = 0; i < FIRCLSSignalCount; ++i) { + block(i, FIRCLSFatalSignals[i]); + } +} + +#if CLS_USE_SIGALTSTACK + +static void FIRCLSSignalInstallAltStack(FIRCLSSignalReadContext *roContext) { + stack_t signalStack; + stack_t originalStack; + + signalStack.ss_sp = _firclsContext.readonly->signalStack; + signalStack.ss_size = CLS_SIGNAL_HANDLER_STACK_SIZE; + signalStack.ss_flags = 0; + + if (sigaltstack(&signalStack, &originalStack) != 0) { + FIRCLSSDKLog("Unable to setup stack %s\n", strerror(errno)); + + return; + } + + roContext->originalStack.ss_sp = NULL; + roContext->originalStack = originalStack; +} + +#endif + +static void FIRCLSSignalInstallHandlers(FIRCLSSignalReadContext *roContext) { + FIRCLSSignalEnumerateHandledSignals(^(int idx, int signal) { + struct sigaction action; + struct sigaction previousAction; + + action.sa_sigaction = FIRCLSSignalHandler; + // SA_RESETHAND seems like it would be great, but it doesn't appear to + // work correctly. After taking a signal, causing another identical signal in + // the handler will *not* cause the default handler to be involved (which should + // terminate the process). I've found some evidence that others have seen this + // behavior on MAC OS X. + action.sa_flags = SA_SIGINFO | SA_ONSTACK; + + sigemptyset(&action.sa_mask); + + previousAction.sa_sigaction = NULL; + if (sigaction(signal, &action, &previousAction) != 0) { + FIRCLSSDKLog("Unable to install handler for %d (%s)\n", signal, strerror(errno)); + } + + // store the last action, so it can be recalled + roContext->originalActions[idx].sa_sigaction = NULL; + + if (previousAction.sa_sigaction) { + roContext->originalActions[idx] = previousAction; + } + }); +} + +void FIRCLSSignalCheckHandlers(void) { + if (_firclsContext.readonly->debuggerAttached) { + // Adding this log to remind user deattachs from the debugger. Besides FIRCLSSignal, this logic is on FIRCLSMachException and FIRCLSException as well. Only log once since the check is same. + FIRCLSSDKLog("[Crashlytics] App is attached to a debugger, to see the crash reports please detach from the debugger, https://firebase.google.com/docs/crashlytics/get-started?platform=ios#force-test-crash"); + return; + } + + FIRCLSSignalEnumerateHandledSignals(^(int idx, int signal) { + struct sigaction previousAction; + Dl_info info; + void *ptr; + + if (sigaction(signal, 0, &previousAction) != 0) { + fprintf(stderr, "Unable to read signal handler\n"); + return; + } + + ptr = previousAction.__sigaction_u.__sa_handler; + const char *signalName = NULL; + const char *codeName = NULL; + + FIRCLSSignalNameLookup(signal, 0, &signalName, &codeName); + + if (ptr == FIRCLSSignalHandler) { + return; + } + + const char *name = NULL; + if (dladdr(ptr, &info) != 0) { + name = info.dli_sname; + } + + fprintf(stderr, + "[Crashlytics] The signal %s has a non-Crashlytics handler (%s). This will interfere " + "with reporting.\n", + signalName, name); + }); +} + +void FIRCLSSignalSafeRemoveHandlers(bool includingAbort) { + FIRCLSSignalEnumerateHandledSignals(^(int idx, int signal) { + struct sigaction sa; + + if (!includingAbort && (signal == SIGABRT)) { + return; + } + + sa.sa_handler = SIG_DFL; + sigemptyset(&sa.sa_mask); + + if (sigaction(signal, &sa, NULL) != 0) { + FIRCLSSDKLog("Unable to set default handler for %d (%s)\n", signal, strerror(errno)); + } + }); +} + +bool FIRCLSSignalSafeInstallPreexistingHandlers(FIRCLSSignalReadContext *roContext, + const int signal, + siginfo_t *info, + void *uapVoid) { + __block bool success = true; + + FIRCLSSignalSafeRemoveHandlers(true); + +#if CLS_USE_SIGALTSTACK + + // re-install the original stack, if needed + if (roContext->originalStack.ss_sp) { + if (sigaltstack(&roContext->originalStack, 0) != 0) { + FIRCLSSDKLog("Unable to setup stack %s\n", strerror(errno)); + + return false; + } + } + +#endif + + // re-install the original handlers, if any + FIRCLSSignalEnumerateHandledSignals(^(int idx, int currentSignal) { + if (roContext->originalActions[idx].sa_sigaction == NULL) { + return; + } + + if (sigaction(currentSignal, &roContext->originalActions[idx], 0) != 0) { + FIRCLSSDKLog("Unable to install handler for %d (%s)\n", currentSignal, strerror(errno)); + success = false; + } + + // invoke original handler for current signal + if (signal < 0) { + return; + } + if (signal == currentSignal) { + roContext->originalActions[idx].sa_sigaction(signal, info, uapVoid); + } + }); + + return success; +} + +void FIRCLSSignalNameLookup(int number, int code, const char **name, const char **codeName) { + if (!name || !codeName) { + return; + } + + *codeName = NULL; + + switch (number) { + case SIGABRT: + *name = "SIGABRT"; + *codeName = "ABORT"; + break; + case SIGBUS: + *name = "SIGBUS"; + break; + case SIGFPE: + *name = "SIGFPE"; + break; + case SIGILL: + *name = "SIGILL"; + break; + case SIGSEGV: + *name = "SIGSEGV"; + break; + case SIGSYS: + *name = "SIGSYS"; + break; + case SIGTRAP: + *name = "SIGTRAP"; + break; + default: + *name = "UNKNOWN"; + break; + } +} + +static void FIRCLSSignalRecordSignal(int savedErrno, siginfo_t *info, void *uapVoid) { + if (!_firclsContext.readonly) { + return; + } + + if (FIRCLSContextMarkAndCheckIfCrashed()) { + FIRCLSSDKLog("Error: aborting signal handler because crash has already occurred"); + exit(1); + return; + } + + FIRCLSFile file; + + if (!FIRCLSFileInitWithPath(&file, _firclsContext.readonly->signal.path, false)) { + FIRCLSSDKLog("Unable to open signal file\n"); + return; + } + + FIRCLSFileWriteSectionStart(&file, "signal"); + + FIRCLSFileWriteHashStart(&file); + + if (FIRCLSIsValidPointer(info)) { + FIRCLSFileWriteHashEntryUint64(&file, "number", info->si_signo); + FIRCLSFileWriteHashEntryUint64(&file, "code", info->si_code); + FIRCLSFileWriteHashEntryUint64(&file, "address", (uint64_t)info->si_addr); + + const char *name = NULL; + const char *codeName = NULL; + + FIRCLSSignalNameLookup(info->si_signo, info->si_code, &name, &codeName); + + FIRCLSFileWriteHashEntryString(&file, "name", name); + FIRCLSFileWriteHashEntryString(&file, "code_name", codeName); + } + + FIRCLSFileWriteHashEntryUint64(&file, "errno", savedErrno); + FIRCLSFileWriteHashEntryUint64(&file, "time", time(NULL)); + + FIRCLSFileWriteHashEnd(&file); + + FIRCLSFileWriteSectionEnd(&file); + + FIRCLSHandler(&file, mach_thread_self(), uapVoid, true); + + FIRCLSFileClose(&file); +} + +static void FIRCLSSignalHandler(int signal, siginfo_t *info, void *uapVoid) { + int savedErrno; + sigset_t set; + + // save errno, both because it is interesting, and so we can restore it afterwards + savedErrno = errno; + errno = 0; + + FIRCLSSDKLog("Signal: %d\n", signal); + + // it is important to do this before unmasking signals, otherwise we can get + // called in a loop + FIRCLSSignalSafeRemoveHandlers(true); + + sigfillset(&set); + if (sigprocmask(SIG_UNBLOCK, &set, NULL) != 0) { + FIRCLSSDKLog("Unable to unmask signals - we risk infinite recursion here\n"); + } + + // check info and uapVoid, and set them to appropriate values if invalid. This can happen + // if we have been called without the SA_SIGINFO flag set + if (!FIRCLSIsValidPointer(info)) { + info = NULL; + } + + if (!FIRCLSIsValidPointer(uapVoid)) { + uapVoid = NULL; + } + + FIRCLSSignalRecordSignal(savedErrno, info, uapVoid); + + // re-install original handlers + if (_firclsContext.readonly) { + FIRCLSSignalSafeInstallPreexistingHandlers(&_firclsContext.readonly->signal, signal, info, + uapVoid); + } + + // restore errno + errno = savedErrno; +} +#endif diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Handlers/FIRCLSSignal.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Handlers/FIRCLSSignal.h new file mode 100644 index 0000000..7368d72 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Handlers/FIRCLSSignal.h @@ -0,0 +1,56 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once + +#include "Crashlytics/Crashlytics/Helpers/FIRCLSFeatures.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSFile.h" + +#include +#include + +// per man sigaltstack, MINSIGSTKSZ is the minimum *overhead* needed to support +// a signal stack. The actual stack size must be larger. Let's pick the recommended +// size. +#if CLS_USE_SIGALTSTACK +#define CLS_SIGNAL_HANDLER_STACK_SIZE (SIGSTKSZ * 2) +#else +#define CLS_SIGNAL_HANDLER_STACK_SIZE 0 +#endif + +#if CLS_SIGNAL_SUPPORTED +#define FIRCLSSignalCount (7) + +typedef struct { + const char *path; + struct sigaction originalActions[FIRCLSSignalCount]; + +#if CLS_USE_SIGALTSTACK + stack_t originalStack; +#endif +} FIRCLSSignalReadContext; + +void FIRCLSSignalInitialize(FIRCLSSignalReadContext *roContext); +void FIRCLSSignalCheckHandlers(void); + +void FIRCLSSignalSafeRemoveHandlers(bool includingAbort); +bool FIRCLSSignalSafeInstallPreexistingHandlers(FIRCLSSignalReadContext *roContext, + const int signal, + siginfo_t *info, + void *uapVoid); + +void FIRCLSSignalNameLookup(int number, int code, const char **name, const char **codeName); + +void FIRCLSSignalEnumerateHandledSignals(void (^block)(int idx, int signal)); +#endif diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSAllocate.c b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSAllocate.c new file mode 100644 index 0000000..6c04a7d --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSAllocate.c @@ -0,0 +1,238 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include + +#include "Crashlytics/Crashlytics/Helpers/FIRCLSAllocate.h" +#include "Crashlytics/Crashlytics/Components/FIRCLSHost.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSUtility.h" + +#include +#include +#include +#include +#include +#include +#include + +void* FIRCLSAllocatorSafeAllocateFromRegion(FIRCLSAllocationRegion* region, size_t size); + +FIRCLSAllocatorRef FIRCLSAllocatorCreate(size_t writableSpace, size_t readableSpace) { + FIRCLSAllocatorRef allocator; + FIRCLSAllocationRegion writableRegion; + FIRCLSAllocationRegion readableRegion; + size_t allocationSize; + vm_size_t pageSize; + void* buffer; + + // | GUARD | WRITABLE_REGION | GUARD | READABLE_REGION | GUARD | + + pageSize = FIRCLSHostGetPageSize(); + + readableSpace += sizeof(FIRCLSAllocator); // add the space for our allocator itself + + // we can only protect at the page level, so we need all of our regions to be + // exact multiples of pages. But, we don't need anything in the special-case of zero. + + writableRegion.size = 0; + if (writableSpace > 0) { + writableRegion.size = ((writableSpace / pageSize) + 1) * pageSize; + } + + readableRegion.size = 0; + if (readableSpace > 0) { + readableRegion.size = ((readableSpace / pageSize) + 1) * pageSize; + } + + // Make one big, continuous allocation, adding additional pages for our guards. Note + // that we cannot use malloc, calloc (or valloc) in this case, because we need to assert full + // ownership over these allocations. mmap is a much better choice. We also mark these + // pages as MAP_NOCACHE. + allocationSize = writableRegion.size + readableRegion.size + pageSize * 3; + buffer = + mmap(0, allocationSize, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE | MAP_NOCACHE, -1, 0); + if (buffer == MAP_FAILED) { + FIRCLSSDKLogError("Mapping failed %s\n", strerror(errno)); + return NULL; + } + + // move our cursors into position + writableRegion.cursor = (void*)((uintptr_t)buffer + pageSize); + readableRegion.cursor = (void*)((uintptr_t)buffer + pageSize + writableRegion.size + pageSize); + writableRegion.start = writableRegion.cursor; + readableRegion.start = readableRegion.cursor; + + FIRCLSSDKLogInfo("Mapping: %p %p %p, total: %zu K\n", buffer, writableRegion.start, + readableRegion.start, allocationSize / 1024); + + // protect first guard page + if (mprotect(buffer, pageSize, PROT_NONE) != 0) { + FIRCLSSDKLogError("First guard protection failed %s\n", strerror(errno)); + return NULL; + } + + // middle guard + if (mprotect((void*)((uintptr_t)buffer + pageSize + writableRegion.size), pageSize, PROT_NONE) != + 0) { + FIRCLSSDKLogError("Middle guard protection failed %s\n", strerror(errno)); + return NULL; + } + + // end guard + if (mprotect((void*)((uintptr_t)buffer + pageSize + writableRegion.size + pageSize + + readableRegion.size), + pageSize, PROT_NONE) != 0) { + FIRCLSSDKLogError("Last guard protection failed %s\n", strerror(errno)); + return NULL; + } + + // now, perform our first "allocation", which is to place our allocator into the read-only region + allocator = FIRCLSAllocatorSafeAllocateFromRegion(&readableRegion, sizeof(FIRCLSAllocator)); + + // set up its data structure + allocator->buffer = buffer; + allocator->protectionEnabled = false; + allocator->readableRegion = readableRegion; + allocator->writeableRegion = writableRegion; + + FIRCLSSDKLogDebug("Allocator successfully created %p", allocator); + + return allocator; +} + +void FIRCLSAllocatorDestroy(FIRCLSAllocatorRef allocator) { + if (allocator) { + } +} + +bool FIRCLSAllocatorProtect(FIRCLSAllocatorRef allocator) { + void* address; + + if (!FIRCLSIsValidPointer(allocator)) { + FIRCLSSDKLogError("Invalid allocator"); + return false; + } + + if (allocator->protectionEnabled) { + FIRCLSSDKLogWarn("Write protection already enabled"); + return true; + } + + // This has to be done first + allocator->protectionEnabled = true; + + vm_size_t pageSize = FIRCLSHostGetPageSize(); + + // readable region + address = + (void*)((uintptr_t)allocator->buffer + pageSize + allocator->writeableRegion.size + pageSize); + + return mprotect(address, allocator->readableRegion.size, PROT_READ) == 0; +} + +bool FIRCLSAllocatorUnprotect(FIRCLSAllocatorRef allocator) { + size_t bufferSize; + + if (!allocator) { + return false; + } + + vm_size_t pageSize = FIRCLSHostGetPageSize(); + + bufferSize = (uintptr_t)allocator->buffer + pageSize + allocator->writeableRegion.size + + pageSize + allocator->readableRegion.size + pageSize; + + allocator->protectionEnabled = + !(mprotect(allocator->buffer, bufferSize, PROT_READ | PROT_WRITE) == 0); + + return allocator->protectionEnabled; +} + +void* FIRCLSAllocatorSafeAllocateFromRegion(FIRCLSAllocationRegion* region, size_t size) { + void* newCursor; + void* originalCursor; + + // Here's the idea + // - read the current cursor + // - compute what our new cursor should be + // - attempt a swap + // if the swap fails, some other thread has modified stuff, and we have to start again + // if the swap works, everything has been updated correctly and we are done + do { + originalCursor = region->cursor; + + // this shouldn't happen unless we make a mistake with our size pre-computations + if ((uintptr_t)originalCursor - (uintptr_t)region->start + size > region->size) { + FIRCLSSDKLog("Unable to allocate sufficient memory, falling back to calloc\n"); + void* ptr = calloc(1, size); + if (!ptr) { + FIRCLSSDKLog("Unable to calloc in FIRCLSAllocatorSafeAllocateFromRegion\n"); + return NULL; + } + return ptr; + } + + newCursor = (void*)((uintptr_t)originalCursor + size); + } while (!atomic_compare_exchange_strong(®ion->cursor, &originalCursor, newCursor)); + + return originalCursor; +} + +void* FIRCLSAllocatorSafeAllocate(FIRCLSAllocatorRef allocator, + size_t size, + FIRCLSAllocationType type) { + FIRCLSAllocationRegion* region; + + if (!allocator) { + // fall back to calloc in this case + FIRCLSSDKLog("Allocator invalid, falling back to calloc\n"); + void* ptr = calloc(1, size); + if (!ptr) { + FIRCLSSDKLog("Unable to calloc in FIRCLSAllocatorSafeAllocate\n"); + return NULL; + } + return ptr; + } + + if (allocator->protectionEnabled) { + FIRCLSSDKLog("Allocator already protected, falling back to calloc\n"); + void* ptr = calloc(1, size); + if (!ptr) { + FIRCLSSDKLog("Unable to calloc in FIRCLSAllocatorSafeAllocate\n"); + return NULL; + } + return ptr; + } + + switch (type) { + case CLS_READONLY: + region = &allocator->readableRegion; + break; + case CLS_READWRITE: + region = &allocator->writeableRegion; + break; + default: + return NULL; + } + + return FIRCLSAllocatorSafeAllocateFromRegion(region, size); +} + +void FIRCLSAllocatorFree(FIRCLSAllocatorRef allocator, void* ptr) { + if (!allocator) { + free(ptr); + } + + // how do we do deallocations? +} diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSAllocate.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSAllocate.h new file mode 100644 index 0000000..f23a7ba --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSAllocate.h @@ -0,0 +1,48 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "Crashlytics/Crashlytics/Helpers/FIRCLSFeatures.h" + +#pragma once + +#include +#include + +typedef enum { CLS_READONLY = 0, CLS_READWRITE = 1 } FIRCLSAllocationType; + +typedef struct { + size_t size; + void *start; + _Atomic(void *) volatile cursor; +} FIRCLSAllocationRegion; + +typedef struct { + void *buffer; + bool protectionEnabled; + FIRCLSAllocationRegion writeableRegion; + FIRCLSAllocationRegion readableRegion; +} FIRCLSAllocator; +typedef FIRCLSAllocator *FIRCLSAllocatorRef; + +FIRCLSAllocatorRef FIRCLSAllocatorCreate(size_t writableSpace, size_t readableSpace); +void FIRCLSAllocatorDestroy(FIRCLSAllocatorRef allocator); + +bool FIRCLSAllocatorProtect(FIRCLSAllocatorRef allocator); +bool FIRCLSAllocatorUnprotect(FIRCLSAllocatorRef allocator); + +void *FIRCLSAllocatorSafeAllocate(FIRCLSAllocatorRef allocator, + size_t size, + FIRCLSAllocationType type); +const char *FIRCLSAllocatorSafeStrdup(FIRCLSAllocatorRef allocator, const char *string); +void FIRCLSAllocatorFree(FIRCLSAllocatorRef allocator, void *ptr); diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSCallStackTree.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSCallStackTree.h new file mode 100644 index 0000000..02570f1 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSCallStackTree.h @@ -0,0 +1,37 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import +#if defined(__IPHONE_15_0) +#define CLS_METRICKIT_SUPPORTED (__has_include() && TARGET_OS_IOS) +#else +#define CLS_METRICKIT_SUPPORTED 0 +#endif + +#if CLS_METRICKIT_SUPPORTED +#import + +/* + * Helper class for parsing the `MXCallStackTree` that we receive from MetricKit. Flattens the + * nested structure into a structure similar to what is used in Crashlytics. + */ +@interface FIRCLSCallStackTree : NSObject + +- (instancetype)initWithMXCallStackTree:(MXCallStackTree *)callStackTree API_AVAILABLE(ios(14.0)); +- (NSArray *)getArrayRepresentation; +- (NSArray *)getFramesOfBlamedThread; +- (instancetype)init NS_UNAVAILABLE; + +@end +#endif diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSCallStackTree.m b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSCallStackTree.m new file mode 100644 index 0000000..44aaaeb --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSCallStackTree.m @@ -0,0 +1,147 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +#import "Crashlytics/Crashlytics/Helpers/FIRCLSCallStackTree.h" + +#if CLS_METRICKIT_SUPPORTED + +@interface FIRCLSFrame : NSObject +@property long address; +@property long sampleCount; +@property long offsetIntoBinaryTextSegment; +@property NSString *binaryName; +@property NSUUID *binaryUUID; +@end + +@implementation FIRCLSFrame +@end + +@interface FIRCLSThread : NSObject +@property NSString *threadName; +@property BOOL threadBlamed; +@property NSArray *frames; +@end + +@implementation FIRCLSThread +@end + +@interface FIRCLSCallStackTree () +@property NSArray *threads; +@property(nonatomic) BOOL callStackPerThread; + +@end + +@implementation FIRCLSCallStackTree + +- (instancetype)initWithMXCallStackTree:(MXCallStackTree *)callStackTree { + NSData *jsonCallStackTree = callStackTree.JSONRepresentation; + if ([jsonCallStackTree length] == 0) return nil; + + NSError *error = nil; + NSDictionary *jsonDictionary = [NSJSONSerialization JSONObjectWithData:jsonCallStackTree + options:0 + error:&error]; + if (error) { + NSLog(@"Crashlytics: error creating json"); + return nil; + } + self = [super init]; + if (!self) { + return nil; + } + _callStackPerThread = [[jsonDictionary objectForKey:@"callStackPerThread"] boolValue]; + + // Recurse through the frames in the callStackTree and add them all to an array + NSMutableArray *threads = [[NSMutableArray alloc] init]; + NSArray *callStacks = jsonDictionary[@"callStacks"]; + for (id object in callStacks) { + NSMutableArray *frames = [[NSMutableArray alloc] init]; + [self flattenSubFrames:object[@"callStackRootFrames"] intoFrames:frames]; + FIRCLSThread *thread = [[FIRCLSThread alloc] init]; + thread.threadBlamed = [[object objectForKey:@"threadAttributed"] boolValue]; + thread.frames = frames; + [threads addObject:thread]; + } + _threads = threads; + return self; +} + +// Flattens the nested structure we receive from MetricKit into an array of frames. +- (void)flattenSubFrames:(NSArray *)callStacks intoFrames:(NSMutableArray *)frames { + NSDictionary *rootFrames = [callStacks firstObject]; + FIRCLSFrame *frame = [[FIRCLSFrame alloc] init]; + frame.offsetIntoBinaryTextSegment = + [[rootFrames valueForKey:@"offsetIntoBinaryTextSegment"] longValue]; + frame.address = [[rootFrames valueForKey:@"address"] longValue]; + frame.sampleCount = [[rootFrames valueForKey:@"sampleCount"] longValue]; + frame.binaryUUID = [rootFrames valueForKey:@"binaryUUID"]; + frame.binaryName = [rootFrames valueForKey:@"binaryName"]; + + [frames addObject:frame]; + + // Recurse through any subframes and add them to the array. + if ([rootFrames objectForKey:@"subFrames"]) { + [self flattenSubFrames:[rootFrames objectForKey:@"subFrames"] intoFrames:frames]; + } +} + +- (NSArray *)getArrayRepresentation { + NSMutableArray *threadArray = [[NSMutableArray alloc] init]; + for (FIRCLSThread *thread in self.threads) { + [threadArray addObject:[self getDictionaryRepresentation:thread]]; + } + return threadArray; +} + +- (NSDictionary *)getDictionaryRepresentation:(FIRCLSThread *)thread { + NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init]; + [dictionary setObject:@{} forKey:@"registers"]; + NSMutableArray *frameArray = [[NSMutableArray alloc] init]; + for (FIRCLSFrame *frame in thread.frames) { + [frameArray addObject:[NSNumber numberWithLong:frame.address]]; + } + [dictionary setObject:frameArray forKey:@"stacktrace"]; + [dictionary setObject:[NSNumber numberWithBool:thread.threadBlamed] forKey:@"crashed"]; + return dictionary; +} + +- (NSArray *)getFramesOfBlamedThread { + for (FIRCLSThread *thread in self.threads) { + if (thread.threadBlamed) { + return [self convertFramesFor:thread]; + } + } + if ([self.threads count] > 0) { + return [self convertFramesFor:self.threads.firstObject]; + } + return [NSArray array]; +} + +- (NSArray *)convertFramesFor:(FIRCLSThread *)thread { + NSMutableArray *frames = [[NSMutableArray alloc] init]; + for (FIRCLSFrame *frame in thread.frames) { + [frames addObject:@{ + @"pc" : [NSNumber numberWithLong:frame.address], + @"offset" : [NSNumber numberWithLong:frame.offsetIntoBinaryTextSegment], + @"line" : @0 + }]; + } + return frames; +} + +@end + +#endif diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSContextInitData.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSContextInitData.h new file mode 100644 index 0000000..83807f1 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSContextInitData.h @@ -0,0 +1,38 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRCLSContextInitData : NSObject + +@property(nonatomic, copy, nullable) NSString* customBundleId; +@property(nonatomic, copy) NSString* rootPath; +@property(nonatomic, copy) NSString* previouslyCrashedFileRootPath; +@property(nonatomic, copy) NSString* sessionId; +@property(nonatomic, copy) NSString* appQualitySessionId; +@property(nonatomic, copy) NSString* betaToken; +@property(nonatomic) BOOL errorsEnabled; +@property(nonatomic) BOOL customExceptionsEnabled; +@property(nonatomic) uint32_t maxCustomExceptions; +@property(nonatomic) uint32_t maxErrorLogSize; +@property(nonatomic) uint32_t maxLogSize; +@property(nonatomic) uint32_t maxKeyValues; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSContextInitData.m b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSContextInitData.m new file mode 100644 index 0000000..9f7d9e7 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSContextInitData.m @@ -0,0 +1,18 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "Crashlytics/Crashlytics/Helpers/FIRCLSContextInitData.h" + +@implementation FIRCLSContextInitData +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSDefines.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSDefines.h new file mode 100644 index 0000000..6d62483 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSDefines.h @@ -0,0 +1,89 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once + +#include + +// macro trickiness +#define CONCAT_EXPANDED(a, b) a##b +#define CONCAT(a, b) CONCAT_EXPANDED(a, b) + +// These macros generate a function to force a symbol for the containing .o, to work around an issue +// where strip will not strip debug information without a symbol to strip. +#define DUMMY_FUNCTION_NAME(x) CONCAT(fircls_strip_this_, x) +#define INJECT_STRIP_SYMBOL(x) \ + void DUMMY_FUNCTION_NAME(x)(void) { \ + } + +// These make some target os types available to previous versions of xcode that do not yet have them +// in their SDKs +#ifndef TARGET_OS_IOS +#define TARGET_OS_IOS TARGET_OS_IPHONE +#endif + +#ifndef TARGET_OS_WATCH +#define TARGET_OS_WATCH 0 +#endif + +#ifndef TARGET_OS_TV +#define TARGET_OS_TV 0 +#endif + +// Whether MetricKit should be supported +#if defined(__IPHONE_15_0) +#define CLS_METRICKIT_SUPPORTED (__has_include() && TARGET_OS_IOS) +#else +#define CLS_METRICKIT_SUPPORTED 0 +#endif + +// These help compile based on availability of technologies/frameworks. +#define CLS_TARGET_OS_OSX (TARGET_OS_MAC && !TARGET_OS_IPHONE) +#define CLS_TARGET_OS_HAS_UIKIT (TARGET_OS_IOS || TARGET_OS_TV) + +// arch definitions +#if defined(__arm__) || defined(__arm64__) || defined(__arm64e__) +#include +#endif + +// VisionOS support +#if defined(TARGET_OS_VISION) && TARGET_OS_VISION +#define CLS_TARGET_OS_VISION 1 +#else +#define CLS_TARGET_OS_VISION 0 +#endif + +#if defined(__arm__) +#define CLS_CPU_ARM 1 +#endif +#if defined(__arm64__) || defined(__arm64e__) +#define CLS_CPU_ARM64 1 +#endif +#if defined(__ARM_ARCH_7S__) +#define CLS_CPU_ARMV7S 1 +#endif +#if defined(_ARM_ARCH_7) +#define CLS_CPU_ARMV7 1 +#endif +#if defined(_ARM_ARCH_6) +#define CLS_CPU_ARMV6 1 +#endif +#if defined(__i386__) +#define CLS_CPU_I386 1 +#endif +#if defined(__x86_64__) +#define CLS_CPU_X86_64 1 +#endif +#define CLS_CPU_X86 (CLS_CPU_I386 || CLS_CPU_X86_64) +#define CLS_CPU_64BIT (CLS_CPU_X86_64 || CLS_CPU_ARM64) diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSFeatures.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSFeatures.h new file mode 100644 index 0000000..fc90eea --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSFeatures.h @@ -0,0 +1,32 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once + +#include "Crashlytics/Crashlytics/Helpers/FIRCLSDefines.h" + +#define CLS_MEMORY_PROTECTION_ENABLED 1 +#define CLS_COMPACT_UNWINDED_ENABLED 1 +#define CLS_DWARF_UNWINDING_ENABLED 1 + +#define CLS_USE_SIGALTSTACK (!TARGET_OS_WATCH && !TARGET_OS_TV) +#define CLS_CAN_SUSPEND_THREADS !TARGET_OS_WATCH +#define CLS_MACH_EXCEPTION_SUPPORTED (!TARGET_OS_WATCH && !TARGET_OS_TV) +#define CLS_SIGNAL_SUPPORTED !TARGET_OS_WATCH // As of WatchOS 3, Signal crashes are not supported + +#define CLS_COMPACT_UNWINDING_SUPPORTED \ + ((CLS_CPU_I386 || CLS_CPU_X86_64 || CLS_CPU_ARM64) && CLS_COMPACT_UNWINDED_ENABLED) + +#define CLS_DWARF_UNWINDING_SUPPORTED \ + (CLS_COMPACT_UNWINDING_SUPPORTED && CLS_DWARF_UNWINDING_ENABLED) diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSFile.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSFile.h new file mode 100644 index 0000000..0b8c90c --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSFile.h @@ -0,0 +1,110 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once + +#include +#include +#include + +// Required for 1P builds +#include +#include +#include + +#if defined(__OBJC__) +#import +#endif + +__BEGIN_DECLS + +typedef struct { + int fd; + int collectionDepth; + bool needComma; + + bool bufferWrites; + char* writeBuffer; + size_t writeBufferLength; + + off_t writtenLength; +} FIRCLSFile; +typedef FIRCLSFile* FIRCLSFileRef; + +#define CLS_FILE_MAX_STRING_LENGTH (10240) +#define CLS_FILE_HEX_BUFFER \ + (32) // must be at least 2, and should be even (to account for 2 chars per hex value) +#define CLS_FILE_MAX_WRITE_ATTEMPTS (50) + +extern const size_t FIRCLSWriteBufferLength; + +// make sure to stop work if either FIRCLSFileInit... method returns false, because the FIRCLSFile +// struct will contain garbage data! +bool FIRCLSFileInitWithPath(FIRCLSFile* file, const char* path, bool bufferWrites); +bool FIRCLSFileInitWithPathMode(FIRCLSFile* file, + const char* path, + bool appendMode, + bool bufferWrites); + +void FIRCLSFileFlushWriteBuffer(FIRCLSFile* file); +bool FIRCLSFileClose(FIRCLSFile* file); +bool FIRCLSFileCloseWithOffset(FIRCLSFile* file, off_t* finalSize); +bool FIRCLSFileIsOpen(FIRCLSFile* file); + +bool FIRCLSFileLoopWithWriteBlock(const void* buffer, + size_t length, + ssize_t (^writeBlock)(const void* partialBuffer, + size_t partialLength)); +bool FIRCLSFileWriteWithRetries(int fd, const void* buffer, size_t length); + +// writing +void FIRCLSFileWriteSectionStart(FIRCLSFile* file, const char* name); +void FIRCLSFileWriteSectionEnd(FIRCLSFile* file); + +void FIRCLSFileWriteHashStart(FIRCLSFile* file); +void FIRCLSFileWriteHashEnd(FIRCLSFile* file); +void FIRCLSFileWriteHashKey(FIRCLSFile* file, const char* key); +void FIRCLSFileWriteHashEntryUint64(FIRCLSFile* file, const char* key, uint64_t value); +void FIRCLSFileWriteHashEntryInt64(FIRCLSFile* file, const char* key, int64_t value); +void FIRCLSFileWriteHashEntryString(FIRCLSFile* file, const char* key, const char* value); +void FIRCLSFileWriteStringUnquoted(FIRCLSFile* file, const char* string); +#if defined(__OBJC__) +void FIRCLSFileWriteHashEntryNSString(FIRCLSFile* file, const char* key, NSString* string); +void FIRCLSFileWriteHashEntryNSStringUnlessNilOrEmpty(FIRCLSFile* file, + const char* key, + NSString* string); +#endif +void FIRCLSFileWriteHashEntryHexEncodedString(FIRCLSFile* file, const char* key, const char* value); +void FIRCLSFileWriteHashEntryBoolean(FIRCLSFile* file, const char* key, bool value); + +void FIRCLSFileWriteArrayStart(FIRCLSFile* file); +void FIRCLSFileWriteArrayEnd(FIRCLSFile* file); +void FIRCLSFileWriteArrayEntryUint64(FIRCLSFile* file, uint64_t value); +void FIRCLSFileWriteArrayEntryString(FIRCLSFile* file, const char* value); +void FIRCLSFileWriteArrayEntryHexEncodedString(FIRCLSFile* file, const char* value); + +void FIRCLSFileFDWriteUInt64(int fd, uint64_t number, bool hex); +void FIRCLSFileFDWriteInt64(int fd, int64_t number); +void FIRCLSFileWriteUInt64(FIRCLSFile* file, uint64_t number, bool hex); +void FIRCLSFileWriteInt64(FIRCLSFile* file, int64_t number); + +#if defined(__OBJC__) && TARGET_OS_MAC +NSArray* FIRCLSFileReadSections(const char* path, + bool deleteOnFailure, + NSObject* (^transformer)(id obj)); +NSString* FIRCLSFileHexEncodeString(const char* string); +NSString* FIRCLSFileHexDecodeString(const char* string); +#endif + +__END_DECLS diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSFile.m b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSFile.m new file mode 100644 index 0000000..48dc787 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSFile.m @@ -0,0 +1,733 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "Crashlytics/Crashlytics/Helpers/FIRCLSFile.h" + +#include "Crashlytics/Crashlytics/Helpers/FIRCLSUtility.h" +#include "Crashlytics/Shared/FIRCLSByteUtility.h" + +#if TARGET_OS_MAC +#include +#endif + +#include + +#include +#include + +#include + +const size_t FIRCLSWriteBufferLength = 1000; + +/// Use an enum to define true compile-time integer constants. This prevents +/// compiler warnings when these constants are used to declare array sizes. +enum { + /// The buffer size needed to hold a 64-bit unsigned integer as a string. + /// The largest uint64_t value (18,446,744,073,709,551,615) has 20 digits. + /// An additional byte is required for the null terminator. + FIRCLSUInt64StringBufferLength = 21, + + /// The size in bytes of a raw 128-bit UUID. This is used for buffers + /// holding the binary data, not a C-style string. + FIRCLSStringBufferLength = 16 +}; + +static bool FIRCLSFileInit( + FIRCLSFile* file, const char* path, int fdm, bool appendMode, bool bufferWrites); + +static void FIRCLSFileWriteToFileDescriptorOrBuffer(FIRCLSFile* file, + const char* string, + size_t length); +static void FIRCLSFileWriteToBuffer(FIRCLSFile* file, const char* string, size_t length); +static void FIRCLSFileWriteToFileDescriptor(FIRCLSFile* file, const char* string, size_t length); + +short FIRCLSFilePrepareUInt64(char* buffer, uint64_t number, bool hex); + +static void FIRCLSFileWriteString(FIRCLSFile* file, const char* string); +static void FIRCLSFileWriteHexEncodedString(FIRCLSFile* file, const char* string); +static void FIRCLSFileWriteBool(FIRCLSFile* file, bool value); + +static void FIRCLSFileWriteCollectionStart(FIRCLSFile* file, const char openingChar); +static void FIRCLSFileWriteCollectionEnd(FIRCLSFile* file, const char closingChar); +static void FIRCLSFileWriteCollectionEntryProlog(FIRCLSFile* file); +static void FIRCLSFileWriteCollectionEntryEpilog(FIRCLSFile* file); + +#define CLS_FILE_DEBUG_LOGGING 0 + +#pragma mark - File Structure +static bool FIRCLSFileInit( + FIRCLSFile* file, const char* path, int fd, bool appendMode, bool bufferWrites) { + if (!file) { + FIRCLSSDKLog("Error: file is null\n"); + return false; + } + + if (fd < 0) { + FIRCLSSDKLog("Error: file descriptor invalid\n"); + return false; + } + + memset(file, 0, sizeof(FIRCLSFile)); + + file->fd = fd; + + file->bufferWrites = bufferWrites; + if (bufferWrites) { + file->writeBuffer = calloc(1, FIRCLSWriteBufferLength * sizeof(char)); + if (!file->writeBuffer) { + FIRCLSErrorLog(@"Unable to calloc in FIRCLSFileInit"); + return false; + } + + file->writeBufferLength = 0; + } + + file->writtenLength = 0; + if (appendMode) { + NSError* attributesError; + NSString* objCPath = [NSString stringWithCString:path encoding:NSUTF8StringEncoding]; + NSDictionary* fileAttributes = + [[NSFileManager defaultManager] attributesOfItemAtPath:objCPath error:&attributesError]; + if (attributesError != nil) { + FIRCLSErrorLog(@"Failed to read filesize from %@ with error %@", objCPath, attributesError); + return false; + } + NSNumber* fileSizeNumber = [fileAttributes objectForKey:NSFileSize]; + long long currentFileSize = [fileSizeNumber longLongValue]; + if (currentFileSize > 0) { + file->writtenLength += currentFileSize; + } + } + + return true; +} + +bool FIRCLSFileInitWithPath(FIRCLSFile* file, const char* path, bool bufferWrites) { + return FIRCLSFileInitWithPathMode(file, path, true, bufferWrites); +} + +bool FIRCLSFileInitWithPathMode(FIRCLSFile* file, + const char* path, + bool appendMode, + bool bufferWrites) { + if (!file) { + FIRCLSSDKLog("Error: file is null\n"); + return false; + } + + int mask = O_WRONLY | O_CREAT; + + if (appendMode) { + mask |= O_APPEND; + } else { + mask |= O_TRUNC; + } + + // make sure to call FIRCLSFileInit no matter what + int fd = -1; + if (path) { +#if TARGET_OS_IPHONE + /* + * data-protected non-portable open(2) : + * int open_dprotected_np(user_addr_t path, int flags, int class, int dpflags, int mode) + */ + fd = open_dprotected_np(path, mask, 4, 0, 0644); +#else + fd = open(path, mask, 0644); +#endif + + if (fd < 0) { + FIRCLSSDKLog("Error: Unable to open file %s\n", strerror(errno)); + } + } + + return FIRCLSFileInit(file, path, fd, appendMode, bufferWrites); +} + +bool FIRCLSFileClose(FIRCLSFile* file) { + return FIRCLSFileCloseWithOffset(file, NULL); +} + +bool FIRCLSFileCloseWithOffset(FIRCLSFile* file, off_t* finalSize) { + if (!FIRCLSIsValidPointer(file)) { + return false; + } + + if (file->bufferWrites && FIRCLSIsValidPointer(file->writeBuffer)) { + if (file->writeBufferLength > 0) { + FIRCLSFileFlushWriteBuffer(file); + } + free(file->writeBuffer); + } + + if (FIRCLSIsValidPointer(finalSize)) { + *finalSize = file->writtenLength; + } + + if (close(file->fd) != 0) { + FIRCLSSDKLog("Error: Unable to close file %s\n", strerror(errno)); + return false; + } + + memset(file, 0, sizeof(FIRCLSFile)); + file->fd = -1; + + return true; +} + +bool FIRCLSFileIsOpen(FIRCLSFile* file) { + if (!FIRCLSIsValidPointer(file)) { + return false; + } + + return file->fd > -1; +} + +#pragma mark - Core Writing API +void FIRCLSFileFlushWriteBuffer(FIRCLSFile* file) { + if (!FIRCLSIsValidPointer(file)) { + return; + } + + if (!file->bufferWrites) { + return; + } + + FIRCLSFileWriteToFileDescriptor(file, file->writeBuffer, file->writeBufferLength); + file->writeBufferLength = 0; +} + +static void FIRCLSFileWriteToFileDescriptorOrBuffer(FIRCLSFile* file, + const char* string, + size_t length) { + if (file->bufferWrites) { + if (file->writeBufferLength + length > FIRCLSWriteBufferLength - 1) { + // fill remaining space in buffer + size_t remainingSpace = FIRCLSWriteBufferLength - file->writeBufferLength - 1; + FIRCLSFileWriteToBuffer(file, string, remainingSpace); + FIRCLSFileFlushWriteBuffer(file); + + // write remainder of string to newly-emptied buffer + size_t remainingLength = length - remainingSpace; + FIRCLSFileWriteToFileDescriptorOrBuffer(file, string + remainingSpace, remainingLength); + } else { + FIRCLSFileWriteToBuffer(file, string, length); + } + } else { + FIRCLSFileWriteToFileDescriptor(file, string, length); + } +} + +void FIRCLSFileWriteStringUnquoted(FIRCLSFile* file, const char* string) { + size_t length = strlen(string); + FIRCLSFileWriteToFileDescriptorOrBuffer(file, string, length); +} + +static void FIRCLSFileWriteToFileDescriptor(FIRCLSFile* file, const char* string, size_t length) { + if (!FIRCLSFileWriteWithRetries(file->fd, string, length)) { + return; + } + + file->writtenLength += length; +} + +// Beware calling this method directly: it will truncate the input string if it's longer +// than the remaining space in the buffer. It's safer to call through +// FIRCLSFileWriteToFileDescriptorOrBuffer. +static void FIRCLSFileWriteToBuffer(FIRCLSFile* file, const char* string, size_t length) { + size_t writeLength = length; + if (file->writeBufferLength + writeLength > FIRCLSWriteBufferLength - 1) { + writeLength = FIRCLSWriteBufferLength - file->writeBufferLength - 1; + } + strncpy(file->writeBuffer + file->writeBufferLength, string, writeLength); + file->writeBufferLength += writeLength; + file->writeBuffer[file->writeBufferLength] = '\0'; +} + +bool FIRCLSFileLoopWithWriteBlock(const void* buffer, + size_t length, + ssize_t (^writeBlock)(const void* buf, size_t len)) { + for (size_t count = 0; length > 0 && count < CLS_FILE_MAX_WRITE_ATTEMPTS; ++count) { + // try to write all that is left + ssize_t ret = writeBlock(buffer, length); + + if (length > SIZE_MAX) { + // if this happens we can't convert it to a signed version due to overflow + return false; + } + const ssize_t signedLength = (ssize_t)length; + + if (ret >= 0 && ret == signedLength) { + return true; + } + + // Write was unsuccessful (out of space, etc) + if (ret < 0) { + return false; + } + + // We wrote more bytes than we expected, abort + if (ret > signedLength) { + return false; + } + + // wrote a portion of the data, adjust and keep trying + if (ret > 0) { + length -= ret; + buffer += ret; + continue; + } + + // return value is <= 0, which is an error + break; + } + + return false; +} + +bool FIRCLSFileWriteWithRetries(int fd, const void* buffer, size_t length) { + return FIRCLSFileLoopWithWriteBlock(buffer, length, + ^ssize_t(const void* partialBuffer, size_t partialLength) { + return write(fd, partialBuffer, partialLength); + }); +} + +#pragma mark - Strings + +static void FIRCLSFileWriteUnbufferedStringWithSuffix(FIRCLSFile* file, + const char* string, + size_t length, + char suffix) { + char suffixBuffer[2]; + + // collapse the quote + suffix into one single write call, for a small performance win + suffixBuffer[0] = '"'; + suffixBuffer[1] = suffix; + + FIRCLSFileWriteToFileDescriptorOrBuffer(file, "\"", 1); + FIRCLSFileWriteToFileDescriptorOrBuffer(file, string, length); + FIRCLSFileWriteToFileDescriptorOrBuffer(file, suffixBuffer, suffix == 0 ? 1 : 2); +} + +static void FIRCLSFileWriteStringWithSuffix(FIRCLSFile* file, + const char* string, + size_t length, + char suffix) { + // 2 for quotes, 1 for suffix (if present) and 1 more for null character + const size_t maxStringSize = FIRCLSStringBufferLength - (suffix == 0 ? 3 : 4); + + if (length >= maxStringSize) { + FIRCLSFileWriteUnbufferedStringWithSuffix(file, string, length, suffix); + return; + } + + // we are trying to achieve this in one write call + // <"><"> + + char buffer[FIRCLSStringBufferLength]; + + buffer[0] = '"'; + + strncpy(buffer + 1, string, length); + + buffer[length + 1] = '"'; + length += 2; + + if (suffix) { + buffer[length] = suffix; + length += 1; + } + + // Always add the terminator. strncpy above would copy the terminator, if we supplied length + 1, + // but since we do this suffix adjustment here, it's easier to just fix it up in both cases. + buffer[length + 1] = 0; + + FIRCLSFileWriteToFileDescriptorOrBuffer(file, buffer, length); +} + +void FIRCLSFileWriteString(FIRCLSFile* file, const char* string) { + if (!string) { + FIRCLSFileWriteToFileDescriptorOrBuffer(file, "null", 4); + return; + } + + FIRCLSFileWriteStringWithSuffix(file, string, strlen(string), 0); +} + +void FIRCLSFileWriteHexEncodedString(FIRCLSFile* file, const char* string) { + if (!file) { + return; + } + + if (!string) { + FIRCLSFileWriteToFileDescriptorOrBuffer(file, "null", 4); + return; + } + + char buffer[CLS_FILE_HEX_BUFFER]; + + memset(buffer, 0, sizeof(buffer)); + + size_t length = strlen(string); + + FIRCLSFileWriteToFileDescriptorOrBuffer(file, "\"", 1); + + int bufferIndex = 0; + for (int i = 0; i < length; ++i) { + FIRCLSHexFromByte(string[i], &buffer[bufferIndex]); + + bufferIndex += 2; // 1 char => 2 hex values at a time + + // we can continue only if we have enough space for two more hex + // characters *and* a terminator. So, we need three total chars + // of space + if (bufferIndex >= CLS_FILE_HEX_BUFFER) { + FIRCLSFileWriteToFileDescriptorOrBuffer(file, buffer, CLS_FILE_HEX_BUFFER); + bufferIndex = 0; + } + } + + // Copy the remainder, which could even be the entire string, if it + // fit into the buffer completely. Be careful with bounds checking here. + // The string needs to be non-empty, and we have to have copied at least + // one pair of hex characters in. + if (bufferIndex > 0 && length > 0) { + FIRCLSFileWriteToFileDescriptorOrBuffer(file, buffer, bufferIndex); + } + + FIRCLSFileWriteToFileDescriptorOrBuffer(file, "\"", 1); +} + +#pragma mark - Integers +void FIRCLSFileWriteUInt64(FIRCLSFile* file, uint64_t number, bool hex) { + char buffer[FIRCLSUInt64StringBufferLength]; + short i = FIRCLSFilePrepareUInt64(buffer, number, hex); + char* beginning = &buffer[i]; // Write from a pointer to the beginning of the string. + FIRCLSFileWriteToFileDescriptorOrBuffer(file, beginning, strlen(beginning)); +} + +void FIRCLSFileFDWriteUInt64(int fd, uint64_t number, bool hex) { + char buffer[FIRCLSUInt64StringBufferLength]; + short i = FIRCLSFilePrepareUInt64(buffer, number, hex); + char* beginning = &buffer[i]; // Write from a pointer to the beginning of the string. + FIRCLSFileWriteWithRetries(fd, beginning, strlen(beginning)); +} + +void FIRCLSFileWriteInt64(FIRCLSFile* file, int64_t number) { + if (number < 0) { + FIRCLSFileWriteToFileDescriptorOrBuffer(file, "-", 1); + number *= -1; // make it positive + } + + FIRCLSFileWriteUInt64(file, number, false); +} + +void FIRCLSFileFDWriteInt64(int fd, int64_t number) { + if (number < 0) { + FIRCLSFileWriteWithRetries(fd, "-", 1); + number *= -1; // make it positive + } + + FIRCLSFileFDWriteUInt64(fd, number, false); +} + +short FIRCLSFilePrepareUInt64(char* buffer, uint64_t number, bool hex) { + uint32_t base = hex ? 16 : 10; + + // zero it out, which will add a terminator + memset(buffer, 0, FIRCLSUInt64StringBufferLength); + + // TODO: look at this closer + // I'm pretty sure there is a bug in this code that + // can result in numbers with leading zeros. Technically, + // those are not valid json. + + // Set current index. + short i = FIRCLSUInt64StringBufferLength - 1; + + // Loop through filling in the chars from the end. + do { + char value = number % base + '0'; + if (value > '9') { + value += 'a' - '9' - 1; + } + + buffer[--i] = value; + } while ((number /= base) > 0 && i > 0); + + // returns index pointing to the beginning of the string. + return i; +} + +void FIRCLSFileWriteBool(FIRCLSFile* file, bool value) { + if (value) { + FIRCLSFileWriteToFileDescriptorOrBuffer(file, "true", 4); + } else { + FIRCLSFileWriteToFileDescriptorOrBuffer(file, "false", 5); + } +} + +void FIRCLSFileWriteSectionStart(FIRCLSFile* file, const char* name) { + FIRCLSFileWriteHashStart(file); + FIRCLSFileWriteHashKey(file, name); +} + +void FIRCLSFileWriteSectionEnd(FIRCLSFile* file) { + FIRCLSFileWriteHashEnd(file); + FIRCLSFileWriteToFileDescriptorOrBuffer(file, "\n", 1); +} + +void FIRCLSFileWriteCollectionStart(FIRCLSFile* file, const char openingChar) { + char string[2]; + + string[0] = ','; + string[1] = openingChar; + + if (file->needComma) { + FIRCLSFileWriteToFileDescriptorOrBuffer(file, string, 2); // write the separator + opening char + } else { + FIRCLSFileWriteToFileDescriptorOrBuffer(file, &string[1], 1); // write only the opening char + } + + file->collectionDepth++; + + file->needComma = false; +} + +void FIRCLSFileWriteCollectionEnd(FIRCLSFile* file, const char closingChar) { + FIRCLSFileWriteToFileDescriptorOrBuffer(file, &closingChar, 1); + + if (file->collectionDepth <= 0) { + // FIRCLSSafeLog("Collection depth invariant violated\n"); + return; + } + + file->collectionDepth--; + + file->needComma = file->collectionDepth > 0; +} + +void FIRCLSFileWriteCollectionEntryProlog(FIRCLSFile* file) { + if (file->needComma) { + FIRCLSFileWriteToFileDescriptorOrBuffer(file, ",", 1); + } +} + +void FIRCLSFileWriteCollectionEntryEpilog(FIRCLSFile* file) { + file->needComma = true; +} + +void FIRCLSFileWriteHashStart(FIRCLSFile* file) { + FIRCLSFileWriteCollectionStart(file, '{'); +} + +void FIRCLSFileWriteHashEnd(FIRCLSFile* file) { + FIRCLSFileWriteCollectionEnd(file, '}'); +} + +void FIRCLSFileWriteHashKey(FIRCLSFile* file, const char* key) { + FIRCLSFileWriteCollectionEntryProlog(file); + + FIRCLSFileWriteStringWithSuffix(file, key, strlen(key), ':'); + + file->needComma = false; +} + +void FIRCLSFileWriteHashEntryUint64(FIRCLSFile* file, const char* key, uint64_t value) { + // no prolog needed because it comes from the key + + FIRCLSFileWriteHashKey(file, key); + FIRCLSFileWriteUInt64(file, value, false); + + FIRCLSFileWriteCollectionEntryEpilog(file); +} + +void FIRCLSFileWriteHashEntryInt64(FIRCLSFile* file, const char* key, int64_t value) { + // prolog from key + FIRCLSFileWriteHashKey(file, key); + FIRCLSFileWriteInt64(file, value); + + FIRCLSFileWriteCollectionEntryEpilog(file); +} + +void FIRCLSFileWriteHashEntryString(FIRCLSFile* file, const char* key, const char* value) { + FIRCLSFileWriteHashKey(file, key); + FIRCLSFileWriteString(file, value); + + FIRCLSFileWriteCollectionEntryEpilog(file); +} + +void FIRCLSFileWriteHashEntryNSString(FIRCLSFile* file, const char* key, NSString* string) { + FIRCLSFileWriteHashEntryString(file, key, [string UTF8String]); +} + +void FIRCLSFileWriteHashEntryNSStringUnlessNilOrEmpty(FIRCLSFile* file, + const char* key, + NSString* string) { + if ([string length] > 0) { + FIRCLSFileWriteHashEntryString(file, key, [string UTF8String]); + } +} + +void FIRCLSFileWriteHashEntryHexEncodedString(FIRCLSFile* file, + const char* key, + const char* value) { + FIRCLSFileWriteHashKey(file, key); + FIRCLSFileWriteHexEncodedString(file, value); + + FIRCLSFileWriteCollectionEntryEpilog(file); +} + +void FIRCLSFileWriteHashEntryBoolean(FIRCLSFile* file, const char* key, bool value) { + FIRCLSFileWriteHashKey(file, key); + FIRCLSFileWriteBool(file, value); + + FIRCLSFileWriteCollectionEntryEpilog(file); +} + +void FIRCLSFileWriteArrayStart(FIRCLSFile* file) { + FIRCLSFileWriteCollectionStart(file, '['); +} + +void FIRCLSFileWriteArrayEnd(FIRCLSFile* file) { + FIRCLSFileWriteCollectionEnd(file, ']'); +} + +void FIRCLSFileWriteArrayEntryUint64(FIRCLSFile* file, uint64_t value) { + FIRCLSFileWriteCollectionEntryProlog(file); + + FIRCLSFileWriteUInt64(file, value, false); + + FIRCLSFileWriteCollectionEntryEpilog(file); +} + +void FIRCLSFileWriteArrayEntryString(FIRCLSFile* file, const char* value) { + FIRCLSFileWriteCollectionEntryProlog(file); + + FIRCLSFileWriteString(file, value); + + FIRCLSFileWriteCollectionEntryEpilog(file); +} + +void FIRCLSFileWriteArrayEntryHexEncodedString(FIRCLSFile* file, const char* value) { + FIRCLSFileWriteCollectionEntryProlog(file); + + FIRCLSFileWriteHexEncodedString(file, value); + + FIRCLSFileWriteCollectionEntryEpilog(file); +} + +NSArray* FIRCLSFileReadSections(const char* path, + bool deleteOnFailure, + NSObject* (^transformer)(id obj)) { + if (!FIRCLSIsValidPointer(path)) { + FIRCLSSDKLogError("Error: input path is invalid\n"); + return nil; + } + + NSString* pathString = [NSString stringWithUTF8String:path]; + NSString* contents = [NSString stringWithContentsOfFile:pathString + encoding:NSUTF8StringEncoding + error:nil]; + NSArray* components = [contents componentsSeparatedByString:@"\n"]; + + if (!components) { + if (deleteOnFailure) { + unlink(path); + } + + FIRCLSSDKLog("Unable to read file %s\n", path); + return nil; + } + + NSMutableArray* array = [NSMutableArray array]; + + // loop through all the entries, and + for (NSString* component in components) { + NSData* data = [component dataUsingEncoding:NSUTF8StringEncoding]; + + id obj = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; + if (!obj) { + continue; + } + + if (transformer) { + obj = transformer(obj); + } + + if (!obj) { + continue; + } + + [array addObject:obj]; + } + + return array; +} + +NSString* FIRCLSFileHexEncodeString(const char* string) { + size_t length = strlen(string); + char* encodedBuffer = calloc(1, length * 2 + 1); + + if (!encodedBuffer) { + FIRCLSErrorLog(@"Unable to calloc in FIRCLSFileHexEncodeString"); + return nil; + } + + memset(encodedBuffer, 0, length * 2 + 1); + + int bufferIndex = 0; + for (int i = 0; i < length; ++i) { + FIRCLSHexFromByte(string[i], &encodedBuffer[bufferIndex]); + + bufferIndex += 2; // 1 char => 2 hex values at a time + } + + NSString* stringObject = [NSString stringWithUTF8String:encodedBuffer]; + + free(encodedBuffer); + + return stringObject; +} + +NSString* FIRCLSFileHexDecodeString(const char* string) { + size_t length = strlen(string); + char* decodedBuffer = calloc(1, length); // too long, but safe + if (!decodedBuffer) { + FIRCLSErrorLog(@"Unable to calloc in FIRCLSFileHexDecodeString"); + return nil; + } + + memset(decodedBuffer, 0, length); + + for (int i = 0; i < length / 2; ++i) { + size_t index = i * 2; + + uint8_t hiNybble = FIRCLSNybbleFromChar(string[index]); + uint8_t lowNybble = FIRCLSNybbleFromChar(string[index + 1]); + + if (hiNybble == FIRCLSInvalidCharNybble || lowNybble == FIRCLSInvalidCharNybble) { + // char is invalid, abort loop + break; + } + + decodedBuffer[i] = (hiNybble << 4) | lowNybble; + } + + NSString* strObject = [NSString stringWithUTF8String:decodedBuffer]; + + free(decodedBuffer); + + return strObject; +} diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSInternalLogging.c b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSInternalLogging.c new file mode 100644 index 0000000..22a5510 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSInternalLogging.c @@ -0,0 +1,117 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include + +#include "Crashlytics/Crashlytics/Helpers/FIRCLSInternalLogging.h" +#include "Crashlytics/Crashlytics/Components/FIRCLSContext.h" +#include "Crashlytics/Crashlytics/Components/FIRCLSGlobals.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSUtility.h" + +void FIRCLSSDKFileLog(FIRCLSInternalLogLevel level, const char* format, ...) { + if (!_firclsContext.readonly || !_firclsContext.writable) { + return; + } + + const char* path = _firclsContext.readonly->logPath; + if (!FIRCLSIsValidPointer(path)) { + return; + } + + if (_firclsContext.writable->internalLogging.logLevel > level) { + return; + } + + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + if (_firclsContext.writable->internalLogging.logFd == -1) { + _firclsContext.writable->internalLogging.logFd = open(path, O_WRONLY | O_CREAT | O_APPEND, 0644); + } + }); + + const int fd = _firclsContext.writable->internalLogging.logFd; + if (fd < 0) { + return; + } + + va_list args; + va_start(args, format); + +#if DEBUG && 0 + // It's nice to use printf here, so all the formatting works. However, its possible to hit a + // deadlock if you call vfprintf in a crash handler. So, this code is handy to keep, just in case, + // if there's a really tough thing to debug. + FILE* file = fopen(path, "a+"); + vfprintf(file, format, args); + fclose(file); +#else + size_t formatLength = strlen(format); + for (size_t idx = 0; idx < formatLength; ++idx) { + if (format[idx] != '%') { + write(fd, &format[idx], 1); + continue; + } + + idx++; // move to the format char + switch (format[idx]) { + case 'd': { + int value = va_arg(args, int); + FIRCLSFileFDWriteInt64(fd, value); + } break; + case 'u': { + uint32_t value = va_arg(args, uint32_t); + FIRCLSFileFDWriteUInt64(fd, value, false); + } break; + case 'p': { + uintptr_t value = va_arg(args, uintptr_t); + write(fd, "0x", 2); + FIRCLSFileFDWriteUInt64(fd, value, true); + } break; + case 's': { + const char* string = va_arg(args, const char*); + if (!string) { + string = "(null)"; + } + write(fd, string, strlen(string)); + } break; + case 'x': { + unsigned int value = va_arg(args, unsigned int); + FIRCLSFileFDWriteUInt64(fd, value, true); + } break; + case 'l': { + // llx, llu, lld + if (idx + 1 < formatLength && format[idx + 1] == 'l') { + idx ++; + } + + //lx, lu, ld + if (idx + 1 < formatLength) { + uint64_t value = va_arg(args, uint64_t); + if (format[idx + 1] == 'x') { + FIRCLSFileFDWriteUInt64(fd, value, true); + } else if (format[idx + 1] == 'd' || format[idx + 1] == 'u') { + FIRCLSFileFDWriteUInt64(fd, value, false); + } + idx ++; + } + } break; + default: + // unhandled, back up to write out the percent + the format char + write(fd, &format[idx - 1], 2); + break; + } + } +#endif + va_end(args); +} diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSInternalLogging.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSInternalLogging.h new file mode 100644 index 0000000..3869889 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSInternalLogging.h @@ -0,0 +1,57 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once + +#include + +#if __OBJC__ +#import "Crashlytics/Crashlytics/Helpers/FIRCLSLogger.h" +#define FIRCLSDeveloperLog(label, __FORMAT__, ...) \ + FIRCLSDebugLog(@"[" label "] " __FORMAT__, ##__VA_ARGS__); +#endif + +typedef enum { + FIRCLSInternalLogLevelUnknown = 0, + FIRCLSInternalLogLevelDebug = 1, + FIRCLSInternalLogLevelInfo = 2, + FIRCLSInternalLogLevelWarn = 3, + FIRCLSInternalLogLevelError = 4 +} FIRCLSInternalLogLevel; + +typedef struct { + int logFd; + FIRCLSInternalLogLevel logLevel; +} FIRCLSInternalLoggingWritableContext; + +#define FIRCLSSDKLogDebug(__FORMAT__, ...) \ + FIRCLSSDKFileLog(FIRCLSInternalLogLevelDebug, "DEBUG [%s:%d] " __FORMAT__, __FUNCTION__, \ + __LINE__, ##__VA_ARGS__) +#define FIRCLSSDKLogInfo(__FORMAT__, ...) \ + FIRCLSSDKFileLog(FIRCLSInternalLogLevelInfo, "INFO [%s:%d] " __FORMAT__, __FUNCTION__, \ + __LINE__, ##__VA_ARGS__) +#define FIRCLSSDKLogWarn(__FORMAT__, ...) \ + FIRCLSSDKFileLog(FIRCLSInternalLogLevelWarn, "WARN [%s:%d] " __FORMAT__, __FUNCTION__, \ + __LINE__, ##__VA_ARGS__) +#define FIRCLSSDKLogError(__FORMAT__, ...) \ + FIRCLSSDKFileLog(FIRCLSInternalLogLevelError, "ERROR [%s:%d] " __FORMAT__, __FUNCTION__, \ + __LINE__, ##__VA_ARGS__) + +#define FIRCLSSDKLog FIRCLSSDKLogWarn + +__BEGIN_DECLS + +void FIRCLSSDKFileLog(FIRCLSInternalLogLevel level, const char* format, ...) __printflike(2, 3); + +__END_DECLS diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSLogger.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSLogger.h new file mode 100644 index 0000000..e03d99a --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSLogger.h @@ -0,0 +1,24 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +__BEGIN_DECLS + +void FIRCLSDebugLog(NSString *message, ...); +void FIRCLSInfoLog(NSString *message, ...); +void FIRCLSWarningLog(NSString *message, ...); +void FIRCLSErrorLog(NSString *message, ...); + +__END_DECLS diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSLogger.m b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSLogger.m new file mode 100644 index 0000000..e8cac73 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSLogger.m @@ -0,0 +1,52 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "Crashlytics/Crashlytics/Helpers/FIRCLSLogger.h" + +#import "FirebaseCore/Extension/FirebaseCoreInternal.h" + +FIRLoggerService kFIRLoggerCrashlytics = @"[FirebaseCrashlytics]"; + +NSString *const CrashlyticsMessageCode = @"I-CLS000000"; + +void FIRCLSDebugLog(NSString *message, ...) { + va_list args_ptr; + va_start(args_ptr, message); + FIRLogBasic(FIRLoggerLevelDebug, kFIRLoggerCrashlytics, CrashlyticsMessageCode, message, + args_ptr); + va_end(args_ptr); +} + +void FIRCLSInfoLog(NSString *message, ...) { + va_list args_ptr; + va_start(args_ptr, message); + FIRLogBasic(FIRLoggerLevelInfo, kFIRLoggerCrashlytics, CrashlyticsMessageCode, message, args_ptr); + va_end(args_ptr); +} + +void FIRCLSWarningLog(NSString *message, ...) { + va_list args_ptr; + va_start(args_ptr, message); + FIRLogBasic(FIRLoggerLevelWarning, kFIRLoggerCrashlytics, CrashlyticsMessageCode, message, + args_ptr); + va_end(args_ptr); +} + +void FIRCLSErrorLog(NSString *message, ...) { + va_list args_ptr; + va_start(args_ptr, message); + FIRLogBasic(FIRLoggerLevelError, kFIRLoggerCrashlytics, CrashlyticsMessageCode, message, + args_ptr); + va_end(args_ptr); +} diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSThreadState.c b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSThreadState.c new file mode 100644 index 0000000..c25e0c9 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSThreadState.c @@ -0,0 +1,147 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "Crashlytics/Crashlytics/Helpers/FIRCLSThreadState.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSDefines.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSUtility.h" + +#if defined(__arm__) || defined(__arm64__) +#include +#include +#endif + +#if CLS_CPU_X86_64 +#define GET_IP_REGISTER(r) (r->__ss.__rip) +#define GET_FP_REGISTER(r) (r->__ss.__rbp) +#define GET_SP_REGISTER(r) (r->__ss.__rsp) +#define GET_LR_REGISTER(r) 0 +#define SET_IP_REGISTER(r, v) (r->__ss.__rip = v) +#define SET_FP_REGISTER(r, v) (r->__ss.__rbp = v) +#define SET_SP_REGISTER(r, v) (r->__ss.__rsp = v) +#define SET_LR_REGISTER(r, v) +#elif CLS_CPU_I386 +#define GET_IP_REGISTER(r) (r->__ss.__eip) +#define GET_FP_REGISTER(r) (r->__ss.__ebp) +#define GET_SP_REGISTER(r) (r->__ss.__esp) +#define GET_LR_REGISTER(r) 0 +#define SET_IP_REGISTER(r, v) (r->__ss.__eip = v) +#define SET_FP_REGISTER(r, v) (r->__ss.__ebp = v) +#define SET_SP_REGISTER(r, v) (r->__ss.__esp = v) +#define SET_LR_REGISTER(r, v) +#elif CLS_CPU_ARM64 +// The arm_thread_state64_get_* macros translate down to the AUTIA and AUTIB instructions which +// authenticate the address, but don't clear the upper bits. From the docs: +// "If the authentication passes, the upper bits of the address are restored to enable +// subsequent use of the address. the authentication fails, the upper bits are corrupted and +// any subsequent use of the address results in a Translation fault." +// Since we only want the address (with the metadata in the upper bits masked out), we used the +// ptrauth_strip macro to clear the upper bits. +// +// We found later that ptrauth_strip doesn't seem to do anything. In many cases, the upper bits were +// already stripped, so for most non-system-library code, Crashlytics would still symbolicate. But +// for system libraries, the upper bits were being left in even when we called ptrauth_strip. +// Instead, we're bit masking and only allowing the latter 36 bits. +#define CLS_PTRAUTH_STRIP(pointer) ((uintptr_t)pointer & 0x0000000FFFFFFFFF) +#define GET_IP_REGISTER(r) (CLS_PTRAUTH_STRIP(arm_thread_state64_get_pc(r->__ss))) +#define GET_FP_REGISTER(r) (CLS_PTRAUTH_STRIP(arm_thread_state64_get_fp(r->__ss))) +#define GET_SP_REGISTER(r) (CLS_PTRAUTH_STRIP(arm_thread_state64_get_sp(r->__ss))) +#define GET_LR_REGISTER(r) (CLS_PTRAUTH_STRIP(arm_thread_state64_get_lr(r->__ss))) +#define SET_IP_REGISTER(r, v) arm_thread_state64_set_pc_fptr(r->__ss, (void*)v) +#define SET_FP_REGISTER(r, v) arm_thread_state64_set_fp(r->__ss, v) +#define SET_SP_REGISTER(r, v) arm_thread_state64_set_sp(r->__ss, v) +#define SET_LR_REGISTER(r, v) arm_thread_state64_set_lr_fptr(r->__ss, (void*)v) +#elif CLS_CPU_ARM +#define GET_IP_REGISTER(r) (r->__ss.__pc) +#define GET_FP_REGISTER(r) (r->__ss.__r[7]) +#define GET_SP_REGISTER(r) (r->__ss.__sp) +#define GET_LR_REGISTER(r) (r->__ss.__lr) +#define SET_IP_REGISTER(r, v) (r->__ss.__pc = v) +#define SET_FP_REGISTER(r, v) (r->__ss.__r[7] = v) +#define SET_SP_REGISTER(r, v) (r->__ss.__sp = v) +#define SET_LR_REGISTER(r, v) (r->__ss.__lr = v) +#else +#error "Architecture Unsupported" +#endif + +uintptr_t FIRCLSThreadContextGetPC(FIRCLSThreadContext* registers) { + if (!registers) { + return 0; + } + + return GET_IP_REGISTER(registers); +} + +uintptr_t FIRCLSThreadContextGetStackPointer(const FIRCLSThreadContext* registers) { + if (!registers) { + return 0; + } + + return GET_SP_REGISTER(registers); +} + +bool FIRCLSThreadContextSetStackPointer(FIRCLSThreadContext* registers, uintptr_t value) { + if (!FIRCLSIsValidPointer(registers)) { + return false; + } + + SET_SP_REGISTER(registers, value); + + return true; +} + +uintptr_t FIRCLSThreadContextGetLinkRegister(const FIRCLSThreadContext* registers) { + if (!FIRCLSIsValidPointer(registers)) { + return 0; + } + + return GET_LR_REGISTER(registers); +} + +bool FIRCLSThreadContextSetLinkRegister(FIRCLSThreadContext* registers, uintptr_t value) { + if (!FIRCLSIsValidPointer(registers)) { + return false; + } + + SET_LR_REGISTER(registers, value); + + return true; +} + +bool FIRCLSThreadContextSetPC(FIRCLSThreadContext* registers, uintptr_t value) { + if (!registers) { + return false; + } + + SET_IP_REGISTER(registers, value); + + return true; +} + +uintptr_t FIRCLSThreadContextGetFramePointer(const FIRCLSThreadContext* registers) { + if (!FIRCLSIsValidPointer(registers)) { + return 0; + } + + return GET_FP_REGISTER(registers); +} + +bool FIRCLSThreadContextSetFramePointer(FIRCLSThreadContext* registers, uintptr_t value) { + if (!FIRCLSIsValidPointer(registers)) { + return false; + } + + SET_FP_REGISTER(registers, value); + + return true; +} diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSThreadState.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSThreadState.h new file mode 100644 index 0000000..d2a38cf --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSThreadState.h @@ -0,0 +1,57 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once + +#include +#include + +#if CLS_CPU_ARM +#define FIRCLSThreadStateCount ARM_THREAD_STATE_COUNT +#define FIRCLSThreadState ARM_THREAD_STATE +#elif CLS_CPU_ARM64 +#define FIRCLSThreadStateCount ARM_THREAD_STATE64_COUNT +#define FIRCLSThreadState ARM_THREAD_STATE64 +#elif CLS_CPU_I386 +#define FIRCLSThreadStateCount x86_THREAD_STATE32_COUNT +#define FIRCLSThreadState x86_THREAD_STATE32 +#elif CLS_CPU_X86_64 +#define FIRCLSThreadStateCount x86_THREAD_STATE64_COUNT +#define FIRCLSThreadState x86_THREAD_STATE64 +#endif + +// _STRUCT_MCONTEXT was fixed to point to the right thing on ARM in the iOS 7.1 SDK +typedef _STRUCT_MCONTEXT FIRCLSThreadContext; + +// I'm not entirely sure what happened when, but this appears to have disappeared from +// the SDKs... +#if !defined(_STRUCT_UCONTEXT64) +typedef _STRUCT_UCONTEXT _STRUCT_UCONTEXT64; +#endif + +#pragma mark Register Access + +uintptr_t FIRCLSThreadContextGetPC(FIRCLSThreadContext *registers); +uintptr_t FIRCLSThreadContextGetStackPointer(const FIRCLSThreadContext *registers); +uintptr_t FIRCLSThreadContextGetFramePointer(const FIRCLSThreadContext *registers); + +bool FIRCLSThreadContextSetPC(FIRCLSThreadContext *registers, uintptr_t value); +bool FIRCLSThreadContextSetStackPointer(FIRCLSThreadContext *registers, uintptr_t value); +bool FIRCLSThreadContextSetFramePointer(FIRCLSThreadContext *registers, uintptr_t value); + +// The link register only exists on ARM platforms. +#if CLS_CPU_ARM || CLS_CPU_ARM64 +uintptr_t FIRCLSThreadContextGetLinkRegister(const FIRCLSThreadContext *registers); +bool FIRCLSThreadContextSetLinkRegister(FIRCLSThreadContext *registers, uintptr_t value); +#endif diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSUtility.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSUtility.h new file mode 100644 index 0000000..0f3e84a --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSUtility.h @@ -0,0 +1,55 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once + +#include +#include +#include +#include "Crashlytics/Crashlytics/Components/FIRCLSGlobals.h" + +#define FIRCLSIsValidPointer(x) ((uintptr_t)x >= 4096) +#define FIRCLSInvalidCharNybble (255) + +__BEGIN_DECLS + +void FIRCLSLookupFunctionPointer(void* ptr, void (^block)(const char* name, const char* lib)); + +void FIRCLSHexFromByte(uint8_t c, char output[]); +uint8_t FIRCLSNybbleFromChar(char c); + +bool FIRCLSReadMemory(vm_address_t src, void* dest, size_t len); +bool FIRCLSReadString(vm_address_t src, char** dest, size_t maxlen); + +const char* FIRCLSDupString(const char* string); + +bool FIRCLSUnlinkIfExists(const char* path); +void FIRCLSRedactUUID(char* value); + +#if __OBJC__ +void FIRCLSDispatchAfter(float timeInSeconds, dispatch_queue_t queue, dispatch_block_t block); + +NSString* FIRCLSNormalizeUUID(NSString* value); +NSString* FIRCLSGenerateNormalizedUUID(void); + +NSString* FIRCLSNSDataToNSString(NSData* data); + +void FIRCLSAddOperationAfter(float timeInSeconds, NSOperationQueue* queue, void (^block)(void)); +#endif + +#if DEBUG +void FIRCLSPrintAUUID(const uint8_t* value); +#endif + +__END_DECLS diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSUtility.m b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSUtility.m new file mode 100644 index 0000000..7edb657 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Helpers/FIRCLSUtility.m @@ -0,0 +1,222 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "Crashlytics/Crashlytics/Helpers/FIRCLSUtility.h" + +#include + +#include + +#include "Crashlytics/Crashlytics/Components/FIRCLSGlobals.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSFeatures.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSFile.h" + +#import "Crashlytics/Shared/FIRCLSByteUtility.h" +#import "Crashlytics/Shared/FIRCLSUUID.h" + +#import + +void FIRCLSLookupFunctionPointer(void* ptr, void (^block)(const char* name, const char* lib)) { + Dl_info info; + + if (dladdr(ptr, &info) == 0) { + block(NULL, NULL); + return; + } + + const char* name = "unknown"; + const char* lib = "unknown"; + + if (info.dli_sname) { + name = info.dli_sname; + } + + if (info.dli_fname) { + lib = info.dli_fname; + } + + block(name, lib); +} + +uint8_t FIRCLSNybbleFromChar(char c) { + if (c >= '0' && c <= '9') { + return c - '0'; + } + + if (c >= 'a' && c <= 'f') { + return c - 'a' + 10; + } + + if (c >= 'A' && c <= 'F') { + return c - 'A' + 10; + } + + return FIRCLSInvalidCharNybble; +} + +bool FIRCLSReadMemory(vm_address_t src, void* dest, size_t len) { + if (!FIRCLSIsValidPointer(src)) { + return false; + } + + vm_size_t readSize = len; + + return vm_read_overwrite(mach_task_self(), src, len, (pointer_t)dest, &readSize) == KERN_SUCCESS; +} + +bool FIRCLSReadString(vm_address_t src, char** dest, size_t maxlen) { + char c; + vm_address_t address; + + if (!dest) { + return false; + } + + // Walk the entire string. Not certain this is perfect... + for (address = src; address < src + maxlen; ++address) { + if (!FIRCLSReadMemory(address, &c, 1)) { + return false; + } + + if (c == 0) { + break; + } + } + + *dest = (char*)src; + + return true; +} + +const char* FIRCLSDupString(const char* string) { +#if CLS_MEMORY_PROTECTION_ENABLED + char* buffer; + size_t length; + + if (!string) { + return NULL; + } + + length = strlen(string); + buffer = FIRCLSAllocatorSafeAllocate(_firclsContext.allocator, length + 1, CLS_READONLY); + + memcpy(buffer, string, length); + + buffer[length] = 0; // null-terminate + + return buffer; +#else + return strdup(string); +#endif +} + +void FIRCLSDispatchAfter(float timeInSeconds, dispatch_queue_t queue, dispatch_block_t block) { + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(timeInSeconds * NSEC_PER_SEC)), queue, + block); +} + +bool FIRCLSUnlinkIfExists(const char* path) { + if (unlink(path) != 0) { + if (errno != ENOENT) { + return false; + } + } + + return true; +} + +NSString* FIRCLSNormalizeUUID(NSString* value) { + return [[value stringByReplacingOccurrencesOfString:@"-" withString:@""] lowercaseString]; +} + +NSString* FIRCLSGenerateNormalizedUUID(void) { + return FIRCLSNormalizeUUID(FIRCLSGenerateUUID()); +} + +// Redacts a UUID wrapped in parenthesis from a char* using strchr, which is async safe. +// Ex. +// "foo (bar) (45D62CC2-CFB5-4E33-AB61-B0684627F1B6) baz" +// becomes +// "foo (bar) (********-****-****-****-************) baz" +void FIRCLSRedactUUID(char* value) { + if (value == NULL) { + return; + } + char* openParen = value; + // find the index of the first paren + while ((openParen = strchr(openParen, '(')) != NULL) { + // find index of the matching close paren + const char* closeParen = strchr(openParen, ')'); + if (closeParen == NULL) { + break; + } + // if the distance between them is 37, traverse the characters + // and replace anything that is not a '-' with '*' + if (closeParen - openParen == 37) { + for (int i = 1; i < 37; ++i) { + if (*(openParen + i) != '-') { + *(openParen + i) = '*'; + } + } + break; + } + openParen++; + } +} + +NSString* FIRCLSNSDataToNSString(NSData* data) { + NSString* string; + char* buffer; + size_t size; + NSUInteger length; + + // we need 2 hex char for every byte of data, plus one more spot for a + // null terminator + length = [data length]; + size = (length * 2) + 1; + buffer = calloc(1, sizeof(char) * size); + + if (!buffer) { + FIRCLSErrorLog(@"Unable to calloc in FIRCLSNSDataToNSString"); + return nil; + } + + FIRCLSSafeHexToString([data bytes], length, buffer); + + string = [NSString stringWithUTF8String:buffer]; + + free(buffer); + + return string; +} + +void FIRCLSAddOperationAfter(float timeInSeconds, NSOperationQueue* queue, void (^block)(void)) { + dispatch_queue_t afterQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); + FIRCLSDispatchAfter(timeInSeconds, afterQueue, ^{ + [queue addOperationWithBlock:block]; + }); +} + +#if DEBUG +void FIRCLSPrintAUUID(const uint8_t* value) { + CFUUIDRef uuid = CFUUIDCreateFromUUIDBytes(kCFAllocatorDefault, *(CFUUIDBytes*)value); + + NSString* string = CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault, uuid)); + + CFRelease(uuid); + + FIRCLSDebugLog(@"%@", [[string stringByReplacingOccurrencesOfString:@"-" + withString:@""] lowercaseString]); +} +#endif diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/FIRCLSExecutionIdentifierModel.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/FIRCLSExecutionIdentifierModel.h new file mode 100644 index 0000000..41a4896 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/FIRCLSExecutionIdentifierModel.h @@ -0,0 +1,33 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + * This class is a model to identify a single execution of the app + */ +@interface FIRCLSExecutionIdentifierModel : NSObject + +/** + * Returns the launch identifier. This is a unique id that will remain constant until this process + * is relaunched. This value is useful for correlating events across kits and/or across reports at + * the process-lifecycle level. + */ +@property(nonatomic, readonly) NSString *executionID; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/FIRCLSExecutionIdentifierModel.m b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/FIRCLSExecutionIdentifierModel.m new file mode 100644 index 0000000..163b337 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/FIRCLSExecutionIdentifierModel.m @@ -0,0 +1,33 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "Crashlytics/Crashlytics/Models/FIRCLSExecutionIdentifierModel.h" + +#import "Crashlytics/Shared/FIRCLSUUID.h" + +@implementation FIRCLSExecutionIdentifierModel + +- (instancetype)init { + self = [super init]; + if (!self) { + return nil; + } + + _executionID = [[FIRCLSGenerateUUID() stringByReplacingOccurrencesOfString:@"-" + withString:@""] lowercaseString]; + + return self; +} + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/FIRCLSFileManager.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/FIRCLSFileManager.h new file mode 100644 index 0000000..6de9eaf --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/FIRCLSFileManager.h @@ -0,0 +1,75 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +@class FIRCLSInternalReport; + +@interface FIRCLSFileManager : NSObject + +- (instancetype)init NS_DESIGNATED_INITIALIZER; + +@property(nonatomic, readonly) NSFileManager *underlyingFileManager; + +/** + * Returns the folder containing the settings file + */ +@property(nonatomic, readonly) NSString *settingsDirectoryPath; + +/** + * Returns the path to the settings file + */ +@property(nonatomic, readonly) NSString *settingsFilePath; + +/** + * Path to the file that holds the ttl and keys that invalidate settings + */ +@property(nonatomic, readonly) NSString *settingsCacheKeyPath; + +@property(nonatomic, readonly) NSString *rootPath; +@property(nonatomic, readonly) NSString *cachesPath; +@property(nonatomic, readonly) NSString *structurePath; +@property(nonatomic, readonly) NSString *activePath; +@property(nonatomic, readonly) NSString *processingPath; +@property(nonatomic, readonly) NSString *pendingPath; +@property(nonatomic, readonly) NSString *preparedPath; +@property(nonatomic, readonly) NSArray *activePathContents; +@property(nonatomic, readonly) NSArray *preparedPathContents; +@property(nonatomic, readonly) NSArray *processingPathContents; + +- (BOOL)fileExistsAtPath:(NSString *)path; +- (BOOL)createFileAtPath:(NSString *)path + contents:(NSData *)data + attributes:(NSDictionary *)attr; +- (BOOL)createDirectoryAtPath:(NSString *)path; +- (BOOL)removeItemAtPath:(NSString *)path; +- (BOOL)removeContentsOfDirectoryAtPath:(NSString *)path; +- (BOOL)moveItemAtPath:(NSString *)path toDirectory:(NSString *)destDir; +- (BOOL)didCrashOnPreviousExecution; +- (BOOL)metricKitDiagnosticFileExists; +- (void)createEmptyMetricKitFile:(NSString *)reportPath; +- (void)enumerateFilesInDirectory:(NSString *)directory + usingBlock:(void (^)(NSString *filePath, NSString *extension))block; +- (NSNumber *)fileSizeAtPath:(NSString *)path; +- (NSArray *)contentsOfDirectory:(NSString *)path; + +// logic of managing files/directories +- (BOOL)createReportDirectories; +- (NSString *)setupNewPathForExecutionIdentifier:(NSString *)identifier; + +- (BOOL)moveItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error; + +- (NSData *)dataWithContentsOfFile:(NSString *)path; + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/FIRCLSFileManager.m b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/FIRCLSFileManager.m new file mode 100644 index 0000000..8b310b3 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/FIRCLSFileManager.m @@ -0,0 +1,296 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "Crashlytics/Crashlytics/Models/FIRCLSFileManager.h" + +#import "Crashlytics/Crashlytics/Components/FIRCLSApplication.h" +#import "Crashlytics/Crashlytics/Components/FIRCLSCrashedMarkerFile.h" +#import "Crashlytics/Crashlytics/Helpers/FIRCLSLogger.h" +#import "Crashlytics/Crashlytics/Models/FIRCLSInternalReport.h" + +NSString *const FIRCLSCacheDirectoryName = @"com.crashlytics.data"; +NSString *const FIRCLSCacheVersion = @"v5"; +NSString *const FIRCLSMetricKitDiagnosticPath = @"/MetricKit/Diagnostics/"; + +@interface FIRCLSFileManager () { + NSString *_rootPath; + NSString *_cachesPath; +} +@property(nonatomic) BOOL crashFileMarkerExists; + +@end + +@implementation FIRCLSFileManager + +- (instancetype)init { + self = [super init]; + if (!self) { + return nil; + } + + _underlyingFileManager = [NSFileManager defaultManager]; + + NSString *path = + [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]; + _cachesPath = [path copy]; + path = [path stringByAppendingPathComponent:FIRCLSCacheDirectoryName]; + path = [path stringByAppendingPathComponent:[self pathNamespace]]; + _rootPath = [path copy]; + + _crashFileMarkerExists = NO; + return self; +} + +#pragma mark - Core API + +- (BOOL)fileExistsAtPath:(NSString *)path { + return [_underlyingFileManager fileExistsAtPath:path]; +} + +- (BOOL)createFileAtPath:(NSString *)path + contents:(nullable NSData *)data + attributes:(nullable NSDictionary *)attr { + return [_underlyingFileManager createFileAtPath:path contents:data attributes:attr]; +} + +- (BOOL)createDirectoryAtPath:(NSString *)path { + NSDictionary *attributes; + NSError *error; + + attributes = @{NSFilePosixPermissions : [NSNumber numberWithShort:0755]}; + error = nil; + + if (![[self underlyingFileManager] createDirectoryAtPath:path + withIntermediateDirectories:YES + attributes:attributes + error:&error]) { + FIRCLSErrorLog(@"Unable to create directory %@", error); + return NO; + } + + return YES; +} + +- (BOOL)removeItemAtPath:(NSString *)path { + NSError *error; + + error = nil; + if (![[self underlyingFileManager] removeItemAtPath:path error:&error] || !path) { + FIRCLSErrorLog(@"Failed to remove file %@: %@", path, error); + + return NO; + } + + return YES; +} + +- (BOOL)removeContentsOfDirectoryAtPath:(NSString *)path { + __block BOOL success = YES; + + // only return true if we were able to remove every item in the directory (or it was empty) + + [self enumerateFilesInDirectory:path + usingBlock:^(NSString *filePath, NSString *extension) { + success = [self removeItemAtPath:filePath] && success; + }]; + + return success; +} + +- (BOOL)moveItemAtPath:(NSString *)path toDirectory:(NSString *)destDir { + NSString *destPath; + NSError *error; + + destPath = [destDir stringByAppendingPathComponent:[path lastPathComponent]]; + error = nil; + + if (!path || !destPath) { + FIRCLSErrorLog(@"Failed to move file, inputs invalid"); + + return NO; + } + + if (![[self underlyingFileManager] moveItemAtPath:path toPath:destPath error:&error]) { + FIRCLSErrorLog(@"Failed to move file: %@", error); + + return NO; + } + + return YES; +} + +- (BOOL)didCrashOnPreviousExecution { + static dispatch_once_t checkCrashFileMarketExistsOnceToken; + dispatch_once(&checkCrashFileMarketExistsOnceToken, ^{ + NSString *crashedMarkerFileName = [NSString stringWithUTF8String:FIRCLSCrashedMarkerFileName]; + NSString *crashedMarkerFileFullPath = + [[self rootPath] stringByAppendingPathComponent:crashedMarkerFileName]; + self.crashFileMarkerExists = [self fileExistsAtPath:crashedMarkerFileFullPath]; + }); + return self.crashFileMarkerExists; +} + +- (BOOL)metricKitDiagnosticFileExists { + NSArray *contentsOfMetricKitDirectory = [self + contentsOfDirectory:[_cachesPath stringByAppendingString:FIRCLSMetricKitDiagnosticPath]]; + return ([contentsOfMetricKitDirectory count] > 0); +} + +- (void)createEmptyMetricKitFile:(NSString *)reportPath { + NSString *metricKitFile = + [reportPath stringByAppendingPathComponent:FIRCLSMetricKitFatalReportFile]; + [self createFileAtPath:metricKitFile contents:nil attributes:nil]; +} + +- (void)enumerateFilesInDirectory:(NSString *)directory + usingBlock:(void (^)(NSString *filePath, NSString *extension))block { + for (NSString *path in [[self underlyingFileManager] contentsOfDirectoryAtPath:directory + error:nil]) { + NSString *extension; + NSString *fullPath; + + // Skip files that start with a dot. This is important, because if you try to move a .DS_Store + // file, it will fail if the target directory also has a .DS_Store file in it. Plus, its + // wasteful, because we don't care about dot files. + if ([path hasPrefix:@"."]) { + continue; + } + + extension = [path pathExtension]; + fullPath = [directory stringByAppendingPathComponent:path]; + if (block) { + block(fullPath, extension); + } + } +} + +- (NSNumber *)fileSizeAtPath:(NSString *)path { + NSError *error = nil; + NSDictionary *attrs = [[self underlyingFileManager] attributesOfItemAtPath:path error:&error]; + + if (!attrs) { + FIRCLSErrorLog(@"Unable to read file size: %@", error); + return nil; + } + + return [attrs objectForKey:NSFileSize]; +} + +- (NSArray *)contentsOfDirectory:(NSString *)path { + NSMutableArray *array = [NSMutableArray array]; + + [self enumerateFilesInDirectory:path + usingBlock:^(NSString *filePath, NSString *extension) { + [array addObject:filePath]; + }]; + + return [array copy]; +} + +#pragma - Properties +- (NSString *)pathNamespace { + return FIRCLSApplicationGetBundleIdentifier(); +} + +- (NSString *)versionedPath { + return [[self rootPath] stringByAppendingPathComponent:FIRCLSCacheVersion]; +} + +#pragma - Settings Paths + +// This path should be different than the structurePath because the +// settings download operations will delete the settings directory, +// which would delete crash reports if these were the same +- (NSString *)settingsDirectoryPath { + return [[self versionedPath] stringByAppendingPathComponent:@"settings"]; +} + +- (NSString *)settingsFilePath { + return [[self settingsDirectoryPath] stringByAppendingPathComponent:@"settings.json"]; +} + +- (NSString *)settingsCacheKeyPath { + return [[self settingsDirectoryPath] stringByAppendingPathComponent:@"cache-key.json"]; +} + +#pragma - Report Paths +- (NSString *)structurePath { + return [[self versionedPath] stringByAppendingPathComponent:@"reports"]; +} + +- (NSString *)activePath { + return [[self structurePath] stringByAppendingPathComponent:@"active"]; +} + +- (NSString *)pendingPath { + return [[self structurePath] stringByAppendingPathComponent:@"pending"]; +} + +- (NSString *)processingPath { + return [[self structurePath] stringByAppendingPathComponent:@"processing"]; +} + +- (NSString *)preparedPath { + return [[self structurePath] stringByAppendingPathComponent:@"prepared"]; +} + +- (NSArray *)activePathContents { + return [self contentsOfDirectory:[self activePath]]; +} + +- (NSArray *)preparedPathContents { + return [self contentsOfDirectory:[self preparedPath]]; +} + +- (NSArray *)processingPathContents { + return [self contentsOfDirectory:[self processingPath]]; +} + +#pragma mark - Logic +- (BOOL)createReportDirectories { + if (![self createDirectoryAtPath:[self activePath]]) { + return NO; + } + + if (![self createDirectoryAtPath:[self processingPath]]) { + return NO; + } + + if (![self createDirectoryAtPath:[self preparedPath]]) { + return NO; + } + + return YES; +} + +- (NSString *)setupNewPathForExecutionIdentifier:(NSString *)identifier { + NSString *path = [[self activePath] stringByAppendingPathComponent:identifier]; + + if (![self createDirectoryAtPath:path]) { + return nil; + } + + return path; +} + +- (BOOL)moveItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error { + return [self.underlyingFileManager moveItemAtPath:srcPath toPath:dstPath error:error]; +} + +// Wrapper over NSData so the method can be mocked for unit tests +- (NSData *)dataWithContentsOfFile:(NSString *)path { + return [NSData dataWithContentsOfFile:path]; +} + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/FIRCLSInstallIdentifierModel.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/FIRCLSInstallIdentifierModel.h new file mode 100644 index 0000000..4e0f483 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/FIRCLSInstallIdentifierModel.h @@ -0,0 +1,51 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +@class FIRInstallations; + +NS_ASSUME_NONNULL_BEGIN + +/** + * This class is a model for identifying an installation of an app + */ +@interface FIRCLSInstallIdentifierModel : NSObject + +- (instancetype)init NS_UNAVAILABLE; + +- (instancetype)initWithInstallations:(FIRInstallations *)instanceID NS_DESIGNATED_INITIALIZER; + +/** + * Returns the backwards compatible Crashlytics Installation UUID + */ +@property(nonatomic, readonly) NSString *installID; + +/** + * To support end-users rotating Install IDs, this will check and rotate the Install ID, + * which can be a slow operation. This should be run in an Activity or + * background thread. + * + * This method has 2 concerns: + * - Concern 1: We have the old Crashlytics Install ID that needs to regenerate when the FIID + * changes. If we get a null FIID, we don't want to rotate because we don't know if it changed or + * not. + * - Concern 2: Whatever the FIID is, we should send it with the Crash report so we're in sync with + * Sessions and other Firebase SDKs + */ +- (BOOL)regenerateInstallIDIfNeededWithBlock:(void (^)(NSString *fiid, NSString *authToken))block; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/FIRCLSInstallIdentifierModel.m b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/FIRCLSInstallIdentifierModel.m new file mode 100644 index 0000000..96e96e6 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/FIRCLSInstallIdentifierModel.m @@ -0,0 +1,189 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "Crashlytics/Crashlytics/Models/FIRCLSInstallIdentifierModel.h" + +#import "FirebaseInstallations/Source/Library/Private/FirebaseInstallationsInternal.h" + +#import "Crashlytics/Crashlytics/FIRCLSUserDefaults/FIRCLSUserDefaults.h" +#import "Crashlytics/Crashlytics/Helpers/FIRCLSLogger.h" +#import "Crashlytics/Shared/FIRCLSByteUtility.h" +#import "Crashlytics/Shared/FIRCLSUUID.h" + +static NSString *const FIRCLSInstallationUUIDKey = @"com.crashlytics.iuuid"; +static NSString *const FIRCLSInstallationIIDHashKey = @"com.crashlytics.install.iid"; + +// Legacy key that is automatically removed +static NSString *const FIRCLSInstallationADIDKey = @"com.crashlytics.install.adid"; + +static unsigned long long FIRCLSInstallationsWaitTime = 10 * NSEC_PER_SEC; + +@interface FIRCLSInstallIdentifierModel () + +@property(nonatomic, copy) NSString *installID; + +@property(nonatomic, readonly) FIRInstallations *installations; + +@end + +@implementation FIRCLSInstallIdentifierModel + +// This needs to be synthesized so we can set without using the setter in the constructor and +// overridden setters and getters +@synthesize installID = _installID; + +- (instancetype)initWithInstallations:(FIRInstallations *)installations { + self = [super init]; + if (!self) { + return nil; + } + + // capture the install ID information + _installID = [self readInstallationUUID].copy; + _installations = installations; + + if (!_installID) { + FIRCLSDebugLog(@"Generating Install ID"); + _installID = [self generateInstallationUUID].copy; + + FIRCLSUserDefaults *defaults = [FIRCLSUserDefaults standardUserDefaults]; + [defaults synchronize]; + } + + return self; +} + +- (NSString *)installID { + @synchronized(self) { + return _installID; + } +} + +- (void)setInstallID:(NSString *)installID { + @synchronized(self) { + _installID = installID; + } +} + +/** + * Reads installation UUID stored in persistent storage. + * If the installation UUID is stored in legacy key, migrates it over to the new key. + */ +- (NSString *)readInstallationUUID { + return [[FIRCLSUserDefaults standardUserDefaults] objectForKey:FIRCLSInstallationUUIDKey]; +} + +/** + * Generates a new UUID and saves it in persistent storage. + * Does not synchronize the user defaults (to allow optimized + * batching of user default synchronizing) + */ +- (NSString *)generateInstallationUUID { + NSString *UUID = FIRCLSGenerateUUID(); + FIRCLSUserDefaults *userDefaults = [FIRCLSUserDefaults standardUserDefaults]; + [userDefaults setObject:UUID forKey:FIRCLSInstallationUUIDKey]; + return UUID; +} + +#pragma mark Privacy Shield + +- (BOOL)regenerateInstallIDIfNeededWithBlock:(void (^)(NSString *fiid, NSString *authToken))block { + BOOL __block didRotate = false; + NSString __block *authTokenComplete = @""; + NSString __block *currentIIDComplete = @""; + + // Installations Completions run async, so wait a reasonable amount of time for it to finish. + dispatch_group_t workingGroup = dispatch_group_create(); + + dispatch_group_enter(workingGroup); + [self.installations + authTokenWithCompletion:^(FIRInstallationsAuthTokenResult *_Nullable tokenResult, + NSError *_Nullable error) { + authTokenComplete = tokenResult.authToken; + dispatch_group_leave(workingGroup); + }]; + + dispatch_group_enter(workingGroup); + [self.installations + installationIDWithCompletion:^(NSString *_Nullable currentIID, NSError *_Nullable error) { + currentIIDComplete = currentIID; + didRotate = [self rotateCrashlyticsInstallUUIDWithIID:currentIID error:error]; + + if (didRotate) { + FIRCLSInfoLog(@"Rotated Crashlytics Install UUID because Firebase Install ID changed"); + } + dispatch_group_leave(workingGroup); + }]; + + intptr_t result = dispatch_group_wait( + workingGroup, dispatch_time(DISPATCH_TIME_NOW, FIRCLSInstallationsWaitTime)); + + if (result != 0) { + FIRCLSErrorLog(@"Crashlytics timed out while checking for Firebase Installation ID"); + } + + // Provide the IID to the callback. For this case we don't care + // if the FIID is null because it's the best we can do - we just want + // to send up the same FIID that is sent by other SDKs (eg. the Sessions SDK). + block(currentIIDComplete, authTokenComplete); + return didRotate; +} + +- (BOOL)rotateCrashlyticsInstallUUIDWithIID:(NSString *_Nullable)currentIID + error:(NSError *_Nullable)error { + BOOL didRotate = NO; + + FIRCLSUserDefaults *defaults = [FIRCLSUserDefaults standardUserDefaults]; + + // Remove the legacy ID + NSString *adID = [defaults objectForKey:FIRCLSInstallationADIDKey]; + if (adID.length != 0) { + [defaults removeObjectForKey:FIRCLSInstallationADIDKey]; + [defaults synchronize]; + } + + if (error != nil) { + FIRCLSErrorLog(@"Failed to get Firebase Instance ID: %@", error); + return didRotate; + } + + if (currentIID.length == 0) { + FIRCLSErrorLog(@"Firebase Instance ID was empty when checked for changes"); + return didRotate; + } + + NSString *currentIIDHash = + FIRCLS256HashNSData([currentIID dataUsingEncoding:NSUTF8StringEncoding]); + NSString *lastIIDHash = [defaults objectForKey:FIRCLSInstallationIIDHashKey]; + + // If the IDs are the same, we never regenerate + if ([lastIIDHash isEqualToString:currentIIDHash]) { + return didRotate; + } + + // If we had an FIID saved, we know it's not an upgrade scenario, so we can regenerate + if (lastIIDHash.length != 0) { + FIRCLSDebugLog(@"Regenerating Install ID"); + self.installID = [self generateInstallationUUID].copy; + didRotate = YES; + } + + // Write the new FIID to UserDefaults + [defaults setObject:currentIIDHash forKey:FIRCLSInstallationIIDHashKey]; + [defaults synchronize]; + + return didRotate; +} + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/FIRCLSInternalReport.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/FIRCLSInternalReport.h new file mode 100644 index 0000000..624c199 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/FIRCLSInternalReport.h @@ -0,0 +1,121 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +#include "Crashlytics/Crashlytics/Helpers/FIRCLSFeatures.h" + +extern NSString *const FIRCLSCustomFatalIndicatorFile; +extern NSString *const FIRCLSReportBinaryImageFile; +extern NSString *const FIRCLSReportExceptionFile; +extern NSString *const FIRCLSReportCustomExceptionAFile; +extern NSString *const FIRCLSReportCustomExceptionBFile; +extern NSString *const FIRCLSReportSignalFile; +extern NSString *const FIRCLSMetricKitFatalReportFile; +extern NSString *const FIRCLSMetricKitNonfatalReportFile; +#if CLS_MACH_EXCEPTION_SUPPORTED +extern NSString *const FIRCLSReportMachExceptionFile; +#endif +extern NSString *const FIRCLSReportErrorAFile; +extern NSString *const FIRCLSReportErrorBFile; +extern NSString *const FIRCLSReportLogAFile; +extern NSString *const FIRCLSReportLogBFile; +extern NSString *const FIRCLSReportMetadataFile; +extern NSString *const FIRCLSReportInternalIncrementalKVFile; +extern NSString *const FIRCLSReportInternalCompactedKVFile; +extern NSString *const FIRCLSReportUserIncrementalKVFile; +extern NSString *const FIRCLSReportUserCompactedKVFile; +extern NSString *const FIRCLSReportRolloutsFile; + +@class FIRCLSFileManager; + +@interface FIRCLSInternalReport : NSObject + ++ (instancetype)reportWithPath:(NSString *)path; +- (instancetype)initWithPath:(NSString *)path + executionIdentifier:(NSString *)identifier NS_DESIGNATED_INITIALIZER; +- (instancetype)initWithPath:(NSString *)path; +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)new NS_UNAVAILABLE; + ++ (NSArray *)crashFileNames; + +@property(nonatomic, copy, readonly) NSString *directoryName; +@property(nonatomic, copy) NSString *path; +@property(nonatomic, assign, readonly) BOOL hasAnyEvents; + +// content paths +@property(nonatomic, copy, readonly) NSString *binaryImagePath; +@property(nonatomic, copy, readonly) NSString *metadataPath; + +- (void)enumerateSymbolicatableFilesInContent:(void (^)(NSString *path))block; + +- (NSString *)pathForContentFile:(NSString *)name; + +// Metadata Helpers + +/** + * Returns the org id for the report. + **/ +@property(nonatomic, copy, readonly) NSString *orgID; + +/** + * Returns the Install UUID for the report. + **/ +@property(nonatomic, copy, readonly) NSString *installID; + +/** + * Returns true if report contains a signal, mach exception or unhandled exception record, false + * otherwise. + **/ +@property(nonatomic, assign, readonly) BOOL isCrash; + +/** + * Returns the session identifier for the report. + **/ +@property(nonatomic, copy, readonly) NSString *identifier; + +/** + * Returns the custom key value data for the report. + **/ +@property(nonatomic, copy, readonly) NSDictionary *customKeys; + +/** + * Returns the CFBundleVersion of the application that generated the report. + **/ +@property(nonatomic, copy, readonly) NSString *bundleVersion; + +/** + * Returns the CFBundleShortVersionString of the application that generated the report. + **/ +@property(nonatomic, copy, readonly) NSString *bundleShortVersionString; + +/** + * Returns the date that the report was created. + **/ +@property(nonatomic, copy, readonly) NSDate *dateCreated; + +@property(nonatomic, copy, readonly) NSDate *crashedOnDate; + +/** + * Returns the os version that the application crashed on. + **/ +@property(nonatomic, copy, readonly) NSString *OSVersion; + +/** + * Returns the os build version that the application crashed on. + **/ +@property(nonatomic, copy, readonly) NSString *OSBuildVersion; + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/FIRCLSInternalReport.m b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/FIRCLSInternalReport.m new file mode 100644 index 0000000..35160d1 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/FIRCLSInternalReport.m @@ -0,0 +1,258 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// TODO: Remove this class after the uploading of reports via GoogleDataTransport is no longer an +// experiment + +#import "Crashlytics/Crashlytics/Models/FIRCLSInternalReport.h" + +#import "Crashlytics/Crashlytics/Helpers/FIRCLSFile.h" +#import "Crashlytics/Crashlytics/Helpers/FIRCLSLogger.h" +#import "Crashlytics/Crashlytics/Models/FIRCLSFileManager.h" + +NSString *const FIRCLSCustomFatalIndicatorFile = @"custom_fatal.clsrecord"; +NSString *const FIRCLSReportBinaryImageFile = @"binary_images.clsrecord"; +NSString *const FIRCLSReportExceptionFile = @"exception.clsrecord"; +NSString *const FIRCLSReportCustomExceptionAFile = @"custom_exception_a.clsrecord"; +NSString *const FIRCLSReportCustomExceptionBFile = @"custom_exception_b.clsrecord"; +NSString *const FIRCLSReportSignalFile = @"signal.clsrecord"; +NSString *const FIRCLSMetricKitFatalReportFile = @"metric_kit_fatal.clsrecord"; +NSString *const FIRCLSMetricKitNonfatalReportFile = @"metric_kit_nonfatal.clsrecord"; +#if CLS_MACH_EXCEPTION_SUPPORTED +NSString *const FIRCLSReportMachExceptionFile = @"mach_exception.clsrecord"; +#endif +NSString *const FIRCLSReportMetadataFile = @"metadata.clsrecord"; +NSString *const FIRCLSReportErrorAFile = @"errors_a.clsrecord"; +NSString *const FIRCLSReportErrorBFile = @"errors_b.clsrecord"; +NSString *const FIRCLSReportLogAFile = @"log_a.clsrecord"; +NSString *const FIRCLSReportLogBFile = @"log_b.clsrecord"; +NSString *const FIRCLSReportInternalIncrementalKVFile = @"internal_incremental_kv.clsrecord"; +NSString *const FIRCLSReportInternalCompactedKVFile = @"internal_compacted_kv.clsrecord"; +NSString *const FIRCLSReportUserIncrementalKVFile = @"user_incremental_kv.clsrecord"; +NSString *const FIRCLSReportUserCompactedKVFile = @"user_compacted_kv.clsrecord"; +NSString *const FIRCLSReportRolloutsFile = @"rollouts.clsrecord"; + +@interface FIRCLSInternalReport () { + NSString *_identifier; + NSString *_path; + NSArray *_metadataSections; +} + +@end + +@implementation FIRCLSInternalReport + ++ (instancetype)reportWithPath:(NSString *)path { + return [[self alloc] initWithPath:path]; +} + +#pragma mark - Initialization +/** + * Initializes a new report, i.e. one without metadata on the file system yet. + */ +- (instancetype)initWithPath:(NSString *)path executionIdentifier:(NSString *)identifier { + self = [super init]; + if (!self) { + return self; + } + + if (!path || !identifier) { + return nil; + } + + [self setPath:path]; + + _identifier = [identifier copy]; + + return self; +} + +/** + * Initializes a pre-existing report, i.e. one with metadata on the file system. + */ +- (instancetype)initWithPath:(NSString *)path { + NSString *metadataPath = [path stringByAppendingPathComponent:FIRCLSReportMetadataFile]; + NSString *identifier = [[[[self.class readFIRCLSFileAtPath:metadataPath] objectAtIndex:0] + objectForKey:@"identity"] objectForKey:@"session_id"]; + if (!identifier) { + FIRCLSErrorLog(@"Unable to read identifier at path %@", path); + } + return [self initWithPath:path executionIdentifier:identifier]; +} + +#pragma mark - Path Helpers +- (NSString *)directoryName { + return self.path.lastPathComponent; +} + +- (NSString *)pathForContentFile:(NSString *)name { + return [[self path] stringByAppendingPathComponent:name]; +} + +- (NSString *)metadataPath { + return [[self path] stringByAppendingPathComponent:FIRCLSReportMetadataFile]; +} + +- (NSString *)binaryImagePath { + return [self pathForContentFile:FIRCLSReportBinaryImageFile]; +} + +#pragma mark - Processing Methods +- (BOOL)hasAnyEvents { + NSArray *reportFiles = @[ + FIRCLSReportExceptionFile, FIRCLSReportSignalFile, FIRCLSReportCustomExceptionAFile, + FIRCLSReportCustomExceptionBFile, FIRCLSMetricKitFatalReportFile, + FIRCLSMetricKitNonfatalReportFile, +#if CLS_MACH_EXCEPTION_SUPPORTED + FIRCLSReportMachExceptionFile, +#endif + FIRCLSReportErrorAFile, FIRCLSReportErrorBFile + ]; + return [self checkExistenceOfAtLeastOneFileInArray:reportFiles]; +} + +// These are purposefully in order of precedence. If duplicate data exists +// in any crash file, the exception file's contents take precedence over the +// rest, for example +// +// Do not change the order of this. +// ++ (NSArray *)crashFileNames { + static NSArray *files; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + files = @[ + FIRCLSReportExceptionFile, +#if CLS_MACH_EXCEPTION_SUPPORTED + FIRCLSReportMachExceptionFile, +#endif + FIRCLSReportSignalFile, FIRCLSMetricKitFatalReportFile, FIRCLSCustomFatalIndicatorFile + ]; + }); + return files; +} + +- (BOOL)isCrash { + NSArray *crashFiles = [FIRCLSInternalReport crashFileNames]; + return [self checkExistenceOfAtLeastOneFileInArray:crashFiles]; +} + +- (BOOL)checkExistenceOfAtLeastOneFileInArray:(NSArray *)files { + NSFileManager *manager = [NSFileManager defaultManager]; + + for (NSString *fileName in files) { + NSString *path = [self pathForContentFile:fileName]; + + if ([manager fileExistsAtPath:path]) { + return YES; + } + } + + return NO; +} + +- (void)enumerateSymbolicatableFilesInContent:(void (^)(NSString *path))block { + for (NSString *fileName in [FIRCLSInternalReport crashFileNames]) { + NSString *path = [self pathForContentFile:fileName]; + + block(path); + } +} + +#pragma mark - Metadata helpers ++ (NSArray *)readFIRCLSFileAtPath:(NSString *)path { + NSArray *sections = FIRCLSFileReadSections([path fileSystemRepresentation], false, nil); + + if ([sections count] == 0) { + return nil; + } + + return sections; +} + +- (NSArray *)metadataSections { + if (!_metadataSections) { + _metadataSections = [self.class readFIRCLSFileAtPath:self.metadataPath]; + } + return _metadataSections; +} + +- (NSString *)orgID { + return + [[[self.metadataSections objectAtIndex:0] objectForKey:@"identity"] objectForKey:@"org_id"]; +} + +- (NSDictionary *)customKeys { + return nil; +} + +- (NSString *)bundleVersion { + return [[[self.metadataSections objectAtIndex:2] objectForKey:@"application"] + objectForKey:@"build_version"]; +} + +- (NSString *)bundleShortVersionString { + return [[[self.metadataSections objectAtIndex:2] objectForKey:@"application"] + objectForKey:@"display_version"]; +} + +- (NSDate *)dateCreated { + NSUInteger unixtime = [[[[self.metadataSections objectAtIndex:0] objectForKey:@"identity"] + objectForKey:@"started_at"] unsignedIntegerValue]; + + return [NSDate dateWithTimeIntervalSince1970:unixtime]; +} + +- (NSDate *)crashedOnDate { + if (!self.isCrash) { + return nil; + } + +#if CLS_MACH_EXCEPTION_SUPPORTED + // try the mach exception first, because it is more common + NSDate *date = [self timeFromCrashContentFile:FIRCLSReportMachExceptionFile + sectionName:@"mach_exception"]; + if (date) { + return date; + } +#endif + + return [self timeFromCrashContentFile:FIRCLSReportSignalFile sectionName:@"signal"]; +} + +- (NSDate *)timeFromCrashContentFile:(NSString *)fileName sectionName:(NSString *)sectionName { + // This works because both signal and mach exception files have the same structure to extract + // the "time" component + NSString *path = [self pathForContentFile:fileName]; + + NSNumber *timeValue = [[[[self.class readFIRCLSFileAtPath:path] objectAtIndex:0] + objectForKey:sectionName] objectForKey:@"time"]; + if (timeValue == nil) { + return nil; + } + + return [NSDate dateWithTimeIntervalSince1970:[timeValue unsignedIntegerValue]]; +} + +- (NSString *)OSVersion { + return [[[self.metadataSections objectAtIndex:1] objectForKey:@"host"] + objectForKey:@"os_display_version"]; +} + +- (NSString *)OSBuildVersion { + return [[[self.metadataSections objectAtIndex:1] objectForKey:@"host"] + objectForKey:@"os_build_version"]; +} + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/FIRCLSLaunchMarkerModel.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/FIRCLSLaunchMarkerModel.h new file mode 100644 index 0000000..269a1c9 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/FIRCLSLaunchMarkerModel.h @@ -0,0 +1,40 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +#import "Crashlytics/Crashlytics/Models/FIRCLSFileManager.h" + +NS_ASSUME_NONNULL_BEGIN + +/* + * Writes a file during startup, and deletes it at the end. Existence + * of this file on the next run means there was a crash at launch, + * because the file wasn't deleted. This is used to make Crashlytics + * block startup on uploading the crash. + */ +@interface FIRCLSLaunchMarkerModel : NSObject + +- (instancetype)initWithFileManager:(FIRCLSFileManager *)fileManager; + +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)new NS_UNAVAILABLE; + +- (BOOL)checkForAndCreateLaunchMarker; +- (BOOL)createLaunchFailureMarker; +- (BOOL)removeLaunchFailureMarker; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/FIRCLSLaunchMarkerModel.m b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/FIRCLSLaunchMarkerModel.m new file mode 100644 index 0000000..ed5ee88 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/FIRCLSLaunchMarkerModel.m @@ -0,0 +1,84 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "Crashlytics/Crashlytics/Models/FIRCLSLaunchMarkerModel.h" + +#import "Crashlytics/Crashlytics/Helpers/FIRCLSInternalLogging.h" + +@interface FIRCLSLaunchMarkerModel () + +@property(nonatomic, strong) FIRCLSFileManager *fileManager; + +@end + +@implementation FIRCLSLaunchMarkerModel + +- (instancetype)initWithFileManager:(FIRCLSFileManager *)fileManager { + self = [super init]; + if (!self) { + return nil; + } + + _fileManager = fileManager; + + return self; +} + +- (BOOL)checkForAndCreateLaunchMarker { + BOOL launchFailure = [self launchFailureMarkerPresent]; + if (launchFailure) { + FIRCLSDeveloperLog("Crashlytics:Crash", + @"Last launch failed: this may indicate a crash shortly after app launch."); + } else { + [self createLaunchFailureMarker]; + } + + return launchFailure; +} + +- (NSString *)launchFailureMarkerPath { + return [[_fileManager structurePath] stringByAppendingPathComponent:@"launchmarker"]; +} + +- (BOOL)createLaunchFailureMarker { + // It's tempting to use - [NSFileManger createFileAtPath:contents:attributes:] here. But that + // operation, even with empty/nil contents does a ton of work to write out nothing via a + // temporarly file. This is a much faster implementation. + const char *path = [[self launchFailureMarkerPath] fileSystemRepresentation]; + +#if TARGET_OS_IPHONE + /* + * data-protected non-portable open(2) : + * int open_dprotected_np(user_addr_t path, int flags, int class, int dpflags, int mode) + */ + int fd = open_dprotected_np(path, O_WRONLY | O_CREAT | O_TRUNC, 4, 0, 0644); +#else + int fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644); +#endif + if (fd == -1) { + return NO; + } + + return close(fd) == 0; +} + +- (BOOL)launchFailureMarkerPresent { + return [[_fileManager underlyingFileManager] fileExistsAtPath:[self launchFailureMarkerPath]]; +} + +- (BOOL)removeLaunchFailureMarker { + return [_fileManager removeItemAtPath:[self launchFailureMarkerPath]]; +} + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/FIRCLSOnDemandModel.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/FIRCLSOnDemandModel.h new file mode 100644 index 0000000..78721ee --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/FIRCLSOnDemandModel.h @@ -0,0 +1,22 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +NS_SWIFT_NAME(OnDemandModel) +@interface FIRCLSOnDemandModel : NSObject + +- (instancetype)init NS_UNAVAILABLE; + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/FIRCLSOnDemandModel.m b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/FIRCLSOnDemandModel.m new file mode 100644 index 0000000..649940f --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/FIRCLSOnDemandModel.m @@ -0,0 +1,269 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +#import "Crashlytics/Crashlytics/Components/FIRCLSApplication.h" +#import "Crashlytics/Crashlytics/DataCollection/FIRCLSDataCollectionArbiter.h" +#import "Crashlytics/Crashlytics/DataCollection/FIRCLSDataCollectionToken.h" +#import "Crashlytics/Crashlytics/Handlers/FIRCLSException.h" +#import "Crashlytics/Crashlytics/Helpers/FIRCLSLogger.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSUtility.h" +#import "Crashlytics/Crashlytics/Models/FIRCLSFileManager.h" +#import "Crashlytics/Crashlytics/Models/FIRCLSOnDemandModel.h" +#import "Crashlytics/Crashlytics/Private/FIRCLSOnDemandModel_Private.h" + +#include + +@interface FIRCLSOnDemandModel () + +@property(nonatomic, readonly) int recordedOnDemandExceptionCount; +@property(nonatomic, readonly) int droppedOnDemandExceptionCount; +@property(nonatomic, readonly) int queuedOperationsCount; + +@property(nonatomic, strong) FIRCLSSettings *settings; +@property(nonatomic, strong) NSOperationQueue *operationQueue; +@property(nonatomic, strong) dispatch_queue_t dispatchQueue; + +@property(nonatomic) double lastUpdated; +@property(nonatomic) double currentStep; + +@property(nonatomic, strong) FIRCLSFileManager *fileManager; +@property(nonatomic, strong) NSMutableArray *storedActiveReportPaths; + +@end + +@implementation FIRCLSOnDemandModel + +@synthesize recordedOnDemandExceptionCount = _recordedOnDemandExceptionCount; +@synthesize droppedOnDemandExceptionCount = _droppedOnDemandExceptionCount; +@synthesize queuedOperationsCount = _queuedOperationsCount; + +static const double MAX_DELAY_SEC = 3600; +static const double SEC_PER_MINUTE = 60; + +- (instancetype)initWithFIRCLSSettings:(FIRCLSSettings *)settings + fileManager:(FIRCLSFileManager *)fileManager { + self = [super init]; + if (!self) { + return nil; + } + + _settings = settings; + _fileManager = fileManager; + + NSString *sdkBundleID = FIRCLSApplicationGetSDKBundleID(); + _operationQueue = [NSOperationQueue new]; + [_operationQueue setMaxConcurrentOperationCount:1]; + [_operationQueue setName:[sdkBundleID stringByAppendingString:@".on-demand-queue"]]; + _dispatchQueue = dispatch_queue_create("com.google.firebase.crashlytics.on.demand", 0); + _operationQueue.underlyingQueue = _dispatchQueue; + + _queuedOperationsCount = 0; + + _recordedOnDemandExceptionCount = 0; + _droppedOnDemandExceptionCount = 0; + + _lastUpdated = [NSDate timeIntervalSinceReferenceDate]; + _currentStep = -1; + + self.storedActiveReportPaths = [NSMutableArray array]; + + return self; +} + +/* + * Called from FIRCrashlytics whenever the on-demand record exception method is called. Handles + * rate limiting and exponential backoff. + */ +- (BOOL)recordOnDemandExceptionIfQuota:(FIRExceptionModel *)exceptionModel + withDataCollectionEnabled:(BOOL)dataCollectionEnabled + usingExistingReportManager:(FIRCLSExistingReportManager *)existingReportManager { + // Record the exception model into a new report if there is unused on-demand quota. Otherwise, + // log the occurrence but drop the event. + @synchronized(self) { + if ([self isQueueFull]) { + FIRCLSDebugLog(@"No available on-demand quota, dropping report"); + [self incrementDroppedExceptionCount]; + [self incrementRecordedExceptionCount]; + return NO; // Didn't record or submit the exception because no quota was available. + } + + FIRCLSDataCollectionToken *dataCollectionToken = [FIRCLSDataCollectionToken validToken]; + NSString *activeReportPath = [self recordOnDemandExceptionWithModel:exceptionModel]; + + if (!activeReportPath) { + FIRCLSErrorLog(@"Error recording on-demand exception"); + return NO; // Something went wrong when recording the exception, so we don't have a valid + // path. + } + + // Only submit an exception report if data collection is enabled. Otherwise, the report + // is stored until send or delete unsent reports is called. + [self incrementQueuedOperationCount]; + [self incrementRecordedExceptionCount]; + [self resetDroppedExceptionCount]; + + [self.operationQueue addOperationWithBlock:^{ + double uploadDelay = [self calculateUploadDelay]; + + if (dataCollectionEnabled) { + [existingReportManager handleOnDemandReportUpload:activeReportPath + dataCollectionToken:dataCollectionToken + asUrgent:YES]; + FIRCLSDebugLog(@"Submitted an on-demand exception, starting delay %.20f", uploadDelay); + } else { + [self.storedActiveReportPaths insertObject:activeReportPath atIndex:0]; + if ([self.storedActiveReportPaths count] > FIRCLSMaxUnsentReports) { + [self.fileManager removeItemAtPath:[self.storedActiveReportPaths lastObject]]; + [self.storedActiveReportPaths removeLastObject]; + [self decrementRecordedExceptionCount]; + [self incrementDroppedExceptionCount]; + } + FIRCLSDebugLog(@"Stored an on-demand exception, starting delay %.20f", uploadDelay); + } + [self implementOnDemandUploadDelay:uploadDelay]; + [self decrementQueuedOperationCount]; + }]; + return YES; // Recorded and submitted the exception. + } +} + +- (double)calculateUploadDelay { + double calculatedStepDuration = [self calculateStepDuration]; + double power = pow(self.settings.onDemandBackoffBase, calculatedStepDuration); + NSNumber *calculatedUploadDelay = + [NSNumber numberWithDouble:(SEC_PER_MINUTE / self.settings.onDemandUploadRate) * power]; + NSComparisonResult result = + [[NSNumber numberWithDouble:MAX_DELAY_SEC] compare:calculatedUploadDelay]; + return (result == NSOrderedAscending) ? MAX_DELAY_SEC : [calculatedUploadDelay doubleValue]; +} + +- (double)calculateStepDuration { + double currentTime = [NSDate timeIntervalSinceReferenceDate]; + BOOL queueIsFull = [self isQueueFull]; + + if (self.currentStep == -1) { + self.currentStep = 0; + self.lastUpdated = currentTime; + } + + double delta = + (currentTime - self.lastUpdated) / (double)self.settings.onDemandBackoffStepDuration; + double queueFullDuration = (self.currentStep + delta) > 100 ? 100 : (self.currentStep + delta); + double queueNotFullDuration = (self.currentStep - delta) < 0 ? 0 : (self.currentStep - delta); + double calculatedDuration = queueIsFull ? queueFullDuration : queueNotFullDuration; + + if (self.currentStep != calculatedDuration) { + self.currentStep = calculatedDuration; + self.lastUpdated = currentTime; + } + + return calculatedDuration; +} + +- (void)implementOnDemandUploadDelay:(int)delay { + sleep(delay); +} + +- (NSString *)recordOnDemandExceptionWithModel:(FIRExceptionModel *)exceptionModel { + BOOL shouldSuspendThread = self.settings.onDemandThreadSuspensionEnabled; + return FIRCLSExceptionRecordOnDemandModel(exceptionModel, self.recordedOnDemandExceptionCount, + self.droppedOnDemandExceptionCount, + shouldSuspendThread); +} + +- (int)droppedOnDemandExceptionCount { + @synchronized(self) { + return _droppedOnDemandExceptionCount; + } +} + +- (void)setDroppedOnDemandExceptionCount:(int)count { + @synchronized(self) { + _droppedOnDemandExceptionCount = count; + } +} + +- (void)incrementDroppedExceptionCount { + @synchronized(self) { + [self setDroppedOnDemandExceptionCount:[self droppedOnDemandExceptionCount] + 1]; + } +} + +- (void)decrementDroppedExceptionCount { + @synchronized(self) { + [self setDroppedOnDemandExceptionCount:[self droppedOnDemandExceptionCount] - 1]; + } +} + +- (void)resetDroppedExceptionCount { + @synchronized(self) { + [self setDroppedOnDemandExceptionCount:0]; + } +} + +- (int)recordedOnDemandExceptionCount { + @synchronized(self) { + return _recordedOnDemandExceptionCount; + } +} + +- (void)setRecordedOnDemandExceptionCount:(int)count { + @synchronized(self) { + _recordedOnDemandExceptionCount = count; + } +} + +- (void)incrementRecordedExceptionCount { + @synchronized(self) { + [self setRecordedOnDemandExceptionCount:[self recordedOnDemandExceptionCount] + 1]; + } +} + +- (void)decrementRecordedExceptionCount { + @synchronized(self) { + [self setRecordedOnDemandExceptionCount:[self recordedOnDemandExceptionCount] - 1]; + } +} + +- (int)getQueuedOperationsCount { + @synchronized(self) { + return _queuedOperationsCount; + } +} + +- (void)setQueuedOperationsCount:(int)count { + @synchronized(self) { + _queuedOperationsCount = count; + } +} + +- (void)incrementQueuedOperationCount { + @synchronized(self) { + [self setQueuedOperationsCount:[self getQueuedOperationsCount] + 1]; + } +} + +- (void)decrementQueuedOperationCount { + @synchronized(self) { + [self setQueuedOperationsCount:[self getQueuedOperationsCount] - 1]; + } +} + +- (BOOL)isQueueFull { + return ([self getQueuedOperationsCount] >= self.settings.onDemandUploadRate); +} + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/FIRCLSSettings.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/FIRCLSSettings.h new file mode 100644 index 0000000..f122fff --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/FIRCLSSettings.h @@ -0,0 +1,131 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +#if __has_include() +#import +#else +#import "FBLPromises.h" +#endif + +@class FIRCLSApplicationIdentifierModel; +@class FIRCLSFileManager; + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRCLSSettings : NSObject + +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)new NS_UNAVAILABLE; +- (instancetype)initWithFileManager:(FIRCLSFileManager *)fileManager + appIDModel:(FIRCLSApplicationIdentifierModel *)appIDModel + NS_DESIGNATED_INITIALIZER; + +/** + * Recreates the settings dictionary by re-reading the settings file from persistent storage. This + * should be called before any settings values are read, as it will populate the underlying + * settingsDictionary. If the Google App ID has changed or there is an error, delete the cache file + * and settingsDictionary. If the cache has expired, set `isCacheExpired` to true so that settings + * are re-fetched, but do not delete any values. + */ +- (void)reloadFromCacheWithGoogleAppID:(NSString *)googleAppID + currentTimestamp:(NSTimeInterval)currentTimestamp; + +/** + * Stores a separate file with the settings expiration and Google App ID it was saved with + * so that we can later determine that the settings have expired. + * + * This should be called in a background thread right after the settings.json file has been + * downloaded. + */ +- (void)cacheSettingsWithGoogleAppID:(NSString *)googleAppID + currentTimestamp:(NSTimeInterval)currentTimestamp; + +/** + * Returns true when Settings should be fetched from the server again + */ +@property(nonatomic, readonly) BOOL isCacheExpired; + +/** + * Determines how long these Settings should be respected until the SDK should fetch again + */ +@property(nonatomic, readonly) uint32_t cacheDurationSeconds; + +/** + * When this is false, Crashlytics will not start up + */ +@property(nonatomic, readonly) BOOL collectReportsEnabled; + +/** + * When this is false, Crashlytics will not collect non-fatal errors and errors + * from the custom exception / record error APIs + */ +@property(nonatomic, readonly) BOOL errorReportingEnabled; + +/** + * When this is false, Crashlytics will not collect custom exceptions from the API + */ +@property(nonatomic, readonly) BOOL customExceptionsEnabled; + +/** + * When this is true, Crashlytics will collect data from MetricKit + */ +@property(nonatomic, readonly) BOOL metricKitCollectionEnabled; + +/** + * Returns the maximum number of custom exception events that will be + * recorded in a session. + */ +@property(nonatomic, readonly) uint32_t errorLogBufferSize; + +/** + * Returns the maximum size of the log buffer in bytes + */ +@property(nonatomic, readonly) uint32_t logBufferSize; + +/** + * Returns the maximum number of custom exceptions that will be collected + * in a session. + */ +@property(nonatomic, readonly) uint32_t maxCustomExceptions; + +/** + * Returns the maximum number of custom key-value pair keys (not bytes). + */ +@property(nonatomic, readonly) uint32_t maxCustomKeys; + +/** + * Returns the initial upload rate for on-demand exception reporting. + */ +@property(nonatomic, readonly) double onDemandUploadRate; + +/** + * Base exponent used when exponential backoff is triggered for on-demand reporting. + */ +@property(nonatomic, readonly) double onDemandBackoffBase; + +/** + * Step duration to use with exponential backoff for on-demand reporting. + */ +@property(nonatomic, readonly) uint32_t onDemandBackoffStepDuration; + +/** + * When this is true, Crashlytics will suspend all threads to do on-demand fatal recording. + */ +@property(nonatomic, readonly) BOOL onDemandThreadSuspensionEnabled; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/FIRCLSSettings.m b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/FIRCLSSettings.m new file mode 100644 index 0000000..758772e --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/FIRCLSSettings.m @@ -0,0 +1,369 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "Crashlytics/Crashlytics/Models/FIRCLSSettings.h" + +#if __has_include() +#import +#else +#import "FBLPromises.h" +#endif + +#import "Crashlytics/Crashlytics/Helpers/FIRCLSLogger.h" +#import "Crashlytics/Crashlytics/Models/FIRCLSFileManager.h" +#import "Crashlytics/Crashlytics/Settings/Models/FIRCLSApplicationIdentifierModel.h" +#import "Crashlytics/Shared/FIRCLSConstants.h" +#import "Crashlytics/Shared/FIRCLSNetworking/FIRCLSURLBuilder.h" + +NSString *const CreatedAtKey = @"created_at"; +NSString *const GoogleAppIDKey = @"google_app_id"; +NSString *const BuildInstanceID = @"build_instance_id"; +NSString *const AppVersion = @"app_version"; + +@interface FIRCLSSettings () + +@property(nonatomic, strong) FIRCLSFileManager *fileManager; +@property(nonatomic, strong) FIRCLSApplicationIdentifierModel *appIDModel; + +@property(nonatomic, strong) NSDictionary *settingsDictionary; + +@property(nonatomic) BOOL isCacheKeyExpired; + +@end + +@implementation FIRCLSSettings + +- (instancetype)initWithFileManager:(FIRCLSFileManager *)fileManager + appIDModel:(FIRCLSApplicationIdentifierModel *)appIDModel { + self = [super init]; + if (!self) { + return nil; + } + + _fileManager = fileManager; + _appIDModel = appIDModel; + + _settingsDictionary = nil; + _isCacheKeyExpired = NO; + + return self; +} + +#pragma mark - Public Methods + +- (void)reloadFromCacheWithGoogleAppID:(NSString *)googleAppID + currentTimestamp:(NSTimeInterval)currentTimestamp { + NSString *settingsFilePath = self.fileManager.settingsFilePath; + + NSData *data = [self.fileManager dataWithContentsOfFile:settingsFilePath]; + + if (!data) { + FIRCLSDebugLog(@"[Crashlytics:Settings] No settings were cached"); + + return; + } + + NSError *error = nil; + @synchronized(self) { + _settingsDictionary = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; + } + + if (!_settingsDictionary) { + FIRCLSErrorLog(@"Could not load settings file data with error: %@", error.localizedDescription); + + // Attempt to remove it, in case it's messed up + [self deleteCachedSettings]; + return; + } + + NSDictionary *cacheKey = [self loadCacheKey]; + if (!cacheKey) { + FIRCLSErrorLog(@"Could not load settings cache key"); + + [self deleteCachedSettings]; + return; + } + + NSString *cachedGoogleAppID = cacheKey[GoogleAppIDKey]; + if (![cachedGoogleAppID isEqualToString:googleAppID]) { + FIRCLSDebugLog( + @"[Crashlytics:Settings] Invalidating settings cache because Google App ID changed"); + + [self deleteCachedSettings]; + return; + } + + NSTimeInterval cacheCreatedAt = [cacheKey[CreatedAtKey] unsignedIntValue]; + NSTimeInterval cacheDurationSeconds = self.cacheDurationSeconds; + if (currentTimestamp > (cacheCreatedAt + cacheDurationSeconds)) { + FIRCLSDebugLog(@"[Crashlytics:Settings] Settings TTL expired"); + + @synchronized(self) { + self.isCacheKeyExpired = YES; + } + } + + NSString *cacheBuildInstanceID = cacheKey[BuildInstanceID]; + if (![cacheBuildInstanceID isEqualToString:self.appIDModel.buildInstanceID]) { + FIRCLSDebugLog(@"[Crashlytics:Settings] Settings expired because build instance changed"); + + @synchronized(self) { + self.isCacheKeyExpired = YES; + } + } + + NSString *cacheAppVersion = cacheKey[AppVersion]; + if (![cacheAppVersion isEqualToString:self.appIDModel.synthesizedVersion]) { + FIRCLSDebugLog(@"[Crashlytics:Settings] Settings expired because app version changed"); + + @synchronized(self) { + self.isCacheKeyExpired = YES; + } + } +} + +- (void)cacheSettingsWithGoogleAppID:(NSString *)googleAppID + currentTimestamp:(NSTimeInterval)currentTimestamp { + NSNumber *createdAtTimestamp = [NSNumber numberWithDouble:currentTimestamp]; + NSDictionary *cacheKey = @{ + CreatedAtKey : createdAtTimestamp, + GoogleAppIDKey : googleAppID, + BuildInstanceID : self.appIDModel.buildInstanceID, + AppVersion : self.appIDModel.synthesizedVersion, + }; + + NSError *error = nil; + NSData *jsonData = [NSJSONSerialization dataWithJSONObject:cacheKey + options:kNilOptions + error:&error]; + + if (!jsonData) { + FIRCLSErrorLog(@"Could not create settings cache key with error: %@", + error.localizedDescription); + + return; + } + + if ([self.fileManager fileExistsAtPath:self.fileManager.settingsCacheKeyPath]) { + [self.fileManager removeItemAtPath:self.fileManager.settingsCacheKeyPath]; + } + [self.fileManager createFileAtPath:self.fileManager.settingsCacheKeyPath + contents:jsonData + attributes:nil]; + + // If Settings were expired before, they should no longer be expired after this. + // This may be set back to YES if reloading from the cache fails + @synchronized(self) { + self.isCacheKeyExpired = NO; + } + + [self reloadFromCacheWithGoogleAppID:googleAppID currentTimestamp:currentTimestamp]; +} + +#pragma mark - Convenience Methods + +- (NSDictionary *)loadCacheKey { + NSData *cacheKeyData = + [self.fileManager dataWithContentsOfFile:self.fileManager.settingsCacheKeyPath]; + + if (!cacheKeyData) { + return nil; + } + + NSError *error = nil; + NSDictionary *cacheKey = [NSJSONSerialization JSONObjectWithData:cacheKeyData + options:NSJSONReadingAllowFragments + error:&error]; + return cacheKey; +} + +- (void)deleteCachedSettings { + __weak FIRCLSSettings *weakSelf = self; + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ + __strong FIRCLSSettings *strongSelf = weakSelf; + if ([strongSelf.fileManager fileExistsAtPath:strongSelf.fileManager.settingsFilePath]) { + [strongSelf.fileManager removeItemAtPath:strongSelf.fileManager.settingsFilePath]; + } + if ([strongSelf.fileManager fileExistsAtPath:strongSelf.fileManager.settingsCacheKeyPath]) { + [strongSelf.fileManager removeItemAtPath:strongSelf.fileManager.settingsCacheKeyPath]; + } + }); + + @synchronized(self) { + self.isCacheKeyExpired = YES; + _settingsDictionary = nil; + } +} + +- (NSDictionary *)settingsDictionary { + @synchronized(self) { + return _settingsDictionary; + } +} + +#pragma mark - Settings Groups + +- (NSDictionary *)appSettings { + return self.settingsDictionary[@"app"]; +} + +- (NSDictionary *)sessionSettings { + return self.settingsDictionary[@"session"]; +} + +- (NSDictionary *)featuresSettings { + return self.settingsDictionary[@"features"]; +} + +- (NSDictionary *)fabricSettings { + return self.settingsDictionary[@"fabric"]; +} + +#pragma mark - Caching + +- (BOOL)isCacheExpired { + if (!self.settingsDictionary) { + return YES; + } + + @synchronized(self) { + return self.isCacheKeyExpired; + } +} + +- (uint32_t)cacheDurationSeconds { + id fetchedCacheDuration = self.settingsDictionary[@"cache_duration"]; + if (fetchedCacheDuration) { + return [fetchedCacheDuration unsignedIntValue]; + } + + return 60 * 60; +} + +#pragma mark - On / Off Switches + +- (BOOL)errorReportingEnabled { + NSNumber *value = [self featuresSettings][@"collect_logged_exceptions"]; + + if (value != nil) { + return [value boolValue]; + } + + return YES; +} + +- (BOOL)customExceptionsEnabled { + // Right now, recording custom exceptions from the API and + // automatically capturing non-fatal errors go hand in hand + return [self errorReportingEnabled]; +} + +- (BOOL)collectReportsEnabled { + NSNumber *value = [self featuresSettings][@"collect_reports"]; + + if (value != nil) { + return value.boolValue; + } + + return YES; +} + +- (BOOL)metricKitCollectionEnabled { + NSNumber *value = [self featuresSettings][@"collect_metric_kit"]; + + if (value != nil) { + return value.boolValue; + } + + return NO; +} + +#pragma mark - Optional Limit Overrides + +- (uint32_t)errorLogBufferSize { + return [self logBufferSize]; +} + +- (uint32_t)logBufferSize { + NSNumber *value = [self sessionSettings][@"log_buffer_size"]; + + if (value != nil) { + return value.unsignedIntValue; + } + + return 64 * 1000; +} + +- (uint32_t)maxCustomExceptions { + NSNumber *value = [self sessionSettings][@"max_custom_exception_events"]; + + if (value != nil) { + return value.unsignedIntValue; + } + + return 8; +} + +- (uint32_t)maxCustomKeys { + NSNumber *value = [self sessionSettings][@"max_custom_key_value_pairs"]; + + if (value != nil) { + return value.unsignedIntValue; + } + + return 64; +} + +#pragma mark - On Demand Reporting Parameters + +- (double)onDemandUploadRate { + NSNumber *value = self.settingsDictionary[@"on_demand_upload_rate_per_minute"]; + + if (value != nil) { + return value.doubleValue; + } + + return 10; // on-demand uploads allowed per minute +} + +- (double)onDemandBackoffBase { + NSNumber *value = self.settingsDictionary[@"on_demand_backoff_base"]; + + if (value != nil) { + return [value doubleValue]; + } + + return 1.5; // base of exponent for exponential backoff +} + +- (uint32_t)onDemandBackoffStepDuration { + NSNumber *value = self.settingsDictionary[@"on_demand_backoff_step_duration_seconds"]; + + if (value != nil) { + return value.unsignedIntValue; + } + + return 6; // step duration for exponential backoff +} + +- (BOOL)onDemandThreadSuspensionEnabled { + NSNumber *value = self.settingsDictionary[@"on_demand_thread_recording_suspension_enabled"]; + + if (value != nil) { + return value.boolValue; + } + + return YES; +} +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/FIRCLSSymbolResolver.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/FIRCLSSymbolResolver.h new file mode 100644 index 0000000..a18e604 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/FIRCLSSymbolResolver.h @@ -0,0 +1,26 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +@class FIRStackFrame; + +@interface FIRCLSSymbolResolver : NSObject + +- (BOOL)loadBinaryImagesFromFile:(NSString *)path; + +- (FIRStackFrame *)frameForAddress:(uint64_t)address; +- (BOOL)updateStackFrame:(FIRStackFrame *)frame; + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/FIRCLSSymbolResolver.m b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/FIRCLSSymbolResolver.m new file mode 100644 index 0000000..8ce74da --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/FIRCLSSymbolResolver.m @@ -0,0 +1,176 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "Crashlytics/Crashlytics/Models/FIRCLSSymbolResolver.h" + +#include + +#include "Crashlytics/Crashlytics/Components/FIRCLSBinaryImage.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSFile.h" +#import "Crashlytics/Crashlytics/Helpers/FIRCLSInternalLogging.h" +#import "Crashlytics/Crashlytics/Helpers/FIRCLSLogger.h" +#import "Crashlytics/Crashlytics/Private/FIRStackFrame_Private.h" + +@interface FIRCLSSymbolResolver () { + NSMutableArray* _binaryImages; +} + +@end + +@implementation FIRCLSSymbolResolver + +- (instancetype)init { + self = [super init]; + if (!self) { + return nil; + } + + _binaryImages = [NSMutableArray array]; + + return self; +} + +- (BOOL)loadBinaryImagesFromFile:(NSString*)path { + if ([path length] == 0) { + return NO; + } + + NSArray* sections = FIRCLSFileReadSections([path fileSystemRepresentation], false, nil); + + if ([sections count] == 0) { + FIRCLSErrorLog(@"Failed to read binary image file %@", path); + return NO; + } + + // filter out unloads, as well as loads with invalid entries + for (NSDictionary* entry in sections) { + NSDictionary* details = [entry objectForKey:@"load"]; + if (!details) { + continue; + } + + // This does happen occasionally and causes a crash. I'm really not sure there + // is anything sane we can do in this case. + if (![details objectForKey:@"base"] || ![details objectForKey:@"size"]) { + continue; + } + + if ([details objectForKey:@"base"] == (id)[NSNull null] || + [details objectForKey:@"size"] == (id)[NSNull null]) { + continue; + } + + [_binaryImages addObject:details]; + } + + [_binaryImages sortUsingComparator:^NSComparisonResult(id obj1, id obj2) { + NSNumber* base1 = [obj1 objectForKey:@"base"]; + NSNumber* base2 = [obj2 objectForKey:@"base"]; + + return [base1 compare:base2]; + }]; + + return YES; +} + +- (NSDictionary*)loadedBinaryImageForPC:(uintptr_t)pc { + NSUInteger index = + [_binaryImages indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL* stop) { + uintptr_t base = [[obj objectForKey:@"base"] unsignedIntegerValue]; + uintptr_t size = [[obj objectForKey:@"size"] unsignedIntegerValue]; + + return pc >= base && pc < (base + size); + }]; + + if (index == NSNotFound) { + return nil; + } + + return [_binaryImages objectAtIndex:index]; +} + +- (BOOL)fillInImageDetails:(FIRCLSBinaryImageDetails*)details forUUID:(NSString*)uuid { + if (!details || !uuid) { + return NO; + } + + return FIRCLSBinaryImageFindImageForUUID([uuid UTF8String], details); +} + +- (FIRStackFrame*)frameForAddress:(uint64_t)address { + FIRStackFrame* frame = [FIRStackFrame stackFrameWithAddress:(NSUInteger)address]; + + if (![self updateStackFrame:frame]) { + return nil; + } + + return frame; +} + +- (BOOL)updateStackFrame:(FIRStackFrame*)frame { + uint64_t address = [frame address]; + if (address == 0) { + return NO; + } + + NSDictionary* binaryImage = [self loadedBinaryImageForPC:(uintptr_t)address]; + + FIRCLSBinaryImageDetails imageDetails; + + if (![self fillInImageDetails:&imageDetails forUUID:[binaryImage objectForKey:@"uuid"]]) { +#if DEBUG + FIRCLSSDKLog("Image not found\n"); +#endif + return NO; + } + + uintptr_t addr = (uintptr_t)address - + (uintptr_t)[[binaryImage objectForKey:@"base"] unsignedIntegerValue] + + (uintptr_t)imageDetails.node.baseAddress; + Dl_info dlInfo; + + if (dladdr((void*)addr, &dlInfo) == 0) { +#if DEBUG + FIRCLSSDKLog("Could not look up address\n"); +#endif + return NO; + } + + if (addr - (uintptr_t)dlInfo.dli_saddr == 0) { + addr -= 2; + if (dladdr((void*)addr, &dlInfo) == 0) { +#if DEBUG + FIRCLSSDKLog("Could not look up address after move\n"); +#endif + return NO; + } + } + + if (dlInfo.dli_sname) { + NSString* symbol = [NSString stringWithUTF8String:dlInfo.dli_sname]; + + frame.symbol = symbol; + frame.rawSymbol = symbol; + } + + if (addr > (uintptr_t)dlInfo.dli_saddr) { + [frame setOffset:addr - (uintptr_t)dlInfo.dli_saddr]; + } + + [frame setLibrary:[[binaryImage objectForKey:@"path"] lastPathComponent]]; + + return YES; +} + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/Record/FIRCLSRecordApplication.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/Record/FIRCLSRecordApplication.h new file mode 100644 index 0000000..a3177b2 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/Record/FIRCLSRecordApplication.h @@ -0,0 +1,24 @@ +/* + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "Crashlytics/Crashlytics/Models/Record/FIRCLSRecordBase.h" + +@interface FIRCLSRecordApplication : FIRCLSRecordBase + +@property(nonatomic, copy) NSString *build_version; +@property(nonatomic, copy) NSString *display_version; + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/Record/FIRCLSRecordApplication.m b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/Record/FIRCLSRecordApplication.m new file mode 100644 index 0000000..b447416 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/Record/FIRCLSRecordApplication.m @@ -0,0 +1,30 @@ +/* + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "Crashlytics/Crashlytics/Models/Record/FIRCLSRecordApplication.h" + +@implementation FIRCLSRecordApplication + +- (instancetype)initWithDict:(NSDictionary *)dict { + self = [super initWithDict:dict]; + if (self) { + _display_version = dict[@"display_version"]; + _build_version = dict[@"build_version"]; + } + return self; +} + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/Record/FIRCLSRecordBase.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/Record/FIRCLSRecordBase.h new file mode 100644 index 0000000..57c620d --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/Record/FIRCLSRecordBase.h @@ -0,0 +1,37 @@ +/* + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +/** + * This is the base class to represent the data in the persisted crash (.clsrecord) files. + * The properties these subclasses are nullable on purpose. If there is an issue reading values + * from the crash files, continue as if those fields are optional so a report can still be uploaded. + * That way the issue can potentially be monitored through the backend. + **/ +@interface FIRCLSRecordBase : NSObject + +/** + * Mark the default initializer as unavailable so the subclasses do not have to add the same line + **/ +- (instancetype)init NS_UNAVAILABLE; + +/** + * All subclasses should define an initializer taking in a dictionary + **/ +- (instancetype)initWithDict:(NSDictionary *)dict; + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/Record/FIRCLSRecordBase.m b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/Record/FIRCLSRecordBase.m new file mode 100644 index 0000000..9b07ffe --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/Record/FIRCLSRecordBase.m @@ -0,0 +1,25 @@ +/* + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "Crashlytics/Crashlytics/Models/Record/FIRCLSRecordBase.h" + +@implementation FIRCLSRecordBase + +- (instancetype)initWithDict:(NSDictionary *)dict { + return [super init]; +} + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/Record/FIRCLSRecordHost.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/Record/FIRCLSRecordHost.h new file mode 100644 index 0000000..a1a18bc --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/Record/FIRCLSRecordHost.h @@ -0,0 +1,23 @@ +/* + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "Crashlytics/Crashlytics/Models/Record/FIRCLSRecordBase.h" + +@interface FIRCLSRecordHost : FIRCLSRecordBase + +@property(nonatomic, copy) NSString *platform; + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/Record/FIRCLSRecordHost.m b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/Record/FIRCLSRecordHost.m new file mode 100644 index 0000000..dd678a0 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/Record/FIRCLSRecordHost.m @@ -0,0 +1,29 @@ +/* + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "Crashlytics/Crashlytics/Models/Record/FIRCLSRecordHost.h" + +@implementation FIRCLSRecordHost + +- (instancetype)initWithDict:(NSDictionary *)dict { + self = [super initWithDict:dict]; + if (self) { + _platform = dict[@"platform"]; + } + return self; +} + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/Record/FIRCLSRecordIdentity.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/Record/FIRCLSRecordIdentity.h new file mode 100644 index 0000000..dc508c5 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/Record/FIRCLSRecordIdentity.h @@ -0,0 +1,24 @@ +/* + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "Crashlytics/Crashlytics/Models/Record/FIRCLSRecordBase.h" + +@interface FIRCLSRecordIdentity : FIRCLSRecordBase + +@property(nonatomic, copy) NSString *build_version; +@property(nonatomic, copy) NSString *app_quality_session_id; + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/Record/FIRCLSRecordIdentity.m b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/Record/FIRCLSRecordIdentity.m new file mode 100644 index 0000000..651d318 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/Record/FIRCLSRecordIdentity.m @@ -0,0 +1,30 @@ +/* + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "Crashlytics/Crashlytics/Models/Record/FIRCLSRecordIdentity.h" + +@implementation FIRCLSRecordIdentity + +- (instancetype)initWithDict:(NSDictionary *)dict { + self = [super initWithDict:dict]; + if (self) { + _build_version = dict[@"build_version"]; + _app_quality_session_id = dict[@"app_quality_session_id"]; + } + return self; +} + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/Record/FIRCLSReportAdapter.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/Record/FIRCLSReportAdapter.h new file mode 100644 index 0000000..4db047c --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/Record/FIRCLSReportAdapter.h @@ -0,0 +1,40 @@ +/* + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#include "Crashlytics/Protogen/nanopb/crashlytics.nanopb.h" + +#import "Crashlytics/Crashlytics/Models/FIRCLSInstallIdentifierModel.h" + +#import + +/// This class is responsible for reading the persisted crash reports from disk and converting them +/// the information into the nanopb model to be used with GoogleDataTransport +@interface FIRCLSReportAdapter : NSObject + +- (instancetype)init NS_UNAVAILABLE; + +/// Initializer +/// @param folderPath Path where the persisted crash files reside +/// @param googleAppID ID for the app passed in from Firebase Core +/// @param installIDModel for pulling the Crashlytics Installation UUID +- (instancetype)initWithPath:(NSString *)folderPath + googleAppId:(NSString *)googleAppID + installIDModel:(FIRCLSInstallIdentifierModel *)installIDModel + fiid:(NSString *)fiid + authToken:(NSString *)authToken; +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/Record/FIRCLSReportAdapter.m b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/Record/FIRCLSReportAdapter.m new file mode 100644 index 0000000..348c097 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/Record/FIRCLSReportAdapter.m @@ -0,0 +1,283 @@ +/* + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "Crashlytics/Crashlytics/Models/Record/FIRCLSReportAdapter.h" +#import "Crashlytics/Crashlytics/Models/Record/FIRCLSReportAdapter_Private.h" + +#import "Crashlytics/Crashlytics/Helpers/FIRCLSLogger.h" +#import "Crashlytics/Crashlytics/Models/FIRCLSInternalReport.h" + +#import "Crashlytics/Crashlytics/Components/FIRCLSUserLogging.h" + +#import +#import +#import + +@interface FIRCLSReportAdapter () + +@property(nonatomic, strong) FIRCLSInstallIdentifierModel *installIDModel; +@property(nonatomic, copy) NSString *fiid; +@property(nonatomic, copy) NSString *authToken; + +@end + +@implementation FIRCLSReportAdapter + +- (instancetype)initWithPath:(NSString *)folderPath + googleAppId:(NSString *)googleAppID + installIDModel:(FIRCLSInstallIdentifierModel *)installIDModel + fiid:(NSString *)fiid + authToken:(NSString *)authToken { + self = [super init]; + if (self) { + _folderPath = folderPath; + _googleAppID = googleAppID; + _installIDModel = installIDModel; + _fiid = [fiid copy]; + _authToken = [authToken copy]; + + [self loadMetaDataFile]; + + _report = [self protoReport]; + } + return self; +} + +- (void)dealloc { + pb_release(google_crashlytics_Report_fields, &_report); +} + +// +// MARK: Load from persisted crash files +// + +/// Reads from metadata.clsrecord +- (void)loadMetaDataFile { + NSString *path = [self.folderPath stringByAppendingPathComponent:FIRCLSReportMetadataFile]; + NSDictionary *dict = [FIRCLSReportAdapter combinedDictionariesFromFilePath:path]; + + self.identity = [[FIRCLSRecordIdentity alloc] initWithDict:dict[@"identity"]]; + self.host = [[FIRCLSRecordHost alloc] initWithDict:dict[@"host"]]; + self.application = [[FIRCLSRecordApplication alloc] initWithDict:dict[@"application"]]; +} + +/// Return the persisted crash file as a combined dictionary that way lookups can occur with a key +/// (to avoid ordering dependency) +/// @param filePath Persisted crash file path ++ (NSDictionary *)combinedDictionariesFromFilePath:(NSString *)filePath { + NSMutableDictionary *joinedDict = [[NSMutableDictionary alloc] init]; + for (NSDictionary *dict in [self dictionariesFromEachLineOfFile:filePath]) { + [joinedDict addEntriesFromDictionary:dict]; + } + return joinedDict; +} + +/// The persisted crash files contains JSON on separate lines. Read each line and return the JSON +/// data as a dictionary. +/// @param filePath Persisted crash file path ++ (NSArray *)dictionariesFromEachLineOfFile:(NSString *)filePath { + NSString *content = [[NSString alloc] initWithContentsOfFile:filePath + encoding:NSUTF8StringEncoding + error:nil]; + NSArray *lines = + [content componentsSeparatedByCharactersInSet:NSCharacterSet.newlineCharacterSet]; + + NSMutableArray *array = [[NSMutableArray alloc] init]; + + int lineNum = 0; + for (NSString *line in lines) { + lineNum++; + + if (line.length == 0) { + // Likely newline at the end of the file + continue; + } + + NSError *error; + NSDictionary *dict = + [NSJSONSerialization JSONObjectWithData:[line dataUsingEncoding:NSUTF8StringEncoding] + options:0 + error:&error]; + + if (error) { + FIRCLSErrorLog(@"Failed to read JSON from file (%@) line (%d) with error: %@", filePath, + lineNum, error); + } else { + [array addObject:dict]; + } + } + + return array; +} + +// +// MARK: GDTCOREventDataObject +// + +- (NSData *)transportBytes { + pb_ostream_t sizestream = PB_OSTREAM_SIZING; + + // Encode 1 time to determine the size. + if (!pb_encode(&sizestream, google_crashlytics_Report_fields, &_report)) { + FIRCLSErrorLog(@"Error in nanopb encoding for size: %s", PB_GET_ERROR(&sizestream)); + } + + // Encode a 2nd time to actually get the bytes from it. + size_t bufferSize = sizestream.bytes_written; + CFMutableDataRef dataRef = CFDataCreateMutable(CFAllocatorGetDefault(), bufferSize); + CFDataSetLength(dataRef, bufferSize); + pb_ostream_t ostream = pb_ostream_from_buffer((void *)CFDataGetBytePtr(dataRef), bufferSize); + if (!pb_encode(&ostream, google_crashlytics_Report_fields, &_report)) { + FIRCLSErrorLog(@"Error in nanopb encoding for bytes: %s", PB_GET_ERROR(&ostream)); + } + + return CFBridgingRelease(dataRef); +} + +// +// MARK: NanoPB conversions +// + +- (google_crashlytics_Report)protoReport { + google_crashlytics_Report report = google_crashlytics_Report_init_default; + report.sdk_version = FIRCLSEncodeString(self.identity.build_version); + report.gmp_app_id = FIRCLSEncodeString(self.googleAppID); + report.platform = [self protoPlatformFromString:self.host.platform]; + report.installation_uuid = FIRCLSEncodeString(self.installIDModel.installID); + report.firebase_installation_id = FIRCLSEncodeString(self.fiid); + report.app_quality_session_id = FIRCLSEncodeString(self.identity.app_quality_session_id); + report.firebase_authentication_token = FIRCLSEncodeString(self.authToken); + report.build_version = FIRCLSEncodeString(self.application.build_version); + report.display_version = FIRCLSEncodeString(self.application.display_version); + report.apple_payload = [self protoFilesPayload]; + return report; +} + +- (google_crashlytics_FilesPayload)protoFilesPayload { + google_crashlytics_FilesPayload apple_payload = google_crashlytics_FilesPayload_init_default; + + NSArray *clsRecords = [self clsRecordFilePaths]; + google_crashlytics_FilesPayload_File *files = + calloc(1, sizeof(google_crashlytics_FilesPayload_File) * clsRecords.count); + + if (files == NULL) { + // files and files_count are initialized to NULL and 0 by default. + return apple_payload; + } + for (NSUInteger i = 0; i < clsRecords.count; i++) { + google_crashlytics_FilesPayload_File file = google_crashlytics_FilesPayload_File_init_default; + file.filename = FIRCLSEncodeString(clsRecords[i].lastPathComponent); + + NSError *error; + file.contents = FIRCLSEncodeData([NSData dataWithContentsOfFile:clsRecords[i] + options:0 + error:&error]); + if (error) { + FIRCLSErrorLog(@"Failed to read from %@ with error: %@", clsRecords[i], error); + } + + files[i] = file; + } + + apple_payload.files = files; + apple_payload.files_count = (pb_size_t)clsRecords.count; + + return apple_payload; +} + +- (NSArray *)clsRecordFilePaths { + NSMutableArray *clsRecords = [[NSMutableArray alloc] init]; + + NSError *error; + NSArray *files = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:self.folderPath + error:&error]; + + if (error) { + FIRCLSErrorLog(@"Failed to find .clsrecords from %@ with error: %@", self.folderPath, error); + return clsRecords; + } + + [files enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { + NSString *filename = (NSString *)obj; + NSString *lowerExtension = filename.pathExtension.lowercaseString; + if ([lowerExtension isEqualToString:@"clsrecord"] || + [lowerExtension isEqualToString:@"symbolicated"]) { + [clsRecords addObject:[self.folderPath stringByAppendingPathComponent:filename]]; + } + }]; + + return [clsRecords sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)]; +} + +- (google_crashlytics_Platforms)protoPlatformFromString:(NSString *)str { + NSString *platform = str.lowercaseString; + + if ([platform isEqualToString:@"ios"]) { + return google_crashlytics_Platforms_IOS; + } else if ([platform isEqualToString:@"mac"]) { + return google_crashlytics_Platforms_MAC_OS_X; + } else if ([platform isEqualToString:@"tvos"]) { + return google_crashlytics_Platforms_TVOS; + } else { + return google_crashlytics_Platforms_UNKNOWN_PLATFORM; + } +} + +/** Callocs a pb_bytes_array and copies the given NSString's bytes into the bytes array. + * @note Memory needs to be freed manually, through pb_free or pb_release. + * @param string The string to encode as pb_bytes. + */ +pb_bytes_array_t *FIRCLSEncodeString(NSString *string) { + if ([string isMemberOfClass:[NSNull class]]) { + FIRCLSErrorLog(@"Expected encodable string, but found NSNull instead. " + @"Set a symbolic breakpoint at FIRCLSEncodeString to debug."); + string = nil; + } + NSString *stringToEncode = string ? string : @""; + NSData *stringBytes = [stringToEncode dataUsingEncoding:NSUTF8StringEncoding]; + return FIRCLSEncodeData(stringBytes); +} + +/** Callocs a pb_bytes_array and copies the given NSData bytes into the bytes array. + * @note Memory needs to be free manually, through pb_free or pb_release. + * @param data The data to copy into the new bytes array. + */ +pb_bytes_array_t *FIRCLSEncodeData(NSData *data) { + // We have received couple security tickets before for using calloc here. + // Here is a short explanation on how it is calculated so buffer overflow is prevented: + // We will alloc an amount of memory for struct `pb_bytes_array_t`, this struct contains two + // attributes: + // pb_size_t size + // pb_byte_t bytes[1] + // It contains the size the of the data and the actually data information in byte form (which + // is represented by a pointer), for more information check the declaration in nanopb/pb.h. + + // For size, NSData return size in `unsigned long` type which is the same size as `pb_size_t` and + // it is declared in compile time depending on the arch of system. If overflow happened it should + // happend at NSData level first when user trying to inserting data to NSData. + // For bytes, it is just a strict memory copy of the data in NSData. + // The whole structure will be freed as a part of process for deallocing report in dealloc() of + // this class + pb_bytes_array_t *pbBytes = calloc(1, PB_BYTES_ARRAY_T_ALLOCSIZE(data.length)); + if (pbBytes == NULL) { + return NULL; + } + memcpy(pbBytes->bytes, [data bytes], data.length); + pbBytes->size = (pb_size_t)data.length; + return pbBytes; +} + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/Record/FIRCLSReportAdapter_Private.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/Record/FIRCLSReportAdapter_Private.h new file mode 100644 index 0000000..809e08d --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Models/Record/FIRCLSReportAdapter_Private.h @@ -0,0 +1,43 @@ +/* + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "Crashlytics/Crashlytics/Models/Record/FIRCLSReportAdapter.h" + +#import "Crashlytics/Crashlytics/Models/Record/FIRCLSRecordApplication.h" +#import "Crashlytics/Crashlytics/Models/Record/FIRCLSRecordHost.h" +#import "Crashlytics/Crashlytics/Models/Record/FIRCLSRecordIdentity.h" + +pb_bytes_array_t *FIRCLSEncodeString(NSString *string); +pb_bytes_array_t *FIRCLSEncodeData(NSData *data); + +@interface FIRCLSReportAdapter () + +@property(nonatomic, readonly) BOOL hasCrashed; + +@property(nonatomic, strong) NSString *folderPath; +@property(nonatomic, strong) NSString *googleAppID; + +// From metadata.clsrecord +@property(nonatomic, strong) FIRCLSRecordIdentity *identity; +@property(nonatomic, strong) FIRCLSRecordHost *host; +@property(nonatomic, strong) FIRCLSRecordApplication *application; + +@property(nonatomic) google_crashlytics_Report report; + +- (google_crashlytics_Report)protoReport; +- (NSArray *)clsRecordFilePaths; + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Operations/FIRCLSAsyncOperation.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Operations/FIRCLSAsyncOperation.h new file mode 100644 index 0000000..5636d3d --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Operations/FIRCLSAsyncOperation.h @@ -0,0 +1,23 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +typedef void (^FIRCLSAsyncOperationCompletionBlock)(NSError* error); + +@interface FIRCLSAsyncOperation : NSOperation + +@property(copy, nonatomic) FIRCLSAsyncOperationCompletionBlock asyncCompletion; + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Operations/FIRCLSAsyncOperation.m b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Operations/FIRCLSAsyncOperation.m new file mode 100644 index 0000000..1ec49e4 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Operations/FIRCLSAsyncOperation.m @@ -0,0 +1,135 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "Crashlytics/Crashlytics/Operations/FIRCLSAsyncOperation.h" + +@interface FIRCLSAsyncOperation () { + BOOL _internalExecuting; + BOOL _internalFinished; +} + +@property(nonatomic, strong) NSRecursiveLock *lock; + +@end + +@implementation FIRCLSAsyncOperation + +- (instancetype)init { + self = [super init]; + if (!self) { + return nil; + } + + _internalExecuting = NO; + _internalFinished = NO; + + self.lock = [[NSRecursiveLock alloc] init]; + self.lock.name = @"com.crashlytics.async-operation-lock"; + + return self; +} + +#pragma mark - NSOperation Overrides +- (BOOL)isConcurrent { + return YES; +} + +- (BOOL)isAsynchronous { + return YES; +} + +- (BOOL)isExecuting { + [self.lock lock]; + BOOL result = _internalExecuting; + [self.lock unlock]; + + return result; +} + +- (BOOL)isFinished { + [self.lock lock]; + BOOL result = _internalFinished; + [self.lock unlock]; + + return result; +} + +- (void)start { + if ([self checkForCancellation]) { + return; + } + + [self markStarted]; + + [self main]; +} + +#pragma mark - Utilities +- (void)changeValueForKey:(NSString *)key inBlock:(void (^)(void))block { + [self willChangeValueForKey:key]; + block(); + [self didChangeValueForKey:key]; +} + +- (void)lock:(void (^)(void))block { + [self.lock lock]; + block(); + [self.lock unlock]; +} + +- (BOOL)checkForCancellation { + if ([self isCancelled]) { + [self markDone]; + return YES; + } + + return NO; +} + +#pragma mark - State Management +- (void)unlockedMarkFinished { + [self changeValueForKey:@"isFinished" + inBlock:^{ + self->_internalFinished = YES; + }]; +} + +- (void)unlockedMarkStarted { + [self changeValueForKey:@"isExecuting" + inBlock:^{ + self->_internalExecuting = YES; + }]; +} + +- (void)unlockedMarkComplete { + [self changeValueForKey:@"isExecuting" + inBlock:^{ + self->_internalExecuting = NO; + }]; +} + +- (void)markStarted { + [self lock:^{ + [self unlockedMarkStarted]; + }]; +} + +- (void)markDone { + [self lock:^{ + [self unlockedMarkComplete]; + [self unlockedMarkFinished]; + }]; +} + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Operations/FIRCLSAsyncOperation_Private.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Operations/FIRCLSAsyncOperation_Private.h new file mode 100644 index 0000000..6dcc707 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Operations/FIRCLSAsyncOperation_Private.h @@ -0,0 +1,24 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "Crashlytics/Crashlytics/Operations/FIRCLSAsyncOperation.h" + +@interface FIRCLSAsyncOperation (Private) + +- (void)markStarted; +- (void)markDone; + +- (BOOL)checkForCancellation; + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Operations/Reports/FIRCLSProcessReportOperation.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Operations/Reports/FIRCLSProcessReportOperation.h new file mode 100644 index 0000000..1e90286 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Operations/Reports/FIRCLSProcessReportOperation.h @@ -0,0 +1,30 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +@class FIRCLSInternalReport; +@class FIRCLSSymbolResolver; + +@interface FIRCLSProcessReportOperation : NSOperation + +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)new NS_UNAVAILABLE; +- (instancetype)initWithReport:(FIRCLSInternalReport *)report + resolver:(FIRCLSSymbolResolver *)resolver NS_DESIGNATED_INITIALIZER; + +@property(nonatomic, readonly) FIRCLSSymbolResolver *symbolResolver; +@property(nonatomic, readonly) FIRCLSInternalReport *report; + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Operations/Reports/FIRCLSProcessReportOperation.m b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Operations/Reports/FIRCLSProcessReportOperation.m new file mode 100644 index 0000000..03a7c1e --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Operations/Reports/FIRCLSProcessReportOperation.m @@ -0,0 +1,113 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "Crashlytics/Crashlytics/Operations/Reports/FIRCLSProcessReportOperation.h" + +#import "Crashlytics/Crashlytics/Helpers/FIRCLSFile.h" +#import "Crashlytics/Crashlytics/Models/FIRCLSInternalReport.h" +#import "Crashlytics/Crashlytics/Models/FIRCLSSymbolResolver.h" +#import "Crashlytics/Crashlytics/Operations/Symbolication/FIRCLSDemangleOperation.h" +#import "Crashlytics/Crashlytics/Operations/Symbolication/FIRCLSSerializeSymbolicatedFramesOperation.h" +#import "Crashlytics/Crashlytics/Operations/Symbolication/FIRCLSSymbolicationOperation.h" +#import "Crashlytics/Crashlytics/Private/FIRStackFrame_Private.h" + +@implementation FIRCLSProcessReportOperation + +- (instancetype)initWithReport:(FIRCLSInternalReport *)report + resolver:(FIRCLSSymbolResolver *)resolver { + self = [super init]; + if (!self) { + return nil; + } + + _report = report; + _symbolResolver = resolver; + + return self; +} + +- (NSString *)binaryImagePath { + return self.report.binaryImagePath; +} + +- (NSArray *)threadArrayFromFile:(NSString *)path { + NSArray *threads = + FIRCLSFileReadSections([path fileSystemRepresentation], false, ^NSObject *(id obj) { + // use this to select out the one entry that has a "threads" top-level entry + return [obj objectForKey:@"threads"]; + }); + + if ([threads count] == 0) { + return nil; + } + + // threads is actually an array of arrays + threads = [threads objectAtIndex:0]; + if (!threads) { + return nil; + } + + NSMutableArray *threadArray = [NSMutableArray array]; + + for (NSDictionary *threadDetails in threads) { + NSMutableArray *frameArray = [NSMutableArray array]; + + for (NSNumber *pc in [threadDetails objectForKey:@"stacktrace"]) { + FIRStackFrame *frame = [FIRStackFrame stackFrameWithAddress:[pc unsignedIntegerValue]]; + + [frameArray addObject:frame]; + } + + [threadArray addObject:frameArray]; + } + + return threadArray; +} + +- (BOOL)symbolicateFile:(NSString *)path withResolver:(FIRCLSSymbolResolver *)resolver { + NSArray *threadArray = [self threadArrayFromFile:path]; + if (!threadArray) { + return NO; + } + + FIRCLSSymbolicationOperation *symbolicationOp = [[FIRCLSSymbolicationOperation alloc] init]; + [symbolicationOp setThreadArray:threadArray]; + [symbolicationOp setSymbolResolver:resolver]; + + FIRCLSDemangleOperation *demangleOp = [[FIRCLSDemangleOperation alloc] init]; + [demangleOp setThreadArray:threadArray]; + + FIRCLSSerializeSymbolicatedFramesOperation *serializeOp = + [[FIRCLSSerializeSymbolicatedFramesOperation alloc] init]; + [serializeOp setThreadArray:threadArray]; + [serializeOp setOutputPath:[path stringByAppendingPathExtension:@"symbolicated"]]; + + [symbolicationOp start]; + [demangleOp start]; + [serializeOp start]; + + return YES; +} + +- (void)main { + if (![self.symbolResolver loadBinaryImagesFromFile:self.binaryImagePath]) { + return; + } + + [self.report enumerateSymbolicatableFilesInContent:^(NSString *path) { + [self symbolicateFile:path withResolver:self.symbolResolver]; + }]; +} + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Operations/Symbolication/FIRCLSDemangleOperation.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Operations/Symbolication/FIRCLSDemangleOperation.h new file mode 100644 index 0000000..0680153 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Operations/Symbolication/FIRCLSDemangleOperation.h @@ -0,0 +1,24 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "Crashlytics/Crashlytics/Operations/Symbolication/FIRCLSThreadArrayOperation.h" + +@interface FIRCLSDemangleOperation : FIRCLSThreadArrayOperation + ++ (NSString *)demangleSymbol:(const char *)symbol; ++ (NSString *)demangleCppSymbol:(const char *)symbol; + +- (NSString *)demangleSymbol:(const char *)symbol; + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Operations/Symbolication/FIRCLSDemangleOperation.mm b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Operations/Symbolication/FIRCLSDemangleOperation.mm new file mode 100644 index 0000000..106a33c --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Operations/Symbolication/FIRCLSDemangleOperation.mm @@ -0,0 +1,96 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "Crashlytics/Crashlytics/Operations/Symbolication/FIRCLSDemangleOperation.h" +#include "Crashlytics/Crashlytics/Private/FIRStackFrame_Private.h" + +#import + +@implementation FIRCLSDemangleOperation + ++ (NSString *)demangleSymbol:(const char *)symbol { + if (!symbol) { + return nil; + } + + if (strncmp(symbol, "_Z", 2) == 0) { + return [self demangleCppSymbol:symbol]; + } else if (strncmp(symbol, "__Z", 3) == 0) { + return [self demangleBlockInvokeCppSymbol:symbol]; + } + + return nil; +} + ++ (NSString *)demangleBlockInvokeCppSymbol:(const char *)symbol { + NSString *string = [NSString stringWithUTF8String:symbol]; + + // search backwards, because this string should be at the end + NSRange range = [string rangeOfString:@"_block_invoke" options:NSBackwardsSearch]; + + if (range.location == NSNotFound) { + return nil; + } + + // we need at least a "_Z..." for a valid C++ symbol, so make sure of that + if (range.location < 5) { + return nil; + } + + // extract the mangled C++ symbol from the string + NSString *cppSymbol = [string substringWithRange:NSMakeRange(1, range.location - 1)]; + cppSymbol = [self demangleSymbol:[cppSymbol UTF8String]]; + if (!cppSymbol) { + return nil; + } + + // extract out just the "_block_invoke..." part + string = + [string substringWithRange:NSMakeRange(range.location, [string length] - range.location)]; + + // and glue that onto the end + return [cppSymbol stringByAppendingString:string]; +} + ++ (NSString *)demangleCppSymbol:(const char *)symbol { + int status; + char *buffer = NULL; + + buffer = __cxxabiv1::__cxa_demangle(symbol, buffer, NULL, &status); + if (!buffer) { + return nil; + } + + NSString *result = [NSString stringWithUTF8String:buffer]; + + free(buffer); + + return result; +} + +- (NSString *)demangleSymbol:(const char *)symbol { + return [[self class] demangleSymbol:symbol]; +} + +- (void)main { + [self enumerateFramesWithBlock:^(FIRStackFrame *frame) { + NSString *demangedSymbol = [self demangleSymbol:[[frame rawSymbol] UTF8String]]; + + if (demangedSymbol) { + [frame setSymbol:demangedSymbol]; + } + }]; +} + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Operations/Symbolication/FIRCLSSerializeSymbolicatedFramesOperation.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Operations/Symbolication/FIRCLSSerializeSymbolicatedFramesOperation.h new file mode 100644 index 0000000..7ce245d --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Operations/Symbolication/FIRCLSSerializeSymbolicatedFramesOperation.h @@ -0,0 +1,21 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "Crashlytics/Crashlytics/Operations/Symbolication/FIRCLSThreadArrayOperation.h" + +@interface FIRCLSSerializeSymbolicatedFramesOperation : FIRCLSThreadArrayOperation + +@property(nonatomic, copy) NSString *outputPath; + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Operations/Symbolication/FIRCLSSerializeSymbolicatedFramesOperation.m b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Operations/Symbolication/FIRCLSSerializeSymbolicatedFramesOperation.m new file mode 100644 index 0000000..445b37c --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Operations/Symbolication/FIRCLSSerializeSymbolicatedFramesOperation.m @@ -0,0 +1,63 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "Crashlytics/Crashlytics/Operations/Symbolication/FIRCLSSerializeSymbolicatedFramesOperation.h" + +#import "Crashlytics/Crashlytics/Helpers/FIRCLSFile.h" +#import "Crashlytics/Crashlytics/Helpers/FIRCLSLogger.h" +#import "Crashlytics/Crashlytics/Private/FIRStackFrame_Private.h" + +@implementation FIRCLSSerializeSymbolicatedFramesOperation + +- (void)main { + FIRCLSFile file; + + // Make sure not to open in append mode, so we can overwrite any pre-existing symbolication + // files. + if (!FIRCLSFileInitWithPathMode(&file, [self.outputPath fileSystemRepresentation], false, + false)) { + FIRCLSErrorLog(@"Failed to create output file"); + return; + } + + FIRCLSFileWriteSectionStart(&file, "threads"); + FIRCLSFileWriteArrayStart(&file); + + for (NSArray *frameArray in self.threadArray) { + FIRCLSFileWriteArrayStart(&file); + + for (FIRStackFrame *frame in frameArray) { + FIRCLSFileWriteHashStart(&file); + FIRCLSFileWriteHashEntryString(&file, "symbol", [[frame symbol] UTF8String]); + + // only include this field if it is present and different + if (![[frame rawSymbol] isEqualToString:[frame symbol]]) { + FIRCLSFileWriteHashEntryString(&file, "raw_symbol", [[frame rawSymbol] UTF8String]); + } + + FIRCLSFileWriteHashEntryUint64(&file, "offset", [frame offset]); + FIRCLSFileWriteHashEntryString(&file, "library", [[frame library] UTF8String]); + + FIRCLSFileWriteHashEnd(&file); + } + + FIRCLSFileWriteArrayEnd(&file); + } + + FIRCLSFileWriteArrayEnd(&file); + FIRCLSFileWriteSectionEnd(&file); + FIRCLSFileClose(&file); +} + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Operations/Symbolication/FIRCLSSymbolicationOperation.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Operations/Symbolication/FIRCLSSymbolicationOperation.h new file mode 100644 index 0000000..2a26d60 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Operations/Symbolication/FIRCLSSymbolicationOperation.h @@ -0,0 +1,23 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "Crashlytics/Crashlytics/Operations/Symbolication/FIRCLSThreadArrayOperation.h" + +@class FIRCLSSymbolResolver; + +@interface FIRCLSSymbolicationOperation : FIRCLSThreadArrayOperation + +@property(nonatomic, strong) FIRCLSSymbolResolver *symbolResolver; + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Operations/Symbolication/FIRCLSSymbolicationOperation.m b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Operations/Symbolication/FIRCLSSymbolicationOperation.m new file mode 100644 index 0000000..a8111fd --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Operations/Symbolication/FIRCLSSymbolicationOperation.m @@ -0,0 +1,27 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "Crashlytics/Crashlytics/Operations/Symbolication/FIRCLSSymbolicationOperation.h" + +#import "Crashlytics/Crashlytics/Models/FIRCLSSymbolResolver.h" + +@implementation FIRCLSSymbolicationOperation + +- (void)main { + [self enumerateFramesWithBlock:^(FIRStackFrame *frame) { + [self.symbolResolver updateStackFrame:frame]; + }]; +} + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Operations/Symbolication/FIRCLSThreadArrayOperation.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Operations/Symbolication/FIRCLSThreadArrayOperation.h new file mode 100644 index 0000000..0c2a1df --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Operations/Symbolication/FIRCLSThreadArrayOperation.h @@ -0,0 +1,25 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +@class FIRStackFrame; + +@interface FIRCLSThreadArrayOperation : NSOperation + +@property(nonatomic, strong) NSArray *threadArray; + +- (void)enumerateFramesWithBlock:(void (^)(FIRStackFrame *frame))block; + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Operations/Symbolication/FIRCLSThreadArrayOperation.m b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Operations/Symbolication/FIRCLSThreadArrayOperation.m new file mode 100644 index 0000000..76f59d9 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Operations/Symbolication/FIRCLSThreadArrayOperation.m @@ -0,0 +1,31 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "Crashlytics/Crashlytics/Operations/Symbolication/FIRCLSThreadArrayOperation.h" + +@implementation FIRCLSThreadArrayOperation + +- (void)enumerateFramesWithBlock:(void (^)(FIRStackFrame *frame))block { + for (NSArray *frameArray in self.threadArray) { + for (FIRStackFrame *frame in frameArray) { + block(frame); + + if ([self isCancelled]) { + break; + } + } + } +} + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Private/FIRCLSExistingReportManager_Private.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Private/FIRCLSExistingReportManager_Private.h new file mode 100644 index 0000000..a07f19d --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Private/FIRCLSExistingReportManager_Private.h @@ -0,0 +1,36 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef FIRCLSExistingReportManager_Private_h +#define FIRCLSExistingReportManager_Private_h + +#import "Crashlytics/Crashlytics/Controllers/FIRCLSExistingReportManager.h" + +/** + * Visible for testing + */ +@interface FIRCLSExistingReportManager (Private) + +@property(nonatomic, strong) NSOperationQueue *operationQueue; + +@property(nonatomic, strong) NSArray *existingUnemptyActiveReportPaths; +@property(nonatomic, strong) NSArray *processingReportPaths; +@property(nonatomic, strong) NSArray *preparedReportPaths; + +- (void)handleOnDemandReportUpload:(NSString *)path + dataCollectionToken:(FIRCLSDataCollectionToken *)dataCollectionToken + asUrgent:(BOOL)urgent; +@end + +#endif /* FIRCLSExistingReportManager_Private_h */ diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Private/FIRCLSOnDemandModel_Private.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Private/FIRCLSOnDemandModel_Private.h new file mode 100644 index 0000000..3b58944 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Private/FIRCLSOnDemandModel_Private.h @@ -0,0 +1,50 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef FIRCLSOnDemandModel_Private_h +#define FIRCLSOnDemandModel_Private_h + +#import + +#import "Crashlytics/Crashlytics/Models/FIRCLSOnDemandModel.h" +#import "Crashlytics/Crashlytics/Models/FIRCLSSettings.h" +#import "Crashlytics/Crashlytics/Private/FIRCLSExistingReportManager_Private.h" +#import "Crashlytics/Crashlytics/Private/FIRExceptionModel_Private.h" + +@interface FIRCLSOnDemandModel (Private) + +- (instancetype)initWithFIRCLSSettings:(FIRCLSSettings *)settings + fileManager:(FIRCLSFileManager *)fileManager; + +- (BOOL)recordOnDemandExceptionIfQuota:(FIRExceptionModel *)exceptionModel + withDataCollectionEnabled:(BOOL)dataCollectionEnabled + usingExistingReportManager:(FIRCLSExistingReportManager *)existingReportManager; + +- (int)getQueuedOperationsCount; +- (void)setQueuedOperationsCount:(int)count; + +// When data collection is off, stores active paths that have been recorded but not dispatched for +// upload. Kept sorted (newest at front) so that we can limit on-device reports to the newest +// `FIRCLSMaxUnsentReports` reports. +@property(nonatomic, strong) NSMutableArray *storedActiveReportPaths; + +@property(nonatomic, readonly) int recordedOnDemandExceptionCount; +@property(nonatomic, readonly) int droppedOnDemandExceptionCount; +@property(nonatomic, readonly) int queuedOperationsCount; + +@property(nonatomic, strong) NSOperationQueue *operationQueue; + +@end + +#endif /* FIRCLSOnDemandModel_Private_h */ diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Private/FIRCrashlyticsReport_Private.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Private/FIRCrashlyticsReport_Private.h new file mode 100644 index 0000000..cbf8a81 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Private/FIRCrashlyticsReport_Private.h @@ -0,0 +1,35 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef FIRCrashlyticsReport_Private_h +#define FIRCrashlyticsReport_Private_h + +#import "Crashlytics/Crashlytics/Public/FirebaseCrashlytics/FIRCrashlyticsReport.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + * Internal initializer because this object is created by the SDK. + **/ +@interface FIRCrashlyticsReport (Private) + +- (instancetype)initWithInternalReport:(FIRCLSInternalReport *)internalReport; + +@property(nonatomic, strong) FIRCLSInternalReport *internalReport; + +@end + +NS_ASSUME_NONNULL_END + +#endif /* FIRCrashlyticsReport_Private_h */ diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Private/FIRExceptionModel_Private.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Private/FIRExceptionModel_Private.h new file mode 100644 index 0000000..b89290f --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Private/FIRExceptionModel_Private.h @@ -0,0 +1,35 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef FIRExceptionModel_Private_h +#define FIRExceptionModel_Private_h + +#import + +#import "Crashlytics/Crashlytics/Public/FirebaseCrashlytics/FIRExceptionModel.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRExceptionModel (Private) + +@property(nonatomic, copy) NSString *name; +@property(nonatomic, copy) NSString *reason; +@property(nonatomic) BOOL isFatal; +@property(nonatomic) BOOL onDemand; + +@end + +NS_ASSUME_NONNULL_END + +#endif /* FIRExceptionModel_Private_h */ diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Private/FIRStackFrame_Private.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Private/FIRStackFrame_Private.h new file mode 100644 index 0000000..0683cb7 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Private/FIRStackFrame_Private.h @@ -0,0 +1,44 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +#import "Crashlytics/Crashlytics/Public/FirebaseCrashlytics/FIRStackFrame.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + * This class is used in conjunction with recordExceptionModel to record information about + * non-ObjC, non-C++, and non-Swift exceptions. All information included here will be displayed in + *the Crashlytics UI, and can influence crash grouping. Be particularly careful with the use of the + *address properties. If set, Crashlytics will attempt symbolication and could overwrite other + *properties in the process. + **/ +@interface FIRStackFrame (Private) + ++ (instancetype)stackFrame; ++ (instancetype)stackFrameWithAddress:(NSUInteger)address; ++ (instancetype)stackFrameWithSymbol:(NSString *)symbol; + +@property(nonatomic, copy, nullable) NSString *symbol; +@property(nonatomic, copy, nullable) NSString *rawSymbol; +@property(nonatomic, copy, nullable) NSString *library; +@property(nonatomic, copy, nullable) NSString *fileName; +@property(nonatomic, assign) uint32_t lineNumber; +@property(nonatomic, assign) uint64_t offset; +@property(nonatomic, assign) uint64_t address; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Public/FirebaseCrashlytics/FIRCrashlytics.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Public/FirebaseCrashlytics/FIRCrashlytics.h new file mode 100644 index 0000000..c923f4c --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Public/FirebaseCrashlytics/FIRCrashlytics.h @@ -0,0 +1,248 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +#import "FIRCrashlyticsReport.h" +#import "FIRExceptionModel.h" + +#if __has_include() +#warning "FirebaseCrashlytics and Crashlytics are not compatible \ +in the same app because including multiple crash reporters can \ +cause problems when registering exception handlers." +#endif + +NS_ASSUME_NONNULL_BEGIN + +/** + * The Firebase Crashlytics API provides methods to annotate and manage fatal and + * non-fatal reports captured and reported to Firebase Crashlytics. + * + * By default, Firebase Crashlytics is initialized with `FirebaseApp.configure()`. + * + * Note: The Crashlytics class cannot be subclassed. If this makes testing difficult, + * we suggest using a wrapper class or a protocol extension. + */ +NS_SWIFT_NAME(Crashlytics) +@interface FIRCrashlytics : NSObject + +/** :nodoc: */ +- (instancetype)init NS_UNAVAILABLE; + +/** + * Accesses the singleton Crashlytics instance. + * + * @return The singleton Crashlytics instance. + */ ++ (instancetype)crashlytics NS_SWIFT_NAME(crashlytics()); + +/** + * Adds logging that is sent with your crash data. The logging does not appear in app + * logs and is only visible in the Crashlytics dashboard. + * + * @param msg Message to log + */ +- (void)log:(NSString *)msg; + +/** + * Adds logging that is sent with your crash data. The logging does not appear in app + * logs and is only visible in the Crashlytics dashboard. + * + * @param format The format of the string, followed by a comma-separated list + * of arguments to substitute into the format. + */ +- (void)logWithFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1, 2); + +/** + * Adds logging that is sent with your crash data. The logging does not appear in app + * logs and is only visible in the Crashlytics dashboard. + * + * @param format Format of string + * @param args Arguments to substitute into format + */ +- (void)logWithFormat:(NSString *)format + arguments:(va_list)args + __attribute__((__swift_name__("log(format:arguments:)"))); // Avoid `NS_SWIFT_NAME` (#9331). + +/** + * Sets a custom key and value to be associated with subsequent fatal and non-fatal reports. + * When setting an object value, the object is converted to a string. This is + * typically done by using the object's `description`. + * + * @param value The value to be associated with the key + * @param key A unique key + */ +- (void)setCustomValue:(nullable id)value forKey:(NSString *)key; + +/** + * Sets custom keys and values to be associated with subsequent fatal and non-fatal reports. + * The objects in the dictionary are converted to strings. This is + * typically done by using the object's `description`. + * + * @param keysAndValues The values to be associated with the corresponding keys + */ +- (void)setCustomKeysAndValues:(NSDictionary *)keysAndValues; + +/** + * Records a user ID (identifier) that's associated with subsequent fatal and non-fatal reports. + * + * If you want to associate a crash with a specific user, we recommend specifying an arbitrary + * string (e.g., a database, ID, hash, or other value that you can index and query, but is + * meaningless to a third-party observer). This allows you to facilitate responses for support + * requests and reach out to users for more information. + * + * @param userID An arbitrary user identifier string that associates a user to a record in your + * system. + */ +- (void)setUserID:(nullable NSString *)userID; + +/** + * Records a non-fatal event described by an Error object. The events are + * grouped and displayed similarly to crashes. Keep in mind that this method can be expensive. + * The total number of Errors that can be recorded during your app's life-cycle is limited by a + * fixed-size circular buffer. If the buffer is overrun, the oldest data is dropped. Errors are + * relayed to Crashlytics on a subsequent launch of your application. + * + * @param error Non-fatal error to be recorded + */ +- (void)recordError:(NSError *)error NS_SWIFT_NAME(record(error:)); + +/** + * Records a non-fatal event described by an NSError object. The events are + * grouped and displayed similarly to crashes. Keep in mind that this method can be expensive. + * The total number of NSErrors that can be recorded during your app's life-cycle is limited by a + * fixed-size circular buffer. If the buffer is overrun, the oldest data is dropped. Errors are + * relayed to Crashlytics on a subsequent launch of your application. + * + * @param error Non-fatal error to be recorded + * @param userInfo Additional keys and values to send with the logged error. These keys and values + * are added to the error, in addition to the Crashlytics global list of keys and values. + */ +- (void)recordError:(NSError *)error + userInfo:(nullable NSDictionary *)userInfo + NS_SWIFT_NAME(record(error:userInfo:)); + +/** + * Records an Exception Model described by an ExceptionModel object. The events are + * grouped and displayed similarly to crashes. Keep in mind that this method can be expensive. + * The total number of ExceptionModels that can be recorded during your app's life-cycle is + * limited by a fixed-size circular buffer. If the buffer is overrun, the oldest data is dropped. + * ExceptionModels are relayed to Crashlytics on a subsequent launch of your application. + * + * @param exceptionModel Instance of the ExceptionModel to be recorded + */ +- (void)recordExceptionModel:(FIRExceptionModel *)exceptionModel + NS_SWIFT_NAME(record(exceptionModel:)); + +/** + * Returns whether the app crashed during the previous execution. + */ +- (BOOL)didCrashDuringPreviousExecution; + +/** + * Enables/disables automatic data collection. + * + * Calling this method overrides both the FirebaseCrashlyticsCollectionEnabled flag in your + * App's Info.plist and FirebaseApp's isDataCollectionDefaultEnabled flag. + * + * When you set a value for this method, it persists across runs of the app. + * + * The value does not apply until the next run of the app. If you want to disable data + * collection without rebooting, add the FirebaseCrashlyticsCollectionEnabled flag to your app's + * Info.plist. + * * + * @param enabled Determines whether automatic data collection is enabled + */ +- (void)setCrashlyticsCollectionEnabled:(BOOL)enabled; + +/** + * Indicates whether or not automatic data collection is enabled + * + * This method uses three ways to decide whether automatic data collection is enabled, + * in order of priority: + * - If setCrashlyticsCollectionEnabled is called with a value, use it + * - If the FirebaseCrashlyticsCollectionEnabled key is in your app's Info.plist, use it + * - Otherwise, use the default isDataCollectionDefaultEnabled in FirebaseApp + */ +- (BOOL)isCrashlyticsCollectionEnabled; + +/** + * Determines whether there are any unsent crash reports cached on the device, then calls the given + * callback. + * + * The callback only executes if automatic data collection is disabled. You can use + * the callback to get one-time consent from a user upon a crash, and then call + * sendUnsentReports or deleteUnsentReports, depending on whether or not the user gives consent. + * + * Disable automatic collection by: + * - Adding the `FirebaseCrashlyticsCollectionEnabled` key with the value set to NO to your app's + * Info.plist + * - Calling `FirebaseCrashlytics.crashlytics().setCrashlyticsCollectionEnabled(false)` in your app + * - Setting `FirebaseApp`'s `isDataCollectionDefaultEnabled` to false + * + * @param completion The callback that's executed once Crashlytics finishes checking for unsent + * reports. The callback is set to true if there are unsent reports on disk. + */ +- (void)checkForUnsentReportsWithCompletion:(void (^)(BOOL))completion + NS_SWIFT_NAME(checkForUnsentReports(completion:)); + +/** + * Determines whether there are any unsent crash reports cached on the device, then calls the given + * callback with a CrashlyticsReport object that you can use to update the unsent report. + * CrashlyticsReports have a lot of the familiar Crashlytics methods like setting custom keys and + * logs. + * + * The callback only executes if automatic data collection is disabled. You can use + * the callback to get one-time consent from a user upon a crash, and then call + * sendUnsentReports or deleteUnsentReports, depending on whether or not the user gives consent. + * + * Disable automatic collection by: + * - Adding the `FirebaseCrashlyticsCollectionEnabled` key with the value set to NO to your app's + * Info.plist + * - Calling `FirebaseCrashlytics.crashlytics().setCrashlyticsCollectionEnabled(false)` in your app + * - Setting `FirebaseApp`'s `isDataCollectionDefaultEnabled` to false + * + * Not calling `sendUnsentReports()`/`deleteUnsentReports()` will result in the report staying on + * disk, which means the same CrashlyticsReport can show up in multiple runs of the app. If you + * want avoid duplicates, ensure there was a crash on the last run of the app by checking the value + * of `didCrashDuringPreviousExecution`. + * + * @param completion The callback that's executed once Crashlytics finishes checking for unsent + * reports. The callback is called with the newest unsent Crashlytics Report, or nil if there are + * none cached on disk. + */ +- (void)checkAndUpdateUnsentReportsWithCompletion: + (void (^)(FIRCrashlyticsReport *_Nullable))completion + NS_SWIFT_NAME(checkAndUpdateUnsentReports(completion:)); + +/** + * Enqueues any unsent reports on the device to upload to Crashlytics. + * + * This method only applies if automatic data collection is disabled. + * + * When automatic data collection is enabled, Crashlytics automatically uploads and deletes reports + * at startup, so this method is ignored. + */ +- (void)sendUnsentReports; + +/** + * Deletes any unsent reports on the device. + * + * This method only applies if automatic data collection is disabled. + */ +- (void)deleteUnsentReports; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Public/FirebaseCrashlytics/FIRCrashlyticsReport.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Public/FirebaseCrashlytics/FIRCrashlyticsReport.h new file mode 100644 index 0000000..8b4a119 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Public/FirebaseCrashlytics/FIRCrashlyticsReport.h @@ -0,0 +1,109 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + * The Firebase Crashlytics Report provides a way to read and write information + * to a past Crashlytics reports. A common use case is gathering end-user feedback + * on the next run of the app. + * + * The CrashlyticsReport should be modified before calling send/deleteUnsentReports. + */ +NS_SWIFT_NAME(CrashlyticsReport) +@interface FIRCrashlyticsReport : NSObject + +/** :nodoc: */ +- (instancetype)init NS_UNAVAILABLE; + +/** + * Returns the unique ID for the Crashlytics report. + */ +@property(nonatomic, readonly) NSString *reportID; + +/** + * Returns the date that the report was created. + */ +@property(nonatomic, readonly) NSDate *dateCreated; + +/** + * Returns true when one of the events in the Crashlytics report is a crash. + */ +@property(nonatomic, readonly) BOOL hasCrash; + +/** + * Adds logging that is sent with your crash data. The logging does not appear in the + * system.log and is only visible in the Crashlytics dashboard. + * + * @param msg Message to log + */ +- (void)log:(NSString *)msg; + +/** + * Adds logging that is sent with your crash data. The logging does not appear in the + * system.log and is only visible in the Crashlytics dashboard. + * + * @param format The format of the string, followed by a comma-separated list + * of arguments to substitute into the format. + */ +- (void)logWithFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1, 2); + +/** + * Adds logging that is sent with your crash data. The logging does not appear in the + * system.log and is only visible in the Crashlytics dashboard. + * + * @param format Format of string + * @param args Arguments to substitute into format + */ +- (void)logWithFormat:(NSString *)format + arguments:(va_list)args + __attribute__((__swift_name__("log(format:arguments:)"))); // Avoid `NS_SWIFT_NAME` (#9331). + +/** + * Sets a custom key and value to be associated with subsequent fatal and non-fatal reports. + * When setting an object value, the object is converted to a string. This is + * typically done by using the object's description. + * + * @param value The value to be associated with the key + * @param key A unique key + */ +- (void)setCustomValue:(nullable id)value forKey:(NSString *)key; + +/** + * Sets custom keys and values to be associated with subsequent fatal and non-fatal reports. + * The objects in the dictionary are converted to strings. This is + * typically done by using the object's description. + * + * @param keysAndValues The values to be associated with the corresponding keys + */ +- (void)setCustomKeysAndValues:(NSDictionary *)keysAndValues; + +/** + * Records a user ID (identifier) that's associated with subsequent fatal and non-fatal reports. + * + * If you want to associate a crash with a specific user, we recommend specifying an arbitrary + * string (e.g., a database, ID, hash, or other value that you can index and query, but is + * meaningless to a third-party observer). This allows you to facilitate responses for support + * requests and reach out to users for more information. + * + * @param userID An arbitrary user identifier string that associates a user to a record in your + * system. + */ +- (void)setUserID:(nullable NSString *)userID; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Public/FirebaseCrashlytics/FIRExceptionModel.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Public/FirebaseCrashlytics/FIRExceptionModel.h new file mode 100644 index 0000000..4a89ce9 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Public/FirebaseCrashlytics/FIRExceptionModel.h @@ -0,0 +1,57 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +#import "FIRStackFrame.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + * The Firebase Crashlytics ExceptionModel provides a way to report custom exceptions + * to Crashlytics that came from a runtime environment outside of the native + * platform Crashlytics is running in. + */ +NS_SWIFT_NAME(ExceptionModel) +@interface FIRExceptionModel : NSObject + +/** :nodoc: */ +- (instancetype)init NS_UNAVAILABLE; + +/** + * Initializes an ExceptionModel with the given required fields. + * + * @param name - typically the type of the Exception class + * @param reason - the human-readable reason the issue occurred + */ +- (instancetype)initWithName:(NSString *)name reason:(NSString *)reason; + +/** + * Creates an ExceptionModel with the given required fields. + * + * @param name - typically the type of the Exception class + * @param reason - the human-readable reason the issue occurred + */ ++ (instancetype)exceptionModelWithName:(NSString *)name + reason:(NSString *)reason NS_SWIFT_UNAVAILABLE(""); + +/** + * A list of stack frames that make up the stack trace. The order of the stack trace is top-first, + * so typically the "main" function is the last element in this list. + */ +@property(nonatomic, copy) NSArray *stackTrace; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Public/FirebaseCrashlytics/FIRStackFrame.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Public/FirebaseCrashlytics/FIRStackFrame.h new file mode 100644 index 0000000..61418c1 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Public/FirebaseCrashlytics/FIRStackFrame.h @@ -0,0 +1,63 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + * The Firebase Crashlytics `StackFrame` provides a way to construct the lines of + * a stack trace for reporting along with a recorded `ExceptionModel`. + */ +NS_SWIFT_NAME(StackFrame) +@interface FIRStackFrame : NSObject + +/** :nodoc: */ +- (instancetype)init NS_UNAVAILABLE; + +/** + * Initializes a symbolicated `StackFrame` with the given required fields. Symbolicated + * `StackFrame`s will appear in the Crashlytics dashboard as reported in these fields. + * + * @param symbol - The function or method name + * @param file - the file where the exception occurred + * @param line - the line number + */ +- (instancetype)initWithSymbol:(NSString *)symbol file:(NSString *)file line:(NSInteger)line; + +/** + * Creates a symbolicated `StackFrame` from an address. The address will be + * symbolicated in the Crashlytics backend for the customer and reported in the + * Crashlytics dashboard with the appropriate file name and line number. If an + * invalid address is provided it will appear in the dashboard as missing. + * + * @param address - the address where the exception occurred + */ ++ (instancetype)stackFrameWithAddress:(NSUInteger)address; + +/** + * Creates a symbolicated `StackFrame` with the given required fields. Symbolicated + * `StackFrame`s will appear in the Crashlytics dashboard as reported in these fields. + * + * @param symbol - The function or method name + * @param file - the file where the exception occurred + * @param line - the line number + */ ++ (instancetype)stackFrameWithSymbol:(NSString *)symbol + file:(NSString *)file + line:(NSInteger)line NS_SWIFT_UNAVAILABLE(""); + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Public/FirebaseCrashlytics/FirebaseCrashlytics.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Public/FirebaseCrashlytics/FirebaseCrashlytics.h new file mode 100644 index 0000000..280ab81 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Public/FirebaseCrashlytics/FirebaseCrashlytics.h @@ -0,0 +1,20 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRCrashlytics.h" +#import "FIRCrashlyticsReport.h" +#import "FIRExceptionModel.h" +#import "FIRStackFrame.h" diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Rollouts/CrashlyticsRemoteConfigManager.swift b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Rollouts/CrashlyticsRemoteConfigManager.swift new file mode 100644 index 0000000..d6d5cb1 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Rollouts/CrashlyticsRemoteConfigManager.swift @@ -0,0 +1,141 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import FirebaseRemoteConfigInterop +import Foundation + +@objc(FIRCLSPersistenceLog) +public protocol CrashlyticsPersistenceLog { + func updateRolloutsStateToPersistence(rollouts: Data, reportID: String) + func debugLog(message: String) +} + +@objc(FIRCLSRemoteConfigManager) +public class CrashlyticsRemoteConfigManager: NSObject { + public static let maxRolloutAssignments = 128 + public static let maxParameterValueLength = 256 + + private let lock = NSLock() + private var _rolloutAssignment: [RolloutAssignment] = [] + + var remoteConfig: RemoteConfigInterop + var persistenceDelegate: CrashlyticsPersistenceLog + + @objc public var rolloutAssignment: [RolloutAssignment] { + lock.lock() + defer { lock.unlock() } + let copy = _rolloutAssignment + return copy + } + + @objc public init(remoteConfig: RemoteConfigInterop, + persistenceDelegate: CrashlyticsPersistenceLog) { + self.remoteConfig = remoteConfig + self.persistenceDelegate = persistenceDelegate + } + + @objc public func updateRolloutsState(rolloutsState: RolloutsState, reportID: String) { + lock.lock() + _rolloutAssignment = normalizeRolloutAssignment(assignments: Array(rolloutsState.assignments)) + lock.unlock() + + // Writring to persistence + if let rolloutsData = + getRolloutsStateEncodedJsonData() { + persistenceDelegate.updateRolloutsStateToPersistence( + rollouts: rolloutsData, + reportID: reportID + ) + } + } + + /// Return string format: [{RolloutAssignment1}, {RolloutAssignment2}, {RolloutAssignment3}...] + /// This will get inserted into each clsrcord for non-fatal events. + /// Return a string type because later `FIRCLSFileWriteStringUnquoted` takes string as input + @objc public func getRolloutAssignmentsEncodedJsonString() -> String? { + let encodeData = getRolloutAssignmentsEncodedJsonData() + if let data = encodeData { + return String(data: data, encoding: .utf8) + } + + let debugInfo = encodeData?.debugDescription ?? "nil" + persistenceDelegate.debugLog(message: String( + format: "Failed to serialize rollouts: %@", + arguments: [debugInfo] + )) + + return nil + } +} + +private extension CrashlyticsRemoteConfigManager { + func normalizeRolloutAssignment(assignments: [RolloutAssignment]) -> [RolloutAssignment] { + var validatedAssignments = assignments + if assignments.count > CrashlyticsRemoteConfigManager.maxRolloutAssignments { + persistenceDelegate + .debugLog( + message: "Rollouts excess the maximum number of assignments can pass to Crashlytics" + ) + validatedAssignments = + Array(assignments[.. CrashlyticsRemoteConfigManager.maxParameterValueLength { + debugPrint( + "Rollouts excess the maximum length of parameter value can pass to Crashlytics", + assignment.parameterValue + ) + let upperBound = String.Index( + utf16Offset: CrashlyticsRemoteConfigManager.maxParameterValueLength, + in: assignment.parameterValue + ) + let slicedParameterValue = assignment.parameterValue[.. Data? { + let contentEncodedRolloutAssignments = rolloutAssignment.map { assignment in + EncodedRolloutAssignment(assignment: assignment) + } + + let encoder = JSONEncoder() + encoder.keyEncodingStrategy = .convertToSnakeCase + encoder.outputFormatting = .sortedKeys + let encodeData = try? encoder.encode(contentEncodedRolloutAssignments) + return encodeData + } + + /// Return string format: {"rollouts": [{RolloutAssignment1}, {RolloutAssignment2}, + /// {RolloutAssignment3}...]} + /// This will get stored in the separate rollouts.clsrecord + /// Return a data type because later `[NSFileHandler writeData:]` takes data as input + func getRolloutsStateEncodedJsonData() -> Data? { + let contentEncodedRolloutAssignments = rolloutAssignment.map { assignment in + EncodedRolloutAssignment(assignment: assignment) + } + + let state = EncodedRolloutsState(assignments: contentEncodedRolloutAssignments) + let encoder = JSONEncoder() + encoder.keyEncodingStrategy = .convertToSnakeCase + let encodeData = try? encoder.encode(state) + return encodeData + } +} diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Rollouts/EncodedRolloutAssignment.swift b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Rollouts/EncodedRolloutAssignment.swift new file mode 100644 index 0000000..725b630 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Rollouts/EncodedRolloutAssignment.swift @@ -0,0 +1,44 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import FirebaseRemoteConfigInterop +import Foundation + +@objc(FIRCLSEncodedRolloutsState) +class EncodedRolloutsState: NSObject, Codable { + @objc public private(set) var rollouts: [EncodedRolloutAssignment] + + @objc public init(assignments: [EncodedRolloutAssignment]) { + rollouts = assignments + super.init() + } +} + +@objc(FIRCLSEncodedRolloutAssignment) +class EncodedRolloutAssignment: NSObject, Codable { + @objc public private(set) var rolloutId: String + @objc public private(set) var variantId: String + @objc public private(set) var templateVersion: Int64 + @objc public private(set) var parameterKey: String + @objc public private(set) var parameterValue: String + + public init(assignment: RolloutAssignment) { + rolloutId = FileUtility.stringToHexConverter(for: assignment.rolloutId) + variantId = FileUtility.stringToHexConverter(for: assignment.variantId) + templateVersion = assignment.templateVersion + parameterKey = FileUtility.stringToHexConverter(for: assignment.parameterKey) + parameterValue = FileUtility.stringToHexConverter(for: assignment.parameterValue) + super.init() + } +} diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Rollouts/StringToHexConverter.swift b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Rollouts/StringToHexConverter.swift new file mode 100644 index 0000000..9d4365d --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Rollouts/StringToHexConverter.swift @@ -0,0 +1,38 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation + +// This is a swift rewrite for the logic in FIRCLSFile for the function FIRCLSFileHexEncodeString() +@objc(FIRCLSwiftFileUtility) +public class FileUtility: NSObject { + @objc public static func stringToHexConverter(for string: String) -> String { + let hexMap = "0123456789abcdef" + + var processedString = "" + let utf8Array = string.utf8.map { UInt8($0) } + for c in utf8Array { + let index1 = String.Index( + utf16Offset: Int(c >> 4), + in: hexMap + ) + let index2 = String.Index( + utf16Offset: Int(c & 0x0F), + in: hexMap + ) + processedString = processedString + String(hexMap[index1]) + String(hexMap[index2]) + } + return processedString + } +} diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Settings/FIRCLSSettingsManager.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Settings/FIRCLSSettingsManager.h new file mode 100644 index 0000000..8a44c8f --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Settings/FIRCLSSettingsManager.h @@ -0,0 +1,57 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +#if __has_include() +#import +#else +#import "FBLPromises.h" +#endif + +@class FIRCLSApplicationIdentifierModel; +@class FIRCLSDataCollectionToken; +@class FIRCLSFileManager; +@class FIRCLSInstallIdentifierModel; +@class FIRCLSSettings; + +NS_ASSUME_NONNULL_BEGIN + +/** + * Use this class to retrieve remote settings for the application from crashlytics backend. + */ +@interface FIRCLSSettingsManager : NSObject + +/** + * Designated Initializer. + */ +- (instancetype)initWithAppIDModel:(FIRCLSApplicationIdentifierModel *)appIDModel + installIDModel:(FIRCLSInstallIdentifierModel *)installIDModel + settings:(FIRCLSSettings *)settings + fileManager:(FIRCLSFileManager *)fileManager + googleAppID:(NSString *)googleAppID NS_DESIGNATED_INITIALIZER; +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)new NS_UNAVAILABLE; + +/** + * This method kicks off downloading settings for the app. + * @param googleAppID (required) GMP id for the app. + * @param token (required) Data collection token signifying we can make network calls + */ +- (void)beginSettingsWithGoogleAppId:(NSString *)googleAppID + token:(FIRCLSDataCollectionToken *)token; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Settings/FIRCLSSettingsManager.m b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Settings/FIRCLSSettingsManager.m new file mode 100644 index 0000000..3655442 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Settings/FIRCLSSettingsManager.m @@ -0,0 +1,157 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "Crashlytics/Crashlytics/Settings/FIRCLSSettingsManager.h" + +#import "Crashlytics/Crashlytics/DataCollection/FIRCLSDataCollectionToken.h" +#import "Crashlytics/Crashlytics/Helpers/FIRCLSDefines.h" +#import "Crashlytics/Crashlytics/Helpers/FIRCLSLogger.h" +#import "Crashlytics/Crashlytics/Models/FIRCLSFileManager.h" +#import "Crashlytics/Crashlytics/Models/FIRCLSInstallIdentifierModel.h" +#import "Crashlytics/Crashlytics/Models/FIRCLSSettings.h" +#import "Crashlytics/Crashlytics/Settings/Models/FIRCLSApplicationIdentifierModel.h" +#import "Crashlytics/Crashlytics/Settings/Operations/FIRCLSDownloadAndSaveSettingsOperation.h" +#import "Crashlytics/Shared/FIRCLSConstants.h" +#import "Crashlytics/Shared/FIRCLSNetworking/FIRCLSFABNetworkClient.h" +#import "Crashlytics/Shared/FIRCLSNetworking/FIRCLSURLBuilder.h" + +@interface FIRCLSSettingsManager () + +@property(nonatomic, strong) FIRCLSApplicationIdentifierModel *appIDModel; +@property(nonatomic, strong) FIRCLSInstallIdentifierModel *installIDModel; + +@property(nonatomic, strong) FIRCLSSettings *settings; + +@property(nonatomic, strong) FIRCLSFileManager *fileManager; + +@property(nonatomic) NSDictionary *configuration; +@property(nonatomic) NSDictionary *defaultConfiguration; +@property(nonatomic, copy) NSString *googleAppID; +@property(nonatomic, copy) NSDictionary *kitVersionsByKitBundleIdentifier; +@property(nonatomic, readonly) FIRCLSFABNetworkClient *networkClient; + +@end + +@implementation FIRCLSSettingsManager + +- (instancetype)initWithAppIDModel:(FIRCLSApplicationIdentifierModel *)appIDModel + installIDModel:(FIRCLSInstallIdentifierModel *)installIDModel + settings:(FIRCLSSettings *)settings + fileManager:(FIRCLSFileManager *)fileManager + googleAppID:(NSString *)googleAppID { + self = [super init]; + if (!self) { + return nil; + } + + _appIDModel = appIDModel; + _installIDModel = installIDModel; + _settings = settings; + _fileManager = fileManager; + _googleAppID = googleAppID; + + _networkClient = [[FIRCLSFABNetworkClient alloc] initWithQueue:nil]; + + return self; +} + +- (void)beginSettingsWithGoogleAppId:(NSString *)googleAppID + token:(FIRCLSDataCollectionToken *)token { + NSParameterAssert(googleAppID); + + self.googleAppID = googleAppID; + + // This map helps us determine what versions of the SDK + // are out there. We're keeping the Fabric value in there for + // backwards compatibility + // TODO(b/141747635) + self.kitVersionsByKitBundleIdentifier = @{ + FIRCLSApplicationGetSDKBundleID() : FIRCLSSDKVersion(), + }; + + [self beginSettingsDownload:token]; +} + +#pragma mark Helper methods + +/** + * Makes a settings download request. If the request fails, the error is handled silently (with a + * log statement). + */ +- (void)beginSettingsDownload:(FIRCLSDataCollectionToken *)token { + FIRCLSDownloadAndSaveSettingsOperation *operation = nil; + operation = [[FIRCLSDownloadAndSaveSettingsOperation alloc] + initWithGoogleAppID:self.googleAppID + delegate:self + settingsURL:self.settingsURL + settingsDirectoryPath:self.fileManager.settingsDirectoryPath + settingsFilePath:self.fileManager.settingsFilePath + installIDModel:self.installIDModel + networkClient:self.networkClient + token:token]; + + [operation startWithToken:token]; +} + +- (void)finishNetworkingSession { + [self.networkClient invalidateAndCancel]; +} + +#pragma mark FIRCLSDownloadAndSaveSettingsOperationDelegate methods + +- (void)operation:(FIRCLSDownloadAndSaveSettingsOperation *)operation + didDownloadAndSaveSettingsWithError:(nullable NSError *)error { + if (error) { + NSString *message = @"Failed to download settings."; + if (error.userInfo && [error.userInfo objectForKey:@"status_code"] && + [[error.userInfo objectForKey:@"status_code"] + isEqualToNumber:[NSNumber numberWithInt:404]]) { + NSString *debugHint = @"If this is your first time launching the app, make sure you have " + @"enabled Crashlytics in the Firebase Console."; + message = [NSString stringWithFormat:@"%@ %@", message, debugHint]; + } + FIRCLSErrorLog(@"%@ %@", message, error); + [self finishNetworkingSession]; + return; + } + + FIRCLSDebugLog(@"Settings downloaded successfully"); + + NSTimeInterval currentTimestamp = [NSDate timeIntervalSinceReferenceDate]; + [self.settings cacheSettingsWithGoogleAppID:self.googleAppID currentTimestamp:currentTimestamp]; + + // we're all set! + [self finishNetworkingSession]; +} + +- (NSURL *)settingsURL { + // GET + // /spi/v2/platforms/:platform/apps/:identifier/settings?build_version=1234&display_version=abc&instance=xyz&source=1 + FIRCLSURLBuilder *url = [FIRCLSURLBuilder URLWithBase:FIRCLSSettingsEndpoint]; + + [url appendComponent:@"/spi/v2/platforms/"]; + [url escapeAndAppendComponent:self.appIDModel.platform]; + [url appendComponent:@"/gmp/"]; + [url escapeAndAppendComponent:self.googleAppID]; + [url appendComponent:@"/settings"]; + + [url appendValue:self.appIDModel.buildVersion forQueryParam:@"build_version"]; + [url appendValue:self.appIDModel.displayVersion forQueryParam:@"display_version"]; + [url appendValue:self.appIDModel.buildInstanceID forQueryParam:@"instance"]; + [url appendValue:@(self.appIDModel.installSource) forQueryParam:@"source"]; + // TODO: find the right param name for KitVersions and add them here + return url.URL; +} + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Settings/Models/FIRCLSApplicationIdentifierModel.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Settings/Models/FIRCLSApplicationIdentifierModel.h new file mode 100644 index 0000000..7b40ec7 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Settings/Models/FIRCLSApplicationIdentifierModel.h @@ -0,0 +1,71 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +#import "Crashlytics/Crashlytics/Components/FIRCLSApplication.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + * This class is a model for identifiers related to the application binary. + * It is thread-safe. + */ +@interface FIRCLSApplicationIdentifierModel : NSObject + +@property(nonatomic, readonly, nullable) NSString* bundleID; + +/** + * Returns the user-facing app name + */ +@property(nonatomic, readonly, nullable) NSString* displayName; + +@property(nonatomic, readonly, nullable) NSString* platform; +@property(nonatomic, readonly, nullable) NSString* buildVersion; +@property(nonatomic, readonly, nullable) NSString* displayVersion; + +/** + * Returns the synthesized app version, similar to how the backend does it + * () + */ +@property(nonatomic, readonly, nullable) NSString* synthesizedVersion; + +@property(nonatomic, readonly) FIRCLSApplicationInstallationSourceType installSource; + +/** + * A mapping between all supported architectures and their UUIDs + */ +@property(nonatomic, readonly) NSDictionary* architectureUUIDMap; + +/** + * Returns the linked OS SDK + */ +@property(nonatomic, readonly) NSString* builtSDKString; + +/** + * Returns the min supported OS + */ +@property(nonatomic, readonly) NSString* minimumSDKString; + +/** + * The unique identifier for this instance of the version of app running Crashlytics. This is + * computed by hashing the app itself. + * + * On Android, this is called the Build ID + */ +@property(nonatomic, readonly) NSString* buildInstanceID; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Settings/Models/FIRCLSApplicationIdentifierModel.m b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Settings/Models/FIRCLSApplicationIdentifierModel.m new file mode 100644 index 0000000..975cf2b --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Settings/Models/FIRCLSApplicationIdentifierModel.m @@ -0,0 +1,138 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "Crashlytics/Crashlytics/Settings/Models/FIRCLSApplicationIdentifierModel.h" + +#import "Crashlytics/Crashlytics/Components/FIRCLSApplication.h" +#import "Crashlytics/Crashlytics/Helpers/FIRCLSDefines.h" +#import "Crashlytics/Shared/FIRCLSByteUtility.h" +#import "Crashlytics/Shared/FIRCLSMachO/FIRCLSMachO.h" +#import "Crashlytics/Shared/FIRCLSUUID.h" + +@interface FIRCLSApplicationIdentifierModel () + +@property(nonatomic, copy, readwrite) NSDictionary *architectureUUIDMap; +@property(nonatomic, copy, readwrite) NSString *buildInstanceID; +@property(nonatomic, readonly) FIRCLSMachOVersion builtSDK; +@property(nonatomic, readonly) FIRCLSMachOVersion minimumSDK; + +@end + +@implementation FIRCLSApplicationIdentifierModel + +- (nullable instancetype)init { + self = [super init]; + if (!self) { + return nil; + } + + if (![self computeExecutableInfo]) { + return nil; + } + + [self computeInstanceIdentifier]; + + return self; +} + +- (NSString *)bundleID { + return FIRCLSApplicationGetBundleIdentifier(); +} + +- (NSString *)displayName { + return FIRCLSApplicationGetName(); +} + +- (NSString *)platform { + return FIRCLSApplicationGetPlatform(); +} + +- (NSString *)buildVersion { + return FIRCLSApplicationGetBundleVersion(); +} + +- (NSString *)displayVersion { + return FIRCLSApplicationGetShortBundleVersion(); +} + +- (NSString *)synthesizedVersion { + return [NSString stringWithFormat:@"%@ (%@)", self.displayVersion, self.buildVersion]; +} + +- (FIRCLSApplicationInstallationSourceType)installSource { + return FIRCLSApplicationInstallationSource(); +} + +- (NSString *)builtSDKString { + return FIRCLSMachOFormatVersion(&_builtSDK); +} + +- (NSString *)minimumSDKString { + return FIRCLSMachOFormatVersion(&_minimumSDK); +} + +- (BOOL)computeExecutableInfo { + struct FIRCLSMachOFile file; + + if (!FIRCLSMachOFileInitWithCurrent(&file)) { + return NO; + } + + NSMutableDictionary *executables = [NSMutableDictionary dictionary]; + + FIRCLSMachOFileEnumerateSlices(&file, ^(FIRCLSMachOSliceRef fileSlice) { + NSString *arch; + + arch = [NSString stringWithUTF8String:FIRCLSMachOSliceGetArchitectureName(fileSlice)]; + + FIRCLSMachOSliceEnumerateLoadCommands( + fileSlice, ^(uint32_t type, uint32_t size, const struct load_command *cmd) { + if (type == LC_UUID) { + const uint8_t *uuid; + + uuid = FIRCLSMachOGetUUID(cmd); + + [executables setObject:FIRCLSUUIDToNSString(uuid) forKey:arch]; + } else if (type == LC_VERSION_MIN_MACOSX || type == LC_VERSION_MIN_IPHONEOS) { + self->_minimumSDK = FIRCLSMachOGetMinimumOSVersion(cmd); + self->_builtSDK = FIRCLSMachOGetLinkedSDKVersion(cmd); + } + }); + }); + + FIRCLSMachOFileDestroy(&file); + + _architectureUUIDMap = executables; + + return YES; +} + +- (void)computeInstanceIdentifier { + // build up the components of the instance identifier + NSMutableString *string = [NSMutableString string]; + + // first, the uuids, sorted by architecture name + for (NSString *key in + [[_architectureUUIDMap allKeys] sortedArrayUsingSelector:@selector(compare:)]) { + [string appendString:[self.architectureUUIDMap objectForKey:key]]; + } + + // TODO: the instance identifier calculation needs to match Beta's expectation. So, we have to + // continue generating a less-correct value for now. One day, we should incorporate a hash of the + // Info.plist and icon data. + + _buildInstanceID = FIRCLSHashNSData([string dataUsingEncoding:NSUTF8StringEncoding]); +} + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Settings/Operations/FIRCLSDownloadAndSaveSettingsOperation.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Settings/Operations/FIRCLSDownloadAndSaveSettingsOperation.h new file mode 100644 index 0000000..2caeedb --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Settings/Operations/FIRCLSDownloadAndSaveSettingsOperation.h @@ -0,0 +1,80 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import +#import "Crashlytics/Crashlytics/Settings/Operations/FIRCLSNetworkOperation.h" + +@class FIRCLSDownloadAndSaveSettingsOperation; +@class FIRCLSFABNetworkClient; +@class FIRCLSInstallIdentifierModel; + +NS_ASSUME_NONNULL_BEGIN + +/** + * This is the protocol that a delegate of FIRCLSDownloadAndSaveSettingsOperation needs to follow. + */ +@protocol FIRCLSDownloadAndSaveSettingsOperationDelegate + +@required + +/** + * Method that is called when settings have been downloaded and saved, or an error has occurred + * during the operation. This method may be called on an arbitrary background thread. + */ +- (void)operation:(FIRCLSDownloadAndSaveSettingsOperation *)operation + didDownloadAndSaveSettingsWithError:(nullable NSError *)error; + +@end + +/** + * This operation downloads settings from the backend servers, and saves them in file on disk. + */ +@interface FIRCLSDownloadAndSaveSettingsOperation : FIRCLSNetworkOperation + +- (instancetype)initWithGoogleAppID:(NSString *)googleAppID + token:(FIRCLSDataCollectionToken *)token NS_UNAVAILABLE; + +/** + * @param googleAppID must NOT be nil + * @param delegate gets a callback after settings have been downloaded or an error occurs. + * @param settingsURL must NOT be nil. This is the URL to which a download request is made. + * @param settingsDirectoryPath must NOT be nil. This is the directory on disk where the settings + * are persisted. + * @param settingsFilePath must NOT be nil. It is the full file path (including file name) in which + * settings will be persisted on disk. + * @param installIDModel must NOT be nil. This value is sent back to the backend to uniquely + * identify the app install. + */ +- (instancetype)initWithGoogleAppID:(NSString *)googleAppID + delegate:(id)delegate + settingsURL:(NSURL *)settingsURL + settingsDirectoryPath:(NSString *)settingsDirectoryPath + settingsFilePath:(NSString *)settingsFilePath + installIDModel:(FIRCLSInstallIdentifierModel *)installIDModel + networkClient:(FIRCLSFABNetworkClient *)networkClient + token:(FIRCLSDataCollectionToken *)token NS_DESIGNATED_INITIALIZER; + +/** + * Delegate of this operation. + */ +@property(nonatomic, readonly, weak) id delegate; + +/** + * When an error occurs during this operation, it is made available in this property. + */ +@property(nonatomic, readonly) NSError *error; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Settings/Operations/FIRCLSDownloadAndSaveSettingsOperation.m b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Settings/Operations/FIRCLSDownloadAndSaveSettingsOperation.m new file mode 100644 index 0000000..3eb6b03 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Settings/Operations/FIRCLSDownloadAndSaveSettingsOperation.m @@ -0,0 +1,132 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "Crashlytics/Crashlytics/Settings/Operations/FIRCLSDownloadAndSaveSettingsOperation.h" + +#import "Crashlytics/Crashlytics/Helpers/FIRCLSLogger.h" +#import "Crashlytics/Crashlytics/Models/FIRCLSInstallIdentifierModel.h" +#import "Crashlytics/Shared/FIRCLSConstants.h" +#import "Crashlytics/Shared/FIRCLSFABHost.h" +#import "Crashlytics/Shared/FIRCLSNetworking/FIRCLSFABNetworkClient.h" + +@interface FIRCLSDownloadAndSaveSettingsOperation () + +/** + * Method called to fetch the URL from where settings have to be downloaded. + */ +@property(readonly, nonatomic) NSURL *settingsURL; +/** + * File manager which will be used to save settings on disk. + */ +@property(readonly, nonatomic) NSFileManager *fileManager; + +/** + * Directory path on which settings file will be saved + */ +@property(readonly, nonatomic) NSString *settingsDirectoryPath; +/** + * Complete file path on which settings file will be saved + */ +@property(readonly, nonatomic) NSString *settingsFilePath; +/** + * App install identifier. + */ +@property(strong, readonly, nonatomic) FIRCLSInstallIdentifierModel *installIDModel; + +@property(weak, readonly, nonatomic) FIRCLSFABNetworkClient *networkClient; + +@end + +@implementation FIRCLSDownloadAndSaveSettingsOperation + +- (instancetype)initWithGoogleAppID:(NSString *)googleAppID + delegate:(id)delegate + settingsURL:(NSURL *)settingsURL + settingsDirectoryPath:(NSString *)settingsDirectoryPath + settingsFilePath:(NSString *)settingsFilePath + installIDModel:(FIRCLSInstallIdentifierModel *)installIDModel + networkClient:(FIRCLSFABNetworkClient *)networkClient + token:(FIRCLSDataCollectionToken *)token { + NSParameterAssert(settingsURL); + NSParameterAssert(settingsDirectoryPath); + NSParameterAssert(settingsFilePath); + NSParameterAssert(installIDModel); + + self = [super initWithGoogleAppID:googleAppID token:token]; + if (self) { + _delegate = delegate; + _settingsURL = settingsURL.copy; + _settingsDirectoryPath = settingsDirectoryPath.copy; + _settingsFilePath = settingsFilePath.copy; + _fileManager = [[NSFileManager alloc] init]; + _installIDModel = installIDModel; + _networkClient = networkClient; + } + return self; +} + +- (NSMutableURLRequest *)mutableRequestWithDefaultHTTPHeaderFieldsAndTimeoutForURL:(NSURL *)url { + NSMutableURLRequest *request = + [super mutableRequestWithDefaultHTTPHeaderFieldsAndTimeoutForURL:url]; + request.HTTPMethod = @"GET"; + [request setValue:@"application/json" forHTTPHeaderField:@"Accept"]; + [request setValue:self.installIDModel.installID + forHTTPHeaderField:@"X-Crashlytics-Installation-ID"]; + [request setValue:FIRCLSHostModelInfo() forHTTPHeaderField:@"X-Crashlytics-Device-Model"]; + [request setValue:FIRCLSHostOSBuildVersion() + forHTTPHeaderField:@"X-Crashlytics-OS-Build-Version"]; + [request setValue:FIRCLSHostOSDisplayVersion() + forHTTPHeaderField:@"X-Crashlytics-OS-Display-Version"]; + [request setValue:FIRCLSSDKVersion() forHTTPHeaderField:@"X-Crashlytics-API-Client-Version"]; + + return request; +} + +- (void)main { + NSMutableURLRequest *request = + [self mutableRequestWithDefaultHTTPHeaderFieldsAndTimeoutForURL:self.settingsURL]; + + [self.networkClient + startDownloadTaskWithRequest:request + retryLimit:1 + completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) { + if (error) { + self->_error = error; + [self.delegate operation:self didDownloadAndSaveSettingsWithError:self.error]; + [self finishWithError:error]; + return; + } + // This move needs to happen synchronously, because after this method completes, + // the file will not be available. + NSError *moveError = nil; + + // this removal will frequently fail, and we don't want the warning + [self.fileManager removeItemAtPath:self.settingsDirectoryPath error:nil]; + + [self.fileManager createDirectoryAtPath:self.settingsDirectoryPath + withIntermediateDirectories:YES + attributes:nil + error:nil]; + if (![self.fileManager moveItemAtPath:location.path + toPath:self.settingsFilePath + error:&moveError]) { + FIRCLSErrorLog(@"Unable to complete settings download %@", moveError); + self->_error = moveError; + } + [self.delegate operation:self didDownloadAndSaveSettingsWithError:self.error]; + [self finishWithError:self.error]; + }]; +} + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Settings/Operations/FIRCLSNetworkOperation.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Settings/Operations/FIRCLSNetworkOperation.h new file mode 100644 index 0000000..405f6ed --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Settings/Operations/FIRCLSNetworkOperation.h @@ -0,0 +1,55 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import +#import "Crashlytics/Shared/FIRCLSOperation/FIRCLSOperation.h" + +NS_ASSUME_NONNULL_BEGIN + +@class FIRCLSDataCollectionToken; +@class FIRCLSSettings; + +/** + * This is a base class for network based operations. + */ +@interface FIRCLSNetworkOperation : FIRCLSFABAsyncOperation + +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)new NS_UNAVAILABLE; + +/** + * Designated initializer. All parameters are mandatory and must not be nil. + */ +- (instancetype)initWithGoogleAppID:(NSString *)googleAppID + token:(FIRCLSDataCollectionToken *)token NS_DESIGNATED_INITIALIZER; + +- (void)start NS_UNAVAILABLE; +- (void)startWithToken:(FIRCLSDataCollectionToken *)token; + +/** + * Creates a mutable request for posting to Crashlytics backend with a default timeout. + */ +- (NSMutableURLRequest *)mutableRequestWithDefaultHTTPHeaderFieldsAndTimeoutForURL:(NSURL *)url; + +/** + * Creates a mutable request for posting to Crashlytics backend with given timeout. + */ +- (NSMutableURLRequest *)mutableRequestWithDefaultHTTPHeadersForURL:(NSURL *)url + timeout:(NSTimeInterval)timeout; + +@property(nonatomic, strong, readonly) FIRCLSDataCollectionToken *token; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Settings/Operations/FIRCLSNetworkOperation.m b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Settings/Operations/FIRCLSNetworkOperation.m new file mode 100644 index 0000000..2129120 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Settings/Operations/FIRCLSNetworkOperation.m @@ -0,0 +1,93 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "Crashlytics/Crashlytics/Settings/Operations/FIRCLSNetworkOperation.h" + +#import "Crashlytics/Crashlytics/Components/FIRCLSApplication.h" +#import "Crashlytics/Crashlytics/DataCollection/FIRCLSDataCollectionToken.h" +#import "Crashlytics/Crashlytics/Helpers/FIRCLSDefines.h" +#import "Crashlytics/Crashlytics/Helpers/FIRCLSLogger.h" +#import "Crashlytics/Shared/FIRCLSConstants.h" + +@interface FIRCLSNetworkOperation () + +@property(nonatomic, strong, readonly) NSString *googleAppID; + +@end + +@implementation FIRCLSNetworkOperation + +- (instancetype)initWithGoogleAppID:(NSString *)googleAppID + token:(FIRCLSDataCollectionToken *)token { + NSParameterAssert(googleAppID); + if (!googleAppID) { + return nil; + } + + self = [super init]; + if (self) { + _googleAppID = googleAppID; + _token = token; + } + return self; +} + +- (void)startWithToken:(FIRCLSDataCollectionToken *)token { + // Settings is considered data collection, so we must only + // call this with a valid token + if (![token isValid]) { + FIRCLSErrorLog(@"Skipping network operation with invalid data collection token"); + return; + } + + [super start]; +} + +- (NSMutableURLRequest *)mutableRequestWithDefaultHTTPHeaderFieldsAndTimeoutForURL:(NSURL *)url { + return [self mutableRequestWithDefaultHTTPHeadersForURL:url timeout:10.0]; +} + +- (NSMutableURLRequest *)mutableRequestWithDefaultHTTPHeadersForURL:(NSURL *)url + timeout:(NSTimeInterval)timeout { + NSMutableURLRequest *request = + [NSMutableURLRequest requestWithURL:url + cachePolicy:NSURLRequestReloadIgnoringLocalCacheData + timeoutInterval:timeout]; + + NSString *localeId = self.localeIdentifier; + + [request setValue:self.userAgentString forHTTPHeaderField:FIRCLSNetworkUserAgent]; + [request setValue:FIRCLSNetworkUTF8 forHTTPHeaderField:FIRCLSNetworkAcceptCharset]; + [request setValue:localeId forHTTPHeaderField:FIRCLSNetworkAcceptLanguage]; + [request setValue:localeId forHTTPHeaderField:FIRCLSNetworkContentLanguage]; + [request setValue:FIRCLSDeveloperToken forHTTPHeaderField:FIRCLSNetworkCrashlyticsDeveloperToken]; + [request setValue:FIRCLSApplicationGetSDKBundleID() + forHTTPHeaderField:FIRCLSNetworkCrashlyticsAPIClientId]; + [request setValue:FIRCLSSDKVersion() + forHTTPHeaderField:FIRCLSNetworkCrashlyticsAPIClientDisplayVersion]; + [request setValue:self.googleAppID forHTTPHeaderField:FIRCLSNetworkCrashlyticsGoogleAppId]; + + return request; +} + +- (NSString *)userAgentString { + return + [NSString stringWithFormat:@"%@/%@", FIRCLSApplicationGetSDKBundleID(), FIRCLSSDKVersion()]; +} + +- (NSString *)localeIdentifier { + return NSLocale.currentLocale.localeIdentifier; +} + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Unwind/Compact/FIRCLSCompactUnwind.c b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Unwind/Compact/FIRCLSCompactUnwind.c new file mode 100644 index 0000000..4512aba --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Unwind/Compact/FIRCLSCompactUnwind.c @@ -0,0 +1,404 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "Crashlytics/Crashlytics/Unwind/Compact/FIRCLSCompactUnwind_Private.h" +#include "Crashlytics/Crashlytics/Unwind/Dwarf/FIRCLSDataParsing.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSDefines.h" +#include "Crashlytics/Crashlytics/Unwind/Dwarf/FIRCLSDwarfUnwind.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSFeatures.h" +#include "Crashlytics/Crashlytics/Unwind/FIRCLSUnwind.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSUtility.h" + +#include + +#if CLS_COMPACT_UNWINDING_SUPPORTED + +#pragma mark Parsing +bool FIRCLSCompactUnwindInit(FIRCLSCompactUnwindContext* context, + const void* unwindInfo, + const void* ehFrame, + uintptr_t loadAddress) { + if (!FIRCLSIsValidPointer(context)) { + FIRCLSSDKLog("Error: invalid context passed to compact unwind init"); + return false; + } + if (!FIRCLSIsValidPointer(unwindInfo)) { + FIRCLSSDKLog("Error: invalid unwind info passed to compact unwind init"); + return false; + } + if (!FIRCLSIsValidPointer(loadAddress)) { + FIRCLSSDKLog("Error: invalid load address passed to compact unwind init"); + return false; + } + + memset(context, 0, sizeof(FIRCLSCompactUnwindContext)); + + if (!FIRCLSReadMemory((vm_address_t)unwindInfo, &context->unwindHeader, + sizeof(struct unwind_info_section_header))) { + FIRCLSSDKLog("Error: could not read memory contents of unwindInfo\n"); + return false; + } + + if (context->unwindHeader.version != UNWIND_SECTION_VERSION) { + FIRCLSSDKLog("Error: bad unwind_info structure version (%d != %d)\n", + context->unwindHeader.version, UNWIND_SECTION_VERSION); + return false; + } + + // copy in the values + context->unwindInfo = unwindInfo; + context->ehFrame = ehFrame; + context->loadAddress = loadAddress; + + return true; +} + +void* FIRCLSCompactUnwindGetIndexData(FIRCLSCompactUnwindContext* context) { + return (void*)((uintptr_t)context->unwindInfo + + (uintptr_t)context->unwindHeader.indexSectionOffset); +} + +compact_unwind_encoding_t* FIRCLSCompactUnwindGetCommonEncodings( + FIRCLSCompactUnwindContext* context) { + return (compact_unwind_encoding_t*)((uintptr_t)context->unwindInfo + + (uintptr_t) + context->unwindHeader.commonEncodingsArraySectionOffset); +} + +void* FIRCLSCompactUnwindGetSecondLevelData(FIRCLSCompactUnwindContext* context) { + return (void*)((uintptr_t)context->unwindInfo + + context->indexHeader.secondLevelPagesSectionOffset); +} + +uintptr_t FIRCLSCompactUnwindGetIndexFunctionOffset(FIRCLSCompactUnwindContext* context) { + return context->loadAddress + context->indexHeader.functionOffset; +} +uintptr_t FIRCLSCompactUnwindGetTargetAddress(FIRCLSCompactUnwindContext* context, uintptr_t pc) { + uintptr_t offset = FIRCLSCompactUnwindGetIndexFunctionOffset(context); + + if (pc <= offset) { + FIRCLSSDKLog("Error: PC is invalid\n"); + return 0; + } + + return pc - offset; +} + +#pragma mark - Parsing and Lookup +bool FIRCLSCompactUnwindLookupFirstLevel(FIRCLSCompactUnwindContext* context, uintptr_t address) { + if (!context) { + return false; + } + + // In practice, it appears that there always one more first level entry + // than required. This actually makes sense, since we have to use this + // info to check if we are in range. This implies there must be + // at least 2 indices at a minimum. + + uint32_t indexCount = context->unwindHeader.indexCount; + if (indexCount < 2) { + return false; + } + + // make sure our address is valid + if (address < context->loadAddress) { + return false; + } + + struct unwind_info_section_header_index_entry* indexEntries = + FIRCLSCompactUnwindGetIndexData(context); + if (!indexEntries) { + return false; + } + + address -= context->loadAddress; // search relative to zero + + // minus one because of the extra entry - see comment above + for (uint32_t index = 0; index < indexCount - 1; ++index) { + uint32_t value = indexEntries[index].functionOffset; + uint32_t nextValue = indexEntries[index + 1].functionOffset; + + if (address >= value && address < nextValue) { + context->firstLevelNextFunctionOffset = nextValue; + context->indexHeader = indexEntries[index]; + return true; + } + } + + return false; +} + +uint32_t FIRCLSCompactUnwindGetSecondLevelPageKind(FIRCLSCompactUnwindContext* context) { + if (!context) { + return 0; + } + + return *(uint32_t*)FIRCLSCompactUnwindGetSecondLevelData(context); +} + +bool FIRCLSCompactUnwindLookupSecondLevelRegular(FIRCLSCompactUnwindContext* context, + uintptr_t pc, + FIRCLSCompactUnwindResult* result) { + FIRCLSSDKLog("Encountered a regular second-level page\n"); + return false; +} + +// this only works for compressed entries right now +bool FIRCLSCompactUnwindBinarySearchSecondLevel(uintptr_t address, + uint32_t* index, + uint16_t entryCount, + uint32_t* entryArray) { + if (!index || !entryArray) { + return false; + } + + if (entryCount == 0) { + return false; + } + + if (address == 0) { + return false; + } + + uint32_t highIndex = entryCount; + *index = 0; + + while (*index < highIndex) { + uint32_t midIndex = (*index + highIndex) / 2; + + // FIRCLSSDKLog("%u %u %u\n", *index, midIndex, highIndex); + + uintptr_t value = UNWIND_INFO_COMPRESSED_ENTRY_FUNC_OFFSET(entryArray[midIndex]); + + if (value > address) { + if (highIndex == midIndex) { + return false; + } + + highIndex = midIndex; + continue; + } + + *index = midIndex; + + // are we at the end of the array? + if (midIndex == entryCount - 1) { + return false; + } + + uintptr_t nextValue = UNWIND_INFO_COMPRESSED_ENTRY_FUNC_OFFSET(entryArray[midIndex + 1]); + if (nextValue > address) { + // we've found it + break; + } + + *index += 1; + } + + // check to make sure we're still within bounds + return *index < entryCount; +} + +bool FIRCLSCompactUnwindLookupSecondLevelCompressed(FIRCLSCompactUnwindContext* context, + uintptr_t pc, + FIRCLSCompactUnwindResult* result) { + if (!context || !result) { + return false; + } + + void* ptr = FIRCLSCompactUnwindGetSecondLevelData(context); + + if (!ptr) { + return false; + } + + memset(result, 0, sizeof(FIRCLSCompactUnwindResult)); + + struct unwind_info_compressed_second_level_page_header* header = + (struct unwind_info_compressed_second_level_page_header*)ptr; + + // adjust address + uintptr_t targetAddress = FIRCLSCompactUnwindGetTargetAddress(context, pc); + + uint32_t* entryArray = ptr + header->entryPageOffset; + + uint32_t index = 0; + + if (!FIRCLSCompactUnwindBinarySearchSecondLevel(targetAddress, &index, header->entryCount, + entryArray)) { + FIRCLSSDKLogInfo("Unable to find PC in second level\n"); + return false; + } + + uint32_t entry = entryArray[index]; + + // Computing the function start address is easy + result->functionStart = UNWIND_INFO_COMPRESSED_ENTRY_FUNC_OFFSET(entry) + + FIRCLSCompactUnwindGetIndexFunctionOffset(context); + + // Computing the end is more complex, because we could be on the last entry. In that case, we + // cannot use the next value as the end. + result->functionEnd = context->loadAddress; + if (index < header->entryCount - 1) { + result->functionEnd += UNWIND_INFO_COMPRESSED_ENTRY_FUNC_OFFSET(entryArray[index + 1]) + + context->indexHeader.functionOffset; + } else { + result->functionEnd += context->firstLevelNextFunctionOffset; + } + + // FIRCLSSDKLog("Located %lx => %lx %lx\n", pc, result->functionStart, result->functionEnd); + + if ((pc < result->functionStart) || (pc >= result->functionEnd)) { + FIRCLSSDKLog("PC does not match computed function range\n"); + return false; + } + + uint32_t encodingIndex = UNWIND_INFO_COMPRESSED_ENTRY_ENCODING_INDEX(entry); + + // encoding could be in the common array + if (encodingIndex < context->unwindHeader.commonEncodingsArrayCount) { + result->encoding = FIRCLSCompactUnwindGetCommonEncodings(context)[encodingIndex]; + + // FIRCLSSDKLog("Entry has common encoding: 0x%x\n", result->encoding); + } else { + encodingIndex = encodingIndex - context->unwindHeader.commonEncodingsArrayCount; + + compact_unwind_encoding_t* encodings = ptr + header->encodingsPageOffset; + + result->encoding = encodings[encodingIndex]; + + // FIRCLSSDKLog("Entry has compressed encoding: 0x%x\n", result->encoding); + } + + if (result->encoding == 0) { + FIRCLSSDKLogInfo("Entry has has no unwind info\n"); + return false; + } + + return true; +} + +bool FIRCLSCompactUnwindLookupSecondLevel(FIRCLSCompactUnwindContext* context, + uintptr_t pc, + FIRCLSCompactUnwindResult* result) { + switch (FIRCLSCompactUnwindGetSecondLevelPageKind(context)) { + case UNWIND_SECOND_LEVEL_REGULAR: + FIRCLSSDKLogInfo("Found a second level regular header\n"); + if (FIRCLSCompactUnwindLookupSecondLevelRegular(context, pc, result)) { + return true; + } + break; + case UNWIND_SECOND_LEVEL_COMPRESSED: + FIRCLSSDKLogInfo("Found a second level compressed header\n"); + if (FIRCLSCompactUnwindLookupSecondLevelCompressed(context, pc, result)) { + return true; + } + break; + default: + FIRCLSSDKLogError("Unrecognized header kind - unable to continue\n"); + break; + } + + return false; +} + +bool FIRCLSCompactUnwindLookup(FIRCLSCompactUnwindContext* context, + uintptr_t pc, + FIRCLSCompactUnwindResult* result) { + if (!context || !result) { + return false; + } + + // step 1 - find the pc in the first-level index + if (!FIRCLSCompactUnwindLookupFirstLevel(context, pc)) { + FIRCLSSDKLogWarn("Unable to find pc in first level\n"); + return false; + } + + FIRCLSSDKLogDebug("Found first level (second => %u)\n", + context->indexHeader.secondLevelPagesSectionOffset); + + // step 2 - use that info to find the second-level information + // that second actually has the encoding info we're looking for. + if (!FIRCLSCompactUnwindLookupSecondLevel(context, pc, result)) { + FIRCLSSDKLogInfo("Second-level PC lookup failed\n"); + return false; + } + + return true; +} + +#pragma mark - Unwinding +bool FIRCLSCompactUnwindLookupAndCompute(FIRCLSCompactUnwindContext* context, + FIRCLSThreadContext* registers) { + if (!context || !registers) { + return false; + } + + uintptr_t pc = FIRCLSThreadContextGetPC(registers); + + // little sanity check + if (pc < context->loadAddress) { + return false; + } + + FIRCLSCompactUnwindResult result; + + memset(&result, 0, sizeof(result)); + + if (!FIRCLSCompactUnwindLookup(context, pc, &result)) { + FIRCLSSDKLogInfo("Unable to lookup compact unwind for pc %p\n", (void*)pc); + return false; + } + + // Ok, armed with the encoding, we can actually attempt to modify the registers. Because + // the encoding is arch-specific, this function has to be defined per-arch. + if (!FIRCLSCompactUnwindComputeRegisters(context, &result, registers)) { + FIRCLSSDKLogError("Failed to compute registers\n"); + return false; + } + + return true; +} + +#if CLS_DWARF_UNWINDING_SUPPORTED +bool FIRCLSCompactUnwindDwarfFrame(FIRCLSCompactUnwindContext* context, + uintptr_t dwarfOffset, + FIRCLSThreadContext* registers) { + if (!context || !registers) { + return false; + } + + // Everyone's favorite! Dwarf unwinding! + FIRCLSSDKLogInfo("Trying to read dwarf data with offset %lx\n", dwarfOffset); + + FIRCLSDwarfCFIRecord record; + + if (!FIRCLSDwarfParseCFIFromFDERecordOffset(&record, context->ehFrame, dwarfOffset)) { + FIRCLSSDKLogError("Unable to init FDE\n"); + return false; + } + + if (!FIRCLSDwarfUnwindComputeRegisters(&record, registers)) { + FIRCLSSDKLogError("Failed to compute DWARF registers\n"); + return false; + } + + return true; +} +#endif + +#else +INJECT_STRIP_SYMBOL(compact_unwind) +#endif diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Unwind/Compact/FIRCLSCompactUnwind.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Unwind/Compact/FIRCLSCompactUnwind.h new file mode 100644 index 0000000..7c76a19 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Unwind/Compact/FIRCLSCompactUnwind.h @@ -0,0 +1,68 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once + +#include +#include + +#include "Crashlytics/Crashlytics/Helpers/FIRCLSFeatures.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSThreadState.h" + +// We have to pack the arrays defined in this header, so +// we can reason about pointer math. +#pragma pack(push) +#pragma pack(1) +#include +#pragma pack(pop) + +// First masks out the value, and then shifts the value by the number +// of zeros in the mask. __builtin_ctz returns the number of trailing zeros. +// Its output is undefined if the input is zero. +#define GET_BITS_WITH_MASK(value, mask) ((value & mask) >> (mask == 0 ? 0 : __builtin_ctz(mask))) + +typedef struct { + const void *unwindInfo; + const void *ehFrame; + uintptr_t loadAddress; + + struct unwind_info_section_header unwindHeader; + struct unwind_info_section_header_index_entry indexHeader; + uint32_t firstLevelNextFunctionOffset; +} FIRCLSCompactUnwindContext; + +typedef struct { + compact_unwind_encoding_t encoding; + uintptr_t functionStart; + uintptr_t functionEnd; + uintptr_t lsda; + uintptr_t personality; + +} FIRCLSCompactUnwindResult; + +bool FIRCLSCompactUnwindInit(FIRCLSCompactUnwindContext *context, + const void *unwindInfo, + const void *ehFrame, + uintptr_t loadAddress); +void *FIRCLSCompactUnwindGetIndexData(FIRCLSCompactUnwindContext *context); +void *FIRCLSCompactUnwindGetSecondLevelData(FIRCLSCompactUnwindContext *context); +bool FIRCLSCompactUnwindFindFirstLevelIndex(FIRCLSCompactUnwindContext *context, + uintptr_t pc, + uint32_t *index); + +bool FIRCLSCompactUnwindDwarfFrame(FIRCLSCompactUnwindContext *context, + uintptr_t dwarfOffset, + FIRCLSThreadContext *registers); +bool FIRCLSCompactUnwindLookupAndCompute(FIRCLSCompactUnwindContext *context, + FIRCLSThreadContext *registers); diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Unwind/Compact/FIRCLSCompactUnwind_Private.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Unwind/Compact/FIRCLSCompactUnwind_Private.h new file mode 100644 index 0000000..71cd2dd --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Unwind/Compact/FIRCLSCompactUnwind_Private.h @@ -0,0 +1,28 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once + +#include "Crashlytics/Crashlytics/Unwind/Compact/FIRCLSCompactUnwind.h" +#pragma pack(push, 1) +#include +#pragma pack(pop) + +bool FIRCLSCompactUnwindLookup(FIRCLSCompactUnwindContext *context, + uintptr_t pc, + FIRCLSCompactUnwindResult *result); + +bool FIRCLSCompactUnwindComputeRegisters(FIRCLSCompactUnwindContext *context, + FIRCLSCompactUnwindResult *result, + FIRCLSThreadContext *registers); diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Unwind/Dwarf/FIRCLSDataParsing.c b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Unwind/Dwarf/FIRCLSDataParsing.c new file mode 100644 index 0000000..2bb37c1 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Unwind/Dwarf/FIRCLSDataParsing.c @@ -0,0 +1,238 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "Crashlytics/Crashlytics/Unwind/Dwarf/FIRCLSDataParsing.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSDefines.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSUtility.h" +#include "Crashlytics/third_party/libunwind/dwarf.h" + +#include + +#if CLS_DWARF_UNWINDING_SUPPORTED + +uint8_t FIRCLSParseUint8AndAdvance(const void** cursor) { + uint8_t tmp = **(uint8_t**)cursor; + + *cursor += sizeof(uint8_t); + + return tmp; +} + +uint16_t FIRCLSParseUint16AndAdvance(const void** cursor) { + uint16_t tmp = **(uint16_t**)cursor; + + *cursor += sizeof(uint16_t); + + return tmp; +} + +int16_t FIRCLSParseInt16AndAdvance(const void** cursor) { + int16_t tmp = **(int16_t**)cursor; + + *cursor += sizeof(int16_t); + + return tmp; +} + +uint32_t FIRCLSParseUint32AndAdvance(const void** cursor) { + uint32_t tmp = **(uint32_t**)cursor; + + *cursor += sizeof(uint32_t); + + return tmp; +} + +int32_t FIRCLSParseInt32AndAdvance(const void** cursor) { + int32_t tmp = **(int32_t**)cursor; + + *cursor += sizeof(int32_t); + + return tmp; +} + +uint64_t FIRCLSParseUint64AndAdvance(const void** cursor) { + uint64_t tmp = **(uint64_t**)cursor; + + *cursor += sizeof(uint64_t); + + return tmp; +} + +int64_t FIRCLSParseInt64AndAdvance(const void** cursor) { + int64_t tmp = **(int64_t**)cursor; + + *cursor += sizeof(int64_t); + + return tmp; +} + +uintptr_t FIRCLSParsePointerAndAdvance(const void** cursor) { + uintptr_t tmp = **(uintptr_t**)cursor; + + *cursor += sizeof(uintptr_t); + + return tmp; +} + +// Signed and Unsigned LEB128 decoding algorithms taken from Wikipedia - +// http://en.wikipedia.org/wiki/LEB128 +uint64_t FIRCLSParseULEB128AndAdvance(const void** cursor) { + uint64_t result = 0; + char shift = 0; + + for (int i = 0; i < sizeof(uint64_t); ++i) { + char byte; + + byte = **(uint8_t**)cursor; + + *cursor += 1; + + result |= ((0x7F & byte) << shift); + if ((0x80 & byte) == 0) { + break; + } + + shift += 7; + } + + return result; +} + +int64_t FIRCLSParseLEB128AndAdvance(const void** cursor) { + uint64_t result = 0; + char shift = 0; + char size = sizeof(int64_t) * 8; + char byte = 0; + + for (int i = 0; i < sizeof(uint64_t); ++i) { + byte = **(uint8_t**)cursor; + + *cursor += 1; + + result |= ((0x7F & byte) << shift); + shift += 7; + + /* sign bit of byte is second high order bit (0x40) */ + if ((0x80 & byte) == 0) { + break; + } + } + + if ((shift < size) && (0x40 & byte)) { + // sign extend + result |= -(1 << shift); + } + + return result; +} + +const char* FIRCLSParseStringAndAdvance(const void** cursor) { + const char* string; + + string = (const char*)(*cursor); + + // strlen doesn't include the null character, which we need to advance past + *cursor += strlen(string) + 1; + + return string; +} + +uint64_t FIRCLSParseRecordLengthAndAdvance(const void** cursor) { + uint64_t length; + + length = FIRCLSParseUint32AndAdvance(cursor); + if (length == DWARF_EXTENDED_LENGTH_FLAG) { + length = FIRCLSParseUint64AndAdvance(cursor); + } + + return length; +} + +uintptr_t FIRCLSParseAddressWithEncodingAndAdvance(const void** cursor, uint8_t encoding) { + if (encoding == DW_EH_PE_omit) { + return 0; + } + + if (!cursor) { + return CLS_INVALID_ADDRESS; + } + + if (!*cursor) { + return CLS_INVALID_ADDRESS; + } + + intptr_t inputAddr = (intptr_t)*cursor; + intptr_t addr; + + switch (encoding & DW_EH_PE_VALUE_MASK) { + case DW_EH_PE_ptr: + // 32 or 64 bits + addr = FIRCLSParsePointerAndAdvance(cursor); + break; + case DW_EH_PE_uleb128: + addr = (intptr_t)FIRCLSParseULEB128AndAdvance(cursor); + break; + case DW_EH_PE_udata2: + addr = FIRCLSParseUint16AndAdvance(cursor); + break; + case DW_EH_PE_udata4: + addr = FIRCLSParseUint32AndAdvance(cursor); + break; + case DW_EH_PE_udata8: + addr = (intptr_t)FIRCLSParseUint64AndAdvance(cursor); + break; + case DW_EH_PE_sleb128: + addr = (intptr_t)FIRCLSParseLEB128AndAdvance(cursor); + break; + case DW_EH_PE_sdata2: + addr = FIRCLSParseInt16AndAdvance(cursor); + break; + case DW_EH_PE_sdata4: + addr = FIRCLSParseInt32AndAdvance(cursor); + break; + case DW_EH_PE_sdata8: + addr = (intptr_t)FIRCLSParseInt64AndAdvance(cursor); + break; + default: + FIRCLSSDKLog("Unhandled: encoding 0x%02x\n", encoding); + return CLS_INVALID_ADDRESS; + } + + // and now apply the relative offset + switch (encoding & DW_EH_PE_RELATIVE_OFFSET_MASK) { + case DW_EH_PE_absptr: + break; + case DW_EH_PE_pcrel: + addr += inputAddr; + break; + default: + FIRCLSSDKLog("Unhandled: relative encoding 0x%02x\n", encoding); + return CLS_INVALID_ADDRESS; + } + + // Here's a crazy one. It seems this encoding means you actually look up + // the value of the address using the result address itself + if (encoding & DW_EH_PE_indirect) { + if (!addr) { + return CLS_INVALID_ADDRESS; + } + + addr = *(uintptr_t*)addr; + } + + return addr; +} +#else +INJECT_STRIP_SYMBOL(data_parsing) +#endif diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Unwind/Dwarf/FIRCLSDataParsing.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Unwind/Dwarf/FIRCLSDataParsing.h new file mode 100644 index 0000000..bf6e464 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Unwind/Dwarf/FIRCLSDataParsing.h @@ -0,0 +1,46 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once + +#include + +#include "Crashlytics/Crashlytics/Helpers/FIRCLSFeatures.h" + +#if CLS_DWARF_UNWINDING_SUPPORTED + +#if CLS_CPU_64BIT +#define CLS_INVALID_ADDRESS (0xffffffffffffffff) +#else +#define CLS_INVALID_ADDRESS (0xffffffff) +#endif + +// basic data types +uint8_t FIRCLSParseUint8AndAdvance(const void **cursor); +uint16_t FIRCLSParseUint16AndAdvance(const void **cursor); +int16_t FIRCLSParseInt16AndAdvance(const void **cursor); +uint32_t FIRCLSParseUint32AndAdvance(const void **cursor); +int32_t FIRCLSParseInt32AndAdvance(const void **cursor); +uint64_t FIRCLSParseUint64AndAdvance(const void **cursor); +int64_t FIRCLSParseInt64AndAdvance(const void **cursor); +uintptr_t FIRCLSParsePointerAndAdvance(const void **cursor); +uint64_t FIRCLSParseULEB128AndAdvance(const void **cursor); +int64_t FIRCLSParseLEB128AndAdvance(const void **cursor); +const char *FIRCLSParseStringAndAdvance(const void **cursor); + +// FDE/CIE-specifc structures +uint64_t FIRCLSParseRecordLengthAndAdvance(const void **cursor); +uintptr_t FIRCLSParseAddressWithEncodingAndAdvance(const void **cursor, uint8_t encoding); + +#endif diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Unwind/Dwarf/FIRCLSDwarfExpressionMachine.c b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Unwind/Dwarf/FIRCLSDwarfExpressionMachine.c new file mode 100644 index 0000000..ef975fe --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Unwind/Dwarf/FIRCLSDwarfExpressionMachine.c @@ -0,0 +1,453 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "Crashlytics/Crashlytics/Unwind/Dwarf/FIRCLSDwarfExpressionMachine.h" +#include "Crashlytics/Crashlytics/Unwind/Dwarf/FIRCLSDataParsing.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSDefines.h" +#include "Crashlytics/Crashlytics/Unwind/Dwarf/FIRCLSDwarfUnwindRegisters.h" +#include "Crashlytics/Crashlytics/Unwind/FIRCLSUnwind_arch.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSUtility.h" +#include "Crashlytics/third_party/libunwind/dwarf.h" + +#if CLS_DWARF_UNWINDING_SUPPORTED + +static bool FIRCLSDwarfExpressionMachineExecute_bregN(FIRCLSDwarfExpressionMachine *machine, + uint8_t opcode); +static bool FIRCLSDwarfExpressionMachineExecute_deref(FIRCLSDwarfExpressionMachine *machine); +static bool FIRCLSDwarfExpressionMachineExecute_plus_uconst(FIRCLSDwarfExpressionMachine *machine); +static bool FIRCLSDwarfExpressionMachineExecute_and(FIRCLSDwarfExpressionMachine *machine); +static bool FIRCLSDwarfExpressionMachineExecute_plus(FIRCLSDwarfExpressionMachine *machine); +static bool FIRCLSDwarfExpressionMachineExecute_dup(FIRCLSDwarfExpressionMachine *machine); +static bool FIRCLSDwarfExpressionMachineExecute_swap(FIRCLSDwarfExpressionMachine *machine); +static bool FIRCLSDwarfExpressionMachineExecute_deref_size(FIRCLSDwarfExpressionMachine *machine); +static bool FIRCLSDwarfExpressionMachineExecute_ne(FIRCLSDwarfExpressionMachine *machine); +static bool FIRCLSDwarfExpressionMachineExecute_litN(FIRCLSDwarfExpressionMachine *machine, + uint8_t opcode); + +#pragma mark - +#pragma mark Stack Implementation +void FIRCLSDwarfExpressionStackInit(FIRCLSDwarfExpressionStack *stack) { + if (!FIRCLSIsValidPointer(stack)) { + return; + } + + memset(stack, 0, sizeof(FIRCLSDwarfExpressionStack)); + + stack->pointer = stack->buffer; +} + +bool FIRCLSDwarfExpressionStackIsValid(FIRCLSDwarfExpressionStack *stack) { + if (!FIRCLSIsValidPointer(stack)) { + return false; + } + + // check for valid stack pointer + if (stack->pointer < stack->buffer) { + return false; + } + + if (stack->pointer > stack->buffer + CLS_DWARF_EXPRESSION_STACK_SIZE) { + return false; + } + + return true; +} + +bool FIRCLSDwarfExpressionStackPush(FIRCLSDwarfExpressionStack *stack, intptr_t value) { + if (!FIRCLSDwarfExpressionStackIsValid(stack)) { + return false; + } + + if (stack->pointer == stack->buffer + CLS_DWARF_EXPRESSION_STACK_SIZE) { + // overflow + stack->pointer = NULL; + return false; + } + + *(stack->pointer) = value; + stack->pointer += 1; + + return true; +} + +intptr_t FIRCLSDwarfExpressionStackPeek(FIRCLSDwarfExpressionStack *stack) { + if (!FIRCLSDwarfExpressionStackIsValid(stack)) { + return 0; + } + + if (stack->pointer == stack->buffer) { + // underflow + stack->pointer = NULL; + return 0; + } + + return *(stack->pointer - 1); +} + +intptr_t FIRCLSDwarfExpressionStackPop(FIRCLSDwarfExpressionStack *stack) { + if (!FIRCLSDwarfExpressionStackIsValid(stack)) { + return 0; + } + + if (stack->pointer == stack->buffer) { + // underflow + stack->pointer = NULL; + return 0; + } + + stack->pointer -= 1; + + return *(stack->pointer); +} + +#pragma mark - +#pragma mark Machine API +bool FIRCLSDwarfExpressionMachineInit(FIRCLSDwarfExpressionMachine *machine, + const void *cursor, + const FIRCLSThreadContext *registers, + intptr_t stackValue) { + if (!FIRCLSIsValidPointer(machine)) { + return false; + } + + memset(machine, 0, sizeof(FIRCLSDwarfExpressionMachine)); + + if (!FIRCLSIsValidPointer(cursor)) { + return false; + } + + machine->dataCursor = cursor; + machine->registers = registers; + + FIRCLSDwarfExpressionStackInit(&machine->stack); + + return FIRCLSDwarfExpressionStackPush(&machine->stack, stackValue); +} + +bool FIRCLSDwarfExpressionMachinePrepareForExecution(FIRCLSDwarfExpressionMachine *machine) { + if (!FIRCLSIsValidPointer(machine)) { + FIRCLSSDKLog("Error: invalid inputs\n"); + return false; + } + + uint64_t expressionLength = FIRCLSParseULEB128AndAdvance(&machine->dataCursor); + + if (expressionLength == 0) { + FIRCLSSDKLog("Error: DWARF expression length is zero\n"); + return false; + } + + machine->endAddress = machine->dataCursor + expressionLength; + + return true; +} + +bool FIRCLSDwarfExpressionMachineIsFinished(FIRCLSDwarfExpressionMachine *machine) { + if (!FIRCLSIsValidPointer(machine)) { + FIRCLSSDKLog("Error: invalid inputs\n"); + return true; + } + + if (!FIRCLSIsValidPointer(machine->endAddress) || !FIRCLSIsValidPointer(machine->dataCursor)) { + FIRCLSSDKLog("Error: DWARF machine pointers invalid\n"); + return true; + } + + if (!FIRCLSDwarfExpressionStackIsValid(&machine->stack)) { + FIRCLSSDKLog("Error: DWARF machine stack invalid\n"); + return true; + } + + return machine->dataCursor >= machine->endAddress; +} + +bool FIRCLSDwarfExpressionMachineGetResult(FIRCLSDwarfExpressionMachine *machine, + intptr_t *result) { + if (!FIRCLSIsValidPointer(machine) || !FIRCLSIsValidPointer(result)) { + return false; + } + + if (machine->dataCursor != machine->endAddress) { + FIRCLSSDKLog("Error: DWARF expression hasn't completed execution\n"); + return false; + } + + *result = FIRCLSDwarfExpressionStackPeek(&machine->stack); + + return FIRCLSDwarfExpressionStackIsValid(&machine->stack); +} + +bool FIRCLSDwarfExpressionMachineExecuteNextOpcode(FIRCLSDwarfExpressionMachine *machine) { + if (!FIRCLSIsValidPointer(machine)) { + return false; + } + + const uint8_t opcode = FIRCLSParseUint8AndAdvance(&machine->dataCursor); + + bool success = false; + + switch (opcode) { + case DW_OP_deref: + success = FIRCLSDwarfExpressionMachineExecute_deref(machine); + break; + case DW_OP_dup: + success = FIRCLSDwarfExpressionMachineExecute_dup(machine); + break; + case DW_OP_and: + success = FIRCLSDwarfExpressionMachineExecute_and(machine); + break; + case DW_OP_plus: + success = FIRCLSDwarfExpressionMachineExecute_plus(machine); + break; + case DW_OP_swap: + success = FIRCLSDwarfExpressionMachineExecute_swap(machine); + break; + case DW_OP_plus_uconst: + success = FIRCLSDwarfExpressionMachineExecute_plus_uconst(machine); + break; + case DW_OP_ne: + success = FIRCLSDwarfExpressionMachineExecute_ne(machine); + break; + case DW_OP_lit0: + case DW_OP_lit1: + case DW_OP_lit2: + case DW_OP_lit3: + case DW_OP_lit4: + case DW_OP_lit5: + case DW_OP_lit6: + case DW_OP_lit7: + case DW_OP_lit8: + case DW_OP_lit9: + case DW_OP_lit10: + case DW_OP_lit11: + case DW_OP_lit12: + case DW_OP_lit13: + case DW_OP_lit14: + case DW_OP_lit15: + case DW_OP_lit16: + case DW_OP_lit17: + case DW_OP_lit18: + case DW_OP_lit19: + case DW_OP_lit20: + case DW_OP_lit21: + case DW_OP_lit22: + case DW_OP_lit23: + case DW_OP_lit24: + case DW_OP_lit25: + case DW_OP_lit26: + case DW_OP_lit27: + case DW_OP_lit28: + case DW_OP_lit29: + case DW_OP_lit30: + case DW_OP_lit31: + success = FIRCLSDwarfExpressionMachineExecute_litN(machine, opcode); + break; + case DW_OP_breg0: + case DW_OP_breg1: + case DW_OP_breg2: + case DW_OP_breg3: + case DW_OP_breg4: + case DW_OP_breg5: + case DW_OP_breg6: + case DW_OP_breg7: + case DW_OP_breg8: + case DW_OP_breg9: + case DW_OP_breg10: + case DW_OP_breg11: + case DW_OP_breg12: + case DW_OP_breg13: + case DW_OP_breg14: + case DW_OP_breg15: + case DW_OP_breg16: + case DW_OP_breg17: + case DW_OP_breg18: + case DW_OP_breg19: + case DW_OP_breg20: + case DW_OP_breg21: + case DW_OP_breg22: + case DW_OP_breg23: + case DW_OP_breg24: + case DW_OP_breg25: + case DW_OP_breg26: + case DW_OP_breg27: + case DW_OP_breg28: + case DW_OP_breg29: + case DW_OP_breg30: + case DW_OP_breg31: + success = FIRCLSDwarfExpressionMachineExecute_bregN(machine, opcode); + break; + case DW_OP_deref_size: + success = FIRCLSDwarfExpressionMachineExecute_deref_size(machine); + break; + default: + FIRCLSSDKLog("Error: Unrecognized DWARF expression opcode 0x%x\n", opcode); + return false; + } + + return success; +} + +#pragma mark - +#pragma mark Helpers +static intptr_t FIRCLSDwarfExpressionMachineStackPop(FIRCLSDwarfExpressionMachine *machine) { + return FIRCLSDwarfExpressionStackPop(&machine->stack); +} + +static bool FIRCLSDwarfExpressionMachineStackPush(FIRCLSDwarfExpressionMachine *machine, + intptr_t value) { + return FIRCLSDwarfExpressionStackPush(&machine->stack, value); +} + +#pragma mark - +#pragma mark Opcode Implementations +static bool FIRCLSDwarfExpressionMachineExecute_bregN(FIRCLSDwarfExpressionMachine *machine, + uint8_t opcode) { + // find the register number, compute offset value, push + const uint8_t regNum = opcode - DW_OP_breg0; + + if (regNum > CLS_DWARF_MAX_REGISTER_NUM) { + FIRCLSSDKLog("Error: DW_OP_breg invalid register number\n"); + return false; + } + + int64_t offset = FIRCLSParseLEB128AndAdvance(&machine->dataCursor); + + FIRCLSSDKLog("DW_OP_breg %d value %d\n", regNum, (int)offset); + + const intptr_t value = + FIRCLSDwarfUnwindGetRegisterValue(machine->registers, regNum) + (intptr_t)offset; + + return FIRCLSDwarfExpressionMachineStackPush(machine, value); +} + +static bool FIRCLSDwarfExpressionMachineExecute_deref(FIRCLSDwarfExpressionMachine *machine) { + // pop stack, dereference, push result + intptr_t value = FIRCLSDwarfExpressionMachineStackPop(machine); + + FIRCLSSDKLog("DW_OP_deref value %p\n", (void *)value); + + if (!FIRCLSReadMemory(value, &value, sizeof(value))) { + FIRCLSSDKLog("Error: DW_OP_deref failed to read memory\n"); + return false; + } + + return FIRCLSDwarfExpressionMachineStackPush(machine, value); +} + +static bool FIRCLSDwarfExpressionMachineExecute_plus_uconst(FIRCLSDwarfExpressionMachine *machine) { + // pop stack, add constant, push result + intptr_t value = FIRCLSDwarfExpressionMachineStackPop(machine); + + value += FIRCLSParseULEB128AndAdvance(&machine->dataCursor); + + FIRCLSSDKLog("DW_OP_plus_uconst value %lu\n", value); + + return FIRCLSDwarfExpressionMachineStackPush(machine, value); +} + +static bool FIRCLSDwarfExpressionMachineExecute_and(FIRCLSDwarfExpressionMachine *machine) { + FIRCLSSDKLog("DW_OP_plus_and\n"); + + intptr_t value = FIRCLSDwarfExpressionMachineStackPop(machine); + + value = value & FIRCLSDwarfExpressionMachineStackPop(machine); + + return FIRCLSDwarfExpressionMachineStackPush(machine, value); +} + +static bool FIRCLSDwarfExpressionMachineExecute_plus(FIRCLSDwarfExpressionMachine *machine) { + FIRCLSSDKLog("DW_OP_plus\n"); + + intptr_t value = FIRCLSDwarfExpressionMachineStackPop(machine); + + value = value + FIRCLSDwarfExpressionMachineStackPop(machine); + + return FIRCLSDwarfExpressionMachineStackPush(machine, value); +} + +static bool FIRCLSDwarfExpressionMachineExecute_dup(FIRCLSDwarfExpressionMachine *machine) { + // duplicate top of stack + intptr_t value = FIRCLSDwarfExpressionStackPeek(&machine->stack); + + FIRCLSSDKLog("DW_OP_dup value %lu\n", value); + + return FIRCLSDwarfExpressionMachineStackPush(machine, value); +} + +static bool FIRCLSDwarfExpressionMachineExecute_swap(FIRCLSDwarfExpressionMachine *machine) { + // swap top two values on the stack + intptr_t valueA = FIRCLSDwarfExpressionMachineStackPop(machine); + intptr_t valueB = FIRCLSDwarfExpressionMachineStackPop(machine); + + FIRCLSSDKLog("DW_OP_swap\n"); + + if (!FIRCLSDwarfExpressionMachineStackPush(machine, valueA)) { + return false; + } + + return FIRCLSDwarfExpressionMachineStackPush(machine, valueB); +} + +static bool FIRCLSDwarfExpressionMachineExecute_deref_size(FIRCLSDwarfExpressionMachine *machine) { + // pop stack, dereference variable sized value, push result + const void *address = (const void *)FIRCLSDwarfExpressionMachineStackPop(machine); + const uint8_t readSize = FIRCLSParseUint8AndAdvance(&machine->dataCursor); + intptr_t value = 0; + + FIRCLSSDKLog("DW_OP_deref_size %p size %u\n", address, readSize); + + switch (readSize) { + case 1: + value = FIRCLSParseUint8AndAdvance(&address); + break; + case 2: + value = FIRCLSParseUint16AndAdvance(&address); + break; + case 4: + value = FIRCLSParseUint32AndAdvance(&address); + break; + case 8: + // this is a little funky, as an 8 here really doesn't make sense for 32-bit platforms + value = (intptr_t)FIRCLSParseUint64AndAdvance(&address); + break; + default: + FIRCLSSDKLog("Error: unrecognized DW_OP_deref_size argument %x\n", readSize); + return false; + } + + return FIRCLSDwarfExpressionMachineStackPush(machine, value); +} + +static bool FIRCLSDwarfExpressionMachineExecute_ne(FIRCLSDwarfExpressionMachine *machine) { + FIRCLSSDKLog("DW_OP_ne\n"); + + intptr_t value = FIRCLSDwarfExpressionMachineStackPop(machine); + + value = value != FIRCLSDwarfExpressionMachineStackPop(machine); + + return FIRCLSDwarfExpressionMachineStackPush(machine, value); +} + +static bool FIRCLSDwarfExpressionMachineExecute_litN(FIRCLSDwarfExpressionMachine *machine, + uint8_t opcode) { + const uint8_t value = opcode - DW_OP_lit0; + + FIRCLSSDKLog("DW_OP_lit %u\n", value); + + return FIRCLSDwarfExpressionMachineStackPush(machine, value); +} + +#else +INJECT_STRIP_SYMBOL(dwarf_expression_machine) +#endif diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Unwind/Dwarf/FIRCLSDwarfExpressionMachine.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Unwind/Dwarf/FIRCLSDwarfExpressionMachine.h new file mode 100644 index 0000000..2fb4628 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Unwind/Dwarf/FIRCLSDwarfExpressionMachine.h @@ -0,0 +1,55 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once + +#include +#include + +#include "Crashlytics/Crashlytics/Helpers/FIRCLSFeatures.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSThreadState.h" + +#define CLS_DWARF_EXPRESSION_STACK_SIZE (100) + +#if CLS_DWARF_UNWINDING_SUPPORTED + +typedef struct { + intptr_t buffer[CLS_DWARF_EXPRESSION_STACK_SIZE]; + intptr_t *pointer; +} FIRCLSDwarfExpressionStack; + +typedef struct { + FIRCLSDwarfExpressionStack stack; + const void *dataCursor; + const void *endAddress; + const FIRCLSThreadContext *registers; +} FIRCLSDwarfExpressionMachine; + +void FIRCLSDwarfExpressionStackInit(FIRCLSDwarfExpressionStack *stack); +bool FIRCLSDwarfExpressionStackIsValid(FIRCLSDwarfExpressionStack *stack); +bool FIRCLSDwarfExpressionStackPush(FIRCLSDwarfExpressionStack *stack, intptr_t value); +intptr_t FIRCLSDwarfExpressionStackPeek(FIRCLSDwarfExpressionStack *stack); +intptr_t FIRCLSDwarfExpressionStackPop(FIRCLSDwarfExpressionStack *stack); + +bool FIRCLSDwarfExpressionMachineInit(FIRCLSDwarfExpressionMachine *machine, + const void *cursor, + const FIRCLSThreadContext *registers, + intptr_t stackValue); +bool FIRCLSDwarfExpressionMachinePrepareForExecution(FIRCLSDwarfExpressionMachine *machine); +bool FIRCLSDwarfExpressionMachineIsFinished(FIRCLSDwarfExpressionMachine *machine); +bool FIRCLSDwarfExpressionMachineGetResult(FIRCLSDwarfExpressionMachine *machine, intptr_t *result); + +bool FIRCLSDwarfExpressionMachineExecuteNextOpcode(FIRCLSDwarfExpressionMachine *machine); + +#endif diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Unwind/Dwarf/FIRCLSDwarfUnwind.c b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Unwind/Dwarf/FIRCLSDwarfUnwind.c new file mode 100644 index 0000000..de6e2aa --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Unwind/Dwarf/FIRCLSDwarfUnwind.c @@ -0,0 +1,1001 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "Crashlytics/Crashlytics/Unwind/Dwarf/FIRCLSDwarfUnwind.h" +#include "Crashlytics/Crashlytics/Unwind/Dwarf/FIRCLSDataParsing.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSDefines.h" +#include "Crashlytics/Crashlytics/Unwind/Dwarf/FIRCLSDwarfExpressionMachine.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSFeatures.h" +#include "Crashlytics/Crashlytics/Unwind/FIRCLSUnwind_arch.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSUtility.h" +#include "Crashlytics/third_party/libunwind/dwarf.h" + +#include + +#if CLS_DWARF_UNWINDING_SUPPORTED + +#define FIRCLSDwarfLog(__FORMAT__, ...) FIRCLSSDKLog(__FORMAT__, ##__VA_ARGS__) + +#define CLS_DWARF_EXPRESSION_STACK_SIZE (100) + +#pragma mark Prototypes +static bool FIRCLSDwarfParseAndProcessAugmentation(DWARFCIERecord* record, const void** ptr); + +#pragma mark - Record Parsing +bool FIRCLSDwarfParseCIERecord(DWARFCIERecord* cie, const void* ptr) { + if (!cie || !ptr) { + return false; + } + + memset(cie, 0, sizeof(DWARFCIERecord)); + + cie->length = FIRCLSParseRecordLengthAndAdvance(&ptr); + if (cie->length == 0) { + FIRCLSSDKLog("Error: CIE length invalid\n"); + return false; + } + + // the length does not include the length field(s) themselves + const void* endAddress = ptr + cie->length; + + if (FIRCLSParseUint32AndAdvance(&ptr) != DWARF_CIE_ID_CIE_FLAG) { + FIRCLSSDKLog("Error: CIE flag not found\n"); + } + + cie->version = FIRCLSParseUint8AndAdvance(&ptr); + if (cie->version != 1 && cie->version != 3) { + FIRCLSSDKLog("Error: CIE version %u unsupported\n", cie->version); + } + + cie->pointerEncoding = DW_EH_PE_absptr; + cie->lsdaEncoding = DW_EH_PE_absptr; + + cie->augmentation = FIRCLSParseStringAndAdvance(&ptr); + cie->codeAlignFactor = FIRCLSParseULEB128AndAdvance(&ptr); + cie->dataAlignFactor = FIRCLSParseLEB128AndAdvance(&ptr); + + switch (cie->version) { + case 1: + cie->returnAddressRegister = FIRCLSParseUint8AndAdvance(&ptr); + break; + case 3: + cie->returnAddressRegister = FIRCLSParseULEB128AndAdvance(&ptr); + break; + default: + FIRCLSSDKLog("Error: CIE version %u unsupported\n", cie->version); + return false; + } + + if (!FIRCLSDwarfParseAndProcessAugmentation(cie, &ptr)) { + return false; + } + + cie->instructions.data = ptr; + cie->instructions.length = (uint32_t)(endAddress - ptr); + + return true; +} + +static bool FIRCLSDwarfParseAndProcessAugmentation(DWARFCIERecord* record, const void** ptr) { + if (!record || !ptr) { + return false; + } + + if (!record->augmentation) { + return false; + } + + if (record->augmentation[0] == 0) { + return true; + } + + if (record->augmentation[0] != 'z') { + FIRCLSSDKLog("Error: Unimplemented: augmentation string %s\n", record->augmentation); + return false; + } + + size_t stringLength = strlen(record->augmentation); + + uint64_t dataLength = FIRCLSParseULEB128AndAdvance(ptr); + const void* ending = *ptr + dataLength; + + // start at 1 because we know the first character is a 'z' + for (size_t i = 1; i < stringLength; ++i) { + switch (record->augmentation[i]) { + case 'L': + // There is an LSDA pointer encoding present. The actual address of the LSDA + // is in the FDE + record->lsdaEncoding = FIRCLSParseUint8AndAdvance(ptr); + break; + case 'R': + // There is a pointer encoding present, used for all addresses in an FDE. + record->pointerEncoding = FIRCLSParseUint8AndAdvance(ptr); + break; + case 'P': + // Two arguments. A pointer encoding, and a pointer to a personality function encoded + // with that value. + record->personalityEncoding = FIRCLSParseUint8AndAdvance(ptr); + record->personalityFunction = + FIRCLSParseAddressWithEncodingAndAdvance(ptr, record->personalityEncoding); + if (record->personalityFunction == CLS_INVALID_ADDRESS) { + FIRCLSSDKLog("Error: Found an invalid start address\n"); + return false; + } + break; + case 'S': + record->signalFrame = true; + break; + default: + FIRCLSSDKLog("Error: Unhandled augmentation string entry %c\n", record->augmentation[i]); + return false; + } + + // small sanity check + if (*ptr > ending) { + return false; + } + } + + return true; +} + +bool FIRCLSDwarfParseFDERecord(DWARFFDERecord* fdeRecord, + bool parseCIE, + DWARFCIERecord* cieRecord, + const void* ptr) { + if (!fdeRecord || !cieRecord || !ptr) { + return false; + } + + fdeRecord->length = FIRCLSParseRecordLengthAndAdvance(&ptr); + if (fdeRecord->length == 0) { + FIRCLSSDKLog("Error: FDE has zero length\n"); + return false; + } + + // length does not include length field + const void* endAddress = ptr + fdeRecord->length; + + // According to the spec, this is 32/64 bit value, but libunwind always + // parses this as a 32bit value. + fdeRecord->cieOffset = FIRCLSParseUint32AndAdvance(&ptr); + if (fdeRecord->cieOffset == 0) { + FIRCLSSDKLog("Error: CIE offset invalid\n"); + return false; + } + + if (parseCIE) { + // The CIE offset is really weird. It appears to be an offset from the + // beginning of its field. This isn't what the documentation says, but it is + // a little ambiguous. This is what DwarfParser.hpp does. + // Note that we have to back up one sizeof(uint32_t), because we've advanced + // by parsing the offset + const void* ciePointer = ptr - fdeRecord->cieOffset - sizeof(uint32_t); + if (!FIRCLSDwarfParseCIERecord(cieRecord, ciePointer)) { + FIRCLSSDKLog("Error: Unable to parse CIE record\n"); + return false; + } + } + + if (!FIRCLSDwarfCIEIsValid(cieRecord)) { + FIRCLSSDKLog("Error: CIE invalid\n"); + return false; + } + + // the next field depends on the pointer encoding style used + fdeRecord->startAddress = + FIRCLSParseAddressWithEncodingAndAdvance(&ptr, cieRecord->pointerEncoding); + if (fdeRecord->startAddress == CLS_INVALID_ADDRESS) { + FIRCLSSDKLog("Error: Found an invalid start address\n"); + return false; + } + + // Here's something weird too. The range is encoded as a "special" address, where only the value + // is used, regardless of other pointer-encoding schemes. + fdeRecord->rangeSize = FIRCLSParseAddressWithEncodingAndAdvance( + &ptr, cieRecord->pointerEncoding & DW_EH_PE_VALUE_MASK); + if (fdeRecord->rangeSize == CLS_INVALID_ADDRESS) { + FIRCLSSDKLog("Error: Found an invalid address range\n"); + return false; + } + + // Just skip over the section for now. The data here is only needed for personality functions, + // which we don't need + if (FIRCLSDwarfCIEHasAugmentationData(cieRecord)) { + uintptr_t augmentationLength = (uintptr_t)FIRCLSParseULEB128AndAdvance(&ptr); + + ptr += augmentationLength; + } + + fdeRecord->instructions.data = ptr; + fdeRecord->instructions.length = (uint32_t)(endAddress - ptr); + + return true; +} + +bool FIRCLSDwarfParseCFIFromFDERecord(FIRCLSDwarfCFIRecord* record, const void* ptr) { + if (!record || !ptr) { + return false; + } + + return FIRCLSDwarfParseFDERecord(&record->fde, true, &record->cie, ptr); +} + +bool FIRCLSDwarfParseCFIFromFDERecordOffset(FIRCLSDwarfCFIRecord* record, + const void* ehFrame, + uintptr_t fdeOffset) { + if (!record || !ehFrame || (fdeOffset == 0)) { + return false; + } + + const void* ptr = ehFrame + fdeOffset; + + return FIRCLSDwarfParseCFIFromFDERecord(record, ptr); +} + +#pragma mark - Properties +bool FIRCLSDwarfCIEIsValid(DWARFCIERecord* cie) { + if (!cie) { + return false; + } + + if (cie->length == 0) { + return false; + } + + if (cie->version != 1 && cie->version != 3) { + return false; + } + + return true; +} + +bool FIRCLSDwarfCIEHasAugmentationData(DWARFCIERecord* cie) { + if (!cie) { + return false; + } + + if (!cie->augmentation) { + return false; + } + + return cie->augmentation[0] == 'z'; +} + +#pragma mark - Instructions + +static bool FIRCLSDwarfParseAndExecute_set_loc(const void** cursor, + DWARFCIERecord* cieRecord, + intptr_t* codeOffset) { + uintptr_t operand = FIRCLSParseAddressWithEncodingAndAdvance(cursor, cieRecord->pointerEncoding); + + *codeOffset = operand; + + FIRCLSDwarfLog("DW_CFA_set_loc %lu\n", operand); + + return true; +} + +static bool FIRCLSDwarfParseAndExecute_advance_loc1(const void** cursor, + DWARFCIERecord* cieRecord, + intptr_t* codeOffset) { + int64_t offset = FIRCLSParseUint8AndAdvance(cursor) * cieRecord->codeAlignFactor; + + *codeOffset += offset; + + FIRCLSDwarfLog("DW_CFA_advance_loc1 %lld\n", offset); + + return true; +} + +static bool FIRCLSDwarfParseAndExecute_advance_loc2(const void** cursor, + DWARFCIERecord* cieRecord, + intptr_t* codeOffset) { + int64_t offset = FIRCLSParseUint16AndAdvance(cursor) * cieRecord->codeAlignFactor; + + *codeOffset += offset; + + FIRCLSDwarfLog("DW_CFA_advance_loc2 %lld\n", offset); + + return true; +} + +static bool FIRCLSDwarfParseAndExecute_advance_loc4(const void** cursor, + DWARFCIERecord* cieRecord, + intptr_t* codeOffset) { + int64_t offset = FIRCLSParseUint32AndAdvance(cursor) * cieRecord->codeAlignFactor; + + *codeOffset += offset; + + FIRCLSDwarfLog("DW_CFA_advance_loc4 %lld\n", offset); + + return true; +} + +static bool FIRCLSDwarfParseAndExecute_def_cfa(const void** cursor, + DWARFCIERecord* cieRecord, + FIRCLSDwarfState* state) { + uint64_t regNum = FIRCLSParseULEB128AndAdvance(cursor); + + if (regNum > CLS_DWARF_MAX_REGISTER_NUM) { + FIRCLSSDKLog("Error: Found an invalid DW_CFA_def_cfa register number\n"); + return false; + } + + int64_t offset = FIRCLSParseULEB128AndAdvance(cursor); + + state->cfaRegister = regNum; + state->cfaRegisterOffset = offset; + + FIRCLSDwarfLog("DW_CFA_def_cfa %llu, %lld\n", regNum, offset); + + return true; +} + +static bool FIRCLSDwarfParseAndExecute_def_cfa_register(const void** cursor, + DWARFCIERecord* cieRecord, + FIRCLSDwarfState* state) { + uint64_t regNum = FIRCLSParseULEB128AndAdvance(cursor); + + if (regNum > CLS_DWARF_MAX_REGISTER_NUM) { + FIRCLSSDKLog("Error: Found an invalid DW_CFA_def_cfa_register register number\n"); + return false; + } + + state->cfaRegister = regNum; + + FIRCLSDwarfLog("DW_CFA_def_cfa_register %llu\n", regNum); + + return true; +} + +static bool FIRCLSDwarfParseAndExecute_def_cfa_offset(const void** cursor, + DWARFCIERecord* cieRecord, + FIRCLSDwarfState* state) { + uint64_t offset = FIRCLSParseULEB128AndAdvance(cursor); + + state->cfaRegisterOffset = offset; + + FIRCLSDwarfLog("DW_CFA_def_cfa_offset %lld\n", offset); + + return true; +} + +static bool FIRCLSDwarfParseAndExecute_same_value(const void** cursor, + DWARFCIERecord* cieRecord, + FIRCLSDwarfState* state) { + uint64_t regNum = FIRCLSParseULEB128AndAdvance(cursor); + + if (regNum > CLS_DWARF_MAX_REGISTER_NUM) { + FIRCLSSDKLog("Error: Found an invalid DW_CFA_same_value register number\n"); + return false; + } + + state->registers[regNum].location = FIRCLSDwarfRegisterUnused; + + FIRCLSDwarfLog("DW_CFA_same_value %llu\n", regNum); + + return true; +} + +static bool FIRCLSDwarfParseAndExecute_register(const void** cursor, + DWARFCIERecord* cieRecord, + FIRCLSDwarfState* state) { + uint64_t regNum = FIRCLSParseULEB128AndAdvance(cursor); + + if (regNum > CLS_DWARF_MAX_REGISTER_NUM) { + FIRCLSSDKLog("Error: Found an invalid DW_CFA_register number\n"); + return false; + } + + uint64_t regValue = FIRCLSParseULEB128AndAdvance(cursor); + + if (regValue > CLS_DWARF_MAX_REGISTER_NUM) { + FIRCLSSDKLog("Error: Found an invalid DW_CFA_register value\n"); + return false; + } + + state->registers[regNum].location = FIRCLSDwarfRegisterInRegister; + state->registers[regNum].value = regValue; + + FIRCLSDwarfLog("DW_CFA_register %llu %llu\n", regNum, regValue); + + return true; +} + +static bool FIRCLSDwarfParseAndExecute_expression(const void** cursor, + DWARFCIERecord* cieRecord, + FIRCLSDwarfState* state) { + uint64_t regNum = FIRCLSParseULEB128AndAdvance(cursor); + + if (regNum > CLS_DWARF_MAX_REGISTER_NUM) { + FIRCLSSDKLog("Error: Found an invalid DW_CFA_expression register number\n"); + return false; + } + + state->registers[regNum].location = FIRCLSDwarfRegisterAtExpression; + state->registers[regNum].value = (uintptr_t)*cursor; + + // read the length of the expression, and advance past it + uint64_t length = FIRCLSParseULEB128AndAdvance(cursor); + *cursor += length; + + FIRCLSDwarfLog("DW_CFA_expression %llu %llu\n", regNum, length); + + return true; +} + +static bool FIRCLSDwarfParseAndExecute_val_expression(const void** cursor, + DWARFCIERecord* cieRecord, + FIRCLSDwarfState* state) { + uint64_t regNum = FIRCLSParseULEB128AndAdvance(cursor); + + if (regNum > CLS_DWARF_MAX_REGISTER_NUM) { + FIRCLSSDKLog("Error: Found an invalid DW_CFA_val_expression register number\n"); + return false; + } + + state->registers[regNum].location = FIRCLSDwarfRegisterIsExpression; + state->registers[regNum].value = (uintptr_t)*cursor; + + // read the length of the expression, and advance past it + uint64_t length = FIRCLSParseULEB128AndAdvance(cursor); + *cursor += length; + + FIRCLSDwarfLog("DW_CFA_val_expression %llu %llu\n", regNum, length); + + return true; +} + +static bool FIRCLSDwarfParseAndExecute_def_cfa_expression(const void** cursor, + DWARFCIERecord* cieRecord, + FIRCLSDwarfState* state) { + state->cfaRegister = CLS_DWARF_INVALID_REGISTER_NUM; + state->cfaExpression = *cursor; + + // read the length of the expression, and advance past it + uint64_t length = FIRCLSParseULEB128AndAdvance(cursor); + *cursor += length; + + FIRCLSDwarfLog("DW_CFA_def_cfa_expression %llu\n", length); + + return true; +} + +static bool FIRCLSDwarfParseAndExecute_offset(const void** cursor, + DWARFCIERecord* cieRecord, + FIRCLSDwarfState* state, + uint8_t regNum) { + if (regNum > CLS_DWARF_MAX_REGISTER_NUM) { + FIRCLSSDKLog("Error: Found an invalid DW_CFA_offset register number\n"); + return false; + } + + int64_t offset = FIRCLSParseULEB128AndAdvance(cursor) * cieRecord->dataAlignFactor; + + state->registers[regNum].location = FIRCLSDwarfRegisterInCFA; + state->registers[regNum].value = offset; + + FIRCLSDwarfLog("DW_CFA_offset %u, %lld\n", regNum, offset); + + return true; +} + +static bool FIRCLSDwarfParseAndExecute_advance_loc(const void** cursor, + DWARFCIERecord* cieRecord, + FIRCLSDwarfState* state, + uint8_t delta, + intptr_t* codeOffset) { + if (!FIRCLSIsValidPointer(codeOffset) || !FIRCLSIsValidPointer(cieRecord)) { + FIRCLSSDKLog("Error: invalid inputs\n"); + return false; + } + + *codeOffset = delta * (intptr_t)cieRecord->codeAlignFactor; + + FIRCLSDwarfLog("DW_CFA_advance_loc %u\n", delta); + + return true; +} + +static bool FIRCLSDwarfParseAndExecuteInstructionWithOperand(const void** cursor, + uint8_t instruction, + DWARFCIERecord* cieRecord, + FIRCLSDwarfState* state, + intptr_t* codeOffset) { + uint8_t operand = instruction & DW_CFA_OPERAND_MASK; + bool success = false; + + switch (instruction & DW_CFA_OPCODE_MASK) { + case DW_CFA_offset: + success = FIRCLSDwarfParseAndExecute_offset(cursor, cieRecord, state, operand); + break; + case DW_CFA_advance_loc: + success = + FIRCLSDwarfParseAndExecute_advance_loc(cursor, cieRecord, state, operand, codeOffset); + break; + case DW_CFA_restore: + FIRCLSSDKLog("Error: Unimplemented DWARF instruction with operand 0x%x\n", instruction); + break; + default: + FIRCLSSDKLog("Error: Unrecognized DWARF instruction 0x%x\n", instruction); + break; + } + + return success; +} + +#pragma mark - Expressions +static bool FIRCLSDwarfEvalulateExpression(const void* cursor, + const FIRCLSThreadContext* registers, + intptr_t stackValue, + intptr_t* result) { + FIRCLSDwarfLog("starting at %p with initial value %lx\n", cursor, stackValue); + + if (!FIRCLSIsValidPointer(cursor) || !FIRCLSIsValidPointer(result)) { + FIRCLSSDKLog("Error: inputs invalid\n"); + return false; + } + + FIRCLSDwarfExpressionMachine machine; + + if (!FIRCLSDwarfExpressionMachineInit(&machine, cursor, registers, stackValue)) { + FIRCLSSDKLog("Error: unable to init DWARF expression machine\n"); + return false; + } + + if (!FIRCLSDwarfExpressionMachinePrepareForExecution(&machine)) { + FIRCLSSDKLog("Error: unable to prepare for execution\n"); + return false; + } + + while (!FIRCLSDwarfExpressionMachineIsFinished(&machine)) { + if (!FIRCLSDwarfExpressionMachineExecuteNextOpcode(&machine)) { + FIRCLSSDKLog("Error: failed to execute DWARF machine opcode\n"); + return false; + } + } + + if (!FIRCLSDwarfExpressionMachineGetResult(&machine, result)) { + FIRCLSSDKLog("Error: failed to get DWARF expression result\n"); + return false; + } + + FIRCLSDwarfLog("successfully computed expression result\n"); + + return true; +} + +#pragma mark - Execution +bool FIRCLSDwarfInstructionsEnumerate(DWARFInstructions* instructions, + DWARFCIERecord* cieRecord, + FIRCLSDwarfState* state, + intptr_t pcOffset) { + if (!instructions || !cieRecord || !state) { + FIRCLSSDKLog("Error: inputs invalid\n"); + return false; + } + + // This is a little bit of state that can't be put into the state structure, because + // it is possible for instructions to push/pop state that does not affect this value. + intptr_t codeOffset = 0; + + const void* cursor = instructions->data; + const void* endAddress = cursor + instructions->length; + + FIRCLSDwarfLog("Running instructions from %p to %p\n", cursor, endAddress); + + // parse the instructions, as long as: + // - our data pointer is still in range + // - the pc offset is within the range of instructions that apply + + while ((cursor < endAddress) && (codeOffset < pcOffset)) { + uint8_t instruction = FIRCLSParseUint8AndAdvance(&cursor); + bool success = false; + + switch (instruction) { + case DW_CFA_nop: + FIRCLSDwarfLog("DW_CFA_nop\n"); + continue; + case DW_CFA_set_loc: + success = FIRCLSDwarfParseAndExecute_set_loc(&cursor, cieRecord, &codeOffset); + break; + case DW_CFA_advance_loc1: + success = FIRCLSDwarfParseAndExecute_advance_loc1(&cursor, cieRecord, &codeOffset); + break; + case DW_CFA_advance_loc2: + success = FIRCLSDwarfParseAndExecute_advance_loc2(&cursor, cieRecord, &codeOffset); + break; + case DW_CFA_advance_loc4: + success = FIRCLSDwarfParseAndExecute_advance_loc4(&cursor, cieRecord, &codeOffset); + break; + case DW_CFA_def_cfa: + success = FIRCLSDwarfParseAndExecute_def_cfa(&cursor, cieRecord, state); + break; + case DW_CFA_def_cfa_register: + success = FIRCLSDwarfParseAndExecute_def_cfa_register(&cursor, cieRecord, state); + break; + case DW_CFA_def_cfa_offset: + success = FIRCLSDwarfParseAndExecute_def_cfa_offset(&cursor, cieRecord, state); + break; + case DW_CFA_same_value: + success = FIRCLSDwarfParseAndExecute_same_value(&cursor, cieRecord, state); + break; + case DW_CFA_register: + success = FIRCLSDwarfParseAndExecute_register(&cursor, cieRecord, state); + break; + case DW_CFA_def_cfa_expression: + success = FIRCLSDwarfParseAndExecute_def_cfa_expression(&cursor, cieRecord, state); + break; + case DW_CFA_expression: + success = FIRCLSDwarfParseAndExecute_expression(&cursor, cieRecord, state); + break; + case DW_CFA_val_expression: + success = FIRCLSDwarfParseAndExecute_val_expression(&cursor, cieRecord, state); + break; + case DW_CFA_offset_extended: + case DW_CFA_restore_extended: + case DW_CFA_undefined: + case DW_CFA_remember_state: + case DW_CFA_restore_state: + case DW_CFA_offset_extended_sf: + case DW_CFA_def_cfa_sf: + case DW_CFA_def_cfa_offset_sf: + case DW_CFA_val_offset: + case DW_CFA_val_offset_sf: + case DW_CFA_GNU_window_save: + case DW_CFA_GNU_args_size: + case DW_CFA_GNU_negative_offset_extended: + FIRCLSSDKLog("Error: Unimplemented DWARF instruction 0x%x\n", instruction); + return false; + default: + success = FIRCLSDwarfParseAndExecuteInstructionWithOperand(&cursor, instruction, cieRecord, + state, &codeOffset); + break; + } + + if (!success) { + FIRCLSSDKLog("Error: Failed to execute dwarf instruction 0x%x\n", instruction); + return false; + } + } + + return true; +} + +bool FIRCLSDwarfUnwindComputeRegisters(FIRCLSDwarfCFIRecord* record, + FIRCLSThreadContext* registers) { + if (!record || !registers) { + return false; + } + + // We need to run the dwarf instructions to compute our register values. + // - initialize state + // - run the CIE instructions + // - run the FDE instructions + // - grab the values + + FIRCLSDwarfState state; + + memset(&state, 0, sizeof(FIRCLSDwarfState)); + + // We need to run all the instructions in the CIE record. So, pass in a large value for the pc + // offset so we don't stop early. + if (!FIRCLSDwarfInstructionsEnumerate(&record->cie.instructions, &record->cie, &state, + INTPTR_MAX)) { + FIRCLSSDKLog("Error: Unable to run CIE instructions\n"); + return false; + } + + intptr_t pcOffset = FIRCLSThreadContextGetPC(registers) - record->fde.startAddress; + if (pcOffset < 0) { + FIRCLSSDKLog("Error: The FDE pcOffset value cannot be negative\n"); + return false; + } + + if (!FIRCLSDwarfInstructionsEnumerate(&record->fde.instructions, &record->cie, &state, + pcOffset)) { + FIRCLSSDKLog("Error: Unable to run FDE instructions\n"); + return false; + } + + uintptr_t cfaRegister = 0; + + if (!FIRCLSDwarfGetCFA(&state, registers, &cfaRegister)) { + FIRCLSSDKLog("Error: failed to get CFA\n"); + return false; + } + + if (!FIRCLSDwarfUnwindAssignRegisters(&state, registers, cfaRegister, registers)) { + FIRCLSSDKLogError("Error: Unable to assign DWARF registers\n"); + return false; + } + + return true; +} + +bool FIRCLSDwarfUnwindAssignRegisters(const FIRCLSDwarfState* state, + const FIRCLSThreadContext* registers, + uintptr_t cfaRegister, + FIRCLSThreadContext* outputRegisters) { + if (!FIRCLSIsValidPointer(state) || !FIRCLSIsValidPointer(registers)) { + FIRCLSSDKLogError("Error: input invalid\n"); + return false; + } + + // make a copy, which we'll be changing + FIRCLSThreadContext newThreadState = *registers; + + // loop through all the registers, so we can set their values + for (size_t i = 0; i <= CLS_DWARF_MAX_REGISTER_NUM; ++i) { + if (state->registers[i].location == FIRCLSDwarfRegisterUnused) { + continue; + } + + const uintptr_t value = + FIRCLSDwarfGetSavedRegister(registers, cfaRegister, state->registers[i]); + + if (!FIRCLSDwarfUnwindSetRegisterValue(&newThreadState, i, value)) { + FIRCLSSDKLog("Error: Unable to restore register value\n"); + return false; + } + } + + if (!FIRCLSDwarfUnwindSetRegisterValue(&newThreadState, CLS_DWARF_REG_SP, cfaRegister)) { + FIRCLSSDKLog("Error: Unable to restore SP value\n"); + return false; + } + + // sanity-check that things have changed + if (FIRCLSDwarfCompareRegisters(registers, &newThreadState, CLS_DWARF_REG_SP)) { + FIRCLSSDKLog("Error: Stack pointer hasn't changed\n"); + return false; + } + + if (FIRCLSDwarfCompareRegisters(registers, &newThreadState, CLS_DWARF_REG_RETURN)) { + FIRCLSSDKLog("Error: PC hasn't changed\n"); + return false; + } + + // set our new value + *outputRegisters = newThreadState; + + return true; +} + +#pragma mark - Register Operations +bool FIRCLSDwarfCompareRegisters(const FIRCLSThreadContext* a, + const FIRCLSThreadContext* b, + uint64_t registerNum) { + return FIRCLSDwarfUnwindGetRegisterValue(a, registerNum) == + FIRCLSDwarfUnwindGetRegisterValue(b, registerNum); +} + +bool FIRCLSDwarfGetCFA(FIRCLSDwarfState* state, + const FIRCLSThreadContext* registers, + uintptr_t* cfa) { + if (!FIRCLSIsValidPointer(state) || !FIRCLSIsValidPointer(registers) || + !FIRCLSIsValidPointer(cfa)) { + FIRCLSSDKLog("Error: invalid input\n"); + return false; + } + + if (state->cfaExpression) { + if (!FIRCLSDwarfEvalulateExpression(state->cfaExpression, registers, 0, (intptr_t*)cfa)) { + FIRCLSSDKLog("Error: failed to compute CFA expression\n"); + return false; + } + + return true; + } + + // libunwind checks that cfaRegister is not zero. This seems like a potential bug - why couldn't + // it be zero? + + *cfa = FIRCLSDwarfUnwindGetRegisterValue(registers, state->cfaRegister) + + (uintptr_t)state->cfaRegisterOffset; + + return true; +} + +uintptr_t FIRCLSDwarfGetSavedRegister(const FIRCLSThreadContext* registers, + uintptr_t cfaRegister, + FIRCLSDwarfRegister dRegister) { + intptr_t result = 0; + + FIRCLSDwarfLog("Getting register %x\n", dRegister.location); + + switch (dRegister.location) { + case FIRCLSDwarfRegisterInCFA: { + const uintptr_t address = cfaRegister + (uintptr_t)dRegister.value; + + if (!FIRCLSReadMemory(address, &result, sizeof(result))) { + FIRCLSSDKLog("Error: Unable to read CFA value\n"); + return 0; + } + } + return result; + case FIRCLSDwarfRegisterInRegister: + return FIRCLSDwarfUnwindGetRegisterValue(registers, dRegister.value); + case FIRCLSDwarfRegisterOffsetFromCFA: + FIRCLSSDKLog("Error: OffsetFromCFA unhandled\n"); + break; + case FIRCLSDwarfRegisterAtExpression: + if (!FIRCLSDwarfEvalulateExpression((void*)dRegister.value, registers, cfaRegister, + &result)) { + FIRCLSSDKLog("Error: unable to evaluate expression\n"); + return 0; + } + + if (!FIRCLSReadMemory(result, &result, sizeof(result))) { + FIRCLSSDKLog("Error: Unable to read memory computed from expression\n"); + return 0; + } + + return result; + case FIRCLSDwarfRegisterIsExpression: + if (!FIRCLSDwarfEvalulateExpression((void*)dRegister.value, registers, cfaRegister, + &result)) { + FIRCLSSDKLog("Error: unable to evaluate expression\n"); + return 0; + } + + return result; + default: + FIRCLSSDKLog("Error: Unrecognized register save location 0x%x\n", dRegister.location); + break; + } + + return 0; +} + +#if DEBUG +#pragma mark - Debugging +void FIRCLSCFIRecordShow(FIRCLSDwarfCFIRecord* record) { + if (!record) { + FIRCLSSDKLog("Error: CFI record: null\n"); + return; + } + + FIRCLSCIERecordShow(&record->cie); + FIRCLSFDERecordShow(&record->fde, &record->cie); +} + +void FIRCLSCIERecordShow(DWARFCIERecord* record) { + if (!record) { + FIRCLSSDKLog("Error: CIE: null\n"); + return; + } + + FIRCLSSDKLog("CIE:\n"); + FIRCLSSDKLog(" length: %llu\n", record->length); + FIRCLSSDKLog(" version: %u\n", record->version); + FIRCLSSDKLog(" augmentation: %s\n", record->augmentation); + FIRCLSSDKLog(" EH Data: 0x%04lx\n", record->ehData); + FIRCLSSDKLog("LSDA encoding: 0x%02x\n", record->lsdaEncoding); + FIRCLSSDKLog(" personality: 0x%lx\n", record->personalityFunction); + + FIRCLSDwarfPointerEncodingShow(" encoding", record->pointerEncoding); + FIRCLSDwarfPointerEncodingShow(" P encoding", record->personalityEncoding); + + FIRCLSSDKLog(" code align: %llu\n", record->codeAlignFactor); + FIRCLSSDKLog(" data align: %lld\n", record->dataAlignFactor); + FIRCLSSDKLog(" RA register: %llu\n", record->returnAddressRegister); + + FIRCLSDwarfInstructionsShow(&record->instructions, record); +} + +void FIRCLSFDERecordShow(DWARFFDERecord* record, DWARFCIERecord* cie) { + if (!record) { + FIRCLSSDKLog("FDE: null\n"); + return; + } + + FIRCLSSDKLog("FDE:\n"); + FIRCLSSDKLog(" length: %llu\n", record->length); + FIRCLSSDKLog(" CIE offset: %llu\n", record->cieOffset); + FIRCLSSDKLog(" start addr: 0x%lx\n", record->startAddress); + FIRCLSSDKLog(" range: %lu\n", record->rangeSize); + + FIRCLSDwarfInstructionsShow(&record->instructions, cie); +} + +void FIRCLSDwarfPointerEncodingShow(const char* leadString, uint8_t encoding) { + if (encoding == DW_EH_PE_omit) { + FIRCLSSDKLog("%s: 0x%02x (omit)\n", leadString, encoding); + } else { + const char* peValue = "unknown"; + const char* peOffset = ""; + + switch (encoding & DW_EH_PE_VALUE_MASK) { + case DW_EH_PE_absptr: + peValue = "DW_EH_PE_absptr"; + break; + case DW_EH_PE_uleb128: + peValue = "DW_EH_PE_uleb128"; + break; + case DW_EH_PE_udata2: + peValue = "DW_EH_PE_udata2"; + break; + case DW_EH_PE_udata4: + peValue = "DW_EH_PE_udata4"; + break; + case DW_EH_PE_udata8: + peValue = "DW_EH_PE_udata8"; + break; + case DW_EH_PE_signed: + peValue = "DW_EH_PE_signed"; + break; + case DW_EH_PE_sleb128: + peValue = "DW_EH_PE_sleb128"; + break; + case DW_EH_PE_sdata2: + peValue = "DW_EH_PE_sdata2"; + break; + case DW_EH_PE_sdata4: + peValue = "DW_EH_PE_sdata4"; + break; + case DW_EH_PE_sdata8: + peValue = "DW_EH_PE_sdata8"; + break; + default: + break; + } + + switch (encoding & DW_EH_PE_RELATIVE_OFFSET_MASK) { + case DW_EH_PE_absptr: + break; + case DW_EH_PE_pcrel: + peOffset = " + DW_EH_PE_pcrel"; + break; + case DW_EH_PE_textrel: + peOffset = " + DW_EH_PE_textrel"; + break; + case DW_EH_PE_datarel: + peOffset = " + DW_EH_PE_datarel"; + break; + case DW_EH_PE_funcrel: + peOffset = " + DW_EH_PE_funcrel"; + break; + case DW_EH_PE_aligned: + peOffset = " + DW_EH_PE_aligned"; + break; + case DW_EH_PE_indirect: + peOffset = " + DW_EH_PE_indirect"; + break; + default: + break; + } + + FIRCLSSDKLog("%s: 0x%02x (%s%s)\n", leadString, encoding, peValue, peOffset); + } +} + +void FIRCLSDwarfInstructionsShow(DWARFInstructions* instructions, DWARFCIERecord* cie) { + if (!instructions) { + FIRCLSSDKLog("Error: Instructions null\n"); + } + + FIRCLSDwarfState state; + + memset(&state, 0, sizeof(FIRCLSDwarfState)); + + FIRCLSDwarfInstructionsEnumerate(instructions, cie, &state, -1); +} + +#endif + +#else +INJECT_STRIP_SYMBOL(dwarf_unwind) +#endif diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Unwind/Dwarf/FIRCLSDwarfUnwind.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Unwind/Dwarf/FIRCLSDwarfUnwind.h new file mode 100644 index 0000000..1d83807 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Unwind/Dwarf/FIRCLSDwarfUnwind.h @@ -0,0 +1,138 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once + +#include +#include +#include + +#include "Crashlytics/Crashlytics/Helpers/FIRCLSThreadState.h" +#include "Crashlytics/Crashlytics/Unwind/Dwarf/FIRCLSDwarfUnwindRegisters.h" + +#if CLS_DWARF_UNWINDING_SUPPORTED + +#pragma mark Structures +typedef struct { + uint32_t length; + const void *data; +} DWARFInstructions; + +typedef struct { + uint64_t length; + uint8_t version; + uintptr_t ehData; // 8 bytes for 64-bit architectures, 4 bytes for 32 + const char *augmentation; + uint8_t pointerEncoding; + uint8_t lsdaEncoding; + uint8_t personalityEncoding; + uintptr_t personalityFunction; + uint64_t codeAlignFactor; + int64_t dataAlignFactor; + uint64_t returnAddressRegister; // is 64 bits enough for this value? + bool signalFrame; + + DWARFInstructions instructions; +} DWARFCIERecord; + +typedef struct { + uint64_t length; + uint64_t cieOffset; // also an arch-specific size + uintptr_t startAddress; + uintptr_t rangeSize; + + DWARFInstructions instructions; +} DWARFFDERecord; + +typedef struct { + DWARFCIERecord cie; + DWARFFDERecord fde; +} FIRCLSDwarfCFIRecord; + +typedef enum { + FIRCLSDwarfRegisterUnused = 0, + FIRCLSDwarfRegisterInCFA, + FIRCLSDwarfRegisterOffsetFromCFA, + FIRCLSDwarfRegisterInRegister, + FIRCLSDwarfRegisterAtExpression, + FIRCLSDwarfRegisterIsExpression +} FIRCLSDwarfRegisterLocation; + +typedef struct { + FIRCLSDwarfRegisterLocation location; + uint64_t value; +} FIRCLSDwarfRegister; + +typedef struct { + uint64_t cfaRegister; + int64_t cfaRegisterOffset; + const void *cfaExpression; + uint32_t spArgSize; + + FIRCLSDwarfRegister registers[CLS_DWARF_MAX_REGISTER_NUM + 1]; +} FIRCLSDwarfState; + +__BEGIN_DECLS + +#pragma mark - Parsing +bool FIRCLSDwarfParseCIERecord(DWARFCIERecord *cie, const void *ptr); +bool FIRCLSDwarfParseFDERecord(DWARFFDERecord *fdeRecord, + bool parseCIE, + DWARFCIERecord *cieRecord, + const void *ptr); +bool FIRCLSDwarfParseCFIFromFDERecord(FIRCLSDwarfCFIRecord *record, const void *ptr); +bool FIRCLSDwarfParseCFIFromFDERecordOffset(FIRCLSDwarfCFIRecord *record, + const void *ehFrame, + uintptr_t fdeOffset); + +#pragma mark - Properties +bool FIRCLSDwarfCIEIsValid(DWARFCIERecord *cie); +bool FIRCLSDwarfCIEHasAugmentationData(DWARFCIERecord *cie); + +#pragma mark - Execution +bool FIRCLSDwarfInstructionsEnumerate(DWARFInstructions *instructions, + DWARFCIERecord *cieRecord, + FIRCLSDwarfState *state, + intptr_t pcOffset); +bool FIRCLSDwarfUnwindComputeRegisters(FIRCLSDwarfCFIRecord *record, + FIRCLSThreadContext *registers); +bool FIRCLSDwarfUnwindAssignRegisters(const FIRCLSDwarfState *state, + const FIRCLSThreadContext *registers, + uintptr_t cfaRegister, + FIRCLSThreadContext *outputRegisters); + +#pragma mark - Register Operations +bool FIRCLSDwarfCompareRegisters(const FIRCLSThreadContext *a, + const FIRCLSThreadContext *b, + uint64_t registerNum); + +bool FIRCLSDwarfGetCFA(FIRCLSDwarfState *state, + const FIRCLSThreadContext *registers, + uintptr_t *cfa); +uintptr_t FIRCLSDwarfGetSavedRegister(const FIRCLSThreadContext *registers, + uintptr_t cfaRegister, + FIRCLSDwarfRegister dRegister); + +#if DEBUG +#pragma mark - Debugging +void FIRCLSCFIRecordShow(FIRCLSDwarfCFIRecord *record); +void FIRCLSCIERecordShow(DWARFCIERecord *record); +void FIRCLSFDERecordShow(DWARFFDERecord *record, DWARFCIERecord *cie); +void FIRCLSDwarfPointerEncodingShow(const char *leadString, uint8_t encoding); +void FIRCLSDwarfInstructionsShow(DWARFInstructions *instructions, DWARFCIERecord *cie); +#endif + +__END_DECLS + +#endif diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Unwind/Dwarf/FIRCLSDwarfUnwindRegisters.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Unwind/Dwarf/FIRCLSDwarfUnwindRegisters.h new file mode 100644 index 0000000..7e015cf --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Unwind/Dwarf/FIRCLSDwarfUnwindRegisters.h @@ -0,0 +1,152 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once + +#include + +#include "Crashlytics/Crashlytics/Helpers/FIRCLSFeatures.h" + +#if CLS_CPU_X86_64 +enum { + CLS_DWARF_X86_64_RAX = 0, + CLS_DWARF_X86_64_RDX = 1, + CLS_DWARF_X86_64_RCX = 2, + CLS_DWARF_X86_64_RBX = 3, + CLS_DWARF_X86_64_RSI = 4, + CLS_DWARF_X86_64_RDI = 5, + CLS_DWARF_X86_64_RBP = 6, + CLS_DWARF_X86_64_RSP = 7, + CLS_DWARF_X86_64_R8 = 8, + CLS_DWARF_X86_64_R9 = 9, + CLS_DWARF_X86_64_R10 = 10, + CLS_DWARF_X86_64_R11 = 11, + CLS_DWARF_X86_64_R12 = 12, + CLS_DWARF_X86_64_R13 = 13, + CLS_DWARF_X86_64_R14 = 14, + CLS_DWARF_X86_64_R15 = 15, + + CLS_DWARF_X86_64_RET_ADDR = 16 +}; + +#define CLS_DWARF_REG_RETURN CLS_DWARF_X86_64_RET_ADDR +#define CLS_DWARF_REG_SP CLS_DWARF_X86_64_RSP +#define CLS_DWARF_REG_FP CLS_DWARF_X86_64_RBP + +#define CLS_DWARF_MAX_REGISTER_NUM (CLS_DWARF_X86_64_RET_ADDR) + +#elif CLS_CPU_I386 + +enum { + CLS_DWARF_X86_EAX = 0, + CLS_DWARF_X86_ECX = 1, + CLS_DWARF_X86_EDX = 2, + CLS_DWARF_X86_EBX = 3, + CLS_DWARF_X86_EBP = 4, + CLS_DWARF_X86_ESP = 5, + CLS_DWARF_X86_ESI = 6, + CLS_DWARF_X86_EDI = 7, + + CLS_DWARF_X86_RET_ADDR = 8 +}; + +#define CLS_DWARF_REG_RETURN CLS_DWARF_X86_RET_ADDR +#define CLS_DWARF_REG_SP CLS_DWARF_X86_ESP +#define CLS_DWARF_REG_FP CLS_DWARF_X86_EBP + +#define CLS_DWARF_MAX_REGISTER_NUM (CLS_DWARF_X86_RET_ADDR) + +#elif CLS_CPU_ARM64 + +// 64-bit ARM64 registers +enum { + CLS_DWARF_ARM64_X0 = 0, + CLS_DWARF_ARM64_X1 = 1, + CLS_DWARF_ARM64_X2 = 2, + CLS_DWARF_ARM64_X3 = 3, + CLS_DWARF_ARM64_X4 = 4, + CLS_DWARF_ARM64_X5 = 5, + CLS_DWARF_ARM64_X6 = 6, + CLS_DWARF_ARM64_X7 = 7, + CLS_DWARF_ARM64_X8 = 8, + CLS_DWARF_ARM64_X9 = 9, + CLS_DWARF_ARM64_X10 = 10, + CLS_DWARF_ARM64_X11 = 11, + CLS_DWARF_ARM64_X12 = 12, + CLS_DWARF_ARM64_X13 = 13, + CLS_DWARF_ARM64_X14 = 14, + CLS_DWARF_ARM64_X15 = 15, + CLS_DWARF_ARM64_X16 = 16, + CLS_DWARF_ARM64_X17 = 17, + CLS_DWARF_ARM64_X18 = 18, + CLS_DWARF_ARM64_X19 = 19, + CLS_DWARF_ARM64_X20 = 20, + CLS_DWARF_ARM64_X21 = 21, + CLS_DWARF_ARM64_X22 = 22, + CLS_DWARF_ARM64_X23 = 23, + CLS_DWARF_ARM64_X24 = 24, + CLS_DWARF_ARM64_X25 = 25, + CLS_DWARF_ARM64_X26 = 26, + CLS_DWARF_ARM64_X27 = 27, + CLS_DWARF_ARM64_X28 = 28, + CLS_DWARF_ARM64_X29 = 29, + CLS_DWARF_ARM64_FP = 29, + CLS_DWARF_ARM64_X30 = 30, + CLS_DWARF_ARM64_LR = 30, + CLS_DWARF_ARM64_X31 = 31, + CLS_DWARF_ARM64_SP = 31, + // reserved block + CLS_DWARF_ARM64_D0 = 64, + CLS_DWARF_ARM64_D1 = 65, + CLS_DWARF_ARM64_D2 = 66, + CLS_DWARF_ARM64_D3 = 67, + CLS_DWARF_ARM64_D4 = 68, + CLS_DWARF_ARM64_D5 = 69, + CLS_DWARF_ARM64_D6 = 70, + CLS_DWARF_ARM64_D7 = 71, + CLS_DWARF_ARM64_D8 = 72, + CLS_DWARF_ARM64_D9 = 73, + CLS_DWARF_ARM64_D10 = 74, + CLS_DWARF_ARM64_D11 = 75, + CLS_DWARF_ARM64_D12 = 76, + CLS_DWARF_ARM64_D13 = 77, + CLS_DWARF_ARM64_D14 = 78, + CLS_DWARF_ARM64_D15 = 79, + CLS_DWARF_ARM64_D16 = 80, + CLS_DWARF_ARM64_D17 = 81, + CLS_DWARF_ARM64_D18 = 82, + CLS_DWARF_ARM64_D19 = 83, + CLS_DWARF_ARM64_D20 = 84, + CLS_DWARF_ARM64_D21 = 85, + CLS_DWARF_ARM64_D22 = 86, + CLS_DWARF_ARM64_D23 = 87, + CLS_DWARF_ARM64_D24 = 88, + CLS_DWARF_ARM64_D25 = 89, + CLS_DWARF_ARM64_D26 = 90, + CLS_DWARF_ARM64_D27 = 91, + CLS_DWARF_ARM64_D28 = 92, + CLS_DWARF_ARM64_D29 = 93, + CLS_DWARF_ARM64_D30 = 94, + CLS_DWARF_ARM64_D31 = 95 +}; + +#define CLS_DWARF_MAX_REGISTER_NUM (CLS_DWARF_ARM64_SP) + +#define CLS_DWARF_REG_RETURN CLS_DWARF_ARM64_LR +#define CLS_DWARF_REG_SP CLS_DWARF_ARM64_SP +#define CLS_DWARF_REG_FP CLS_DWARF_ARM64_FP + +#endif + +#define CLS_DWARF_INVALID_REGISTER_NUM (CLS_DWARF_MAX_REGISTER_NUM + 1) diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Unwind/FIRCLSUnwind.c b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Unwind/FIRCLSUnwind.c new file mode 100644 index 0000000..91b2af9 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Unwind/FIRCLSUnwind.c @@ -0,0 +1,319 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "Crashlytics/Crashlytics/Unwind/FIRCLSUnwind.h" +#include "Crashlytics/Crashlytics/Components/FIRCLSBinaryImage.h" +#include "Crashlytics/Crashlytics/Unwind/Compact/FIRCLSCompactUnwind.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSFeatures.h" +#include "Crashlytics/Crashlytics/Components/FIRCLSGlobals.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSUtility.h" + +#include +#include +#include + +// Without a limit on the number of frames we unwind, there's a real possibility +// we'll get stuck in an infinite loop. But, we still need pretty big limits, +// because stacks can get quite big. Also, the stacks are different on the platforms. +// These values were empirically determined (~525000 on OS X, ~65000 on iOS). +#if TARGET_OS_EMBEDDED +const uint32_t FIRCLSUnwindMaxFrames = 100000; +#else +const uint32_t FIRCLSUnwindMaxFrames = 600000; +#endif + +const uint32_t FIRCLSUnwindInfiniteRecursionCountThreshold = 10; + +#pragma mark Prototypes +static bool FIRCLSUnwindNextFrameUsingAllStrategies(FIRCLSUnwindContext* context); +#if CLS_COMPACT_UNWINDING_SUPPORTED +static bool FIRCLSUnwindWithCompactUnwindInfo(FIRCLSUnwindContext* context); +#endif +bool FIRCLSUnwindContextHasValidPCAndSP(FIRCLSUnwindContext* context); + +#pragma mark - API +bool FIRCLSUnwindInit(FIRCLSUnwindContext* context, FIRCLSThreadContext threadContext) { + if (!context) { + return false; + } + + memset(context, 0, sizeof(FIRCLSUnwindContext)); + + context->registers = threadContext; + + return true; +} + +bool FIRCLSUnwindNextFrame(FIRCLSUnwindContext* context) { + if (!FIRCLSIsValidPointer(context)) { + FIRCLSSDKLog("Error: invalid inputs\n"); + return false; + } + + if (!FIRCLSUnwindContextHasValidPCAndSP(context)) { + // This is a special-case. It is possible to try to unwind a thread that has no stack (ie, is + // executing zero functions. I believe this happens when a thread has exited, but before the + // kernel has actually cleaned it up. This situation can only apply to the first frame. So, in + // that case, we don't count it as an error. But, if it happens mid-unwind, it's a problem. + + if (context->frameCount == 0) { + FIRCLSSDKLog("Cancelling unwind for thread with invalid PC/SP\n"); + } else { + FIRCLSSDKLog("Error: thread PC/SP invalid before unwind\n"); + } + + return false; + } + + if (!FIRCLSUnwindNextFrameUsingAllStrategies(context)) { + FIRCLSSDKLogError("Failed to advance to the next frame\n"); + return false; + } + + uintptr_t pc = FIRCLSUnwindGetPC(context); + uintptr_t sp = FIRCLSUnwindGetStackPointer(context); + + // Unwinding will complete when this is no longer a valid value + if (!FIRCLSIsValidPointer(pc)) { + return false; + } + + // after unwinding, validate that we have a sane register value + if (!FIRCLSIsValidPointer(sp)) { + FIRCLSSDKLog("Error: SP (%p) isn't a valid pointer\n", (void*)sp); + return false; + } + + // track repeating frames + if (context->lastFramePC == pc) { + context->repeatCount += 1; + } else { + context->repeatCount = 0; + } + + context->frameCount += 1; + context->lastFramePC = pc; + + return true; +} + +#pragma mark - Register Accessors +uintptr_t FIRCLSUnwindGetPC(FIRCLSUnwindContext* context) { + if (!FIRCLSIsValidPointer(context)) { + return 0; + } + + return FIRCLSThreadContextGetPC(&context->registers); +} + +uintptr_t FIRCLSUnwindGetStackPointer(FIRCLSUnwindContext* context) { + if (!FIRCLSIsValidPointer(context)) { + return 0; + } + + return FIRCLSThreadContextGetStackPointer(&context->registers); +} + +static uintptr_t FIRCLSUnwindGetFramePointer(FIRCLSUnwindContext* context) { + if (!FIRCLSIsValidPointer(context)) { + return 0; + } + + return FIRCLSThreadContextGetFramePointer(&context->registers); +} + +uint32_t FIRCLSUnwindGetFrameRepeatCount(FIRCLSUnwindContext* context) { + if (!FIRCLSIsValidPointer(context)) { + return 0; + } + + return context->repeatCount; +} + +#pragma mark - Unwind Strategies +static bool FIRCLSUnwindNextFrameUsingAllStrategies(FIRCLSUnwindContext* context) { + if (!FIRCLSIsValidPointer(context)) { + FIRCLSSDKLogError("Arguments invalid\n"); + return false; + } + + if (context->frameCount >= FIRCLSUnwindMaxFrames) { + FIRCLSSDKLogWarn("Exceeded maximum number of frames\n"); + return false; + } + + uintptr_t pc = FIRCLSUnwindGetPC(context); + + // Ok, what's going on here? libunwind's UnwindCursor::setInfoBasedOnIPRegister has a + // parameter that, if true, does this subtraction. Despite the comments in the code + // (of 35.1), I found that the parameter was almost always set to true. + // + // I then ran into a problem when unwinding from _pthread_start -> thread_start. This + // is a common transition, which happens in pretty much every report. An extra frame + // was being generated, because the PC we get for _pthread_start was mapping to exactly + // one greater than the function's last byte, according to the compact unwind info. This + // resulted in using the wrong compact encoding, and picking the next function, which + // turned out to be dwarf instead of a frame pointer. + + // So, the moral is - do the subtraction for all frames except the first. I haven't found + // a case where it produces an incorrect result. Also note that at first, I thought this would + // subtract one from the final addresses too. But, the end of this function will *compute* PC, + // so this value is used only to look up unwinding data. + + if (context->frameCount > 0) { + --pc; + if (!FIRCLSThreadContextSetPC(&context->registers, pc)) { + FIRCLSSDKLogError("Unable to set PC\n"); + return false; + } + } + + if (!FIRCLSIsValidPointer(pc)) { + FIRCLSSDKLogError("PC is invalid\n"); + return false; + } + + // the first frame is special - as the registers we need + // are already loaded by definition + if (context->frameCount == 0) { + return true; + } + +#if CLS_COMPACT_UNWINDING_SUPPORTED + // attempt to advance to the next frame using compact unwinding, and + // only fall back to the frame pointer if that fails + if (FIRCLSUnwindWithCompactUnwindInfo(context)) { + return true; + } +#endif + + // If the frame pointer is zero, we cannot use an FP-based unwind and we can reasonably + // assume that we've just gotten to the end of the stack. + if (FIRCLSUnwindGetFramePointer(context) == 0) { + FIRCLSSDKLogWarn("FP is zero, aborting unwind\n"); + // make sure to set the PC to zero, to indicate the unwind is complete + return FIRCLSThreadContextSetPC(&context->registers, 0); + } + + // Only allow stack scanning (as a last resort) if we're on the first frame. All others + // are too likely to screw up. + if (FIRCLSUnwindWithFramePointer(&context->registers, context->frameCount == 1)) { + return true; + } + + FIRCLSSDKLogError("Unable to use frame pointer\n"); + + return false; +} + +#if CLS_COMPACT_UNWINDING_SUPPORTED +static bool FIRCLSUnwindWithCompactUnwindInfo(FIRCLSUnwindContext* context) { + if (!context) { + return false; + } + + // step one - find the image the current pc is within + FIRCLSBinaryImageRuntimeNode image; + + uintptr_t pc = FIRCLSUnwindGetPC(context); + + if (!FIRCLSBinaryImageSafeFindImageForAddress(pc, &image)) { + FIRCLSSDKLogWarn("Unable to find binary for %p\n", (void*)pc); + return false; + } + +#if CLS_BINARY_IMAGE_RUNTIME_NODE_RECORD_NAME + FIRCLSSDKLogDebug("Binary image for %p at %p => %s\n", (void*)pc, image.baseAddress, image.name); +#else + FIRCLSSDKLogDebug("Binary image for %p at %p\n", (void*)pc, image.baseAddress); +#endif + + if (!FIRCLSBinaryImageSafeHasUnwindInfo(&image)) { + FIRCLSSDKLogInfo("Binary image at %p has no unwind info\n", image.baseAddress); + return false; + } + + if (!FIRCLSCompactUnwindInit(&context->compactUnwindState, image.unwindInfo, image.ehFrame, + (uintptr_t)image.baseAddress)) { + FIRCLSSDKLogError("Unable to read unwind info\n"); + return false; + } + + // this function will actually attempt to find compact unwind info for the current PC, + // and use it to mutate the context register state + return FIRCLSCompactUnwindLookupAndCompute(&context->compactUnwindState, &context->registers); +} +#endif + +#pragma mark - Utility Functions +bool FIRCLSUnwindContextHasValidPCAndSP(FIRCLSUnwindContext* context) { + return FIRCLSIsValidPointer(FIRCLSUnwindGetPC(context)) && + FIRCLSIsValidPointer(FIRCLSUnwindGetStackPointer(context)); +} + +#if CLS_CPU_64BIT +#define BASIC_INFO_TYPE vm_region_basic_info_64_t +#define BASIC_INFO VM_REGION_BASIC_INFO_64 +#define BASIC_INFO_COUNT VM_REGION_BASIC_INFO_COUNT_64 +#define vm_region_query_fn vm_region_64 +#else +#define BASIC_INFO_TYPE vm_region_basic_info_t +#define BASIC_INFO VM_REGION_BASIC_INFO +#define BASIC_INFO_COUNT VM_REGION_BASIC_INFO_COUNT +#define vm_region_query_fn vm_region +#endif +bool FIRCLSUnwindIsAddressExecutable(vm_address_t address) { +#if CLS_COMPACT_UNWINDING_SUPPORTED + FIRCLSBinaryImageRuntimeNode unusedNode; + + return FIRCLSBinaryImageSafeFindImageForAddress(address, &unusedNode); +#else + return true; +#endif +} + +bool FIRCLSUnwindFirstExecutableAddress(vm_address_t start, + vm_address_t end, + vm_address_t* foundAddress) { + // This function walks up the data on the stack, looking for the first value that is an address on + // an executable page. This is a heurestic, and can hit false positives. + + *foundAddress = 0; // write in a 0 + + do { + vm_address_t address; + + FIRCLSSDKLogDebug("Checking address %p => %p\n", (void*)start, (void*)*(uintptr_t*)start); + + // if start isn't a valid pointer, don't even bother trying + if (FIRCLSIsValidPointer(start)) { + if (!FIRCLSReadMemory(start, &address, sizeof(void*))) { + // if we fail to read from the stack, we're done + return false; + } + + FIRCLSSDKLogDebug("Checking for executable %p\n", (void*)address); + // when we find an executable address, we're finished + if (FIRCLSUnwindIsAddressExecutable(address)) { + *foundAddress = address; + return true; + } + } + + start += sizeof(void*); // move back up the stack + + } while (start < end); + + return false; +} diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Unwind/FIRCLSUnwind.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Unwind/FIRCLSUnwind.h new file mode 100644 index 0000000..e09dea0 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Unwind/FIRCLSUnwind.h @@ -0,0 +1,53 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once + +#include "Crashlytics/Crashlytics/Helpers/FIRCLSThreadState.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSUtility.h" +#if CLS_COMPACT_UNWINDING_SUPPORTED +#include "Crashlytics/Crashlytics/Unwind/Compact/FIRCLSCompactUnwind.h" +#endif +#include +#include + +#include "Crashlytics/Crashlytics/Unwind/FIRCLSUnwind_arch.h" + +extern const uint32_t FIRCLSUnwindMaxFrames; + +extern const uint32_t FIRCLSUnwindInfiniteRecursionCountThreshold; + +typedef struct { + FIRCLSThreadContext registers; + uint32_t frameCount; +#if CLS_COMPACT_UNWINDING_SUPPORTED + FIRCLSCompactUnwindContext compactUnwindState; +#endif + uintptr_t lastFramePC; + uint32_t repeatCount; +} FIRCLSUnwindContext; + +// API +bool FIRCLSUnwindInit(FIRCLSUnwindContext *context, FIRCLSThreadContext threadContext); + +bool FIRCLSUnwindNextFrame(FIRCLSUnwindContext *context); +uintptr_t FIRCLSUnwindGetPC(FIRCLSUnwindContext *context); +uintptr_t FIRCLSUnwindGetStackPointer(FIRCLSUnwindContext *context); +uint32_t FIRCLSUnwindGetFrameRepeatCount(FIRCLSUnwindContext *context); + +// utility functions +bool FIRCLSUnwindIsAddressExecutable(vm_address_t address); +bool FIRCLSUnwindFirstExecutableAddress(vm_address_t start, + vm_address_t end, + vm_address_t *foundAddress); diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Unwind/FIRCLSUnwind_arch.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Unwind/FIRCLSUnwind_arch.h new file mode 100644 index 0000000..714a7ae --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Unwind/FIRCLSUnwind_arch.h @@ -0,0 +1,32 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once + +#include "Crashlytics/Crashlytics/Helpers/FIRCLSFeatures.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSThreadState.h" +#if CLS_COMPACT_UNWINDING_SUPPORTED +#include "Crashlytics/Crashlytics/Unwind/Compact/FIRCLSCompactUnwind.h" +#endif + +bool FIRCLSUnwindWithFramePointer(FIRCLSThreadContext *registers, bool allowScanning); +uintptr_t FIRCLSUnwindStackPointerFromFramePointer(uintptr_t framePtr); + +#if CLS_DWARF_UNWINDING_SUPPORTED +uintptr_t FIRCLSCompactUnwindDwarfOffset(compact_unwind_encoding_t encoding); +bool FIRCLSDwarfUnwindSetRegisterValue(FIRCLSThreadContext *registers, + uint64_t num, + uintptr_t value); +uintptr_t FIRCLSDwarfUnwindGetRegisterValue(const FIRCLSThreadContext *registers, uint64_t num); +#endif diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Unwind/FIRCLSUnwind_arm.c b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Unwind/FIRCLSUnwind_arm.c new file mode 100644 index 0000000..d97ad39 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Unwind/FIRCLSUnwind_arm.c @@ -0,0 +1,313 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "Crashlytics/Crashlytics/Unwind/Compact/FIRCLSCompactUnwind.h" +#include "Crashlytics/Crashlytics/Unwind/Compact/FIRCLSCompactUnwind_Private.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSDefines.h" +#include "Crashlytics/Crashlytics/Unwind/Dwarf/FIRCLSDwarfUnwind.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSFeatures.h" +#include "Crashlytics/Crashlytics/Unwind/FIRCLSUnwind.h" +#include "Crashlytics/Crashlytics/Unwind/FIRCLSUnwind_arch.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSUtility.h" + +#if CLS_CPU_ARM || CLS_CPU_ARM64 + +static bool FIRCLSUnwindWithLRRegister(FIRCLSThreadContext* registers) { + if (!FIRCLSIsValidPointer(registers)) { + return false; + } + + // Return address is in LR, SP is pointing to the next frame. + uintptr_t value = FIRCLSThreadContextGetLinkRegister(registers); + + if (!FIRCLSIsValidPointer(value)) { + FIRCLSSDKLog("Error: LR value is invalid\n"); + return false; + } + + return FIRCLSThreadContextSetPC(registers, value); +} + +bool FIRCLSUnwindWithFramePointer(FIRCLSThreadContext* registers, bool allowScanning) { + if (allowScanning) { + // The LR register does have the return address here, but there are situations where + // this can produce false matches. Better backend rules can fix this up in many cases. + if (FIRCLSUnwindWithLRRegister(registers)) { + return true; + } else { + // In this case, we're unable to use the LR. We don't want to just stop unwinding, so + // proceed with the normal, non-scanning path + FIRCLSSDKLog("Unable to use LR, skipping\n"); + } + } + + // read the values from the stack + const uintptr_t framePointer = FIRCLSThreadContextGetFramePointer(registers); + uintptr_t stack[2]; + + if (!FIRCLSReadMemory((vm_address_t)framePointer, stack, sizeof(stack))) { + // unable to read the first stack frame + FIRCLSSDKLog("Error: failed to read memory at address %p\n", (void*)framePointer); + return false; + } + + if (!FIRCLSThreadContextSetPC(registers, stack[1])) { + return false; + } + + if (!FIRCLSThreadContextSetFramePointer(registers, stack[0])) { + return false; + } + + if (!FIRCLSThreadContextSetStackPointer(registers, + FIRCLSUnwindStackPointerFromFramePointer(framePointer))) { + return false; + } + + return true; +} + +uintptr_t FIRCLSUnwindStackPointerFromFramePointer(uintptr_t framePtr) { + // the stack pointer is the frame pointer plus the two saved pointers for the frame + return framePtr + 2 * sizeof(void*); +} + +#if CLS_COMPACT_UNWINDING_SUPPORTED +bool FIRCLSCompactUnwindComputeRegisters(FIRCLSCompactUnwindContext* context, + FIRCLSCompactUnwindResult* result, + FIRCLSThreadContext* registers) { + if (!context || !result || !registers) { + return false; + } + + // Note that compact_uwnind_encoding.h has a few bugs in it prior to iOS 8.0. + // Only refer to the >= 8.0 header. + switch (result->encoding & UNWIND_ARM64_MODE_MASK) { + case UNWIND_ARM64_MODE_FRAMELESS: + // Interestingly, we also know the size of the stack frame, by + // using UNWIND_ARM64_FRAMELESS_STACK_SIZE_MASK. Is that useful? + return FIRCLSUnwindWithLRRegister(registers); + break; + case UNWIND_ARM64_MODE_DWARF: + return FIRCLSCompactUnwindDwarfFrame( + context, result->encoding & UNWIND_ARM64_DWARF_SECTION_OFFSET, registers); + break; + case UNWIND_ARM64_MODE_FRAME: + return FIRCLSUnwindWithFramePointer(registers, false); + default: + FIRCLSSDKLog("Invalid encoding 0x%x\n", result->encoding); + break; + } + + return false; +} +#endif + +#if CLS_DWARF_UNWINDING_SUPPORTED +uintptr_t FIRCLSDwarfUnwindGetRegisterValue(const FIRCLSThreadContext* registers, uint64_t num) { + switch (num) { + case CLS_DWARF_ARM64_X0: + return registers->__ss.__x[0]; + case CLS_DWARF_ARM64_X1: + return registers->__ss.__x[1]; + case CLS_DWARF_ARM64_X2: + return registers->__ss.__x[2]; + case CLS_DWARF_ARM64_X3: + return registers->__ss.__x[3]; + case CLS_DWARF_ARM64_X4: + return registers->__ss.__x[4]; + case CLS_DWARF_ARM64_X5: + return registers->__ss.__x[5]; + case CLS_DWARF_ARM64_X6: + return registers->__ss.__x[6]; + case CLS_DWARF_ARM64_X7: + return registers->__ss.__x[7]; + case CLS_DWARF_ARM64_X8: + return registers->__ss.__x[8]; + case CLS_DWARF_ARM64_X9: + return registers->__ss.__x[9]; + case CLS_DWARF_ARM64_X10: + return registers->__ss.__x[10]; + case CLS_DWARF_ARM64_X11: + return registers->__ss.__x[11]; + case CLS_DWARF_ARM64_X12: + return registers->__ss.__x[12]; + case CLS_DWARF_ARM64_X13: + return registers->__ss.__x[13]; + case CLS_DWARF_ARM64_X14: + return registers->__ss.__x[14]; + case CLS_DWARF_ARM64_X15: + return registers->__ss.__x[15]; + case CLS_DWARF_ARM64_X16: + return registers->__ss.__x[16]; + case CLS_DWARF_ARM64_X17: + return registers->__ss.__x[17]; + case CLS_DWARF_ARM64_X18: + return registers->__ss.__x[18]; + case CLS_DWARF_ARM64_X19: + return registers->__ss.__x[19]; + case CLS_DWARF_ARM64_X20: + return registers->__ss.__x[20]; + case CLS_DWARF_ARM64_X21: + return registers->__ss.__x[21]; + case CLS_DWARF_ARM64_X22: + return registers->__ss.__x[22]; + case CLS_DWARF_ARM64_X23: + return registers->__ss.__x[23]; + case CLS_DWARF_ARM64_X24: + return registers->__ss.__x[24]; + case CLS_DWARF_ARM64_X25: + return registers->__ss.__x[25]; + case CLS_DWARF_ARM64_X26: + return registers->__ss.__x[26]; + case CLS_DWARF_ARM64_X27: + return registers->__ss.__x[27]; + case CLS_DWARF_ARM64_X28: + return registers->__ss.__x[28]; + case CLS_DWARF_ARM64_FP: + return FIRCLSThreadContextGetFramePointer(registers); + case CLS_DWARF_ARM64_LR: + return FIRCLSThreadContextGetLinkRegister(registers); + case CLS_DWARF_ARM64_SP: + return FIRCLSThreadContextGetStackPointer(registers); + default: + break; + } + + FIRCLSSDKLog("Error: Unrecognized get register number %llu\n", num); + + return 0; +} + +bool FIRCLSDwarfUnwindSetRegisterValue(FIRCLSThreadContext* registers, + uint64_t num, + uintptr_t value) { + switch (num) { + case CLS_DWARF_ARM64_X0: + registers->__ss.__x[0] = value; + return true; + case CLS_DWARF_ARM64_X1: + registers->__ss.__x[1] = value; + return true; + case CLS_DWARF_ARM64_X2: + registers->__ss.__x[2] = value; + return true; + case CLS_DWARF_ARM64_X3: + registers->__ss.__x[3] = value; + return true; + case CLS_DWARF_ARM64_X4: + registers->__ss.__x[4] = value; + return true; + case CLS_DWARF_ARM64_X5: + registers->__ss.__x[5] = value; + return true; + case CLS_DWARF_ARM64_X6: + registers->__ss.__x[6] = value; + return true; + case CLS_DWARF_ARM64_X7: + registers->__ss.__x[7] = value; + return true; + case CLS_DWARF_ARM64_X8: + registers->__ss.__x[8] = value; + return true; + case CLS_DWARF_ARM64_X9: + registers->__ss.__x[9] = value; + return true; + case CLS_DWARF_ARM64_X10: + registers->__ss.__x[10] = value; + return true; + case CLS_DWARF_ARM64_X11: + registers->__ss.__x[11] = value; + return true; + case CLS_DWARF_ARM64_X12: + registers->__ss.__x[12] = value; + return true; + case CLS_DWARF_ARM64_X13: + registers->__ss.__x[13] = value; + return true; + case CLS_DWARF_ARM64_X14: + registers->__ss.__x[14] = value; + return true; + case CLS_DWARF_ARM64_X15: + registers->__ss.__x[15] = value; + return true; + case CLS_DWARF_ARM64_X16: + registers->__ss.__x[16] = value; + return true; + case CLS_DWARF_ARM64_X17: + registers->__ss.__x[17] = value; + return true; + case CLS_DWARF_ARM64_X18: + registers->__ss.__x[18] = value; + return true; + case CLS_DWARF_ARM64_X19: + registers->__ss.__x[19] = value; + return true; + case CLS_DWARF_ARM64_X20: + registers->__ss.__x[20] = value; + return true; + case CLS_DWARF_ARM64_X21: + registers->__ss.__x[21] = value; + return true; + case CLS_DWARF_ARM64_X22: + registers->__ss.__x[22] = value; + return true; + case CLS_DWARF_ARM64_X23: + registers->__ss.__x[23] = value; + return true; + case CLS_DWARF_ARM64_X24: + registers->__ss.__x[24] = value; + return true; + case CLS_DWARF_ARM64_X25: + registers->__ss.__x[25] = value; + return true; + case CLS_DWARF_ARM64_X26: + registers->__ss.__x[26] = value; + return true; + case CLS_DWARF_ARM64_X27: + registers->__ss.__x[27] = value; + return true; + case CLS_DWARF_ARM64_X28: + registers->__ss.__x[28] = value; + return true; + case CLS_DWARF_ARM64_FP: + FIRCLSThreadContextSetFramePointer(registers, value); + return true; + case CLS_DWARF_ARM64_SP: + FIRCLSThreadContextSetStackPointer(registers, value); + return true; + case CLS_DWARF_ARM64_LR: + // Here's what's going on. For x86, the "return register" is virtual. The architecture + // doesn't actually have one, but DWARF does have the concept. So, when the system + // tries to set the return register, we set the PC. You can see this behavior + // in the FIRCLSDwarfUnwindSetRegisterValue implementation for that architecture. In the + // case of ARM64, the register is real. So, we have to be extra careful to make sure + // we update the PC here. Otherwise, when a DWARF unwind completes, it won't have + // changed the PC to the right value. + FIRCLSThreadContextSetLinkRegister(registers, value); + FIRCLSThreadContextSetPC(registers, value); + return true; + default: + break; + } + + FIRCLSSDKLog("Unrecognized set register number %llu\n", num); + + return false; +} +#endif + +#else +INJECT_STRIP_SYMBOL(unwind_arm) +#endif diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Unwind/FIRCLSUnwind_x86.c b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Unwind/FIRCLSUnwind_x86.c new file mode 100644 index 0000000..1279905 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Unwind/FIRCLSUnwind_x86.c @@ -0,0 +1,537 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "Crashlytics/Crashlytics/Unwind/FIRCLSUnwind_x86.h" +#include "Crashlytics/Crashlytics/Unwind/Compact/FIRCLSCompactUnwind_Private.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSDefines.h" +#include "Crashlytics/Crashlytics/Unwind/Dwarf/FIRCLSDwarfUnwind.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSFeatures.h" +#include "Crashlytics/Crashlytics/Unwind/FIRCLSUnwind.h" +#include "Crashlytics/Crashlytics/Unwind/FIRCLSUnwind_arch.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSUtility.h" + +#if CLS_CPU_X86 + +static bool FIRCLSCompactUnwindBPFrame(compact_unwind_encoding_t encoding, + FIRCLSThreadContext* registers); +static bool FIRCLSCompactUnwindFrameless(compact_unwind_encoding_t encoding, + FIRCLSThreadContext* registers, + uintptr_t functionStart, + bool indirect); + +#if CLS_COMPACT_UNWINDING_SUPPORTED +bool FIRCLSCompactUnwindComputeRegisters(FIRCLSCompactUnwindContext* context, + FIRCLSCompactUnwindResult* result, + FIRCLSThreadContext* registers) { + if (!FIRCLSIsValidPointer(context) || !FIRCLSIsValidPointer(result) || + !FIRCLSIsValidPointer(registers)) { + FIRCLSSDKLogError("invalid inputs\n"); + return false; + } + + FIRCLSSDKLogDebug("Computing registers for encoding %x\n", result->encoding); + + switch (result->encoding & CLS_X86_MODE_MASK) { + case CLS_X86_MODE_BP_FRAME: + return FIRCLSCompactUnwindBPFrame(result->encoding, registers); + case CLS_X86_MODE_STACK_IMMD: + return FIRCLSCompactUnwindFrameless(result->encoding, registers, result->functionStart, + false); + case CLS_X86_MODE_STACK_IND: + return FIRCLSCompactUnwindFrameless(result->encoding, registers, result->functionStart, true); + case CLS_X86_MODE_DWARF: + return FIRCLSCompactUnwindDwarfFrame(context, result->encoding & CLS_X86_DWARF_SECTION_OFFSET, + registers); + default: + FIRCLSSDKLogError("Invalid encoding %x\n", result->encoding); + break; + } + + return false; +} +#endif + +static bool FIRCLSCompactUnwindBPFrame(compact_unwind_encoding_t encoding, + FIRCLSThreadContext* registers) { + // this is the plain-vanilla frame pointer process + + // uint32_t offset = GET_BITS_WITH_MASK(encoding, UNWIND_X86_EBP_FRAME_OFFSET); + // uint32_t locations = GET_BITS_WITH_MASK(encoding, UNWIND_X86_64_RBP_FRAME_REGISTERS); + + // TODO: pretty sure we do need to restore registers here, so that if a subsequent frame needs + // these results, they will be correct + + // Checkout CompactUnwinder.hpp in libunwind for how to do this. Since we don't make use of any of + // those registers for a stacktrace only, there's nothing we need do with them. + + // read the values from the stack + const uintptr_t framePointer = FIRCLSThreadContextGetFramePointer(registers); + uintptr_t stack[2]; + + if (!FIRCLSReadMemory((vm_address_t)framePointer, stack, sizeof(stack))) { + // unable to read the first stack frame + FIRCLSSDKLog("Error: failed to read memory at address %p\n", (void*)framePointer); + return false; + } + + if (!FIRCLSThreadContextSetPC(registers, stack[1])) { + return false; + } + + if (!FIRCLSThreadContextSetFramePointer(registers, stack[0])) { + return false; + } + + if (!FIRCLSThreadContextSetStackPointer(registers, + FIRCLSUnwindStackPointerFromFramePointer(framePointer))) { + return false; + } + + return true; +} + +bool FIRCLSUnwindWithStackScanning(FIRCLSThreadContext* registers) { + vm_address_t start = (vm_address_t)FIRCLSThreadContextGetStackPointer(registers); + vm_address_t end = (vm_address_t)FIRCLSThreadContextGetFramePointer(registers); + + uintptr_t newPC = 0; + + if (!FIRCLSUnwindFirstExecutableAddress(start, end, (vm_address_t*)&newPC)) { + return false; + } + + return FIRCLSThreadContextSetPC(registers, newPC); +} + +bool FIRCLSUnwindWithFramePointer(FIRCLSThreadContext* registers, bool allowScanning) { + // Here's an interesting case. We've just processed the first frame, and it did + // not have any unwind info. If that first function did not allocate + // a stack frame, we'll "skip" the caller. This might sound unlikely, but it actually + // happens a lot in practice. + + // Sooo, one thing we can do is try to stack the stack for things that look like return + // addresses. Normally, this technique will hit many false positives. But, if we do it + // only for the second frame, and only when we don't have other unwind info available. + + if (allowScanning) { + FIRCLSSDKLogInfo("Attempting stack scan\n"); + if (FIRCLSUnwindWithStackScanning(registers)) { + FIRCLSSDKLogInfo("Stack scan successful\n"); + return true; + } + } + + // If we ever do anything else with the encoding, we need to be sure + // to set it up right. + return FIRCLSCompactUnwindBPFrame(CLS_X86_MODE_BP_FRAME, registers); +} + +uintptr_t FIRCLSUnwindStackPointerFromFramePointer(uintptr_t framePtr) { + // the stack pointer is the frame pointer plus the two saved pointers for the frame + return framePtr + 2 * sizeof(void*); +} + +#if CLS_COMPACT_UNWINDING_SUPPORTED || CLS_DWARF_UNWINDING_SUPPORTED +uintptr_t FIRCLSDwarfUnwindGetRegisterValue(const FIRCLSThreadContext* registers, uint64_t num) { + switch (num) { +#if CLS_CPU_X86_64 + case CLS_DWARF_X86_64_RAX: + return registers->__ss.__rax; + case CLS_DWARF_X86_64_RDX: + return registers->__ss.__rdx; + case CLS_DWARF_X86_64_RCX: + return registers->__ss.__rcx; + case CLS_DWARF_X86_64_RBX: + return registers->__ss.__rbx; + case CLS_DWARF_X86_64_RSI: + return registers->__ss.__rsi; + case CLS_DWARF_X86_64_RDI: + return registers->__ss.__rdi; + case CLS_DWARF_X86_64_RBP: + return registers->__ss.__rbp; + case CLS_DWARF_X86_64_RSP: + return registers->__ss.__rsp; + case CLS_DWARF_X86_64_R8: + return registers->__ss.__r8; + case CLS_DWARF_X86_64_R9: + return registers->__ss.__r9; + case CLS_DWARF_X86_64_R10: + return registers->__ss.__r10; + case CLS_DWARF_X86_64_R11: + return registers->__ss.__r11; + case CLS_DWARF_X86_64_R12: + return registers->__ss.__r12; + case CLS_DWARF_X86_64_R13: + return registers->__ss.__r13; + case CLS_DWARF_X86_64_R14: + return registers->__ss.__r14; + case CLS_DWARF_X86_64_R15: + return registers->__ss.__r15; + case CLS_DWARF_X86_64_RET_ADDR: + return registers->__ss.__rip; +#elif CLS_CPU_I386 + case CLS_DWARF_X86_EAX: + return registers->__ss.__eax; + case CLS_DWARF_X86_ECX: + return registers->__ss.__ecx; + case CLS_DWARF_X86_EDX: + return registers->__ss.__edx; + case CLS_DWARF_X86_EBX: + return registers->__ss.__ebx; + case CLS_DWARF_X86_EBP: + return registers->__ss.__ebp; + case CLS_DWARF_X86_ESP: + return registers->__ss.__esp; + case CLS_DWARF_X86_ESI: + return registers->__ss.__esi; + case CLS_DWARF_X86_EDI: + return registers->__ss.__edi; + case CLS_DWARF_X86_RET_ADDR: + return registers->__ss.__eip; +#endif + default: + break; + } + + FIRCLSSDKLog("Error: Unrecognized get register number %llu\n", num); + + return 0; +} + +bool FIRCLSDwarfUnwindSetRegisterValue(FIRCLSThreadContext* registers, + uint64_t num, + uintptr_t value) { + switch (num) { +#if CLS_CPU_X86_64 + case CLS_DWARF_X86_64_RAX: + registers->__ss.__rax = value; + return true; + case CLS_DWARF_X86_64_RDX: + registers->__ss.__rdx = value; + return true; + case CLS_DWARF_X86_64_RCX: + registers->__ss.__rcx = value; + return true; + case CLS_DWARF_X86_64_RBX: + registers->__ss.__rbx = value; + return true; + case CLS_DWARF_X86_64_RSI: + registers->__ss.__rsi = value; + return true; + case CLS_DWARF_X86_64_RDI: + registers->__ss.__rdi = value; + return true; + case CLS_DWARF_X86_64_RBP: + registers->__ss.__rbp = value; + return true; + case CLS_DWARF_X86_64_RSP: + registers->__ss.__rsp = value; + return true; + case CLS_DWARF_X86_64_R8: + registers->__ss.__r8 = value; + return true; + case CLS_DWARF_X86_64_R9: + registers->__ss.__r9 = value; + return true; + case CLS_DWARF_X86_64_R10: + registers->__ss.__r10 = value; + return true; + case CLS_DWARF_X86_64_R11: + registers->__ss.__r11 = value; + return true; + case CLS_DWARF_X86_64_R12: + registers->__ss.__r12 = value; + return true; + case CLS_DWARF_X86_64_R13: + registers->__ss.__r13 = value; + return true; + case CLS_DWARF_X86_64_R14: + registers->__ss.__r14 = value; + return true; + case CLS_DWARF_X86_64_R15: + registers->__ss.__r15 = value; + return true; + case CLS_DWARF_X86_64_RET_ADDR: + registers->__ss.__rip = value; + return true; +#elif CLS_CPU_I386 + case CLS_DWARF_X86_EAX: + registers->__ss.__eax = value; + return true; + case CLS_DWARF_X86_ECX: + registers->__ss.__ecx = value; + return true; + case CLS_DWARF_X86_EDX: + registers->__ss.__edx = value; + return true; + case CLS_DWARF_X86_EBX: + registers->__ss.__ebx = value; + return true; + case CLS_DWARF_X86_EBP: + registers->__ss.__ebp = value; + return true; + case CLS_DWARF_X86_ESP: + registers->__ss.__esp = value; + return true; + case CLS_DWARF_X86_ESI: + registers->__ss.__esi = value; + return true; + case CLS_DWARF_X86_EDI: + registers->__ss.__edi = value; + return true; + case CLS_DWARF_X86_RET_ADDR: + registers->__ss.__eip = value; + return true; +#endif + default: + break; + } + + FIRCLSSDKLog("Unrecognized set register number %llu\n", num); + + return false; +} +#endif + +#if CLS_COMPACT_UNWINDING_SUPPORTED +bool FIRCLSCompactUnwindComputeStackSize(const compact_unwind_encoding_t encoding, + const uintptr_t functionStart, + const bool indirect, + uint32_t* const stackSize) { + if (!FIRCLSIsValidPointer(stackSize)) { + FIRCLSSDKLog("Error: invalid inputs\n"); + return false; + } + + const uint32_t stackSizeEncoded = GET_BITS_WITH_MASK(encoding, CLS_X86_FRAMELESS_STACK_SIZE); + + if (!indirect) { + *stackSize = stackSizeEncoded * sizeof(void*); + return true; + } + + const vm_address_t sublAddress = functionStart + stackSizeEncoded; + uint32_t sublValue = 0; + + if (!FIRCLSReadMemory(sublAddress, &sublValue, sizeof(uint32_t))) { + FIRCLSSDKLog("Error: unable to read subl value\n"); + return false; + } + + const uint32_t stackAdjust = GET_BITS_WITH_MASK(encoding, CLS_X86_FRAMELESS_STACK_ADJUST); + + *stackSize = sublValue + stackAdjust * sizeof(void*); + + return true; +} + +bool FIRCLSCompactUnwindDecompressPermutation(const compact_unwind_encoding_t encoding, + uintptr_t permutatedRegisters[const static 6]) { + const uint32_t regCount = GET_BITS_WITH_MASK(encoding, CLS_X86_FRAMELESS_STACK_REG_COUNT); + uint32_t permutation = GET_BITS_WITH_MASK(encoding, CLS_X86_FRAMELESS_STACK_REG_PERMUTATION); + + switch (regCount) { + case 6: + permutatedRegisters[0] = permutation / 120; + permutation -= (permutatedRegisters[0] * 120); + permutatedRegisters[1] = permutation / 24; + permutation -= (permutatedRegisters[1] * 24); + permutatedRegisters[2] = permutation / 6; + permutation -= (permutatedRegisters[2] * 6); + permutatedRegisters[3] = permutation / 2; + permutation -= (permutatedRegisters[3] * 2); + permutatedRegisters[4] = permutation; + permutatedRegisters[5] = 0; + break; + case 5: + permutatedRegisters[0] = permutation / 120; + permutation -= (permutatedRegisters[0] * 120); + permutatedRegisters[1] = permutation / 24; + permutation -= (permutatedRegisters[1] * 24); + permutatedRegisters[2] = permutation / 6; + permutation -= (permutatedRegisters[2] * 6); + permutatedRegisters[3] = permutation / 2; + permutation -= (permutatedRegisters[3] * 2); + permutatedRegisters[4] = permutation; + break; + case 4: + permutatedRegisters[0] = permutation / 60; + permutation -= (permutatedRegisters[0] * 60); + permutatedRegisters[1] = permutation / 12; + permutation -= (permutatedRegisters[1] * 12); + permutatedRegisters[2] = permutation / 3; + permutation -= (permutatedRegisters[2] * 3); + permutatedRegisters[3] = permutation; + break; + case 3: + permutatedRegisters[0] = permutation / 20; + permutation -= (permutatedRegisters[0] * 20); + permutatedRegisters[1] = permutation / 4; + permutation -= (permutatedRegisters[1] * 4); + permutatedRegisters[2] = permutation; + break; + case 2: + permutatedRegisters[0] = permutation / 5; + permutation -= (permutatedRegisters[0] * 5); + permutatedRegisters[1] = permutation; + break; + case 1: + permutatedRegisters[0] = permutation; + break; + case 0: + break; + default: + FIRCLSSDKLog("Error: unhandled number of register permutations for encoding %x\n", encoding); + return false; + } + + return true; +} + +bool FIRCLSCompactUnwindRemapRegisters(const compact_unwind_encoding_t encoding, + uintptr_t permutatedRegisters[const static 6], + uintptr_t savedRegisters[const static 6]) { + const uint32_t regCount = GET_BITS_WITH_MASK(encoding, CLS_X86_FRAMELESS_STACK_REG_COUNT); + + if (regCount > 6) { + FIRCLSSDKLog("Error: invalid register number count %d\n", regCount); + return false; + } + + // Re-number the registers + + // You are probably wondering, what the hell is this algorithm even doing? It is + // taken from libunwind's implementation that does the same thing. + bool used[7] = {false, false, false, false, false, false, false}; + for (uint32_t i = 0; i < regCount; ++i) { + int renum = 0; + for (int u = 1; u < 7; ++u) { + if (!used[u]) { + if (renum == permutatedRegisters[i]) { + savedRegisters[i] = u; + used[u] = true; + break; + } + ++renum; + } + } + } + + return true; +} + +bool FIRCLSCompactUnwindRestoreRegisters(compact_unwind_encoding_t encoding, + FIRCLSThreadContext* registers, + uint32_t stackSize, + const uintptr_t savedRegisters[const static 6], + uintptr_t* address) { + if (!FIRCLSIsValidPointer(registers) || !FIRCLSIsValidPointer(address)) { + FIRCLSSDKLog("Error: invalid inputs\n"); + return false; + } + + const uint32_t regCount = GET_BITS_WITH_MASK(encoding, CLS_X86_FRAMELESS_STACK_REG_COUNT); + + // compute initial address of saved registers + *address = FIRCLSThreadContextGetStackPointer(registers) + stackSize - sizeof(void*) - + sizeof(void*) * regCount; + uintptr_t value = 0; + + for (uint32_t i = 0; i < regCount; ++i) { + value = 0; + + switch (savedRegisters[i]) { + case CLS_X86_REG_RBP: + if (!FIRCLSReadMemory((vm_address_t)*address, (void*)&value, sizeof(uintptr_t))) { + FIRCLSSDKLog("Error: unable to read memory to set register\n"); + return false; + } + + if (!FIRCLSThreadContextSetFramePointer(registers, value)) { + FIRCLSSDKLog("Error: unable to set FP\n"); + return false; + } + break; + default: + // here, we are restoring a register we don't need for unwinding + FIRCLSSDKLog("Error: skipping a restore of register %d at %p\n", (int)savedRegisters[i], + (void*)*address); + break; + } + + *address += sizeof(void*); + } + + return true; +} + +static bool FIRCLSCompactUnwindFrameless(compact_unwind_encoding_t encoding, + FIRCLSThreadContext* registers, + uintptr_t functionStart, + bool indirect) { + FIRCLSSDKLog("Frameless unwind encountered with encoding %x\n", encoding); + + uint32_t stackSize = 0; + if (!FIRCLSCompactUnwindComputeStackSize(encoding, functionStart, indirect, &stackSize)) { + FIRCLSSDKLog("Error: unable to compute stack size for encoding %x\n", encoding); + return false; + } + + uintptr_t permutatedRegisters[6]; + + memset(permutatedRegisters, 0, sizeof(permutatedRegisters)); + if (!FIRCLSCompactUnwindDecompressPermutation(encoding, permutatedRegisters)) { + FIRCLSSDKLog("Error: unable to decompress registers %x\n", encoding); + return false; + } + + uintptr_t savedRegisters[6]; + + memset(savedRegisters, 0, sizeof(savedRegisters)); + if (!FIRCLSCompactUnwindRemapRegisters(encoding, permutatedRegisters, savedRegisters)) { + FIRCLSSDKLog("Error: unable to remap registers %x\n", encoding); + return false; + } + + uintptr_t address = 0; + + if (!FIRCLSCompactUnwindRestoreRegisters(encoding, registers, stackSize, savedRegisters, + &address)) { + FIRCLSSDKLog("Error: unable to restore registers\n"); + return false; + } + + FIRCLSSDKLog("SP is %p and we are reading %p\n", + (void*)FIRCLSThreadContextGetStackPointer(registers), (void*)address); + // read the value from the stack, now that we know the address to read + uintptr_t value = 0; + if (!FIRCLSReadMemory((vm_address_t)address, (void*)&value, sizeof(uintptr_t))) { + FIRCLSSDKLog("Error: unable to read memory to set register\n"); + return false; + } + + FIRCLSSDKLog("Read PC to be %p\n", (void*)value); + if (!FIRCLSIsValidPointer(value)) { + FIRCLSSDKLog("Error: computed PC is invalid\n"); + return false; + } + + return FIRCLSThreadContextSetPC(registers, value) && + FIRCLSThreadContextSetStackPointer(registers, address + sizeof(void*)); +} +#endif + +#else +INJECT_STRIP_SYMBOL(unwind_x86) +#endif diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Unwind/FIRCLSUnwind_x86.h b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Unwind/FIRCLSUnwind_x86.h new file mode 100644 index 0000000..1cb84c9 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Unwind/FIRCLSUnwind_x86.h @@ -0,0 +1,76 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once + +#include "Crashlytics/Crashlytics/Helpers/FIRCLSFeatures.h" +#include "Crashlytics/Crashlytics/Unwind/Compact/FIRCLSCompactUnwind.h" + +// Add some abstraction to compact unwinding, because compact +// unwinding is nearly identical between 32 and 64 bit +#if CLS_CPU_X86_64 + +#define CLS_X86_MODE_MASK UNWIND_X86_64_MODE_MASK +#define CLS_X86_MODE_BP_FRAME UNWIND_X86_64_MODE_RBP_FRAME +#define CLS_X86_MODE_STACK_IMMD UNWIND_X86_64_MODE_STACK_IMMD +#define CLS_X86_MODE_STACK_IND UNWIND_X86_64_MODE_STACK_IND +#define CLS_X86_MODE_DWARF UNWIND_X86_64_MODE_DWARF + +#define CLS_X86_BP_FRAME_REGISTERS UNWIND_X86_64_RBP_FRAME_REGISTERS +#define CLS_X86_BP_FRAME_OFFSET UNWIND_X86_64_RBP_FRAME_OFFSET + +#define CLS_X86_FRAMELESS_STACK_SIZE UNWIND_X86_64_FRAMELESS_STACK_SIZE +#define CLS_X86_FRAMELESS_STACK_ADJUST UNWIND_X86_64_FRAMELESS_STACK_ADJUST +#define CLS_X86_FRAMELESS_STACK_REG_COUNT UNWIND_X86_64_FRAMELESS_STACK_REG_COUNT +#define CLS_X86_FRAMELESS_STACK_REG_PERMUTATION UNWIND_X86_64_FRAMELESS_STACK_REG_PERMUTATION + +#define CLS_X86_DWARF_SECTION_OFFSET UNWIND_X86_64_DWARF_SECTION_OFFSET + +#define CLS_X86_REG_RBP UNWIND_X86_64_REG_RBP + +#else + +#define CLS_X86_MODE_MASK UNWIND_X86_MODE_MASK +#define CLS_X86_MODE_BP_FRAME UNWIND_X86_MODE_EBP_FRAME +#define CLS_X86_MODE_STACK_IMMD UNWIND_X86_MODE_STACK_IMMD +#define CLS_X86_MODE_STACK_IND UNWIND_X86_MODE_STACK_IND +#define CLS_X86_MODE_DWARF UNWIND_X86_MODE_DWARF + +#define CLS_X86_BP_FRAME_REGISTERS UNWIND_X86_RBP_FRAME_REGISTERS +#define CLS_X86_BP_FRAME_OFFSET UNWIND_X86_RBP_FRAME_OFFSET + +#define CLS_X86_FRAMELESS_STACK_SIZE UNWIND_X86_FRAMELESS_STACK_SIZE +#define CLS_X86_FRAMELESS_STACK_ADJUST UNWIND_X86_FRAMELESS_STACK_ADJUST +#define CLS_X86_FRAMELESS_STACK_REG_COUNT UNWIND_X86_FRAMELESS_STACK_REG_COUNT +#define CLS_X86_FRAMELESS_STACK_REG_PERMUTATION UNWIND_X86_FRAMELESS_STACK_REG_PERMUTATION + +#define CLS_X86_DWARF_SECTION_OFFSET UNWIND_X86_DWARF_SECTION_OFFSET + +#define CLS_X86_REG_RBP UNWIND_X86_REG_EBP + +#endif + +#if CLS_COMPACT_UNWINDING_SUPPORTED +bool FIRCLSCompactUnwindComputeStackSize(const compact_unwind_encoding_t encoding, + const uintptr_t functionStart, + const bool indirect, + uint32_t *const stackSize); +bool FIRCLSCompactUnwindDecompressPermutation(const compact_unwind_encoding_t encoding, + uintptr_t permutatedRegisters[const static 6]); +bool FIRCLSCompactUnwindRestoreRegisters(compact_unwind_encoding_t encoding, + FIRCLSThreadContext *registers, + uint32_t stackSize, + const uintptr_t savedRegisters[const static 6], + uintptr_t *address); +#endif diff --git a/Pods/FirebaseCrashlytics/Crashlytics/LICENSE b/Pods/FirebaseCrashlytics/Crashlytics/LICENSE new file mode 100644 index 0000000..925bc57 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/LICENSE @@ -0,0 +1,230 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +================================================================================ + +The following copyright from Hewlett-Packard Development Company, L.P. +applies to the dwarf.h file in third_party/libunwind + + libunwind - a platform-independent unwind library + Copyright (c) 2003-2005 Hewlett-Packard Development Company, L.P. + Contributed by David Mosberger-Tang + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Protogen/nanopb/crashlytics.nanopb.c b/Pods/FirebaseCrashlytics/Crashlytics/Protogen/nanopb/crashlytics.nanopb.c new file mode 100644 index 0000000..cb88acc --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Protogen/nanopb/crashlytics.nanopb.c @@ -0,0 +1,80 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* Automatically generated nanopb constant definitions */ +/* Generated by nanopb-0.3.9.9 */ + +#include "Crashlytics/Protogen/nanopb/crashlytics.nanopb.h" + +/* @@protoc_insertion_point(includes) */ +#if PB_PROTO_HEADER_VERSION != 30 +#error Regenerate this file with the current version of nanopb generator. +#endif + + + +const pb_field_t google_crashlytics_Report_fields[11] = { + PB_FIELD( 1, BYTES , SINGULAR, POINTER , FIRST, google_crashlytics_Report, sdk_version, sdk_version, 0), + PB_FIELD( 3, BYTES , SINGULAR, POINTER , OTHER, google_crashlytics_Report, gmp_app_id, sdk_version, 0), + PB_FIELD( 4, UENUM , SINGULAR, STATIC , OTHER, google_crashlytics_Report, platform, gmp_app_id, 0), + PB_FIELD( 5, BYTES , SINGULAR, POINTER , OTHER, google_crashlytics_Report, installation_uuid, platform, 0), + PB_FIELD( 6, BYTES , SINGULAR, POINTER , OTHER, google_crashlytics_Report, build_version, installation_uuid, 0), + PB_FIELD( 7, BYTES , SINGULAR, POINTER , OTHER, google_crashlytics_Report, display_version, build_version, 0), + PB_FIELD( 10, MESSAGE , SINGULAR, STATIC , OTHER, google_crashlytics_Report, apple_payload, display_version, &google_crashlytics_FilesPayload_fields), + PB_FIELD( 16, BYTES , SINGULAR, POINTER , OTHER, google_crashlytics_Report, firebase_installation_id, apple_payload, 0), + PB_FIELD( 17, BYTES , SINGULAR, POINTER , OTHER, google_crashlytics_Report, app_quality_session_id, firebase_installation_id, 0), + PB_FIELD( 19, BYTES , SINGULAR, POINTER , OTHER, google_crashlytics_Report, firebase_authentication_token, app_quality_session_id, 0), + PB_LAST_FIELD +}; + +const pb_field_t google_crashlytics_FilesPayload_fields[2] = { + PB_FIELD( 1, MESSAGE , REPEATED, POINTER , FIRST, google_crashlytics_FilesPayload, files, files, &google_crashlytics_FilesPayload_File_fields), + PB_LAST_FIELD +}; + +const pb_field_t google_crashlytics_FilesPayload_File_fields[3] = { + PB_FIELD( 1, BYTES , SINGULAR, POINTER , FIRST, google_crashlytics_FilesPayload_File, filename, filename, 0), + PB_FIELD( 2, BYTES , SINGULAR, POINTER , OTHER, google_crashlytics_FilesPayload_File, contents, filename, 0), + PB_LAST_FIELD +}; + + + +/* Check that field information fits in pb_field_t */ +#if !defined(PB_FIELD_32BIT) +/* If you get an error here, it means that you need to define PB_FIELD_32BIT + * compile-time option. You can do that in pb.h or on compiler command line. + * + * The reason you need to do this is that some of your messages contain tag + * numbers or field sizes that are larger than what can fit in 8 or 16 bit + * field descriptors. + */ +PB_STATIC_ASSERT((pb_membersize(google_crashlytics_Report, apple_payload) < 65536), YOU_MUST_DEFINE_PB_FIELD_32BIT_FOR_MESSAGES_google_crashlytics_Report_google_crashlytics_FilesPayload_google_crashlytics_FilesPayload_File) +#endif + +#if !defined(PB_FIELD_16BIT) && !defined(PB_FIELD_32BIT) +/* If you get an error here, it means that you need to define PB_FIELD_16BIT + * compile-time option. You can do that in pb.h or on compiler command line. + * + * The reason you need to do this is that some of your messages contain tag + * numbers or field sizes that are larger than what can fit in the default + * 8 bit descriptors. + */ +PB_STATIC_ASSERT((pb_membersize(google_crashlytics_Report, apple_payload) < 256), YOU_MUST_DEFINE_PB_FIELD_16BIT_FOR_MESSAGES_google_crashlytics_Report_google_crashlytics_FilesPayload_google_crashlytics_FilesPayload_File) +#endif + + +/* @@protoc_insertion_point(eof) */ diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Protogen/nanopb/crashlytics.nanopb.h b/Pods/FirebaseCrashlytics/Crashlytics/Protogen/nanopb/crashlytics.nanopb.h new file mode 100644 index 0000000..4ad4f89 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Protogen/nanopb/crashlytics.nanopb.h @@ -0,0 +1,113 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* Automatically generated nanopb header */ +/* Generated by nanopb-0.3.9.9 */ + +#ifndef PB_GOOGLE_CRASHLYTICS_CRASHLYTICS_NANOPB_H_INCLUDED +#define PB_GOOGLE_CRASHLYTICS_CRASHLYTICS_NANOPB_H_INCLUDED +#include + +/* @@protoc_insertion_point(includes) */ +#if PB_PROTO_HEADER_VERSION != 30 +#error Regenerate this file with the current version of nanopb generator. +#endif + + +/* Enum definitions */ +typedef enum _google_crashlytics_Platforms { + google_crashlytics_Platforms_UNKNOWN_PLATFORM = 0, + google_crashlytics_Platforms_IOS = 1, + google_crashlytics_Platforms_TVOS = 2, + google_crashlytics_Platforms_MAC_OS_X = 5 +} google_crashlytics_Platforms; +#define _google_crashlytics_Platforms_MIN google_crashlytics_Platforms_UNKNOWN_PLATFORM +#define _google_crashlytics_Platforms_MAX google_crashlytics_Platforms_MAC_OS_X +#define _google_crashlytics_Platforms_ARRAYSIZE ((google_crashlytics_Platforms)(google_crashlytics_Platforms_MAC_OS_X+1)) + +/* Struct definitions */ +typedef struct _google_crashlytics_FilesPayload { + pb_size_t files_count; + struct _google_crashlytics_FilesPayload_File *files; +/* @@protoc_insertion_point(struct:google_crashlytics_FilesPayload) */ +} google_crashlytics_FilesPayload; + +typedef struct _google_crashlytics_FilesPayload_File { + pb_bytes_array_t *filename; + pb_bytes_array_t *contents; +/* @@protoc_insertion_point(struct:google_crashlytics_FilesPayload_File) */ +} google_crashlytics_FilesPayload_File; + +typedef struct _google_crashlytics_Report { + pb_bytes_array_t *sdk_version; + pb_bytes_array_t *gmp_app_id; + google_crashlytics_Platforms platform; + pb_bytes_array_t *installation_uuid; + pb_bytes_array_t *build_version; + pb_bytes_array_t *display_version; + google_crashlytics_FilesPayload apple_payload; + pb_bytes_array_t *firebase_installation_id; + pb_bytes_array_t *app_quality_session_id; + pb_bytes_array_t *firebase_authentication_token; +/* @@protoc_insertion_point(struct:google_crashlytics_Report) */ +} google_crashlytics_Report; + +/* Default values for struct fields */ + +/* Initializer values for message structs */ +#define google_crashlytics_Report_init_default {NULL, NULL, _google_crashlytics_Platforms_MIN, NULL, NULL, NULL, google_crashlytics_FilesPayload_init_default, NULL, NULL} +#define google_crashlytics_FilesPayload_init_default {0, NULL} +#define google_crashlytics_FilesPayload_File_init_default {NULL, NULL} +#define google_crashlytics_Report_init_zero {NULL, NULL, _google_crashlytics_Platforms_MIN, NULL, NULL, NULL, google_crashlytics_FilesPayload_init_zero, NULL, NULL} +#define google_crashlytics_FilesPayload_init_zero {0, NULL} +#define google_crashlytics_FilesPayload_File_init_zero {NULL, NULL} + +/* Field tags (for use in manual encoding/decoding) */ +#define google_crashlytics_FilesPayload_files_tag 1 +#define google_crashlytics_FilesPayload_File_filename_tag 1 +#define google_crashlytics_FilesPayload_File_contents_tag 2 +#define google_crashlytics_Report_sdk_version_tag 1 +#define google_crashlytics_Report_gmp_app_id_tag 3 +#define google_crashlytics_Report_platform_tag 4 +#define google_crashlytics_Report_installation_uuid_tag 5 +#define google_crashlytics_Report_firebase_installation_id_tag 16 +#define google_crashlytics_Report_app_quality_session_id_tag 17 +#define google_crashlytics_Report_firebase_authentication_token 19 +#define google_crashlytics_Report_build_version_tag 6 +#define google_crashlytics_Report_display_version_tag 7 +#define google_crashlytics_Report_apple_payload_tag 10 + +/* Struct field encoding specification for nanopb */ +extern const pb_field_t google_crashlytics_Report_fields[11]; +extern const pb_field_t google_crashlytics_FilesPayload_fields[2]; +extern const pb_field_t google_crashlytics_FilesPayload_File_fields[3]; + +/* Maximum encoded size of messages (where known) */ +/* google_crashlytics_Report_size depends on runtime parameters */ +/* google_crashlytics_FilesPayload_size depends on runtime parameters */ +/* google_crashlytics_FilesPayload_File_size depends on runtime parameters */ + +/* Message IDs (where set with "msgid" option) */ +#ifdef PB_MSGID + +#define CRASHLYTICS_MESSAGES \ + + +#endif + +/* @@protoc_insertion_point(eof) */ + +#endif diff --git a/Pods/FirebaseCrashlytics/Crashlytics/README.md b/Pods/FirebaseCrashlytics/Crashlytics/README.md new file mode 100644 index 0000000..55d36e6 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/README.md @@ -0,0 +1,39 @@ +# Firebase Crashlytics SDK + +## Development + +Follow the subsequent instructions to develop, debug, unit test, and +integration test FirebaseCrashlytics: + +### Prereqs + +- At least CocoaPods 1.6.0 +- Install [cocoapods-generate](https://github.com/square/cocoapods-generate) +- For nanopb and GDT: + - `brew install protobuf nanopb-generator` + - `easy_install protobuf python` + +### To Develop + +- Run `Crashlytics/generate_project.sh` +- `open gen/FirebaseCrashlytics/FirebaseCrashlytics.xcworkspace` + +You're now in an Xcode workspace generate for building, debugging and +testing the FirebaseCrashlytics CocoaPod. + +### Running Unit Tests + +Open the generated workspace, choose the FirebaseCrashlytics-Unit-unit scheme and press Command-u. + +### Changing crash report uploads (using GDT) + +#### Update report proto + +If the crash report proto needs to be updated, follow these instructions: + +- Update `ProtoSupport/Protos/crashlytics.proto` with the new changes +- Depending on the type of fields added/removed, also update `ProtoSupport/Protos/crashlytics.options`. + `CALLBACK` type fields in crashlytics.nanopb.c needs to be changed to `POINTER` + (through the options file). Known field types that require an entry in crashlytics.options are + `strings`, `repeated` and `bytes`. +- Run `generate_project.sh` to update the nanopb .c/.h files. \ No newline at end of file diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Resources/PrivacyInfo.xcprivacy b/Pods/FirebaseCrashlytics/Crashlytics/Resources/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..410a473 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Resources/PrivacyInfo.xcprivacy @@ -0,0 +1,49 @@ + + + + + NSPrivacyTracking + + NSPrivacyTrackingDomains + + + NSPrivacyCollectedDataTypes + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypeCrashData + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + NSPrivacyCollectedDataTypePurposeAppFunctionality + + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypeOtherDiagnosticData + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + NSPrivacyCollectedDataTypePurposeAppFunctionality + + + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + NSPrivacyAccessedAPITypeReasons + + CA92.1 + + + + + \ No newline at end of file diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSByteUtility.h b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSByteUtility.h new file mode 100644 index 0000000..17758b3 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSByteUtility.h @@ -0,0 +1,41 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +/** + * Returns a SHA1 Hash of the input `Data` + */ +NSString *FIRCLSHashNSData(NSData *data); +/** + * Returns a SHA256 Hash of the input `Data` + */ +NSString *FIRCLS256HashNSData(NSData *data); +/** + * Returns a SHA1 Hash of the input bytes + */ +NSString *FIRCLSHashBytes(const void *bytes, size_t length); +/** + * Populates a Hex value conversion of value into outputBuffer. + * If value is nil, then outputBuffer is not modified. + */ +void FIRCLSSafeHexToString(const uint8_t *value, size_t length, char *outputBuffer); + +/** + * Iterates through the raw bytes of data in a way that is similar to + * `Data`'s `enumerateBytes(_ block:)`, but is safe to call from older + * OSes that do not support it. + */ +void FIRCLSEnumerateByteRangesOfNSDataUsingBlock( + NSData *data, void (^block)(const void *bytes, NSRange byteRange, BOOL *stop)); diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSByteUtility.m b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSByteUtility.m new file mode 100644 index 0000000..f27d60b --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSByteUtility.m @@ -0,0 +1,120 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "Crashlytics/Shared/FIRCLSByteUtility.h" + +#import +#import + +#pragma mark Private functions + +static const char FIRCLSHexMap[] = "0123456789abcdef"; + +void FIRCLSHexFromByte(uint8_t c, char output[]) { + if (!output) { + return; + } + + output[0] = FIRCLSHexMap[c >> 4]; + output[1] = FIRCLSHexMap[c & 0x0f]; +} + +void FIRCLSSafeHexToString(const uint8_t *value, size_t length, char *outputBuffer) { + if (!outputBuffer) { + return; + } + + memset(outputBuffer, 0, (length * 2) + 1); + + if (!value) { + return; + } + + for (size_t i = 0; i < length; ++i) { + uint8_t c = value[i]; + + FIRCLSHexFromByte(c, &outputBuffer[i * 2]); + } +} + +NSString *FIRCLSNSDataPrettyDescription(NSData *data) { + NSString *string; + char *buffer; + size_t size; + NSUInteger length; + + // we need 2 hex char for every byte of data, plus one more spot for a + // null terminator + length = data.length; + size = (length * 2) + 1; + buffer = calloc(1, sizeof(char) * size); + + if (!buffer) { + return nil; + } + + FIRCLSSafeHexToString(data.bytes, length, buffer); + + string = [NSString stringWithUTF8String:buffer]; + + free(buffer); + + return string; +} + +#pragma mark Public functions + +NSString *FIRCLSHashBytes(const void *bytes, size_t length) { + uint8_t digest[CC_SHA1_DIGEST_LENGTH] = {0}; + CC_SHA1(bytes, (CC_LONG)length, digest); + + NSData *result = [NSData dataWithBytes:digest length:CC_SHA1_DIGEST_LENGTH]; + + return FIRCLSNSDataPrettyDescription(result); +} + +NSString *FIRCLSHashNSData(NSData *data) { + return FIRCLSHashBytes(data.bytes, data.length); +} + +NSString *FIRCLS256HashBytes(const void *bytes, size_t length) { + uint8_t digest[CC_SHA256_DIGEST_LENGTH] = {0}; + CC_SHA256(bytes, (CC_LONG)length, digest); + + NSData *result = [NSData dataWithBytes:digest length:CC_SHA256_DIGEST_LENGTH]; + + return FIRCLSNSDataPrettyDescription(result); +} + +NSString *FIRCLS256HashNSData(NSData *data) { + return FIRCLS256HashBytes(data.bytes, data.length); +} + +void FIRCLSEnumerateByteRangesOfNSDataUsingBlock( + NSData *data, void (^block)(const void *bytes, NSRange byteRange, BOOL *stop)) { + if ([data respondsToSelector:@selector(enumerateByteRangesUsingBlock:)]) { + [data enumerateByteRangesUsingBlock:^(const void *bytes, NSRange byteRange, BOOL *stop) { + block(bytes, byteRange, stop); + }]; + + return; + } + + // Fall back to the less-efficient mechanism for older OSes. Safe + // to ignore the return value of stop, since we'll only ever + // call this once anyways + BOOL stop = NO; + + block(data.bytes, NSMakeRange(0, data.length), &stop); +} diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSConstants.h b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSConstants.h new file mode 100644 index 0000000..c7034c6 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSConstants.h @@ -0,0 +1,51 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +NS_ASSUME_NONNULL_BEGIN + +FOUNDATION_EXPORT NSString *const FIRCLSDeveloperToken; + +// User Messages +FOUNDATION_EXPORT NSString *const FIRCLSMissingConsumerKeyMsg; +FOUNDATION_EXPORT NSString *const FIRCLSMissingConsumerSecretMsg; + +// Exceptions +FOUNDATION_EXPORT NSString *const FIRCLSException; + +// Endpoints +FOUNDATION_EXPORT NSString *const FIRCLSSettingsEndpoint; +FOUNDATION_EXPORT NSString *const FIRCLSConfigureEndpoint; +FOUNDATION_EXPORT NSString *const FIRCLSReportsEndpoint; + +// Network requests +FOUNDATION_EXPORT NSString *const FIRCLSNetworkAccept; +FOUNDATION_EXPORT NSString *const FIRCLSNetworkAcceptCharset; +FOUNDATION_EXPORT NSString *const FIRCLSNetworkApplicationJson; +FOUNDATION_EXPORT NSString *const FIRCLSNetworkAcceptLanguage; +FOUNDATION_EXPORT NSString *const FIRCLSNetworkContentLanguage; +FOUNDATION_EXPORT NSString *const FIRCLSNetworkCrashlyticsAPIClientDisplayVersion; +FOUNDATION_EXPORT NSString *const FIRCLSNetworkCrashlyticsAPIClientId; +FOUNDATION_EXPORT NSString *const FIRCLSNetworkCrashlyticsDeveloperToken; +FOUNDATION_EXPORT NSString *const FIRCLSNetworkCrashlyticsGoogleAppId; +FOUNDATION_EXPORT NSString *const FIRCLSNetworkCrashlyticsOrgId; +FOUNDATION_EXPORT NSString *const FIRCLSNetworkUserAgent; +FOUNDATION_EXPORT NSString *const FIRCLSNetworkUTF8; + +NSString *FIRCLSSDKGeneratorName(void); + +NSString *FIRCLSSDKVersion(void); + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSConstants.m b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSConstants.m new file mode 100644 index 0000000..301a57d --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSConstants.m @@ -0,0 +1,56 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "Crashlytics/Shared/FIRCLSConstants.h" +#import "FirebaseCore/Extension/FirebaseCoreInternal.h" + +#define STR_HELPER(x) #x +#define STR(x) STR_HELPER(x) + +NSString* const FIRCLSDeveloperToken = @"77f0789d8e230eccdb4b99b82dccd78d47f9b604"; + +// User Messages +NSString* const FIRCLSMissingConsumerKeyMsg = @"consumer key is nil or zero length"; +NSString* const FIRCLSMissingConsumerSecretMsg = @"consumer secret is nil or zero length"; + +// Exceptions +NSString* const FIRCLSException = @"FIRCLSException"; + +// Endpoints +NSString* const FIRCLSSettingsEndpoint = @"https://firebase-settings.crashlytics.com"; +NSString* const FIRCLSConfigureEndpoint = @"https://update.crashlytics.com"; +NSString* const FIRCLSReportsEndpoint = @"https://reports.crashlytics.com"; + +// Network requests +NSString* const FIRCLSNetworkAccept = @"Accept"; +NSString* const FIRCLSNetworkAcceptCharset = @"Accept-Charset"; +NSString* const FIRCLSNetworkApplicationJson = @"application/json"; +NSString* const FIRCLSNetworkAcceptLanguage = @"Accept-Language"; +NSString* const FIRCLSNetworkContentLanguage = @"Content-Language"; +NSString* const FIRCLSNetworkCrashlyticsAPIClientDisplayVersion = + @"X-Crashlytics-API-Client-Display-Version"; +NSString* const FIRCLSNetworkCrashlyticsAPIClientId = @"X-Crashlytics-API-Client-Id"; +NSString* const FIRCLSNetworkCrashlyticsDeveloperToken = @"X-Crashlytics-Developer-Token"; +NSString* const FIRCLSNetworkCrashlyticsGoogleAppId = @"X-Crashlytics-Google-App-Id"; +NSString* const FIRCLSNetworkCrashlyticsOrgId = @"X-Crashlytics-Org-Id"; +NSString* const FIRCLSNetworkUserAgent = @"User-Agent"; +NSString* const FIRCLSNetworkUTF8 = @"utf-8"; + +NSString* FIRCLSSDKGeneratorName(void) { + return [NSString stringWithFormat:@"%s/%s", STR(CLS_SDK_NAME), FIRCLSSDKVersion().UTF8String]; +} + +NSString* FIRCLSSDKVersion(void) { + return FIRFirebaseVersion(); +} diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSFABHost.h b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSFABHost.h new file mode 100644 index 0000000..82c8fcc --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSFABHost.h @@ -0,0 +1,35 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +/** + * Returns the OS version of the host device + */ +NSOperatingSystemVersion FIRCLSHostGetOSVersion(void); + +/** + * Returns model info for the device on which app is running + */ +NSString *FIRCLSHostModelInfo(void); + +/** + * Returns a string representing the OS build + */ +NSString *FIRCLSHostOSBuildVersion(void); + +/** + * Returns a concatenated string of the OS version(majorVersion.minorVersion.patchVersion) + */ +NSString *FIRCLSHostOSDisplayVersion(void); diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSFABHost.m b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSFABHost.m new file mode 100644 index 0000000..b6971c9 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSFABHost.m @@ -0,0 +1,95 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "Crashlytics/Shared/FIRCLSFABHost.h" + +#import + +#if TARGET_OS_WATCH +#import +#elif TARGET_OS_IPHONE +#import +#endif + +#include + +#define FIRCLS_HOST_SYSCTL_BUFFER_SIZE (128) + +#pragma mark - OS Versions + +#pragma mark Private + +static NSString *FIRCLSHostSysctlEntry(const char *sysctlKey) { + char buffer[FIRCLS_HOST_SYSCTL_BUFFER_SIZE]; + size_t bufferSize = FIRCLS_HOST_SYSCTL_BUFFER_SIZE; + if (sysctlbyname(sysctlKey, buffer, &bufferSize, NULL, 0) != 0) { + return nil; + } + return [NSString stringWithUTF8String:buffer]; +} + +#pragma mark Public + +NSOperatingSystemVersion FIRCLSHostGetOSVersion(void) { + // works on macos(10.10), ios(8.0), watchos(2.0), tvos(9.0) + if ([NSProcessInfo.processInfo respondsToSelector:@selector(operatingSystemVersion)]) { + return [NSProcessInfo.processInfo operatingSystemVersion]; + } + + NSOperatingSystemVersion version = {0, 0, 0}; + +#if TARGET_OS_IPHONE + +#if TARGET_OS_WATCH + NSString *versionString = [[WKInterfaceDevice currentDevice] systemVersion]; +#else + NSString *versionString = [[UIDevice currentDevice] systemVersion]; +#endif + + NSArray *parts = [versionString componentsSeparatedByString:@"."]; + + if (parts.count > 0) { + version.majorVersion = [[parts objectAtIndex:0] integerValue]; + } + + if ([parts count] > 1) { + version.minorVersion = [[parts objectAtIndex:1] integerValue]; + } + + if ([parts count] > 2) { + version.patchVersion = [[parts objectAtIndex:2] integerValue]; + } + +#endif + + return version; +} + +NSString *FIRCLSHostOSBuildVersion(void) { + return FIRCLSHostSysctlEntry("kern.osversion"); +} + +NSString *FIRCLSHostOSDisplayVersion(void) { + NSOperatingSystemVersion version = FIRCLSHostGetOSVersion(); + return [NSString stringWithFormat:@"%ld.%ld.%ld", (long)version.majorVersion, + (long)version.minorVersion, (long)version.patchVersion]; +} + +#pragma mark - Host Models + +#pragma mark Public + +NSString *FIRCLSHostModelInfo(void) { + return [GULAppEnvironmentUtil deviceSimulatorModel]; +} diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSMachO/FIRCLSCodeMapping.h b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSMachO/FIRCLSCodeMapping.h new file mode 100644 index 0000000..ae80c46 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSMachO/FIRCLSCodeMapping.h @@ -0,0 +1,34 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +typedef enum { + FIRCLSCodeMappingSourceUnknown, + FIRCLSCodeMappingSourceBuild, + FIRCLSCodeSourceCache, + FIRCLSCodeSourceSpotlight +} FIRCLSCodeMappingSource; + +@interface FIRCLSCodeMapping : NSObject + ++ (instancetype)mappingWithURL:(NSURL*)URL; + +- (instancetype)initWithURL:(NSURL*)URL; + +@property(nonatomic, copy, readonly) NSURL* URL; +@property(nonatomic, assign) FIRCLSCodeMappingSource source; +@property(nonatomic, copy, readonly) NSString* sourceName; + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSMachO/FIRCLSCodeMapping.m b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSMachO/FIRCLSCodeMapping.m new file mode 100644 index 0000000..ca3008b --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSMachO/FIRCLSCodeMapping.m @@ -0,0 +1,40 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "Crashlytics/Shared/FIRCLSMachO/FIRCLSCodeMapping.h" + +@interface FIRCLSCodeMapping () { + FIRCLSCodeMappingSource _source; +} + +@end + +@implementation FIRCLSCodeMapping + ++ (instancetype)mappingWithURL:(NSURL *)URL { + return [[self alloc] initWithURL:URL]; +} + +- (instancetype)initWithURL:(NSURL *)URL { + self = [super init]; + if (!self) { + return nil; + } + + _URL = [URL copy]; + + return self; +} + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSMachO/FIRCLSMachO.h b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSMachO/FIRCLSMachO.h new file mode 100644 index 0000000..a974f53 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSMachO/FIRCLSMachO.h @@ -0,0 +1,117 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once + +#include +#include +#include + +#include + +struct FIRCLSMachOFile { + int fd; + size_t mappedSize; + void* mappedFile; +}; +typedef struct FIRCLSMachOFile* FIRCLSMachOFileRef; + +struct FIRCLSMachOSlice { + const void* startAddress; + cpu_type_t cputype; + cpu_subtype_t cpusubtype; +}; +typedef struct FIRCLSMachOSlice* FIRCLSMachOSliceRef; + +typedef struct { + uint32_t major; + uint32_t minor; + uint32_t bugfix; +} FIRCLSMachOVersion; + +typedef struct { + uint64_t addr; + uint64_t size; + uint32_t offset; +} FIRCLSMachOSection; + +typedef struct { + char segname[16]; + uint64_t vmaddr; + uint64_t vmsize; +} FIRCLSMachOSegmentCommand; + +typedef void (^FIRCLSMachOSliceIterator)(FIRCLSMachOSliceRef slice); +typedef void (^FIRCLSMachOLoadCommandIterator)(uint32_t type, + uint32_t size, + const struct load_command* cmd); +typedef void (*FIRCLSMachOLoadCommandIteratorFunc)(uint32_t type, + uint32_t size, + const struct load_command* cmd, + void* context); + +__BEGIN_DECLS + +bool FIRCLSMachOFileInitWithPath(FIRCLSMachOFileRef file, const char* path); +bool FIRCLSMachOFileInitWithCurrent(FIRCLSMachOFileRef file); +void FIRCLSMachOFileDestroy(FIRCLSMachOFileRef file); +void FIRCLSMachOFileEnumerateSlices(FIRCLSMachOFileRef file, FIRCLSMachOSliceIterator block); +struct FIRCLSMachOSlice FIRCLSMachOFileSliceWithArchitectureName(FIRCLSMachOFileRef file, + const char* name); + +void FIRCLSMachOEnumerateSlicesAtAddress(void* executableData, FIRCLSMachOSliceIterator block); +void FIRCLSMachOSliceEnumerateLoadCommands(FIRCLSMachOSliceRef slice, + FIRCLSMachOLoadCommandIterator block); +void FIRCLSMachOSliceEnumerateLoadCommands_f(FIRCLSMachOSliceRef slice, + void* context, + FIRCLSMachOLoadCommandIteratorFunc function); +struct FIRCLSMachOSlice FIRCLSMachOSliceGetCurrent(void); +struct FIRCLSMachOSlice FIRCLSMachOSliceWithHeader(void* machHeader); + +const char* FIRCLSMachOSliceGetExecutablePath(FIRCLSMachOSliceRef slice); +const char* FIRCLSMachOSliceGetArchitectureName(FIRCLSMachOSliceRef slice); +bool FIRCLSMachOSliceIs64Bit(FIRCLSMachOSliceRef slice); +bool FIRCLSMachOSliceGetSectionByName(FIRCLSMachOSliceRef slice, + const char* segName, + const char* sectionName, + const void** ptr); +bool FIRCLSMachOSliceInitSectionByName(FIRCLSMachOSliceRef slice, + const char* segName, + const char* sectionName, + FIRCLSMachOSection* section); +void FIRCLSMachOSliceGetUnwindInformation(FIRCLSMachOSliceRef slice, + const void** ehFrame, + const void** unwindInfo); + +// load-command-specific calls for convenience + +// returns a pointer to the 16-byte UUID +uint8_t const* FIRCLSMachOGetUUID(const struct load_command* cmd); +const char* FIRCLSMachOGetDylibPath(const struct load_command* cmd); + +// return true if the header indicates the binary is encrypted +bool FIRCLSMachOGetEncrypted(const struct load_command* cmd); + +// SDK minimums +FIRCLSMachOVersion FIRCLSMachOGetMinimumOSVersion(const struct load_command* cmd); +FIRCLSMachOVersion FIRCLSMachOGetLinkedSDKVersion(const struct load_command* cmd); + +// Helpers +FIRCLSMachOSegmentCommand FIRCLSMachOGetSegmentCommand(const struct load_command* cmd); + +#ifdef __OBJC__ +NSString* FIRCLSMachONormalizeUUID(CFUUIDBytes* uuidBytes); +NSString* FIRCLSMachOFormatVersion(FIRCLSMachOVersion* version); +#endif +__END_DECLS diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSMachO/FIRCLSMachO.m b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSMachO/FIRCLSMachO.m new file mode 100644 index 0000000..477541c --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSMachO/FIRCLSMachO.m @@ -0,0 +1,560 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "Crashlytics/Shared/FIRCLSMachO/FIRCLSMachO.h" +#include "Crashlytics/Crashlytics/Helpers/FIRCLSDefines.h" + +#include + +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + +#include + +#include + +// This is defined in newer versions of iOS/macOS in usr/include/mach/machine.h +#define CLS_CPU_SUBTYPE_ARM64E ((cpu_subtype_t)2) + +static void FIRCLSMachOHeaderValues(FIRCLSMachOSliceRef slice, + const struct load_command** cmds, + uint32_t* cmdCount); +static bool FIRCLSMachOSliceIsValid(FIRCLSMachOSliceRef slice); + +bool FIRCLSMachOFileInitWithPath(FIRCLSMachOFileRef file, const char* path) { + if (!file || !path) { + return false; + } + + file->fd = 0; + file->mappedFile = NULL; + file->mappedSize = 0; + + file->fd = open(path, O_RDONLY); + if (file->fd < 0) { + // unable to open mach-o file + return false; + } + + NSError* attributesError; + NSString* objCPath = [NSString stringWithCString:path encoding:NSUTF8StringEncoding]; + NSDictionary* fileAttributes = + [[NSFileManager defaultManager] attributesOfItemAtPath:objCPath error:&attributesError]; + if (attributesError != nil) { + close(file->fd); + return false; + } + NSNumber* fileSizeNumber = [fileAttributes objectForKey:NSFileSize]; + long long currentFileSize = [fileSizeNumber longLongValue]; + NSFileAttributeType fileType = [fileAttributes objectForKey:NSFileType]; + + // We need some minimum size for this to even be a possible mach-o file. I believe + // its probably quite a bit bigger than this, but this at least covers something. + // We also need it to be a regular file. + file->mappedSize = (size_t)currentFileSize; + if (currentFileSize < 16 || ![fileType isEqualToString:NSFileTypeRegular]) { + close(file->fd); + return false; + } + + // Map the file to memory. MAP_SHARED can potentially reduce the amount of actual private + // memory needed to do this mapping. Also, be sure to check for the correct failure result. + file->mappedFile = mmap(0, file->mappedSize, PROT_READ, MAP_FILE | MAP_SHARED, file->fd, 0); + if (!file->mappedFile || (file->mappedFile == MAP_FAILED)) { + close(file->fd); + return false; + } + + return true; +} + +bool FIRCLSMachOFileInitWithCurrent(FIRCLSMachOFileRef file) { + struct FIRCLSMachOSlice slice = FIRCLSMachOSliceGetCurrent(); + + const char* imagePath = FIRCLSMachOSliceGetExecutablePath(&slice); + + return FIRCLSMachOFileInitWithPath(file, imagePath); +} + +void FIRCLSMachOFileDestroy(FIRCLSMachOFileRef file) { + if (!file) { + return; + } + + if (file->mappedFile && file->mappedSize > 0) { + munmap(file->mappedFile, file->mappedSize); + } + + close(file->fd); +} + +void FIRCLSMachOFileEnumerateSlices(FIRCLSMachOFileRef file, FIRCLSMachOSliceIterator block) { + FIRCLSMachOEnumerateSlicesAtAddress(file->mappedFile, block); +} + +void FIRCLSMachOEnumerateSlicesAtAddress(void* executableData, FIRCLSMachOSliceIterator block) { + // check the magic value, to determine if we have a fat header or not + uint32_t magicValue; + uint32_t archCount; + const struct fat_arch* fatArch; + struct FIRCLSMachOSlice slice; + + memset(&slice, 0, sizeof(struct FIRCLSMachOSlice)); + + magicValue = ((struct fat_header*)executableData)->magic; + if ((magicValue != FAT_MAGIC) && (magicValue != FAT_CIGAM)) { + slice.startAddress = executableData; + + // use this to fill in the values + FIRCLSMachOHeaderValues(&slice, NULL, NULL); + + block(&slice); + + return; + } + + archCount = OSSwapBigToHostInt32(((struct fat_header*)executableData)->nfat_arch); + fatArch = executableData + sizeof(struct fat_header); + + for (uint32_t i = 0; i < archCount; ++i) { + slice.cputype = OSSwapBigToHostInt32(fatArch->cputype); + slice.cpusubtype = OSSwapBigToHostInt32(fatArch->cpusubtype); + slice.startAddress = executableData + OSSwapBigToHostInt32(fatArch->offset); + + block(&slice); + + // advance to the next fat_arch structure + fatArch = (struct fat_arch*)((uintptr_t)fatArch + sizeof(struct fat_arch)); + } +} + +struct FIRCLSMachOSlice FIRCLSMachOFileSliceWithArchitectureName(FIRCLSMachOFileRef file, + const char* name) { + __block struct FIRCLSMachOSlice value; + + memset(&value, 0, sizeof(struct FIRCLSMachOSlice)); + + FIRCLSMachOFileEnumerateSlices(file, ^(FIRCLSMachOSliceRef slice) { + if (strcmp(FIRCLSMachOSliceGetArchitectureName(slice), name) == 0) { + value = *slice; + } + }); + + return value; +} + +static void FIRCLSMachOHeaderValues(FIRCLSMachOSliceRef slice, + const struct load_command** cmds, + uint32_t* cmdCount) { + const struct mach_header* header32 = (const struct mach_header*)slice->startAddress; + const struct mach_header_64* header64 = (const struct mach_header_64*)slice->startAddress; + uint32_t commandCount; + const void* commandsAddress; + + if (cmds) { + *cmds = NULL; + } + + if (cmdCount) { + *cmdCount = 0; + } + + if (!slice->startAddress) { + return; + } + + // the 32 and 64 bit versions have an identical structures, so this will work + switch (header32->magic) { + case MH_MAGIC: // 32-bit + case MH_CIGAM: + slice->cputype = header32->cputype; + slice->cpusubtype = header32->cpusubtype; + commandCount = header32->ncmds; + commandsAddress = slice->startAddress + sizeof(struct mach_header); + break; + case MH_MAGIC_64: // 64-bit + case MH_CIGAM_64: + slice->cputype = header64->cputype; + slice->cpusubtype = header64->cpusubtype; + commandCount = header64->ncmds; + commandsAddress = slice->startAddress + sizeof(struct mach_header_64); + break; + default: + // not a valid header + return; + } + + // assign everything back by reference + if (cmds) { + *cmds = commandsAddress; + } + + if (cmdCount) { + *cmdCount = commandCount; + } +} + +static bool FIRCLSMachOSliceIsValid(FIRCLSMachOSliceRef slice) { + if (!slice) { + return false; + } + + if (!slice->startAddress) { + return false; + } + + return true; +} + +void FIRCLSMachOSliceEnumerateLoadCommands_f(FIRCLSMachOSliceRef slice, + void* context, + FIRCLSMachOLoadCommandIteratorFunc function) { + const struct load_command* cmd; + uint32_t cmdCount; + + if (!FIRCLSMachOSliceIsValid(slice)) { + return; + } + + FIRCLSMachOHeaderValues(slice, &cmd, &cmdCount); + + for (uint32_t i = 0; cmd != NULL && i < cmdCount; ++i) { + function(cmd->cmd, cmd->cmdsize, cmd, context); + + cmd = (struct load_command*)((uintptr_t)cmd + cmd->cmdsize); + } +} + +void FIRCLSMachOSliceEnumerateLoadCommands(FIRCLSMachOSliceRef slice, + FIRCLSMachOLoadCommandIterator block) { + const struct load_command* cmd; + uint32_t cmdCount; + + if (!block) { + return; + } + + if (!FIRCLSMachOSliceIsValid(slice)) { + return; + } + + FIRCLSMachOHeaderValues(slice, &cmd, &cmdCount); + + for (uint32_t i = 0; cmd != NULL && i < cmdCount; ++i) { + block(cmd->cmd, cmd->cmdsize, cmd); + + cmd = (struct load_command*)((uintptr_t)cmd + cmd->cmdsize); + } +} + +struct FIRCLSMachOSlice FIRCLSMachOSliceGetCurrent(void) { + struct FIRCLSMachOSlice slice; + void* executableSymbol; + Dl_info dlinfo; + +#if !CLS_TARGET_OS_VISION + const NXArchInfo* archInfo; + archInfo = NXGetLocalArchInfo(); + + if (archInfo) { + slice.cputype = archInfo->cputype; + slice.cpusubtype = archInfo->cpusubtype; + } +#else + cpu_type_t cputype; + cpu_subtype_t cpusubtype; + const char* archname = macho_arch_name_for_mach_header(NULL); + bool hasArchInfo = macho_cpu_type_for_arch_name(archname, &cputype, &cpusubtype); + if (hasArchInfo) { + slice.cputype = cputype; + slice.cpusubtype = cpusubtype; + } +#endif + + slice.startAddress = NULL; + + // This call can fail when Exported Symbols File in Build Settings is missing the symbol value + // defined as _MH_EXECUTE_SYM (if you look in the header the underscored MH_EXECUTE_SYM define is + // there) + executableSymbol = dlsym(RTLD_MAIN_ONLY, MH_EXECUTE_SYM); + + // get the address of the main function + if (dladdr(executableSymbol, &dlinfo) != 0) { + slice.startAddress = dlinfo.dli_fbase; + } + + return slice; +} + +struct FIRCLSMachOSlice FIRCLSMachOSliceWithHeader(void* machHeader) { + struct FIRCLSMachOSlice slice; + + slice.startAddress = machHeader; + + return slice; +} + +const char* FIRCLSMachOSliceGetExecutablePath(FIRCLSMachOSliceRef slice) { + Dl_info info; + + if (!FIRCLSMachOSliceIsValid(slice)) { + return NULL; + } + + // use dladdr here to look up the information we need for a binary image + if (dladdr(slice->startAddress, &info) == 0) { + return NULL; + } + + return info.dli_fname; +} + +const char* FIRCLSMachOSliceGetArchitectureName(FIRCLSMachOSliceRef slice) { + // there are some special cases here for types not handled by earlier OSes + if (slice->cputype == CPU_TYPE_ARM && slice->cpusubtype == CPU_SUBTYPE_ARM_V7S) { + return "armv7s"; + } + + if (slice->cputype == (CPU_TYPE_ARM | CPU_ARCH_ABI64)) { + if (slice->cpusubtype == CLS_CPU_SUBTYPE_ARM64E) { + return "arm64e"; + } else if (slice->cpusubtype == CPU_SUBTYPE_ARM64_ALL) { + return "arm64"; + } + } + + if (slice->cputype == (CPU_TYPE_ARM) && slice->cpusubtype == CPU_SUBTYPE_ARM_V7K) { + return "armv7k"; + } + +#if !CLS_TARGET_OS_VISION + const NXArchInfo* archInfo; + + archInfo = NXGetArchInfoFromCpuType(slice->cputype, slice->cpusubtype); + if (!archInfo) { + return "unknown"; + } + + return archInfo->name; +#else + const char* archname = macho_arch_name_for_mach_header(slice->startAddress); + + if (!archname) { + return "unknown"; + } + return archname; +#endif +} + +bool FIRCLSMachOSliceIs64Bit(FIRCLSMachOSliceRef slice) { + // I'm pretty sure this is sufficient... + return (slice->cputype & CPU_ARCH_ABI64) == CPU_ARCH_ABI64; +} + +// deprecated +bool FIRCLSMachOSliceGetSectionByName(FIRCLSMachOSliceRef slice, + const char* segName, + const char* sectionName, + const void** ptr) { + if (!ptr) { + return false; + } + + *ptr = NULL; // make sure this is set before returning + + FIRCLSMachOSection section; + + if (!FIRCLSMachOSliceInitSectionByName(slice, segName, sectionName, §ion)) { + return false; + } + + // WARNING: this calculation isn't correct, but is here to maintain backwards + // compatibility for now with callers of FIRCLSMachOSliceGetSectionByName. All new + // users should be calling FIRCLSMachOSliceInitSectionByName + *ptr = (const void*)((uintptr_t)slice->startAddress + section.offset); + + return true; +} + +bool FIRCLSMachOSliceInitSectionByName(FIRCLSMachOSliceRef slice, + const char* segName, + const char* sectionName, + FIRCLSMachOSection* section) { + if (!FIRCLSMachOSliceIsValid(slice)) { + return false; + } + + if (!section) { + return false; + } + + memset(section, 0, sizeof(FIRCLSMachOSection)); + +// Deprecated code for vision OS, entire function is not used anywhere +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + if (FIRCLSMachOSliceIs64Bit(slice)) { + const struct section_64* sect = + getsectbynamefromheader_64(slice->startAddress, segName, sectionName); + if (!sect) { + return false; + } + + section->addr = sect->addr; + section->size = sect->size; + section->offset = sect->offset; + } else { + const struct section* sect = getsectbynamefromheader(slice->startAddress, segName, sectionName); + if (!sect) { + return false; + } + + section->addr = sect->addr; + section->size = sect->size; + section->offset = sect->offset; + } +#pragma clang diagnostic pop + return true; +} + +// TODO: this is left in-place just to ensure that old crashltyics + new fabric are still compatible +// with each other. As a happy bonus, if that situation does come up, this will also fix the bug +// that was preventing compact unwind on arm64 + iOS 9 from working correctly. +void FIRCLSMachOSliceGetUnwindInformation(FIRCLSMachOSliceRef slice, + const void** ehFrame, + const void** unwindInfo) { + if (!unwindInfo && !ehFrame) { + return; + } + + bool found = false; + intptr_t slide = 0; + + // This is inefficient, but we have no other safe way to do this correctly. Modifying the + // FIRCLSMachOSlice structure is tempting, but could introduce weird binary-compatibility issues + // with version mis-matches. + for (uint32_t i = 0; i < _dyld_image_count(); ++i) { + const struct mach_header* header = _dyld_get_image_header(i); + + if (header == slice->startAddress) { + found = true; + slide = _dyld_get_image_vmaddr_slide(i); + break; + } + } + + // make sure we were able to find a matching value + if (!found) { + return; + } + + FIRCLSMachOSection section; + + if (unwindInfo) { + if (FIRCLSMachOSliceInitSectionByName(slice, SEG_TEXT, "__unwind_info", §ion)) { + *unwindInfo = (void*)(section.addr + slide); + } + } + + if (ehFrame) { + if (FIRCLSMachOSliceInitSectionByName(slice, SEG_TEXT, "__eh_frame", §ion)) { + *ehFrame = (void*)(section.addr + slide); + } + } +} + +uint8_t const* FIRCLSMachOGetUUID(const struct load_command* cmd) { + return ((const struct uuid_command*)cmd)->uuid; +} + +const char* FIRCLSMachOGetDylibPath(const struct load_command* cmd) { + const struct dylib_command* dylibcmd = (const struct dylib_command*)cmd; + + return (const char*)((uintptr_t)cmd + dylibcmd->dylib.name.offset); +} + +bool FIRCLSMachOGetEncrypted(const struct load_command* cmd) { + return ((struct encryption_info_command*)cmd)->cryptid > 0; +} + +static FIRCLSMachOVersion FIRCLSMachOVersionFromEncoded(uint32_t encoded) { + FIRCLSMachOVersion version; + + version.major = (encoded & 0xffff0000) >> 16; + version.minor = (encoded & 0x0000ff00) >> 8; + version.bugfix = encoded & 0x000000ff; + + return version; +} + +FIRCLSMachOVersion FIRCLSMachOGetMinimumOSVersion(const struct load_command* cmd) { + return FIRCLSMachOVersionFromEncoded(((const struct version_min_command*)cmd)->version); +} + +FIRCLSMachOVersion FIRCLSMachOGetLinkedSDKVersion(const struct load_command* cmd) { + return FIRCLSMachOVersionFromEncoded(((const struct version_min_command*)cmd)->sdk); +} + +FIRCLSMachOSegmentCommand FIRCLSMachOGetSegmentCommand(const struct load_command* cmd) { + FIRCLSMachOSegmentCommand segmentCommand; + + memset(&segmentCommand, 0, sizeof(FIRCLSMachOSegmentCommand)); + + if (!cmd) { + return segmentCommand; + } + + if (cmd->cmd == LC_SEGMENT) { + struct segment_command* segCmd = (struct segment_command*)cmd; + + memcpy(segmentCommand.segname, segCmd->segname, 16); + segmentCommand.vmaddr = segCmd->vmaddr; + segmentCommand.vmsize = segCmd->vmsize; + } else if (cmd->cmd == LC_SEGMENT_64) { + struct segment_command_64* segCmd = (struct segment_command_64*)cmd; + + memcpy(segmentCommand.segname, segCmd->segname, 16); + segmentCommand.vmaddr = segCmd->vmaddr; + segmentCommand.vmsize = segCmd->vmsize; + } + + return segmentCommand; +} + +NSString* FIRCLSMachONormalizeUUID(CFUUIDBytes* uuidBytes) { + CFUUIDRef uuid = CFUUIDCreateFromUUIDBytes(kCFAllocatorDefault, *uuidBytes); + + NSString* string = CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault, uuid)); + + CFRelease(uuid); + + return [[string stringByReplacingOccurrencesOfString:@"-" withString:@""] lowercaseString]; +} + +NSString* FIRCLSMachOFormatVersion(FIRCLSMachOVersion* version) { + if (!version) { + return nil; + } + + return [NSString stringWithFormat:@"%d.%d.%d", version->major, version->minor, version->bugfix]; +} diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSMachO/FIRCLSMachOBinary.h b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSMachO/FIRCLSMachOBinary.h new file mode 100644 index 0000000..94c7fa8 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSMachO/FIRCLSMachOBinary.h @@ -0,0 +1,41 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import +#import "Crashlytics/Shared/FIRCLSMachO/FIRCLSMachO.h" + +@class FIRCLSMachOSlice; + +@interface FIRCLSMachOBinary : NSObject { + NSURL* _url; + + struct FIRCLSMachOFile _file; + NSMutableArray* _slices; + NSString* _instanceIdentifier; +} + ++ (id)MachOBinaryWithPath:(NSString*)path; + +- (id)initWithURL:(NSURL*)url; + +@property(nonatomic, copy, readonly) NSURL* URL; +@property(nonatomic, copy, readonly) NSString* path; +@property(nonatomic, strong, readonly) NSArray* slices; +@property(nonatomic, copy, readonly) NSString* instanceIdentifier; + +- (void)enumerateUUIDs:(void (^)(NSString* uuid, NSString* architecture))block; + +- (FIRCLSMachOSlice*)sliceForArchitecture:(NSString*)architecture; + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSMachO/FIRCLSMachOBinary.m b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSMachO/FIRCLSMachOBinary.m new file mode 100644 index 0000000..f953d99 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSMachO/FIRCLSMachOBinary.m @@ -0,0 +1,121 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "Crashlytics/Shared/FIRCLSMachO/FIRCLSMachOBinary.h" + +#import +#import "Crashlytics/Crashlytics/Helpers/FIRCLSUtility.h" +#import "Crashlytics/Shared/FIRCLSByteUtility.h" +#import "Crashlytics/Shared/FIRCLSMachO/FIRCLSMachOSlice.h" + +static NSString* FIRCLSHashNSString(NSString* value); + +@interface FIRCLSMachOBinary () + ++ (NSString*)hashNSString:(NSString*)value; + +@end + +@implementation FIRCLSMachOBinary + ++ (id)MachOBinaryWithPath:(NSString*)path { + return [[self alloc] initWithURL:[NSURL fileURLWithPath:path]]; +} + +@synthesize slices = _slices; + +- (id)initWithURL:(NSURL*)url { + self = [super init]; + if (self) { + _url = [url copy]; + + if (!FIRCLSMachOFileInitWithPath(&_file, [[_url path] fileSystemRepresentation])) { + return nil; + } + + _slices = [NSMutableArray new]; + FIRCLSMachOFileEnumerateSlices(&_file, ^(FIRCLSMachOSliceRef slice) { + FIRCLSMachOSlice* sliceObject; + + sliceObject = [[FIRCLSMachOSlice alloc] initWithSlice:slice]; + + [self->_slices addObject:sliceObject]; + }); + } + + return self; +} + +- (void)dealloc { + FIRCLSMachOFileDestroy(&_file); +} + +- (NSURL*)URL { + return _url; +} + +- (NSString*)path { + return [_url path]; +} + +- (NSString*)instanceIdentifier { + if (_instanceIdentifier) { + return _instanceIdentifier; + } + + NSMutableString* prehashedString = [NSMutableString new]; + + // sort the slices by architecture + NSArray* sortedSlices = + [_slices sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { + return [[obj1 architectureName] compare:[obj2 architectureName]]; + }]; + + // append them all into a big string + for (FIRCLSMachOSlice* slice in sortedSlices) { + [prehashedString appendString:[slice uuid]]; + } + + _instanceIdentifier = [FIRCLSHashNSString(prehashedString) copy]; + + return _instanceIdentifier; +} + +- (void)enumerateUUIDs:(void (^)(NSString* uuid, NSString* architecture))block { + for (FIRCLSMachOSlice* slice in _slices) { + block([slice uuid], [slice architectureName]); + } +} + +- (FIRCLSMachOSlice*)sliceForArchitecture:(NSString*)architecture { + for (FIRCLSMachOSlice* slice in [self slices]) { + if ([[slice architectureName] isEqualToString:architecture]) { + return slice; + } + } + + return nil; +} + ++ (NSString*)hashNSString:(NSString*)value { + return FIRCLSHashNSString(value); +} + +@end + +static NSString* FIRCLSHashNSString(NSString* value) { + const char* s = [value cStringUsingEncoding:NSUTF8StringEncoding]; + + return FIRCLSHashBytes(s, strlen(s)); +} diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSMachO/FIRCLSMachOSlice.h b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSMachO/FIRCLSMachOSlice.h new file mode 100644 index 0000000..eb55ed9 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSMachO/FIRCLSMachOSlice.h @@ -0,0 +1,37 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import +#import "Crashlytics/Shared/FIRCLSMachO/FIRCLSMachO.h" + +@interface FIRCLSMachOSlice : NSObject { + struct FIRCLSMachOSlice _slice; + + NSString* _uuidString; + NSArray* _linkedDylibs; + FIRCLSMachOVersion _minimumOSVersion; + FIRCLSMachOVersion _linkedSDKVersion; +} + ++ (id)runningSlice; + +- (id)initWithSlice:(FIRCLSMachOSliceRef)sliceRef; + +@property(nonatomic, copy, readonly) NSString* uuid; +@property(nonatomic, copy, readonly) NSString* architectureName; +@property(nonatomic, strong, readonly) NSArray* linkedDylibs; +@property(nonatomic, assign, readonly) FIRCLSMachOVersion minimumOSVersion; +@property(nonatomic, assign, readonly) FIRCLSMachOVersion linkedSDKVersion; + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSMachO/FIRCLSMachOSlice.m b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSMachO/FIRCLSMachOSlice.m new file mode 100644 index 0000000..d28626b --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSMachO/FIRCLSMachOSlice.m @@ -0,0 +1,93 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "Crashlytics/Shared/FIRCLSMachO/FIRCLSMachOSlice.h" + +#include + +// this is defined only if __OPEN_SOURCE__ is *not* defined in the TVOS SDK's mach-o/loader.h +// also, it has not yet made it back to the OSX SDKs, for example +#ifndef LC_VERSION_MIN_TVOS +#define LC_VERSION_MIN_TVOS 0x2F +#endif + +@implementation FIRCLSMachOSlice + ++ (id)runningSlice { + struct FIRCLSMachOSlice slice; + + slice = FIRCLSMachOSliceGetCurrent(); + + return [[self alloc] initWithSlice:&slice]; +} + +@synthesize minimumOSVersion = _minimumOSVersion; +@synthesize linkedSDKVersion = _linkedSDKVersion; + +- (id)initWithSlice:(FIRCLSMachOSliceRef)sliceRef { + self = [super init]; + if (self) { + NSMutableArray* dylibs; + + _slice = *sliceRef; + + _minimumOSVersion.major = 0; + _minimumOSVersion.minor = 0; + _minimumOSVersion.bugfix = 0; + + _linkedSDKVersion.major = 0; + _linkedSDKVersion.minor = 0; + _linkedSDKVersion.bugfix = 0; + + dylibs = [NSMutableArray array]; + + FIRCLSMachOSliceEnumerateLoadCommands( + &_slice, ^(uint32_t type, uint32_t size, const struct load_command* cmd) { + switch (type) { + case LC_UUID: + self->_uuidString = + [FIRCLSMachONormalizeUUID((CFUUIDBytes*)FIRCLSMachOGetUUID(cmd)) copy]; + break; + case LC_LOAD_DYLIB: + [dylibs addObject:[NSString stringWithUTF8String:FIRCLSMachOGetDylibPath(cmd)]]; + break; + case LC_VERSION_MIN_IPHONEOS: + case LC_VERSION_MIN_MACOSX: + case LC_VERSION_MIN_WATCHOS: + case LC_VERSION_MIN_TVOS: + self->_minimumOSVersion = FIRCLSMachOGetMinimumOSVersion(cmd); + self->_linkedSDKVersion = FIRCLSMachOGetLinkedSDKVersion(cmd); + break; + } + }); + + _linkedDylibs = [dylibs copy]; + } + + return self; +} + +- (NSString*)architectureName { + return [NSString stringWithUTF8String:FIRCLSMachOSliceGetArchitectureName(&_slice)]; +} + +- (NSString*)uuid { + return _uuidString; +} + +- (NSArray*)linkedDylibs { + return _linkedDylibs; +} + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSMachO/FIRCLSdSYM.h b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSMachO/FIRCLSdSYM.h new file mode 100644 index 0000000..c80ac74 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSMachO/FIRCLSdSYM.h @@ -0,0 +1,38 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +@class FIRCLSMachOBinary; + +@interface FIRCLSdSYM : NSObject + +NS_ASSUME_NONNULL_BEGIN + ++ (id)dSYMWithURL:(NSURL*)url; + +- (id)initWithURL:(NSURL*)url; + +@property(nonatomic, readonly) FIRCLSMachOBinary* binary; +@property(nonatomic, copy, readonly, nullable) NSString* bundleIdentifier; +@property(nonatomic, copy, readonly) NSURL* executableURL; +@property(nonatomic, copy, readonly) NSString* executablePath; +@property(nonatomic, copy, readonly) NSString* bundleVersion; +@property(nonatomic, copy, readonly) NSString* shortBundleVersion; + +- (void)enumerateUUIDs:(void (^)(NSString* uuid, NSString* architecture))block; + +NS_ASSUME_NONNULL_END + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSMachO/FIRCLSdSYM.m b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSMachO/FIRCLSdSYM.m new file mode 100644 index 0000000..393e9a5 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSMachO/FIRCLSdSYM.m @@ -0,0 +1,109 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "Crashlytics/Shared/FIRCLSMachO/FIRCLSdSYM.h" + +#import "Crashlytics/Shared/FIRCLSMachO/FIRCLSMachOBinary.h" + +#define CLS_XCODE_DSYM_PREFIX (@"com.apple.xcode.dsym.") + +@interface FIRCLSdSYM () + +@property(nonatomic, readonly) NSBundle* bundle; + +@end + +@implementation FIRCLSdSYM + ++ (id)dSYMWithURL:(NSURL*)url { + return [[self alloc] initWithURL:url]; +} + +- (id)initWithURL:(NSURL*)url { + self = [super init]; + if (self) { + NSDirectoryEnumerator* enumerator; + NSString* path; + NSFileManager* fileManager; + BOOL isDirectory; + BOOL fileExistsAtPath; + NSArray* itemsInDWARFDir; + + fileManager = [NSFileManager defaultManager]; + + // Is there a file at this path? + if (![fileManager fileExistsAtPath:[url path]]) { + return nil; + } + + _bundle = [NSBundle bundleWithURL:url]; + if (!_bundle) { + return nil; + } + + path = [[url path] stringByAppendingPathComponent:@"Contents/Resources/DWARF"]; + + // Does this path exist and is it a directory? + fileExistsAtPath = [fileManager fileExistsAtPath:path isDirectory:&isDirectory]; + if (!fileExistsAtPath || !isDirectory) { + return nil; + } + + enumerator = [fileManager enumeratorAtPath:path]; + itemsInDWARFDir = [enumerator allObjects]; + // Do we have a Contents/Resources/DWARF dir but no contents? + if ([itemsInDWARFDir count] == 0) { + return nil; + } + + path = [path stringByAppendingPathComponent:[itemsInDWARFDir objectAtIndex:0]]; + + _binary = [[FIRCLSMachOBinary alloc] initWithURL:[NSURL fileURLWithPath:path]]; + } + + return self; +} + +- (NSString*)bundleIdentifier { + NSString* identifier; + + identifier = [_bundle bundleIdentifier]; + if ([identifier hasPrefix:CLS_XCODE_DSYM_PREFIX]) { + return [identifier substringFromIndex:[CLS_XCODE_DSYM_PREFIX length]]; + } + + return identifier; +} + +- (NSURL*)executableURL { + return [_binary URL]; +} + +- (NSString*)executablePath { + return [_binary path]; +} + +- (NSString*)bundleVersion { + return [[_bundle infoDictionary] objectForKey:@"CFBundleVersion"]; +} + +- (NSString*)shortBundleVersion { + return [[_bundle infoDictionary] objectForKey:@"CFBundleShortVersionString"]; +} + +- (void)enumerateUUIDs:(void (^)(NSString* uuid, NSString* architecture))block { + [_binary enumerateUUIDs:block]; +} + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSNetworking/FIRCLSFABNetworkClient.h b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSNetworking/FIRCLSFABNetworkClient.h new file mode 100644 index 0000000..ebbd26c --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSNetworking/FIRCLSFABNetworkClient.h @@ -0,0 +1,56 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +OBJC_EXTERN const NSUInteger FIRCLSNetworkMaximumRetryCount; + +NS_ASSUME_NONNULL_BEGIN + +typedef void (^FIRCLSNetworkDataTaskCompletionHandlerBlock)(NSData *__nullable data, + NSURLResponse *__nullable response, + NSError *__nullable error); +typedef void (^FIRCLSNetworkDownloadTaskCompletionHandlerBlock)(NSURL *__nullable location, + NSURLResponse *__nullable response, + NSError *__nullable error); + +@interface FIRCLSFABNetworkClient : NSObject + +- (instancetype)init; +- (instancetype)initWithQueue:(nullable NSOperationQueue *)operationQueue; +- (instancetype)initWithSessionConfiguration:(NSURLSessionConfiguration *)config + queue:(nullable NSOperationQueue *)operationQueue + NS_DESIGNATED_INITIALIZER; + +- (void)startDataTaskWithRequest:(NSURLRequest *)request + retryLimit:(NSUInteger)retryLimit + completionHandler:(FIRCLSNetworkDataTaskCompletionHandlerBlock)completionHandler; +- (void)startDownloadTaskWithRequest:(NSURLRequest *)request + retryLimit:(NSUInteger)retryLimit + completionHandler: + (FIRCLSNetworkDownloadTaskCompletionHandlerBlock)completionHandler; + +- (void)invalidateAndCancel; + +// Backwards compatibility (we cannot change an interface in Fabric Base that other kits rely on, +// since we have no control of versioning dependencies) +- (void)startDataTaskWithRequest:(NSURLRequest *)request + completionHandler:(FIRCLSNetworkDataTaskCompletionHandlerBlock)completionHandler; +- (void)startDownloadTaskWithRequest:(NSURLRequest *)request + completionHandler: + (FIRCLSNetworkDownloadTaskCompletionHandlerBlock)completionHandler; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSNetworking/FIRCLSFABNetworkClient.m b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSNetworking/FIRCLSFABNetworkClient.m new file mode 100644 index 0000000..3e96407 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSNetworking/FIRCLSFABNetworkClient.m @@ -0,0 +1,267 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "Crashlytics/Shared/FIRCLSNetworking/FIRCLSFABNetworkClient.h" + +#import "Crashlytics/Shared/FIRCLSNetworking/FIRCLSNetworkResponseHandler.h" + +static const float FIRCLSNetworkMinimumRetryJitter = 0.90f; +static const float FIRCLSNetworkMaximumRetryJitter = 1.10f; +const NSUInteger FIRCLSNetworkMaximumRetryCount = 10; + +@interface FIRCLSFABNetworkClient () + +@property(nonatomic, strong, readonly) NSURLSession *session; + +@end + +@implementation FIRCLSFABNetworkClient + +- (instancetype)init { + return [self initWithQueue:nil]; +} + +- (instancetype)initWithQueue:(nullable NSOperationQueue *)operationQueue { + NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; + return [self initWithSessionConfiguration:config queue:operationQueue]; +} + +- (instancetype)initWithSessionConfiguration:(NSURLSessionConfiguration *)config + queue:(nullable NSOperationQueue *)operationQueue { + self = [super init]; + if (!self) { + return nil; + } + + _session = [NSURLSession sessionWithConfiguration:config + delegate:self + delegateQueue:operationQueue]; + + if (!_session) { + return nil; + } + + return self; +} + +- (void)dealloc { + [_session finishTasksAndInvalidate]; +} + +#pragma mark - Delay Handling +- (double)randomDoubleWithMin:(double)min max:(double)max { + return min + ((max - min) * drand48()); +} + +- (double)generateRandomJitter { + return [self randomDoubleWithMin:FIRCLSNetworkMinimumRetryJitter + max:FIRCLSNetworkMaximumRetryJitter]; +} + +- (NSTimeInterval)computeDelayForResponse:(NSURLResponse *)response + withRetryCount:(NSUInteger)count { + NSTimeInterval initialValue = [FIRCLSNetworkResponseHandler retryValueForResponse:response]; + + // make sure count is > 0 + count = MAX(count, 1); + // make sure initialValue is >2 for exponential backoff to work reasonably with low count numbers + initialValue = MAX(initialValue, 2.0); + + const double jitter = [self generateRandomJitter]; + + return pow(initialValue, count) * jitter; // exponential backoff +} + +- (void)runAfterRetryValueFromResponse:(NSURLResponse *)response + attempts:(NSUInteger)count + onQueue:(dispatch_queue_t)queue + block:(void (^)(void))block { + const NSTimeInterval delay = [self computeDelayForResponse:response withRetryCount:count]; + + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (uint64_t)(delay * NSEC_PER_SEC)), queue, block); +} + +- (void)runAfterRetryValueFromResponse:(NSURLResponse *)response + attempts:(NSUInteger)count + block:(void (^)(void))block { + dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); + + [self runAfterRetryValueFromResponse:response attempts:count onQueue:queue block:block]; +} + +#pragma mark - Tasks + +- (void)startDataTaskWithRequest:(NSURLRequest *)request + retryLimit:(NSUInteger)retryLimit + tries:(NSUInteger)tries + completionHandler:(FIRCLSNetworkDataTaskCompletionHandlerBlock)completionHandler { + NSURLSessionTask *task = [self.session + dataTaskWithRequest:request + completionHandler:^(NSData *data, NSURLResponse *response, NSError *taskError) { + [FIRCLSNetworkResponseHandler + handleCompletedResponse:response + forOriginalRequest:request + error:taskError + block:^(BOOL retry, NSError *error) { + if (!retry) { + completionHandler(data, response, error); + return; + } + + if (tries >= retryLimit) { + NSDictionary *userInfo = @{ + @"retryLimit" : @(retryLimit), + NSURLErrorFailingURLStringErrorKey : request.URL + }; + completionHandler( + nil, nil, + [NSError + errorWithDomain:FIRCLSNetworkErrorDomain + code:FIRCLSNetworkErrorMaximumAttemptsReached + userInfo:userInfo]); + return; + } + + [self + runAfterRetryValueFromResponse:response + attempts:tries + block:^{ + [self + startDataTaskWithRequest: + request + retryLimit: + retryLimit + tries: + (tries + + 1) + completionHandler: + completionHandler]; + }]; + }]; + }]; + + [task resume]; + + if (!task) { + completionHandler(nil, nil, + [NSError errorWithDomain:FIRCLSNetworkErrorDomain + code:FIRCLSNetworkErrorFailedToStartOperation + userInfo:nil]); + } +} + +- (void)startDataTaskWithRequest:(NSURLRequest *)request + retryLimit:(NSUInteger)retryLimit + completionHandler:(FIRCLSNetworkDataTaskCompletionHandlerBlock)completionHandler { + [self startDataTaskWithRequest:request + retryLimit:retryLimit + tries:0 + completionHandler:completionHandler]; +} + +- (void)startDataTaskWithRequest:(NSURLRequest *)request + completionHandler:(FIRCLSNetworkDataTaskCompletionHandlerBlock)completionHandler { + [self startDataTaskWithRequest:request + retryLimit:FIRCLSNetworkMaximumRetryCount + completionHandler:completionHandler]; +} + +- (void)startDownloadTaskWithRequest:(NSURLRequest *)request + retryLimit:(NSUInteger)retryLimit + tries:(NSUInteger)tries + completionHandler: + (FIRCLSNetworkDownloadTaskCompletionHandlerBlock)completionHandler { + NSURLSessionTask *task = [self.session + downloadTaskWithRequest:request + completionHandler:^(NSURL *location, NSURLResponse *response, NSError *taskError) { + [FIRCLSNetworkResponseHandler + handleCompletedResponse:response + forOriginalRequest:request + error:taskError + block:^(BOOL retry, NSError *error) { + if (!retry) { + completionHandler(location, response, error); + return; + } + + if (tries >= retryLimit) { + NSDictionary *userInfo = @{ + @"retryLimit" : @(retryLimit), + NSURLErrorFailingURLStringErrorKey : request.URL + }; + completionHandler( + nil, nil, + [NSError + errorWithDomain:FIRCLSNetworkErrorDomain + code: + FIRCLSNetworkErrorMaximumAttemptsReached + userInfo:userInfo]); + return; + } + + [self + runAfterRetryValueFromResponse:response + attempts:tries + block:^{ + [self + startDownloadTaskWithRequest: + request + retryLimit: + retryLimit + tries: + (tries + + 1) + completionHandler: + completionHandler]; + }]; + }]; + }]; + + [task resume]; + + if (!task) { + completionHandler(nil, nil, + [NSError errorWithDomain:FIRCLSNetworkErrorDomain + code:FIRCLSNetworkErrorFailedToStartOperation + userInfo:nil]); + } +} + +- (void)startDownloadTaskWithRequest:(NSURLRequest *)request + retryLimit:(NSUInteger)retryLimit + completionHandler: + (FIRCLSNetworkDownloadTaskCompletionHandlerBlock)completionHandler { + [self startDownloadTaskWithRequest:request + retryLimit:retryLimit + tries:0 + completionHandler:completionHandler]; +} + +- (void)startDownloadTaskWithRequest:(NSURLRequest *)request + completionHandler: + (FIRCLSNetworkDownloadTaskCompletionHandlerBlock)completionHandler { + [self startDownloadTaskWithRequest:request + retryLimit:FIRCLSNetworkMaximumRetryCount + completionHandler:completionHandler]; +} + +- (void)invalidateAndCancel { + [self.session invalidateAndCancel]; +} + +#pragma mark - NSURLSession Delegate +- (void)URLSession:(NSURLSession *)session didBecomeInvalidWithError:(NSError *)error { +} + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSNetworking/FIRCLSNetworkResponseHandler.h b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSNetworking/FIRCLSNetworkResponseHandler.h new file mode 100644 index 0000000..42f0bb4 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSNetworking/FIRCLSNetworkResponseHandler.h @@ -0,0 +1,87 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +/** + * Type to indicate response status + */ +typedef NS_ENUM(NSInteger, FIRCLSNetworkClientResponseType) { + FIRCLSNetworkClientResponseSuccess, + FIRCLSNetworkClientResponseInvalid, + FIRCLSNetworkClientResponseFailure, + FIRCLSNetworkClientResponseRetry, + FIRCLSNetworkClientResponseBackOff +}; + +typedef NS_ENUM(NSInteger, FIRCLSNetworkErrorType) { + FIRCLSNetworkErrorUnknown = -1, + FIRCLSNetworkErrorFailedToStartOperation = -3, + FIRCLSNetworkErrorResponseInvalid = -4, + FIRCLSNetworkErrorRequestFailed = -5, + FIRCLSNetworkErrorMaximumAttemptsReached = -6, +}; + +extern NSInteger const FIRCLSNetworkErrorUnknownURLCancelReason; + +/** + * This block is an input parameter to handleCompletedResponse: and handleCompletedTask: methods of + * this class. + * @param retryMightSucceed is YES if the request should be retried. + * @param error is the error received back in response. + */ +typedef void (^FIRCLSNetworkResponseCompletionHandlerBlock)(BOOL retryMightSucceed, NSError *error); + +/** + * Error domain for Crashlytics network errors + */ +extern NSString *const FIRCLSNetworkErrorDomain; +/** + * This class handles network responses. + */ +@interface FIRCLSNetworkResponseHandler : NSObject +/** + * Returns the header in the given NSURLResponse with name as key + */ ++ (NSString *)headerForResponse:(NSURLResponse *)response withKey:(NSString *)key; +/** + * Returns Retry-After header value in response, and if absent returns a default retry value + */ ++ (NSTimeInterval)retryValueForResponse:(NSURLResponse *)response; +/** + * Checks if the content type for response matches the request + */ ++ (BOOL)contentTypeForResponse:(NSURLResponse *)response matchesRequest:(NSURLRequest *)request; + ++ (NSInteger)cancelReasonFromURLError:(NSError *)error; + ++ (BOOL)retryableURLError:(NSError *)error; + +/** + * Convenience method that calls back the input block with FIRCLSNetworkClientResponseType after + * checking the response code in response + */ ++ (void)clientResponseType:(NSURLResponse *)response + handler:(void (^)(FIRCLSNetworkClientResponseType type, + NSInteger statusCode))responseTypeAndStatusCodeHandlerBlock; +/** + * Handles a completed response for request and calls back input block. Populates error even if + * error was nil, but response code indicated an error. + */ ++ (void)handleCompletedResponse:(NSURLResponse *)response + forOriginalRequest:(NSURLRequest *)originalRequest + error:(NSError *)error + block:(FIRCLSNetworkResponseCompletionHandlerBlock)completionHandlerBlock; + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSNetworking/FIRCLSNetworkResponseHandler.m b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSNetworking/FIRCLSNetworkResponseHandler.m new file mode 100644 index 0000000..cfcf42f --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSNetworking/FIRCLSNetworkResponseHandler.m @@ -0,0 +1,290 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "Crashlytics/Shared/FIRCLSNetworking/FIRCLSNetworkResponseHandler.h" + +@implementation FIRCLSNetworkResponseHandler + +static const NSTimeInterval kFIRCLSNetworkResponseHandlerDefaultRetryInterval = 2.0; +static NSString *const kFIRCLSNetworkResponseHandlerContentType = @"Content-Type"; +NSString *const FIRCLSNetworkErrorDomain = @"FIRCLSNetworkError"; + +NSInteger const FIRCLSNetworkErrorUnknownURLCancelReason = -1; + +#pragma mark - Header Handling ++ (NSString *)headerForResponse:(NSURLResponse *)response withKey:(NSString *)key { + if (![response respondsToSelector:@selector(allHeaderFields)]) { + return nil; + } + + return [((NSHTTPURLResponse *)response).allHeaderFields objectForKey:key]; +} + ++ (NSTimeInterval)retryValueForResponse:(NSURLResponse *)response { + NSString *retryValueString = [self headerForResponse:response withKey:@"Retry-After"]; + if (!retryValueString) { + return kFIRCLSNetworkResponseHandlerDefaultRetryInterval; + } + + NSTimeInterval value = retryValueString.doubleValue; + if (value < 0.0) { + return kFIRCLSNetworkResponseHandlerDefaultRetryInterval; + } + + return value; +} + ++ (NSString *)requestIdForResponse:(NSURLResponse *)response { + return [self headerForResponse:response withKey:@"X-Request-Id"]; +} + ++ (BOOL)contentTypeForResponse:(NSURLResponse *)response matchesRequest:(NSURLRequest *)request { + NSString *accept = [request.allHTTPHeaderFields objectForKey:@"Accept"]; + if (!accept) { + // An omitted accept header is defined to match everything + return YES; + } + + NSString *contentHeader = [self.class headerForResponse:response + withKey:kFIRCLSNetworkResponseHandlerContentType]; + if (!contentHeader) { + // FIRCLSDeveloperLog("Network", @"Content-Type not present in response"); + return NO; + } + + NSString *acceptCharset = request.allHTTPHeaderFields[@"Accept-Charset"]; + + NSArray *parts = [contentHeader componentsSeparatedByString:@"; charset="]; + if (!parts) { + parts = @[ contentHeader ]; + } + + if ([[parts objectAtIndex:0] caseInsensitiveCompare:accept] != NSOrderedSame) { + // FIRCLSDeveloperLog("Network", @"Content-Type does not match Accept"); + return NO; + } + + if (!acceptCharset) { + return YES; + } + + if (parts.count < 2) { + return YES; + } + + return [[parts objectAtIndex:1] caseInsensitiveCompare:acceptCharset] == NSOrderedSame; +} + ++ (NSInteger)cancelReasonFromURLError:(NSError *)error { + if (![[error domain] isEqualToString:NSURLErrorDomain]) { + return FIRCLSNetworkErrorUnknownURLCancelReason; + } + + if ([error code] != NSURLErrorCancelled) { + return FIRCLSNetworkErrorUnknownURLCancelReason; + } + + NSNumber *reason = [[error userInfo] objectForKey:NSURLErrorBackgroundTaskCancelledReasonKey]; + if (reason == nil) { + return FIRCLSNetworkErrorUnknownURLCancelReason; + } + + return [reason integerValue]; +} + ++ (BOOL)retryableURLError:(NSError *)error { + // So far, the only task errors seen are NSURLErrorDomain. For others, we're not + // sure what to do. + if (![[error domain] isEqualToString:NSURLErrorDomain]) { + return NO; + } + + // cases that we know are definitely not retryable + switch ([error code]) { + case NSURLErrorBadURL: + case NSURLErrorUnsupportedURL: + case NSURLErrorHTTPTooManyRedirects: + case NSURLErrorRedirectToNonExistentLocation: + case NSURLErrorUserCancelledAuthentication: + case NSURLErrorUserAuthenticationRequired: + case NSURLErrorAppTransportSecurityRequiresSecureConnection: + case NSURLErrorFileDoesNotExist: + case NSURLErrorFileIsDirectory: + case NSURLErrorDataLengthExceedsMaximum: + case NSURLErrorSecureConnectionFailed: + case NSURLErrorServerCertificateHasBadDate: + case NSURLErrorServerCertificateUntrusted: + case NSURLErrorServerCertificateHasUnknownRoot: + case NSURLErrorServerCertificateNotYetValid: + case NSURLErrorClientCertificateRejected: + case NSURLErrorClientCertificateRequired: + case NSURLErrorBackgroundSessionRequiresSharedContainer: + return NO; + } + + // All other errors, as far as I can tell, are things that could clear up + // without action on the part of the client. + + // NSURLErrorCancelled is a potential special-case. I believe there are + // situations where a cancelled request cannot be successfully restarted. But, + // until I can prove it, we'll retry. There are definitely many cases where + // a cancelled request definitely can be restarted and will work. + + return YES; +} + +#pragma mark - Error Creation ++ (NSError *)errorForCode:(NSInteger)code userInfo:(NSDictionary *)userInfo { + return [NSError errorWithDomain:FIRCLSNetworkErrorDomain code:code userInfo:userInfo]; +} + ++ (NSError *)errorForResponse:(NSURLResponse *)response + ofType:(FIRCLSNetworkClientResponseType)type + status:(NSInteger)status { + if (type == FIRCLSNetworkClientResponseSuccess) { + return nil; + } + + NSString *requestId = [self requestIdForResponse:response]; + NSString *contentType = [self headerForResponse:response + withKey:kFIRCLSNetworkResponseHandlerContentType]; + + // this could be nil, so be careful + requestId = requestId ? requestId : @""; + contentType = contentType ? contentType : @""; + + NSDictionary *userInfo = @{ + @"type" : @(type), + @"status_code" : @(status), + @"request_id" : requestId, + @"content_type" : contentType + }; + + // compute a reasonable error code type + NSInteger errorCode = FIRCLSNetworkErrorUnknown; + switch (type) { + case FIRCLSNetworkClientResponseFailure: + errorCode = FIRCLSNetworkErrorRequestFailed; + break; + case FIRCLSNetworkClientResponseInvalid: + errorCode = FIRCLSNetworkErrorResponseInvalid; + break; + default: + break; + } + + return [self errorForCode:errorCode userInfo:userInfo]; +} + ++ (void)clientResponseType:(NSURLResponse *)response + handler:(void (^)(FIRCLSNetworkClientResponseType type, + NSInteger statusCode))responseTypeAndStatusCodeHandlerBlock { + if (![response respondsToSelector:@selector(statusCode)]) { + responseTypeAndStatusCodeHandlerBlock(FIRCLSNetworkClientResponseInvalid, 0); + return; + } + + NSInteger code = ((NSHTTPURLResponse *)response).statusCode; + + switch (code) { + case 200: + case 201: + case 202: + case 204: + case 304: + responseTypeAndStatusCodeHandlerBlock(FIRCLSNetworkClientResponseSuccess, code); + return; + case 420: + case 429: + responseTypeAndStatusCodeHandlerBlock(FIRCLSNetworkClientResponseBackOff, code); + return; + case 408: + responseTypeAndStatusCodeHandlerBlock(FIRCLSNetworkClientResponseRetry, code); + return; + case 400: + case 401: + case 403: + case 404: + case 406: + case 410: + case 411: + case 413: + case 419: + case 422: + case 431: + responseTypeAndStatusCodeHandlerBlock(FIRCLSNetworkClientResponseFailure, code); + return; + } + + // check for a 5xx + if (code >= 500 && code <= 599) { + responseTypeAndStatusCodeHandlerBlock(FIRCLSNetworkClientResponseRetry, code); + return; + } + + responseTypeAndStatusCodeHandlerBlock(FIRCLSNetworkClientResponseInvalid, code); +} + ++ (void)handleCompletedResponse:(NSURLResponse *)response + forOriginalRequest:(NSURLRequest *)originalRequest + error:(NSError *)originalError + block: + (FIRCLSNetworkResponseCompletionHandlerBlock)completionHandlerBlock { + // if we have an error, we can just continue + if (originalError) { + BOOL retryable = [self retryableURLError:originalError]; + + completionHandlerBlock(retryable, originalError); + return; + } + + [self.class clientResponseType:response + handler:^(FIRCLSNetworkClientResponseType type, NSInteger statusCode) { + NSError *error = nil; + + switch (type) { + case FIRCLSNetworkClientResponseInvalid: + error = [self errorForResponse:response + ofType:type + status:statusCode]; + break; + case FIRCLSNetworkClientResponseBackOff: + case FIRCLSNetworkClientResponseRetry: + error = [self errorForResponse:response + ofType:type + status:statusCode]; + completionHandlerBlock(YES, error); + return; + case FIRCLSNetworkClientResponseFailure: + error = [self errorForResponse:response + ofType:type + status:statusCode]; + break; + case FIRCLSNetworkClientResponseSuccess: + if (![self contentTypeForResponse:response + matchesRequest:originalRequest]) { + error = [self errorForResponse:response + ofType:FIRCLSNetworkClientResponseInvalid + status:statusCode]; + break; + } + + break; + } + + completionHandlerBlock(NO, error); + }]; +} + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSNetworking/FIRCLSURLBuilder.h b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSNetworking/FIRCLSURLBuilder.h new file mode 100644 index 0000000..c8fbaa9 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSNetworking/FIRCLSURLBuilder.h @@ -0,0 +1,44 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +/** + * This is a convenience class to ease constructing NSURLs. + */ +@interface FIRCLSURLBuilder : NSObject + +/** + * Convenience method that returns a FIRCLSURLBuilder instance with the input base URL appended to + * it. + */ ++ (instancetype)URLWithBase:(NSString *)base; +/** + * Appends the component to the URL being built by FIRCLSURLBuilder instance + */ +- (void)appendComponent:(NSString *)component; +/** + * Escapes and appends the component to the URL being built by FIRCLSURLBuilder instance + */ +- (void)escapeAndAppendComponent:(NSString *)component; +/** + * Adds a query and value to the URL being built + */ +- (void)appendValue:(id)value forQueryParam:(NSString *)param; +/** + * Returns the built URL + */ +- (NSURL *)URL; + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSNetworking/FIRCLSURLBuilder.m b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSNetworking/FIRCLSURLBuilder.m new file mode 100644 index 0000000..58e6f25 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSNetworking/FIRCLSURLBuilder.m @@ -0,0 +1,104 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "Crashlytics/Shared/FIRCLSNetworking/FIRCLSURLBuilder.h" + +#import "Crashlytics/Crashlytics/Helpers/FIRCLSLogger.h" + +@interface FIRCLSURLBuilder () + +@property(nonatomic) NSMutableString *URLString; +@property(nonatomic) NSUInteger queryParams; + +- (NSString *)escapeString:(NSString *)string; + +@end + +@implementation FIRCLSURLBuilder + ++ (instancetype)URLWithBase:(NSString *)base { + FIRCLSURLBuilder *url = [[FIRCLSURLBuilder alloc] init]; + + [url appendComponent:base]; + + return url; +} + +- (instancetype)init { + self = [super init]; + if (!self) { + return nil; + } + + _URLString = [[NSMutableString alloc] init]; + _queryParams = 0; + + return self; +} + +- (NSString *)escapeString:(NSString *)string { +#if TARGET_OS_WATCH + // TODO: Question - Why does watchOS use a different encoding from the other platforms and the + // Android SDK? + // This broken the unit test on watchOS: https://github.com/firebase/firebase-ios-sdk/pull/10511 + return + [string stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet + URLPathAllowedCharacterSet]]; +#else + return + [string stringByAddingPercentEncodingWithAllowedCharacters:NSCharacterSet + .URLQueryAllowedCharacterSet]; +#endif +} + +- (void)appendComponent:(NSString *)component { + if (component.length == 0) { + FIRCLSErrorLog(@"URLBuilder parameter component must not be empty"); + return; + } + + [self.URLString appendString:component]; +} + +- (void)escapeAndAppendComponent:(NSString *)component { + [self appendComponent:[self escapeString:component]]; +} + +- (void)appendValue:(id)value forQueryParam:(NSString *)param { + if (!value) { + return; + } + + if (self.queryParams == 0) { + [self appendComponent:@"?"]; + } else { + [self appendComponent:@"&"]; + } + + self.queryParams += 1; + + [self appendComponent:param]; + [self appendComponent:@"="]; + if ([value isKindOfClass:NSString.class]) { + [self escapeAndAppendComponent:value]; + } else { + [self escapeAndAppendComponent:[value description]]; + } +} + +- (NSURL *)URL { + return [NSURL URLWithString:self.URLString]; +} + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSOperation/FIRCLSCompoundOperation.h b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSOperation/FIRCLSCompoundOperation.h new file mode 100644 index 0000000..07be334 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSOperation/FIRCLSCompoundOperation.h @@ -0,0 +1,58 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "Crashlytics/Shared/FIRCLSOperation/FIRCLSFABAsyncOperation.h" + +/** + * If the compound operation is sent a @c -[cancel] message while executing, it will attempt to + * cancel all operations on its internal queue, and will return an error in its @c asyncCompletion + * block with this value as its code. + */ +FOUNDATION_EXPORT const NSUInteger FIRCLSCompoundOperationErrorCodeCancelled; + +/** + * If one or more of the operations on the @c compoundQueue fail, this operation returns an error + * in its @c asyncCompletion block with this code, and an array of @c NSErrors keyed on @c + * FIRCLSCompoundOperationErrorUserInfoKeyUnderlyingErrors in the @c userInfo dictionary. + */ +FOUNDATION_EXPORT const NSUInteger FIRCLSCompoundOperationErrorCodeSuboperationFailed; + +/** + * When all the operations complete, this @c FIRCLSCompoundOperation instance's @c asyncCompletion + * block is called. If any errors were passed by the suboperations' @c asyncCompletion blocks, they + * are put in an array which can be accessed in the @c userInfo dictionary in the error parameter + * for this instance's @c asyncCompletion block. + */ +FOUNDATION_EXPORT NSString *const FIRCLSCompoundOperationErrorUserInfoKeyUnderlyingErrors; + +/** + * An operation that executes a collection of suboperations on an internal private queue. Any + * instance of @c FIRCLSFABAsyncOperation passed into this instance's @c operations property has the + * potential to return an @c NSError in its @c asyncCompletion block. This instance's @c + * asyncCompletion block will put all such errors in an @c NSArray and return an @c NSError whose @c + * userInfo contains that array keyed by @c FIRCLSCompoundOperationErrorUserInfoKeyUnderlyingErrors. + */ +@interface FIRCLSCompoundOperation : FIRCLSFABAsyncOperation + +/** + * An array of @c NSOperations to execute, which can include instances of @c FIRCLSFABAsyncOperation + * or + * @c FIRCLSCompoundOperation. This operation will not be marked as finished until all suboperations + * are marked as finished. + */ +@property(copy, nonatomic) NSArray *operations; + +@property(strong, nonatomic, readonly) NSOperationQueue *compoundQueue; + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSOperation/FIRCLSCompoundOperation.m b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSOperation/FIRCLSCompoundOperation.m new file mode 100644 index 0000000..92bd06b --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSOperation/FIRCLSCompoundOperation.m @@ -0,0 +1,165 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "Crashlytics/Shared/FIRCLSOperation/FIRCLSCompoundOperation.h" + +#import "Crashlytics/Shared/FIRCLSOperation/FIRCLSFABAsyncOperation_Private.h" + +#define FIRCLS_DISPATCH_QUEUES_AS_OBJECTS OS_OBJECT_USE_OBJC_RETAIN_RELEASE + +const NSUInteger FIRCLSCompoundOperationErrorCodeCancelled = UINT_MAX - 1; +const NSUInteger FIRCLSCompoundOperationErrorCodeSuboperationFailed = UINT_MAX - 2; + +NSString *const FIRCLSCompoundOperationErrorUserInfoKeyUnderlyingErrors = + @"com.google.firebase.crashlytics.FIRCLSCompoundOperation.error.user-info-key.underlying-" + @"errors"; + +static NSString *const FIRCLSCompoundOperationErrorDomain = + @"com.google.firebase.crashlytics.FIRCLSCompoundOperation.error"; +static char *const FIRCLSCompoundOperationCountingQueueLabel = + "com.google.firebase.crashlytics.FIRCLSCompoundOperation.dispatch-queue.counting-queue"; + +@interface FIRCLSCompoundOperation () + +@property(strong, nonatomic, readwrite) NSOperationQueue *compoundQueue; +@property(assign, nonatomic) NSUInteger completedOperations; +@property(strong, nonatomic) NSMutableArray *errors; +#if FIRCLS_DISPATCH_QUEUES_AS_OBJECTS +@property(strong, nonatomic) dispatch_queue_t countingQueue; +#else +@property(assign, nonatomic) dispatch_queue_t countingQueue; +#endif + +@end + +@implementation FIRCLSCompoundOperation + +- (instancetype)init { + self = [super init]; + if (!self) { + return nil; + } + + _compoundQueue = [[NSOperationQueue alloc] init]; + _completedOperations = 0; + _errors = [NSMutableArray array]; + _countingQueue = + dispatch_queue_create(FIRCLSCompoundOperationCountingQueueLabel, DISPATCH_QUEUE_SERIAL); + + return self; +} + +#if !FIRCLS_DISPATCH_QUEUES_AS_OBJECTS +- (void)dealloc { + if (_countingQueue) { + dispatch_release(_countingQueue); + } +} +#endif + +- (void)main { + for (FIRCLSFABAsyncOperation *operation in self.operations) { + [self injectCompoundAsyncCompletionInOperation:operation]; + [self injectCompoundSyncCompletionInOperation:operation]; + + [self.compoundQueue addOperation:operation]; + } +} + +- (void)cancel { + if (self.compoundQueue.operations.count > 0) { + [self.compoundQueue cancelAllOperations]; + dispatch_sync(self.countingQueue, ^{ + [self attemptCompoundCompletion]; + }); + } else { + for (NSOperation *operation in self.operations) { + [operation cancel]; + } + + // we have to add the operations to the queue in order for their isFinished property to be set + // to true. + [self.compoundQueue addOperations:self.operations waitUntilFinished:NO]; + } + [super cancel]; +} + +- (void)injectCompoundAsyncCompletionInOperation:(FIRCLSFABAsyncOperation *)operation { + __weak FIRCLSCompoundOperation *weakSelf = self; + FIRCLSFABAsyncOperationCompletionBlock originalAsyncCompletion = [operation.asyncCompletion copy]; + FIRCLSFABAsyncOperationCompletionBlock completion = ^(NSError *error) { + __strong FIRCLSCompoundOperation *strongSelf = weakSelf; + + if (originalAsyncCompletion) { + dispatch_sync(strongSelf.countingQueue, ^{ + originalAsyncCompletion(error); + }); + } + + [strongSelf updateCompletionCountsWithError:error]; + }; + operation.asyncCompletion = completion; +} + +- (void)injectCompoundSyncCompletionInOperation:(FIRCLSFABAsyncOperation *)operation { + __weak FIRCLSCompoundOperation *weakSelf = self; + void (^originalSyncCompletion)(void) = [operation.completionBlock copy]; + void (^completion)(void) = ^{ + __strong FIRCLSCompoundOperation *strongSelf = weakSelf; + + if (originalSyncCompletion) { + dispatch_sync(strongSelf.countingQueue, ^{ + originalSyncCompletion(); + }); + } + + dispatch_sync(strongSelf.countingQueue, ^{ + [strongSelf attemptCompoundCompletion]; + }); + }; + operation.completionBlock = completion; +} + +- (void)updateCompletionCountsWithError:(NSError *)error { + dispatch_sync(self.countingQueue, ^{ + if (!error) { + self.completedOperations += 1; + } else { + [self.errors addObject:error]; + } + }); +} + +- (void)attemptCompoundCompletion { + if (self.isCancelled) { + [self finishWithError:[NSError errorWithDomain:FIRCLSCompoundOperationErrorDomain + code:FIRCLSCompoundOperationErrorCodeCancelled + userInfo:@{ + NSLocalizedDescriptionKey : [NSString + stringWithFormat:@"%@ cancelled", self.name] + }]]; + self.asyncCompletion = nil; + } else if (self.completedOperations + self.errors.count == self.operations.count) { + NSError *error = nil; + if (self.errors.count > 0) { + error = [NSError + errorWithDomain:FIRCLSCompoundOperationErrorDomain + code:FIRCLSCompoundOperationErrorCodeSuboperationFailed + userInfo:@{FIRCLSCompoundOperationErrorUserInfoKeyUnderlyingErrors : self.errors}]; + } + [self finishWithError:error]; + } +} + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSOperation/FIRCLSFABAsyncOperation.h b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSOperation/FIRCLSFABAsyncOperation.h new file mode 100644 index 0000000..e5d2c7e --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSOperation/FIRCLSFABAsyncOperation.h @@ -0,0 +1,39 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +/** + * Completion block that can be called in your subclass implementation. It is up to you when you + * want to call it. + */ +typedef void (^FIRCLSFABAsyncOperationCompletionBlock)(NSError *__nullable error); + +/** + * FIRCLSFABAsyncOperation is a subclass of NSOperation that allows for asynchronous work to be + * performed, for things like networking, IPC or UI-driven logic. Create your own subclasses to + * encapsulate custom logic. + * @warning When subclassing to create your own operations, be sure to call -[finishWithError:] at + * some point, or program execution will hang. + * @see -[finishWithError:] in FIRCLSFABAsyncOperation_Private.h + */ +@interface FIRCLSFABAsyncOperation : NSOperation + +/** + * Add a callback method for consumers of your subclasses to set when the asynchronous work is + * marked as complete with -[finishWithError:]. + */ +@property(copy, nonatomic, nullable) FIRCLSFABAsyncOperationCompletionBlock asyncCompletion; + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSOperation/FIRCLSFABAsyncOperation.m b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSOperation/FIRCLSFABAsyncOperation.m new file mode 100644 index 0000000..01365e5 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSOperation/FIRCLSFABAsyncOperation.m @@ -0,0 +1,146 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "Crashlytics/Shared/FIRCLSOperation/FIRCLSFABAsyncOperation.h" + +#import "Crashlytics/Shared/FIRCLSOperation/FIRCLSFABAsyncOperation_Private.h" + +@interface FIRCLSFABAsyncOperation () { + BOOL _internalExecuting; + BOOL _internalFinished; +} + +@property(nonatomic, strong) NSRecursiveLock *lock; + +@end + +@implementation FIRCLSFABAsyncOperation + +- (instancetype)init { + self = [super init]; + if (!self) { + return nil; + } + + _internalExecuting = NO; + _internalFinished = NO; + + _lock = [[NSRecursiveLock alloc] init]; + _lock.name = [NSString stringWithFormat:@"com.google.firebase.crashlytics.%@-lock", [self class]]; + ; + + return self; +} + +#pragma mark - NSOperation Overrides +- (BOOL)isConcurrent { + return YES; +} + +- (BOOL)isAsynchronous { + return YES; +} + +- (BOOL)isExecuting { + [self.lock lock]; + BOOL result = _internalExecuting; + [self.lock unlock]; + + return result; +} + +- (BOOL)isFinished { + [self.lock lock]; + BOOL result = _internalFinished; + [self.lock unlock]; + + return result; +} + +- (void)start { + if ([self checkForCancellation]) { + return; + } + + [self markStarted]; + + [self main]; +} + +#pragma mark - Utilities +- (void)changeValueForKey:(NSString *)key inBlock:(void (^)(void))block { + [self willChangeValueForKey:key]; + block(); + [self didChangeValueForKey:key]; +} + +- (void)lock:(void (^)(void))block { + [self.lock lock]; + block(); + [self.lock unlock]; +} + +- (BOOL)checkForCancellation { + if ([self isCancelled]) { + [self markDone]; + return YES; + } + + return NO; +} + +#pragma mark - State Management +- (void)unlockedMarkFinished { + [self changeValueForKey:@"isFinished" + inBlock:^{ + self->_internalFinished = YES; + }]; +} + +- (void)unlockedMarkStarted { + [self changeValueForKey:@"isExecuting" + inBlock:^{ + self->_internalExecuting = YES; + }]; +} + +- (void)unlockedMarkComplete { + [self changeValueForKey:@"isExecuting" + inBlock:^{ + self->_internalExecuting = NO; + }]; +} + +- (void)markStarted { + [self lock:^{ + [self unlockedMarkStarted]; + }]; +} + +- (void)markDone { + [self lock:^{ + [self unlockedMarkComplete]; + [self unlockedMarkFinished]; + }]; +} + +#pragma mark - Protected +- (void)finishWithError:(NSError *)error { + if (self.asyncCompletion) { + self.asyncCompletion(error); + } + [self markDone]; +} + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSOperation/FIRCLSFABAsyncOperation_Private.h b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSOperation/FIRCLSFABAsyncOperation_Private.h new file mode 100644 index 0000000..f2fa4aa --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSOperation/FIRCLSFABAsyncOperation_Private.h @@ -0,0 +1,32 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "Crashlytics/Shared/FIRCLSOperation/FIRCLSFABAsyncOperation.h" + +@interface FIRCLSFABAsyncOperation (Private) + +/** + * Subclasses must call this method when they are done performing work. When it is called is up to + * you; it can be directly after kicking of a network request, say, or in the callback for its + * response. Once this method is called, the operation queue it is on will begin executing the next + * waiting operation. If you directly invoked -[start] on the instance, execution will proceed to + * the next code statement. + * @note as soon as this method is called, @c NSOperation's standard @c completionBlock will be + * executed if one exists, as a result of setting the operation's isFinished property to YES, and + * the asyncCompletion block is called. + * @param error Any error to pass to asyncCompletion, or nil if there is none. + */ +- (void)finishWithError:(NSError *__nullable)error; + +@end diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSOperation/FIRCLSOperation.h b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSOperation/FIRCLSOperation.h new file mode 100644 index 0000000..d70dd66 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSOperation/FIRCLSOperation.h @@ -0,0 +1,19 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +#import "Crashlytics/Shared/FIRCLSOperation/FIRCLSCompoundOperation.h" +#import "Crashlytics/Shared/FIRCLSOperation/FIRCLSFABAsyncOperation.h" +#import "Crashlytics/Shared/FIRCLSOperation/FIRCLSFABAsyncOperation_Private.h" diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSUUID.h b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSUUID.h new file mode 100644 index 0000000..87a2151 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSUUID.h @@ -0,0 +1,26 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import +#import "Crashlytics/Shared/FIRCLSConstants.h" + +/** + * Generates and returns a UUID + */ +NSString *FIRCLSGenerateUUID(void); + +/** + * Converts the input uint8_t UUID to String + */ +NSString *FIRCLSUUIDToNSString(const uint8_t *uuid); diff --git a/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSUUID.m b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSUUID.m new file mode 100644 index 0000000..b3bc4f1 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/Shared/FIRCLSUUID.m @@ -0,0 +1,46 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "Crashlytics/Shared/FIRCLSUUID.h" + +#import "Crashlytics/Shared/FIRCLSByteUtility.h" + +/// Use an enum to define a true compile-time integer constant. This prevents +/// warning below where the constant is used to declare the size of an array. +enum { + /// The buffer size needed to hold the hexadecimal string representation of a + /// 16-byte UUID. This accounts for 32 characters (2 for each byte) plus one + /// byte for the null terminator. + FIRCLSUUIDStringLength = (16 * 2) + 1 +}; + +#pragma mark Public methods + +NSString *FIRCLSGenerateUUID(void) { + NSString *string; + + CFUUIDRef uuid = CFUUIDCreate(kCFAllocatorDefault); + string = CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault, uuid)); + CFRelease(uuid); + + return string; +} + +NSString *FIRCLSUUIDToNSString(const uint8_t *uuid) { + char uuidString[FIRCLSUUIDStringLength]; + + FIRCLSSafeHexToString(uuid, 16, uuidString); + + return [NSString stringWithUTF8String:uuidString]; +} diff --git a/Pods/FirebaseCrashlytics/Crashlytics/third_party/libunwind/dwarf.h b/Pods/FirebaseCrashlytics/Crashlytics/third_party/libunwind/dwarf.h new file mode 100644 index 0000000..9c81868 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Crashlytics/third_party/libunwind/dwarf.h @@ -0,0 +1,256 @@ +/* libunwind - a platform-independent unwind library + Copyright (c) 2003-2005 Hewlett-Packard Development Company, L.P. + Contributed by David Mosberger-Tang + +This file is part of libunwind. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ + +#pragma once + +// +#define DWARF_EXTENDED_LENGTH_FLAG (0xffffffff) +#define DWARF_CIE_ID_CIE_FLAG (0) + +// Exception Handling Pointer Encoding constants +#define DW_EH_PE_VALUE_MASK (0x0F) +#define DW_EH_PE_RELATIVE_OFFSET_MASK (0x70) + +// Register Definitions +#define DW_EN_MAX_REGISTER_NUMBER (120) + +enum { + DW_EH_PE_ptr = 0x00, + DW_EH_PE_uleb128 = 0x01, + DW_EH_PE_udata2 = 0x02, + DW_EH_PE_udata4 = 0x03, + DW_EH_PE_udata8 = 0x04, + DW_EH_PE_signed = 0x08, + DW_EH_PE_sleb128 = 0x09, + DW_EH_PE_sdata2 = 0x0A, + DW_EH_PE_sdata4 = 0x0B, + DW_EH_PE_sdata8 = 0x0C, + + DW_EH_PE_absptr = 0x00, + DW_EH_PE_pcrel = 0x10, + DW_EH_PE_textrel = 0x20, + DW_EH_PE_datarel = 0x30, + DW_EH_PE_funcrel = 0x40, + DW_EH_PE_aligned = 0x50, + DW_EH_PE_indirect = 0x80, + DW_EH_PE_omit = 0xFF +}; + +// Unwind Instructions + +#define DW_CFA_OPCODE_MASK (0xC0) +#define DW_CFA_OPERAND_MASK (0x3F) + +enum { + DW_CFA_nop = 0x0, + DW_CFA_set_loc = 0x1, + DW_CFA_advance_loc1 = 0x2, + DW_CFA_advance_loc2 = 0x3, + DW_CFA_advance_loc4 = 0x4, + DW_CFA_offset_extended = 0x5, + DW_CFA_restore_extended = 0x6, + DW_CFA_undefined = 0x7, + DW_CFA_same_value = 0x8, + DW_CFA_register = 0x9, + DW_CFA_remember_state = 0xA, + DW_CFA_restore_state = 0xB, + DW_CFA_def_cfa = 0xC, + DW_CFA_def_cfa_register = 0xD, + DW_CFA_def_cfa_offset = 0xE, + DW_CFA_def_cfa_expression = 0xF, + DW_CFA_expression = 0x10, + DW_CFA_offset_extended_sf = 0x11, + DW_CFA_def_cfa_sf = 0x12, + DW_CFA_def_cfa_offset_sf = 0x13, + DW_CFA_val_offset = 0x14, + DW_CFA_val_offset_sf = 0x15, + DW_CFA_val_expression = 0x16, + + // opcode is in high 2 bits, operand in is lower 6 bits + DW_CFA_advance_loc = 0x40, // operand is delta + DW_CFA_offset = 0x80, // operand is register + DW_CFA_restore = 0xC0, // operand is register + + // GNU extensions + DW_CFA_GNU_window_save = 0x2D, + DW_CFA_GNU_args_size = 0x2E, + DW_CFA_GNU_negative_offset_extended = 0x2F +}; + +// Expression Instructions +enum { + DW_OP_addr = 0x03, + DW_OP_deref = 0x06, + DW_OP_const1u = 0x08, + DW_OP_const1s = 0x09, + DW_OP_const2u = 0x0A, + DW_OP_const2s = 0x0B, + DW_OP_const4u = 0x0C, + DW_OP_const4s = 0x0D, + DW_OP_const8u = 0x0E, + DW_OP_const8s = 0x0F, + DW_OP_constu = 0x10, + DW_OP_consts = 0x11, + DW_OP_dup = 0x12, + DW_OP_drop = 0x13, + DW_OP_over = 0x14, + DW_OP_pick = 0x15, + DW_OP_swap = 0x16, + DW_OP_rot = 0x17, + DW_OP_xderef = 0x18, + DW_OP_abs = 0x19, + DW_OP_and = 0x1A, + DW_OP_div = 0x1B, + DW_OP_minus = 0x1C, + DW_OP_mod = 0x1D, + DW_OP_mul = 0x1E, + DW_OP_neg = 0x1F, + DW_OP_not = 0x20, + DW_OP_or = 0x21, + DW_OP_plus = 0x22, + DW_OP_plus_uconst = 0x23, + DW_OP_shl = 0x24, + DW_OP_shr = 0x25, + DW_OP_shra = 0x26, + DW_OP_xor = 0x27, + DW_OP_skip = 0x2F, + DW_OP_bra = 0x28, + DW_OP_eq = 0x29, + DW_OP_ge = 0x2A, + DW_OP_gt = 0x2B, + DW_OP_le = 0x2C, + DW_OP_lt = 0x2D, + DW_OP_ne = 0x2E, + DW_OP_lit0 = 0x30, + DW_OP_lit1 = 0x31, + DW_OP_lit2 = 0x32, + DW_OP_lit3 = 0x33, + DW_OP_lit4 = 0x34, + DW_OP_lit5 = 0x35, + DW_OP_lit6 = 0x36, + DW_OP_lit7 = 0x37, + DW_OP_lit8 = 0x38, + DW_OP_lit9 = 0x39, + DW_OP_lit10 = 0x3A, + DW_OP_lit11 = 0x3B, + DW_OP_lit12 = 0x3C, + DW_OP_lit13 = 0x3D, + DW_OP_lit14 = 0x3E, + DW_OP_lit15 = 0x3F, + DW_OP_lit16 = 0x40, + DW_OP_lit17 = 0x41, + DW_OP_lit18 = 0x42, + DW_OP_lit19 = 0x43, + DW_OP_lit20 = 0x44, + DW_OP_lit21 = 0x45, + DW_OP_lit22 = 0x46, + DW_OP_lit23 = 0x47, + DW_OP_lit24 = 0x48, + DW_OP_lit25 = 0x49, + DW_OP_lit26 = 0x4A, + DW_OP_lit27 = 0x4B, + DW_OP_lit28 = 0x4C, + DW_OP_lit29 = 0x4D, + DW_OP_lit30 = 0x4E, + DW_OP_lit31 = 0x4F, + DW_OP_reg0 = 0x50, + DW_OP_reg1 = 0x51, + DW_OP_reg2 = 0x52, + DW_OP_reg3 = 0x53, + DW_OP_reg4 = 0x54, + DW_OP_reg5 = 0x55, + DW_OP_reg6 = 0x56, + DW_OP_reg7 = 0x57, + DW_OP_reg8 = 0x58, + DW_OP_reg9 = 0x59, + DW_OP_reg10 = 0x5A, + DW_OP_reg11 = 0x5B, + DW_OP_reg12 = 0x5C, + DW_OP_reg13 = 0x5D, + DW_OP_reg14 = 0x5E, + DW_OP_reg15 = 0x5F, + DW_OP_reg16 = 0x60, + DW_OP_reg17 = 0x61, + DW_OP_reg18 = 0x62, + DW_OP_reg19 = 0x63, + DW_OP_reg20 = 0x64, + DW_OP_reg21 = 0x65, + DW_OP_reg22 = 0x66, + DW_OP_reg23 = 0x67, + DW_OP_reg24 = 0x68, + DW_OP_reg25 = 0x69, + DW_OP_reg26 = 0x6A, + DW_OP_reg27 = 0x6B, + DW_OP_reg28 = 0x6C, + DW_OP_reg29 = 0x6D, + DW_OP_reg30 = 0x6E, + DW_OP_reg31 = 0x6F, + DW_OP_breg0 = 0x70, + DW_OP_breg1 = 0x71, + DW_OP_breg2 = 0x72, + DW_OP_breg3 = 0x73, + DW_OP_breg4 = 0x74, + DW_OP_breg5 = 0x75, + DW_OP_breg6 = 0x76, + DW_OP_breg7 = 0x77, + DW_OP_breg8 = 0x78, + DW_OP_breg9 = 0x79, + DW_OP_breg10 = 0x7A, + DW_OP_breg11 = 0x7B, + DW_OP_breg12 = 0x7C, + DW_OP_breg13 = 0x7D, + DW_OP_breg14 = 0x7E, + DW_OP_breg15 = 0x7F, + DW_OP_breg16 = 0x80, + DW_OP_breg17 = 0x81, + DW_OP_breg18 = 0x82, + DW_OP_breg19 = 0x83, + DW_OP_breg20 = 0x84, + DW_OP_breg21 = 0x85, + DW_OP_breg22 = 0x86, + DW_OP_breg23 = 0x87, + DW_OP_breg24 = 0x88, + DW_OP_breg25 = 0x89, + DW_OP_breg26 = 0x8A, + DW_OP_breg27 = 0x8B, + DW_OP_breg28 = 0x8C, + DW_OP_breg29 = 0x8D, + DW_OP_breg30 = 0x8E, + DW_OP_breg31 = 0x8F, + DW_OP_regx = 0x90, + DW_OP_fbreg = 0x91, + DW_OP_bregx = 0x92, + DW_OP_piece = 0x93, + DW_OP_deref_size = 0x94, + DW_OP_xderef_size = 0x95, + DW_OP_nop = 0x96, + DW_OP_push_object_addres = 0x97, + DW_OP_call2 = 0x98, + DW_OP_call4 = 0x99, + DW_OP_call_ref = 0x9A, + DW_OP_lo_user = 0xE0, + DW_OP_APPLE_uninit = 0xF0, + DW_OP_hi_user = 0xFF +}; diff --git a/Pods/FirebaseCrashlytics/CrashlyticsInputFiles.xcfilelist b/Pods/FirebaseCrashlytics/CrashlyticsInputFiles.xcfilelist new file mode 100644 index 0000000..d83385f --- /dev/null +++ b/Pods/FirebaseCrashlytics/CrashlyticsInputFiles.xcfilelist @@ -0,0 +1,6 @@ +$(TARGET_BUILD_DIR)/$(UNLOCALIZED_RESOURCES_FOLDER_PATH)/GoogleService-Info.plist +$(TARGET_BUILD_DIR)/$(EXECUTABLE_PATH) +${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME} +${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist +${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${PRODUCT_NAME} +${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${PRODUCT_NAME}.debug.dylib diff --git a/Pods/FirebaseCrashlytics/FirebaseCore/Extension/FIRAppInternal.h b/Pods/FirebaseCrashlytics/FirebaseCore/Extension/FIRAppInternal.h new file mode 100644 index 0000000..96d42ef --- /dev/null +++ b/Pods/FirebaseCrashlytics/FirebaseCore/Extension/FIRAppInternal.h @@ -0,0 +1,182 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FIREBASECORE_FIRAPPINTERNAL_H +#define FIREBASECORE_FIRAPPINTERNAL_H + +#import + +@class FIRComponentContainer; +@class FIRHeartbeatLogger; +@protocol FIRLibrary; + +/** + * The internal interface to `FirebaseApp`. This is meant for first-party integrators, who need to + * receive `FirebaseApp` notifications, log info about the success or failure of their + * configuration, and access other internal functionality of `FirebaseApp`. + */ +NS_ASSUME_NONNULL_BEGIN + +typedef NS_ENUM(NSInteger, FIRConfigType) { + FIRConfigTypeCore = 1, + FIRConfigTypeSDK = 2, +}; + +extern NSString *const kFIRDefaultAppName; +extern NSString *const kFIRAppReadyToConfigureSDKNotification; +extern NSString *const kFIRAppDeleteNotification; +extern NSString *const kFIRAppIsDefaultAppKey; +extern NSString *const kFIRAppNameKey; +extern NSString *const kFIRGoogleAppIDKey; +extern NSString *const kFirebaseCoreErrorDomain; + +/** + * Keys for the strings in the plist file. + */ +extern NSString *const kFIRAPIKey; +extern NSString *const kFIRTrackingID; +extern NSString *const kFIRGoogleAppID; +extern NSString *const kFIRClientID; +extern NSString *const kFIRGCMSenderID; +extern NSString *const kFIRAndroidClientID; +extern NSString *const kFIRDatabaseURL; +extern NSString *const kFIRStorageBucket; +extern NSString *const kFIRBundleID; +extern NSString *const kFIRProjectID; + +/** + * Keys for the plist file name + */ +extern NSString *const kServiceInfoFileName; + +extern NSString *const kServiceInfoFileType; + +/** + * The format string for the `UserDefaults` key used for storing the data collection enabled flag. + * This includes formatting to append the `FirebaseApp`'s name. + */ +extern NSString *const kFIRGlobalAppDataCollectionEnabledDefaultsKeyFormat; + +/** + * The plist key used for storing the data collection enabled flag. + */ +extern NSString *const kFIRGlobalAppDataCollectionEnabledPlistKey; + +/** @var FirebaseAuthStateDidChangeInternalNotification + @brief The name of the @c NotificationCenter notification which is posted when the auth state + changes (e.g. a new token has been produced, a user logs in or out). The object parameter of + the notification is a dictionary possibly containing the key: + @c FirebaseAuthStateDidChangeInternalNotificationTokenKey (the new access token.) If it does not + contain this key it indicates a sign-out event took place. + */ +extern NSString *const FIRAuthStateDidChangeInternalNotification; + +/** @var FirebaseAuthStateDidChangeInternalNotificationTokenKey + @brief A key present in the dictionary object parameter of the + @c FirebaseAuthStateDidChangeInternalNotification notification. The value associated with this + key will contain the new access token. + */ +extern NSString *const FIRAuthStateDidChangeInternalNotificationTokenKey; + +/** @var FirebaseAuthStateDidChangeInternalNotificationAppKey + @brief A key present in the dictionary object parameter of the + @c FirebaseAuthStateDidChangeInternalNotification notification. The value associated with this + key will contain the FirebaseApp associated with the auth instance. + */ +extern NSString *const FIRAuthStateDidChangeInternalNotificationAppKey; + +/** @var FirebaseAuthStateDidChangeInternalNotificationUIDKey + @brief A key present in the dictionary object parameter of the + @c FirebaseAuthStateDidChangeInternalNotification notification. The value associated with this + key will contain the new user's UID (or nil if there is no longer a user signed in). + */ +extern NSString *const FIRAuthStateDidChangeInternalNotificationUIDKey; + +@interface FIRApp () + +/** + * A flag indicating if this is the default app (has the default app name). + */ +@property(nonatomic, readonly) BOOL isDefaultApp; + +/** + * The container of interop SDKs for this app. + */ +@property(nonatomic) FIRComponentContainer *container; + +/** + * The heartbeat logger associated with this app. + * + * Firebase apps have a 1:1 relationship with heartbeat loggers. + */ +@property(readonly) FIRHeartbeatLogger *heartbeatLogger; + +/** + * Checks if the default app is configured without trying to configure it. + */ ++ (BOOL)isDefaultAppConfigured; + +/** + * Registers a given third-party library with the given version number to be reported for + * analytics. + * + * @param name Name of the library. + * @param version Version of the library. + */ ++ (void)registerLibrary:(nonnull NSString *)name withVersion:(nonnull NSString *)version; + +/** + * Registers a given internal library to be reported for analytics. + * + * @param library Optional parameter for component registration. + * @param name Name of the library. + */ ++ (void)registerInternalLibrary:(nonnull Class)library + withName:(nonnull NSString *)name; + +/** + * Registers a given internal library with the given version number to be reported for + * analytics. This should only be used for non-Firebase libraries that have their own versioning + * scheme. + * + * @param library Optional parameter for component registration. + * @param name Name of the library. + * @param version Version of the library. + */ ++ (void)registerInternalLibrary:(nonnull Class)library + withName:(nonnull NSString *)name + withVersion:(nonnull NSString *)version; + +/** + * A concatenated string representing all the third-party libraries and version numbers. + */ ++ (NSString *)firebaseUserAgent; + +/** + * Can be used by the unit tests in each SDK to reset `FirebaseApp`. This method is thread unsafe. + */ ++ (void)resetApps; + +/** + * Can be used by the unit tests in each SDK to set customized options. + */ +- (instancetype)initInstanceWithName:(NSString *)name options:(FIROptions *)options; + +@end + +NS_ASSUME_NONNULL_END + +#endif // FIREBASECORE_FIRAPPINTERNAL_H diff --git a/Pods/FirebaseCrashlytics/FirebaseCore/Extension/FIRComponent.h b/Pods/FirebaseCrashlytics/FirebaseCore/Extension/FIRComponent.h new file mode 100644 index 0000000..98c7a89 --- /dev/null +++ b/Pods/FirebaseCrashlytics/FirebaseCore/Extension/FIRComponent.h @@ -0,0 +1,89 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FIREBASECORE_FIRCOMPONENT_H +#define FIREBASECORE_FIRCOMPONENT_H + +#import + +@class FIRApp; +@class FIRComponentContainer; + +NS_ASSUME_NONNULL_BEGIN + +/// Provides a system to clean up cached instances returned from the component system. +NS_SWIFT_NAME(ComponentLifecycleMaintainer) +@protocol FIRComponentLifecycleMaintainer +/// The associated app will be deleted, clean up any resources as they are about to be deallocated. +- (void)appWillBeDeleted:(FIRApp *)app; +@end + +typedef _Nullable id (^FIRComponentCreationBlock)(FIRComponentContainer *container, + BOOL *isCacheable) + NS_SWIFT_NAME(ComponentCreationBlock); + +/// Describes the timing of instantiation. Note: new components should default to lazy unless there +/// is a strong reason to be eager. +typedef NS_ENUM(NSInteger, FIRInstantiationTiming) { + FIRInstantiationTimingLazy, + FIRInstantiationTimingAlwaysEager, + FIRInstantiationTimingEagerInDefaultApp +} NS_SWIFT_NAME(InstantiationTiming); + +/// A component that can be used from other Firebase SDKs. +NS_SWIFT_NAME(Component) +@interface FIRComponent : NSObject + +/// The protocol describing functionality provided from the `Component`. +@property(nonatomic, strong, readonly) Protocol *protocol; + +/// The timing of instantiation. +@property(nonatomic, readonly) FIRInstantiationTiming instantiationTiming; + +/// A block to instantiate an instance of the component with the appropriate dependencies. +@property(nonatomic, copy, readonly) FIRComponentCreationBlock creationBlock; + +// There's an issue with long NS_SWIFT_NAMES that causes compilation to fail, disable clang-format +// for the next two methods. +// clang-format off + +/// Creates a component with no dependencies that will be lazily initialized. ++ (instancetype)componentWithProtocol:(Protocol *)protocol + creationBlock:(FIRComponentCreationBlock)creationBlock +NS_SWIFT_NAME(init(_:creationBlock:)); + +/// Creates a component to be registered with the component container. +/// +/// @param protocol - The protocol describing functionality provided by the component. +/// @param instantiationTiming - When the component should be initialized. Use .lazy unless there's +/// a good reason to be instantiated earlier. +/// @param creationBlock - A block to instantiate the component with a container, and if +/// @return A component that can be registered with the component container. ++ (instancetype)componentWithProtocol:(Protocol *)protocol + instantiationTiming:(FIRInstantiationTiming)instantiationTiming + creationBlock:(FIRComponentCreationBlock)creationBlock +NS_SWIFT_NAME(init(_:instantiationTiming:creationBlock:)); + +// clang-format on + +/// Unavailable. +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END + +#endif // FIREBASECORE_FIRCOMPONENT_H diff --git a/Pods/FirebaseCrashlytics/FirebaseCore/Extension/FIRComponentContainer.h b/Pods/FirebaseCrashlytics/FirebaseCore/Extension/FIRComponentContainer.h new file mode 100644 index 0000000..6864087 --- /dev/null +++ b/Pods/FirebaseCrashlytics/FirebaseCore/Extension/FIRComponentContainer.h @@ -0,0 +1,51 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FIREBASECORE_FIRCOMPONENTCONTAINER_H +#define FIREBASECORE_FIRCOMPONENTCONTAINER_H + +#import + +NS_ASSUME_NONNULL_BEGIN + +/// A type-safe macro to retrieve a component from a container. This should be used to retrieve +/// components instead of using the container directly. +#define FIR_COMPONENT(type, container) \ + [FIRComponentType> instanceForProtocol:@protocol(type) inContainer:container] + +@class FIRApp; + +/// A container that holds different components that are registered via the +/// `registerAsComponentRegistrant` call. These classes should conform to `ComponentRegistrant` +/// in order to properly register components for Core. +NS_SWIFT_NAME(FirebaseComponentContainer) +@interface FIRComponentContainer : NSObject + +/// A weak reference to the app that an instance of the container belongs to. +@property(nonatomic, weak, readonly) FIRApp *app; + +// TODO: See if we can get improved type safety here. +/// A Swift only API for fetching an instance since the top macro isn't available. +- (nullable id)__instanceForProtocol:(Protocol *)protocol NS_SWIFT_NAME(instance(for:)); + +/// Unavailable. Use the `container` property on `FirebaseApp`. +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END + +#endif // FIREBASECORE_FIRCOMPONENTCONTAINER_H diff --git a/Pods/FirebaseCrashlytics/FirebaseCore/Extension/FIRComponentType.h b/Pods/FirebaseCrashlytics/FirebaseCore/Extension/FIRComponentType.h new file mode 100644 index 0000000..92a5aab --- /dev/null +++ b/Pods/FirebaseCrashlytics/FirebaseCore/Extension/FIRComponentType.h @@ -0,0 +1,40 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FIREBASECORE_FIRCOMPONENTTYPE_H +#define FIREBASECORE_FIRCOMPONENTTYPE_H + +#import + +@class FIRComponentContainer; + +NS_ASSUME_NONNULL_BEGIN + +/// Do not use directly. A placeholder type in order to provide a macro that will warn users of +/// mis-matched protocols. +NS_SWIFT_NAME(ComponentType) +@interface FIRComponentType<__covariant T> : NSObject + +/// Do not use directly. A factory method to retrieve an instance that provides a specific +/// functionality. ++ (nullable T)instanceForProtocol:(Protocol *)protocol + inContainer:(FIRComponentContainer *)container; + +@end + +NS_ASSUME_NONNULL_END + +#endif // FIREBASECORE_FIRCOMPONENTTYPE_H diff --git a/Pods/FirebaseCrashlytics/FirebaseCore/Extension/FIRHeartbeatLogger.h b/Pods/FirebaseCrashlytics/FirebaseCore/Extension/FIRHeartbeatLogger.h new file mode 100644 index 0000000..95497d2 --- /dev/null +++ b/Pods/FirebaseCrashlytics/FirebaseCore/Extension/FIRHeartbeatLogger.h @@ -0,0 +1,110 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef FIREBASECORE_FIRHEARTBEATLOGGER_H +#define FIREBASECORE_FIRHEARTBEATLOGGER_H + +#import + +NS_ASSUME_NONNULL_BEGIN + +#ifndef FIREBASE_BUILD_CMAKE +@class FIRHeartbeatsPayload; +#endif // FIREBASE_BUILD_CMAKE + +/// Enum representing different daily heartbeat codes. +/// This enum is only used by clients using platform logging V1. This is because +/// the V1 payload only supports a single daily heartbeat. +typedef NS_ENUM(NSInteger, FIRDailyHeartbeatCode) { + /// Represents the absence of a daily heartbeat. + FIRDailyHeartbeatCodeNone = 0, + /// Represents the presence of a daily heartbeat. + FIRDailyHeartbeatCodeSome = 2, +}; + +NS_SWIFT_SENDABLE +@protocol FIRHeartbeatLoggerProtocol + +/// Asynchronously logs a heartbeat. +- (void)log; + +/// Gets the heartbeat code for today. +- (FIRDailyHeartbeatCode)heartbeatCodeForToday; + +#ifndef FIREBASE_BUILD_CMAKE +/// Returns the header value for the heartbeat logger via the given completion handler.. +- (void)asyncHeaderValueWithCompletionHandler:(void (^)(NSString *_Nullable))completionHandler + API_AVAILABLE(ios(13.0), macosx(10.15), macCatalyst(13.0), tvos(13.0), watchos(6.0)); + +/// Return the header value for the heartbeat logger. +- (NSString *_Nullable)headerValue; +#endif // FIREBASE_BUILD_CMAKE + +@end + +#ifndef FIREBASE_BUILD_CMAKE +/// Returns a nullable string header value from a given heartbeats payload. +/// +/// This API returns `nil` when the given heartbeats payload is considered empty. +/// +/// @param heartbeatsPayload The heartbeats payload. +NSString *_Nullable FIRHeaderValueFromHeartbeatsPayload(FIRHeartbeatsPayload *heartbeatsPayload); +#endif // FIREBASE_BUILD_CMAKE + +/// A thread safe, synchronized object that logs and flushes platform logging info. +@interface FIRHeartbeatLogger : NSObject + +/// Designated initializer. +/// +/// @param appID The app ID that this heartbeat logger corresponds to. +- (instancetype)initWithAppID:(NSString *)appID; + +/// Asynchronously logs a new heartbeat corresponding to the Firebase User Agent, if needed. +/// +/// @note This API is thread-safe. +- (void)log; + +#ifndef FIREBASE_BUILD_CMAKE +/// Synchronously flushes heartbeats from storage into a structured payload of heartbeats. +/// +/// This API is for clients using platform logging V2. +/// +/// @note This API is thread-safe. +/// @return A payload of heartbeats. +- (FIRHeartbeatsPayload *)flushHeartbeatsIntoPayload; + +/// Asynchronously flushes heartbeats from storage into a structured payload of heartbeats. +/// +/// This API is for clients using platform logging V2. +/// +/// @note This API is thread-safe. +/// @param completionHandler A completion handler to process the flushed payload of heartbeats. +- (void)flushHeartbeatsIntoPayloadWithCompletionHandler: + (void (^)(FIRHeartbeatsPayload *))completionHandler + API_AVAILABLE(ios(13.0), macosx(10.15), macCatalyst(13.0), tvos(13.0), watchos(6.0)); +#endif // FIREBASE_BUILD_CMAKE + +/// Gets today's corresponding heartbeat code. +/// +/// This API is for clients using platform logging V1. +/// +/// @note This API is thread-safe. +/// @return Heartbeat code indicating whether or not there is an unsent global heartbeat. +- (FIRDailyHeartbeatCode)heartbeatCodeForToday; + +@end + +NS_ASSUME_NONNULL_END + +#endif // FIREBASECORE_FIRHEARTBEATLOGGER_H diff --git a/Pods/FirebaseCrashlytics/FirebaseCore/Extension/FIRLibrary.h b/Pods/FirebaseCrashlytics/FirebaseCore/Extension/FIRLibrary.h new file mode 100644 index 0000000..fe256ad --- /dev/null +++ b/Pods/FirebaseCrashlytics/FirebaseCore/Extension/FIRLibrary.h @@ -0,0 +1,44 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FIREBASECORE_FIRLIBRARY_H +#define FIREBASECORE_FIRLIBRARY_H + +#ifndef FIRLibrary_h +#define FIRLibrary_h + +#import + +@class FIRApp; +@class FIRComponent; + +NS_ASSUME_NONNULL_BEGIN + +/// Provide an interface to register a library for userAgent logging and availability to others. +NS_SWIFT_NAME(Library) +@protocol FIRLibrary + +/// Returns one or more Components that will be registered in +/// FirebaseApp and participate in dependency resolution and injection. ++ (NSArray *)componentsToRegister; + +@end + +NS_ASSUME_NONNULL_END + +#endif /* FIRLibrary_h */ + +#endif // FIREBASECORE_FIRLIBRARY_H diff --git a/Pods/FirebaseCrashlytics/FirebaseCore/Extension/FIRLogger.h b/Pods/FirebaseCrashlytics/FirebaseCore/Extension/FIRLogger.h new file mode 100644 index 0000000..8117189 --- /dev/null +++ b/Pods/FirebaseCrashlytics/FirebaseCore/Extension/FIRLogger.h @@ -0,0 +1,198 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FIREBASECORE_FIRLOGGER_H +#define FIREBASECORE_FIRLOGGER_H + +#import + +typedef NS_ENUM(NSInteger, FIRLoggerLevel); + +NS_ASSUME_NONNULL_BEGIN + +/** + * The Firebase services used in Firebase logger. + */ +typedef NSString *const FIRLoggerService; + +extern NSString *const kFIRLoggerAnalytics; +extern NSString *const kFIRLoggerCrash; +extern NSString *const kFIRLoggerCore; +extern NSString *const kFIRLoggerRemoteConfig; + +/** + * The key used to store the logger's error count. + */ +extern NSString *const kFIRLoggerErrorCountKey; + +/** + * The key used to store the logger's warning count. + */ +extern NSString *const kFIRLoggerWarningCountKey; + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/** + * Enables or disables Analytics debug mode. + * If set to true, the logging level for Analytics will be set to FirebaseLoggerLevelDebug. + * Enabling the debug mode has no effect if the app is running from App Store. + * (required) analytics debug mode flag. + */ +void FIRSetAnalyticsDebugMode(BOOL analyticsDebugMode); + +/** + * Gets the current FIRLoggerLevel. + */ +FIRLoggerLevel FIRGetLoggerLevel(void); + +/** + * Changes the default logging level of FirebaseLoggerLevelNotice to a user-specified level. + * The default level cannot be set above FirebaseLoggerLevelNotice if the app is running from App + * Store. (required) log level (one of the FirebaseLoggerLevel enum values). + */ +void FIRSetLoggerLevel(FIRLoggerLevel loggerLevel); + +void FIRSetLoggerLevelNotice(void); +void FIRSetLoggerLevelWarning(void); +void FIRSetLoggerLevelError(void); +void FIRSetLoggerLevelDebug(void); + +/** + * Checks if the specified logger level is loggable given the current settings. + * (required) log level (one of the FirebaseLoggerLevel enum values). + * (required) whether or not this function is called from the Analytics component. + */ +BOOL FIRIsLoggableLevel(FIRLoggerLevel loggerLevel, BOOL analyticsComponent); + +BOOL FIRIsLoggableLevelNotice(void); +BOOL FIRIsLoggableLevelWarning(void); +BOOL FIRIsLoggableLevelError(void); +BOOL FIRIsLoggableLevelDebug(void); + +/** + * Logs a message to the Xcode console and the device log. If running from AppStore, will + * not log any messages with a level higher than FirebaseLoggerLevelNotice to avoid log spamming. + * (required) log level (one of the FirebaseLoggerLevel enum values). + * (required) service name of type FirebaseLoggerService. + * (required) message code starting with "I-" which means iOS, followed by a capitalized + * three-character service identifier and a six digit integer message ID that is unique + * within the service. + * An example of the message code is @"I-COR000001". + * (required) message string which can be a format string. + * (optional) variable arguments list obtained from calling va_start, used when message is a format + * string. + */ +extern void FIRLogBasic(FIRLoggerLevel level, + NSString *category, + NSString *messageCode, + NSString *message, +// On 64-bit simulators, va_list is not a pointer, so cannot be marked nullable +// See: http://stackoverflow.com/q/29095469 +#if __LP64__ && TARGET_OS_SIMULATOR || TARGET_OS_OSX + va_list args_ptr +#else + va_list _Nullable args_ptr +#endif +); + +/** + * The following functions accept the following parameters in order: + * (required) service name of type FirebaseLoggerService. + * (required) message code starting from "I-" which means iOS, followed by a capitalized + * three-character service identifier and a six digit integer message ID that is unique + * within the service. + * An example of the message code is @"I-COR000001". + * See go/firebase-log-proposal for details. + * (required) message string which can be a format string. + * (optional) the list of arguments to substitute into the format string. + * Example usage: + * FirebaseLogError(kFirebaseLoggerCore, @"I-COR000001", @"Configuration of %@ failed.", app.name); + */ +extern void FIRLogError(NSString *category, NSString *messageCode, NSString *message, ...) + NS_FORMAT_FUNCTION(3, 4); +extern void FIRLogWarning(NSString *category, NSString *messageCode, NSString *message, ...) + NS_FORMAT_FUNCTION(3, 4); +extern void FIRLogNotice(NSString *category, NSString *messageCode, NSString *message, ...) + NS_FORMAT_FUNCTION(3, 4); +extern void FIRLogInfo(NSString *category, NSString *messageCode, NSString *message, ...) + NS_FORMAT_FUNCTION(3, 4); +extern void FIRLogDebug(NSString *category, NSString *messageCode, NSString *message, ...) + NS_FORMAT_FUNCTION(3, 4); + +/** + * This function is similar to the one above, except it takes a `va_list` instead of the listed + * variables. + * + * The following functions accept the following parameters in order: (required) service + * name of type FirebaseLoggerService. + * + * (required) message code starting from "I-" which means iOS, + * followed by a capitalized three-character service identifier and a six digit integer message + * ID that is unique within the service. An example of the message code is @"I-COR000001". + * See go/firebase-log-proposal for details. + * (required) message string which can be a format string. + * (optional) A va_list + */ +extern void FIRLogBasicError(NSString *category, + NSString *messageCode, + NSString *message, + va_list args_ptr); +extern void FIRLogBasicWarning(NSString *category, + NSString *messageCode, + NSString *message, + va_list args_ptr); +extern void FIRLogBasicNotice(NSString *category, + NSString *messageCode, + NSString *message, + va_list args_ptr); +extern void FIRLogBasicInfo(NSString *category, + NSString *messageCode, + NSString *message, + va_list args_ptr); +extern void FIRLogBasicDebug(NSString *category, + NSString *messageCode, + NSString *message, + va_list args_ptr); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + +NS_SWIFT_NAME(FirebaseLogger) +@interface FIRLoggerWrapper : NSObject + +/// Logs a given message at a given log level. +/// +/// - Parameters: +/// - level: The log level to use (defined by `FirebaseLoggerLevel` enum values). +/// - category: The service name of type `FirebaseLoggerService`. +/// - code: The message code. Starting with "I-" which means iOS, followed by a capitalized +/// three-character service identifier and a six digit integer message ID that is unique within +/// the service. An example of the message code is @"I-COR000001". +/// - message: Formatted string to be used as the log's message. ++ (void)logWithLevel:(FIRLoggerLevel)level + service:(NSString *)category + code:(NSString *)code + message:(NSString *)message + __attribute__((__swift_name__("log(level:service:code:message:)"))); + +@end + +NS_ASSUME_NONNULL_END + +#endif // FIREBASECORE_FIRLOGGER_H diff --git a/Pods/FirebaseCrashlytics/FirebaseCore/Extension/FirebaseCoreInternal.h b/Pods/FirebaseCrashlytics/FirebaseCore/Extension/FirebaseCoreInternal.h new file mode 100644 index 0000000..2561008 --- /dev/null +++ b/Pods/FirebaseCrashlytics/FirebaseCore/Extension/FirebaseCoreInternal.h @@ -0,0 +1,28 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef FIREBASECORE_FIREBASECOREINTERNAL_H +#define FIREBASECORE_FIREBASECOREINTERNAL_H + +@import FirebaseCore; + +#import "FIRAppInternal.h" +#import "FIRComponent.h" +#import "FIRComponentContainer.h" +#import "FIRComponentType.h" +#import "FIRHeartbeatLogger.h" +#import "FIRLibrary.h" +#import "FIRLogger.h" + +#endif // FIREBASECORE_FIREBASECOREINTERNAL_H diff --git a/Pods/FirebaseCrashlytics/FirebaseInstallations/Source/Library/Private/FirebaseInstallationsInternal.h b/Pods/FirebaseCrashlytics/FirebaseInstallations/Source/Library/Private/FirebaseInstallationsInternal.h new file mode 100644 index 0000000..0c850e9 --- /dev/null +++ b/Pods/FirebaseCrashlytics/FirebaseInstallations/Source/Library/Private/FirebaseInstallationsInternal.h @@ -0,0 +1,19 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// An umbrella header, for any other libraries in this repo to access Firebase +// Installations Public headers. Any package manager complexity should be +// handled here. + +#import diff --git a/Pods/FirebaseCrashlytics/Interop/Analytics/Public/FIRAnalyticsInterop.h b/Pods/FirebaseCrashlytics/Interop/Analytics/Public/FIRAnalyticsInterop.h new file mode 100644 index 0000000..3b49733 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Interop/Analytics/Public/FIRAnalyticsInterop.h @@ -0,0 +1,68 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@protocol FIRAnalyticsInteropListener; + +NS_ASSUME_NONNULL_BEGIN + +/// Block typedef callback parameter to `getUserProperties(with:)`. +typedef void (^FIRAInteropUserPropertiesCallback)(NSDictionary *userProperties) + NS_SWIFT_UNAVAILABLE("Use Swift's closure syntax instead."); + +/// Connector for bridging communication between Firebase SDKs and FirebaseAnalytics APIs. +@protocol FIRAnalyticsInterop + +/// Sets user property when trigger event is logged. This API is only available in the SDK. +- (void)setConditionalUserProperty:(NSDictionary *)conditionalUserProperty; + +/// Clears user property if set. +- (void)clearConditionalUserProperty:(NSString *)userPropertyName + forOrigin:(NSString *)origin + clearEventName:(NSString *)clearEventName + clearEventParameters:(NSDictionary *)clearEventParameters; + +/// Returns currently set user properties. +- (NSArray *> *)conditionalUserProperties:(NSString *)origin + propertyNamePrefix: + (NSString *)propertyNamePrefix; + +/// Returns the maximum number of user properties. +- (NSInteger)maxUserProperties:(NSString *)origin; + +/// Returns the user properties to a callback function. +- (void)getUserPropertiesWithCallback: + (void (^)(NSDictionary *userProperties))callback; + +/// Logs events. +- (void)logEventWithOrigin:(NSString *)origin + name:(NSString *)name + parameters:(nullable NSDictionary *)parameters; + +/// Sets user property. +- (void)setUserPropertyWithOrigin:(NSString *)origin name:(NSString *)name value:(id)value; + +/// Registers an Analytics listener for the given origin. +- (void)registerAnalyticsListener:(id)listener + withOrigin:(NSString *)origin; + +/// Unregisters an Analytics listener for the given origin. +- (void)unregisterAnalyticsListenerWithOrigin:(NSString *)origin; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseCrashlytics/Interop/Analytics/Public/FIRAnalyticsInteropListener.h b/Pods/FirebaseCrashlytics/Interop/Analytics/Public/FIRAnalyticsInteropListener.h new file mode 100644 index 0000000..327aefd --- /dev/null +++ b/Pods/FirebaseCrashlytics/Interop/Analytics/Public/FIRAnalyticsInteropListener.h @@ -0,0 +1,24 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/// Handles events and messages from Analytics. +@protocol FIRAnalyticsInteropListener + +/// Triggers when an Analytics event happens for the registered origin with +/// FirebaseAnalyticsInterop`s `registerAnalyticsListener(_:withOrigin:)`. +- (void)messageTriggered:(NSString *)name parameters:(NSDictionary *)parameters; + +@end diff --git a/Pods/FirebaseCrashlytics/Interop/Analytics/Public/FIRInteropEventNames.h b/Pods/FirebaseCrashlytics/Interop/Analytics/Public/FIRInteropEventNames.h new file mode 100644 index 0000000..efc54ab --- /dev/null +++ b/Pods/FirebaseCrashlytics/Interop/Analytics/Public/FIRInteropEventNames.h @@ -0,0 +1,28 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/// @file FIRInteropEventNames.h + +#import + +/// Notification open event name. +static NSString *const kFIRIEventNotificationOpen = @"_no"; + +/// Notification foreground event name. +static NSString *const kFIRIEventNotificationForeground = @"_nf"; + +/// Campaign event name. +static NSString *const kFIRIEventFirebaseCampaign = @"_cmp"; diff --git a/Pods/FirebaseCrashlytics/Interop/Analytics/Public/FIRInteropParameterNames.h b/Pods/FirebaseCrashlytics/Interop/Analytics/Public/FIRInteropParameterNames.h new file mode 100644 index 0000000..f640702 --- /dev/null +++ b/Pods/FirebaseCrashlytics/Interop/Analytics/Public/FIRInteropParameterNames.h @@ -0,0 +1,73 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +/// @file FIRInteropParameterNames.h +/// +/// Predefined event parameter names used by Firebase. This file is a subset of the +/// FirebaseAnalytics FIRParameterNames.h public header. +/// +/// The origin of your traffic, such as an Ad network (for example, google) or partner (urban +/// airship). Identify the advertiser, site, publication, etc. that is sending traffic to your +/// property. Highly recommended (String). +///
+///     let params = [
+///       kFIRParameterSource : "InMobi",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRIParameterSource NS_SWIFT_NAME(AnalyticsParameterSource) = @"source"; + +/// The advertising or marketing medium, for example: cpc, banner, email, push. Highly recommended +/// (String). +///
+///     let params = [
+///       kFIRParameterMedium : "email",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRIParameterMedium NS_SWIFT_NAME(AnalyticsParameterMedium) = @"medium"; + +/// The individual campaign name, slogan, promo code, etc. Some networks have pre-defined macro to +/// capture campaign information, otherwise can be populated by developer. Highly Recommended +/// (String). +///
+///     let params = [
+///       kFIRParameterCampaign : "winter_promotion",
+///       // ...
+///     ]
+/// 
+static NSString *const kFIRIParameterCampaign NS_SWIFT_NAME(AnalyticsParameterCampaign) = + @"campaign"; + +/// Message identifier. +static NSString *const kFIRIParameterMessageIdentifier = @"_nmid"; + +/// Message name. +static NSString *const kFIRIParameterMessageName = @"_nmn"; + +/// Message send time. +static NSString *const kFIRIParameterMessageTime = @"_nmt"; + +/// Message device time. +static NSString *const kFIRIParameterMessageDeviceTime = @"_ndt"; + +/// Topic message. +static NSString *const kFIRIParameterTopic = @"_nt"; + +/// Stores the message_id of the last notification opened by the app. +static NSString *const kFIRIUserPropertyLastNotification = @"_ln"; diff --git a/Pods/FirebaseCrashlytics/README.md b/Pods/FirebaseCrashlytics/README.md new file mode 100644 index 0000000..15a560d --- /dev/null +++ b/Pods/FirebaseCrashlytics/README.md @@ -0,0 +1,302 @@ +

+ + + + + + + + +
+ + + + + + +

+ +# Firebase Apple Open Source Development + +This repository contains the source code for all Apple platform Firebase SDKs except FirebaseAnalytics. + +Firebase is an app development platform with tools to help you build, grow, and +monetize your app. More information about Firebase can be found on the +[official Firebase website](https://firebase.google.com). + +## Installation + +See the subsections below for details about the different installation methods. Where +available, it's recommended to install any libraries with a `Swift` suffix to get the +best experience when writing your app in Swift. + +1. [Standard pod install](#standard-pod-install) +2. [Swift Package Manager](#swift-package-manager) +3. [Installing from the GitHub repo](#installing-from-github) +4. [Experimental Carthage](#carthage-ios-only) + +### Standard pod install + +For instructions on the standard pod install, visit: +[https://firebase.google.com/docs/ios/setup](https://firebase.google.com/docs/ios/setup). + +### Swift Package Manager + +Instructions for [Swift Package Manager](https://swift.org/package-manager/) support can be +found in the [SwiftPackageManager.md](SwiftPackageManager.md) Markdown file. + +### Installing from GitHub + +These instructions can be used to access the Firebase repo at other branches, +tags, or commits. + +#### Background + +See [the Podfile Syntax Reference](https://guides.cocoapods.org/syntax/podfile.html#pod) +for instructions and options about overriding pod source locations. + +#### Accessing Firebase Source Snapshots + +All official releases are tagged in this repo and available via CocoaPods. To access a local +source snapshot or unreleased branch, use Podfile directives like the following: + +To access FirebaseFirestore via a branch: +```ruby +pod 'FirebaseCore', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :branch => 'main' +pod 'FirebaseFirestore', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :branch => 'main' +``` + +To access FirebaseMessaging via a checked-out version of the firebase-ios-sdk repo: +```ruby +pod 'FirebaseCore', :path => '/path/to/firebase-ios-sdk' +pod 'FirebaseMessaging', :path => '/path/to/firebase-ios-sdk' +``` + +### Carthage (iOS only) + +Instructions for the experimental Carthage distribution can be found at +[Carthage.md](Carthage.md). + +### Using Firebase from a Framework or a library + +For details on using Firebase from a Framework or a library, refer to [firebase_in_libraries.md](docs/firebase_in_libraries.md). + +## Development + +To develop Firebase software in this repository, ensure that you have at least +the following software: + +* Xcode 16.2 (or later) + +CocoaPods is still the canonical way to develop, but much of the repo now supports +development with Swift Package Manager. + +### CocoaPods + +Install the following: +* CocoaPods 1.12.0 (or later) +* [CocoaPods generate](https://github.com/square/cocoapods-generate) + +For the pod that you want to develop: + +```ruby +pod gen Firebase{name here}.podspec --local-sources=./ --auto-open --platforms=ios +``` + +Note: If the CocoaPods cache is out of date, you may need to run +`pod repo update` before the `pod gen` command. + +Note: Set the `--platforms` option to `macos` or `tvos` to develop/test for +those platforms. Since 10.2, Xcode does not properly handle multi-platform +CocoaPods workspaces. + +Firestore has a self-contained Xcode project. See +[Firestore/README](Firestore/README.md) Markdown file. + +#### Development for Catalyst +* `pod gen {name here}.podspec --local-sources=./ --auto-open --platforms=ios` +* Check the Mac box in the App-iOS Build Settings +* Sign the App in the Settings Signing & Capabilities tab +* Click Pods in the Project Manager +* Add Signing to the iOS host app and unit test targets +* Select the Unit-unit scheme +* Run it to build and test + +Alternatively, disable signing in each target: +* Go to Build Settings tab +* Click `+` +* Select `Add User-Defined Setting` +* Add `CODE_SIGNING_REQUIRED` setting with a value of `NO` + +### Swift Package Manager +* To enable test schemes: `./scripts/setup_spm_tests.sh` +* `open Package.swift` or double click `Package.swift` in Finder. +* Xcode will open the project + * Choose a scheme for a library to build or test suite to run + * Choose a target platform by selecting the run destination along with the scheme + +### Adding a New Firebase Pod + +Refer to [AddNewPod](docs/AddNewPod.md) Markdown file for details. + +### Managing Headers and Imports + +For information about managing headers and imports, see [HeadersImports](HeadersImports.md) Markdown file. + +### Code Formatting + +To ensure that the code is formatted consistently, run the script +[./scripts/check.sh](https://github.com/firebase/firebase-ios-sdk/blob/main/scripts/check.sh) +before creating a pull request (PR). + +GitHub Actions will verify that any code changes are done in a style-compliant +way. Install `clang-format` and `mint`: + +```console +brew install clang-format@21 +brew install mint +``` + +### Running Unit Tests + +Select a scheme and press Command-u to build a component and run its unit tests. + +### Running Sample Apps +To run the sample apps and integration tests, you'll need a valid +`GoogleService-Info.plist +` file. The Firebase Xcode project contains dummy plist +files without real values, but they can be replaced with real plist files. To get your own +`GoogleService-Info.plist` files: + +1. Go to the [Firebase Console](https://console.firebase.google.com/) +2. Create a new Firebase project, if you don't already have one +3. For each sample app you want to test, create a new Firebase app with the sample app's bundle +identifier (e.g., `com.google.Database-Example`) +4. Download the resulting `GoogleService-Info.plist` and add it to the Xcode project. + +### Coverage Report Generation + +For coverage report generation instructions, see [scripts/code_coverage_report/README](scripts/code_coverage_report/README.md) Markdown file. + +## Specific Component Instructions +See the sections below for any special instructions for those components. + +### Firebase AI Logic + +See the [Firebase AI Logic README](FirebaseAI#development) for instructions +about building and testing the SDK. + +### Firebase Auth + +For specific Firebase Auth development, refer to the [Auth Sample README](FirebaseAuth/Tests/Sample/README.md) for instructions about +building and running the FirebaseAuth pod along with various samples and tests. + +### Firebase Database + +The Firebase Database Integration tests can be run against a locally running Database Emulator +or against a production instance. + +To run against a local emulator instance, invoke `./scripts/run_database_emulator.sh start` before +running the integration test. + +To run against a production instance, provide a valid `GoogleServices-Info.plist` and copy it to +`FirebaseDatabase/Tests/Resources/GoogleService-Info.plist`. Your Security Rule must be set to +[public](https://firebase.google.com/docs/database/security/quickstart) while your tests are +running. + +### Firebase Dynamic Links + +Firebase Dynamic Links is **deprecated** and should not be used in new projects. The service will shut down on August 25, 2025. + +Please see our [Dynamic Links Deprecation FAQ documentation](https://firebase.google.com/support/dynamic-links-faq) for more guidance. + +### Firebase Performance Monitoring + +For specific Firebase Performance Monitoring development, see +[the Performance README](FirebasePerformance/README.md) for instructions about building the SDK +and [the Performance TestApp README](FirebasePerformance/Tests/TestApp/README.md) for instructions about +integrating Performance with the dev test App. + +### Firebase Storage + +To run the Storage Integration tests, follow the instructions in +[StorageIntegration.swift](FirebaseStorage/Tests/Integration/StorageIntegration.swift). + +#### Push Notifications + +Push notifications can only be delivered to specially provisioned App IDs in the developer portal. +In order to test receiving push notifications, you will need to: + +1. Change the bundle identifier of the sample app to something you own in your Apple Developer +account and enable that App ID for push notifications. +2. You'll also need to +[upload your APNs Provider Authentication Key or certificate to the +Firebase Console](https://firebase.google.com/docs/cloud-messaging/ios/certs) +at **Project Settings > Cloud Messaging > [Your Firebase App]**. +3. Ensure your iOS device is added to your Apple Developer portal as a test device. + +#### iOS Simulator + +The iOS Simulator cannot register for remote notifications and will not receive push notifications. +To receive push notifications, follow the steps above and run the app on a physical device. + +## Building with Firebase on Apple platforms + +Firebase provides official beta support for macOS, Catalyst, and tvOS. visionOS and watchOS +are community supported. Thanks to community contributions for many of the multi-platform PRs. + +At this time, most of Firebase's products are available across Apple platforms. There are still +a few gaps, especially on visionOS and watchOS. For details about the current support matrix, see +[this chart](https://firebase.google.com/docs/ios/learn-more#firebase_library_support_by_platform) +in Firebase's documentation. + +### visionOS + +Where supported, visionOS works as expected with the exception of Firestore via Swift Package +Manager where it is required to use the source distribution. + +To enable the Firestore source distribution, quit Xcode and open the desired +project from the command line with the `FIREBASE_SOURCE_FIRESTORE` environment +variable: `open --env FIREBASE_SOURCE_FIRESTORE /path/to/project.xcodeproj`. +To go back to using the binary distribution of Firestore, quit Xcode and open +Xcode like normal, without the environment variable. + +### watchOS +Thanks to contributions from the community, many of Firebase SDKs now compile, run unit tests, and +work on watchOS. See the [Independent Watch App Sample](Example/watchOSSample). + +Keep in mind that watchOS is not officially supported by Firebase. While we can catch basic unit +test issues with GitHub Actions, there may be some changes where the SDK no longer works as expected +on watchOS. If you encounter this, please +[file an issue](https://github.com/firebase/firebase-ios-sdk/issues). + +During app setup in the console, you may get to a step that mentions something like "Checking if the +app has communicated with our servers". This relies on Analytics and will not work on watchOS. +**It's safe to ignore the message and continue**, the rest of the SDKs will work as expected. + +#### Additional Crashlytics Notes +* watchOS has limited support. Due to watchOS restrictions, mach exceptions and signal crashes are +not recorded. (Crashes in SwiftUI are generated as mach exceptions, so will not be recorded) + +## Combine +Thanks to contributions from the community, _FirebaseCombineSwift_ contains support for Apple's Combine +framework. This module is currently under development and not yet supported for use in production +environments. For more details, please refer to the [docs](FirebaseCombineSwift/README.md). + +## Roadmap + +See [Roadmap](ROADMAP.md) for more about the Firebase Apple SDK Open Source +plans and directions. + +## Contributing + +See [Contributing](CONTRIBUTING.md) for more information on contributing to the Firebase +Apple SDK. + +## License + +The contents of this repository are licensed under the +[Apache License, version 2.0](http://www.apache.org/licenses/LICENSE-2.0). + +Your use of Firebase is governed by the +[Terms of Service for Firebase Services](https://firebase.google.com/terms/). diff --git a/Pods/FirebaseCrashlytics/run b/Pods/FirebaseCrashlytics/run new file mode 100755 index 0000000..bb1d43d --- /dev/null +++ b/Pods/FirebaseCrashlytics/run @@ -0,0 +1,72 @@ +#!/bin/sh + +# Copyright 2019 Google +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# run +# +# This script is meant to be run as a Run Script in the "Build Phases" section +# of your Xcode project. It sends debug symbols to symbolicate stacktraces, +# sends build events to track versions, and onboards apps for Crashlytics. +# +# This script calls upload-symbols twice: +# +# 1) First it calls upload-symbols synchronously in "validation" mode. If the +# script finds issues with the build environment, it will report errors to Xcode. +# In validation mode it exits before doing any time consuming work. +# +# 2) Then it calls upload-symbols in the background to actually send the build +# event and upload symbols. It does this in the background so that it doesn't +# slow down your builds. If an error happens here, you won't see it in Xcode. +# +# You can find the output for the background execution in Console.app, by +# searching for "upload-symbols". +# +# If you want verbose output, you can pass the --debug flag to this script +# + +# Figure out where we're being called from +DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) + +# Build up the arguments list, passing through any flags added, and quoting +# every argument in case there are spaces in any of the paths. +ARGUMENTS='' +for i in "$@"; do + ARGUMENTS="$ARGUMENTS \"$i\"" +done + +VALIDATE_ARGUMENTS="--build-phase --validate $ARGUMENTS" +UPLOAD_ARGUMENTS="--build-phase $ARGUMENTS " + +# Quote the path to handle folders with special characters +COMMAND_PATH="\"$DIR/upload-symbols\" " + +# Ensure params are as expected, run in sync mode to validate, +# and cause a build error if validation fails +eval $COMMAND_PATH$VALIDATE_ARGUMENTS +return_code=$? + +if [[ $return_code != 0 ]]; then + exit $return_code +fi + +# Verification passed, convert and upload dSYMs in the background to prevent +# build delays +# +# Note: Validation is performed again at this step before upload +# +# Note: Output can still be found in Console.app, by searching for +# "upload-symbols" +# +eval $COMMAND_PATH$UPLOAD_ARGUMENTS > /dev/null 2>&1 & diff --git a/Pods/FirebaseCrashlytics/upload-symbols b/Pods/FirebaseCrashlytics/upload-symbols new file mode 100755 index 0000000..4c3f825 Binary files /dev/null and b/Pods/FirebaseCrashlytics/upload-symbols differ diff --git a/Pods/FirebaseInstallations/FirebaseCore/Extension/FIRAppInternal.h b/Pods/FirebaseInstallations/FirebaseCore/Extension/FIRAppInternal.h new file mode 100644 index 0000000..96d42ef --- /dev/null +++ b/Pods/FirebaseInstallations/FirebaseCore/Extension/FIRAppInternal.h @@ -0,0 +1,182 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FIREBASECORE_FIRAPPINTERNAL_H +#define FIREBASECORE_FIRAPPINTERNAL_H + +#import + +@class FIRComponentContainer; +@class FIRHeartbeatLogger; +@protocol FIRLibrary; + +/** + * The internal interface to `FirebaseApp`. This is meant for first-party integrators, who need to + * receive `FirebaseApp` notifications, log info about the success or failure of their + * configuration, and access other internal functionality of `FirebaseApp`. + */ +NS_ASSUME_NONNULL_BEGIN + +typedef NS_ENUM(NSInteger, FIRConfigType) { + FIRConfigTypeCore = 1, + FIRConfigTypeSDK = 2, +}; + +extern NSString *const kFIRDefaultAppName; +extern NSString *const kFIRAppReadyToConfigureSDKNotification; +extern NSString *const kFIRAppDeleteNotification; +extern NSString *const kFIRAppIsDefaultAppKey; +extern NSString *const kFIRAppNameKey; +extern NSString *const kFIRGoogleAppIDKey; +extern NSString *const kFirebaseCoreErrorDomain; + +/** + * Keys for the strings in the plist file. + */ +extern NSString *const kFIRAPIKey; +extern NSString *const kFIRTrackingID; +extern NSString *const kFIRGoogleAppID; +extern NSString *const kFIRClientID; +extern NSString *const kFIRGCMSenderID; +extern NSString *const kFIRAndroidClientID; +extern NSString *const kFIRDatabaseURL; +extern NSString *const kFIRStorageBucket; +extern NSString *const kFIRBundleID; +extern NSString *const kFIRProjectID; + +/** + * Keys for the plist file name + */ +extern NSString *const kServiceInfoFileName; + +extern NSString *const kServiceInfoFileType; + +/** + * The format string for the `UserDefaults` key used for storing the data collection enabled flag. + * This includes formatting to append the `FirebaseApp`'s name. + */ +extern NSString *const kFIRGlobalAppDataCollectionEnabledDefaultsKeyFormat; + +/** + * The plist key used for storing the data collection enabled flag. + */ +extern NSString *const kFIRGlobalAppDataCollectionEnabledPlistKey; + +/** @var FirebaseAuthStateDidChangeInternalNotification + @brief The name of the @c NotificationCenter notification which is posted when the auth state + changes (e.g. a new token has been produced, a user logs in or out). The object parameter of + the notification is a dictionary possibly containing the key: + @c FirebaseAuthStateDidChangeInternalNotificationTokenKey (the new access token.) If it does not + contain this key it indicates a sign-out event took place. + */ +extern NSString *const FIRAuthStateDidChangeInternalNotification; + +/** @var FirebaseAuthStateDidChangeInternalNotificationTokenKey + @brief A key present in the dictionary object parameter of the + @c FirebaseAuthStateDidChangeInternalNotification notification. The value associated with this + key will contain the new access token. + */ +extern NSString *const FIRAuthStateDidChangeInternalNotificationTokenKey; + +/** @var FirebaseAuthStateDidChangeInternalNotificationAppKey + @brief A key present in the dictionary object parameter of the + @c FirebaseAuthStateDidChangeInternalNotification notification. The value associated with this + key will contain the FirebaseApp associated with the auth instance. + */ +extern NSString *const FIRAuthStateDidChangeInternalNotificationAppKey; + +/** @var FirebaseAuthStateDidChangeInternalNotificationUIDKey + @brief A key present in the dictionary object parameter of the + @c FirebaseAuthStateDidChangeInternalNotification notification. The value associated with this + key will contain the new user's UID (or nil if there is no longer a user signed in). + */ +extern NSString *const FIRAuthStateDidChangeInternalNotificationUIDKey; + +@interface FIRApp () + +/** + * A flag indicating if this is the default app (has the default app name). + */ +@property(nonatomic, readonly) BOOL isDefaultApp; + +/** + * The container of interop SDKs for this app. + */ +@property(nonatomic) FIRComponentContainer *container; + +/** + * The heartbeat logger associated with this app. + * + * Firebase apps have a 1:1 relationship with heartbeat loggers. + */ +@property(readonly) FIRHeartbeatLogger *heartbeatLogger; + +/** + * Checks if the default app is configured without trying to configure it. + */ ++ (BOOL)isDefaultAppConfigured; + +/** + * Registers a given third-party library with the given version number to be reported for + * analytics. + * + * @param name Name of the library. + * @param version Version of the library. + */ ++ (void)registerLibrary:(nonnull NSString *)name withVersion:(nonnull NSString *)version; + +/** + * Registers a given internal library to be reported for analytics. + * + * @param library Optional parameter for component registration. + * @param name Name of the library. + */ ++ (void)registerInternalLibrary:(nonnull Class)library + withName:(nonnull NSString *)name; + +/** + * Registers a given internal library with the given version number to be reported for + * analytics. This should only be used for non-Firebase libraries that have their own versioning + * scheme. + * + * @param library Optional parameter for component registration. + * @param name Name of the library. + * @param version Version of the library. + */ ++ (void)registerInternalLibrary:(nonnull Class)library + withName:(nonnull NSString *)name + withVersion:(nonnull NSString *)version; + +/** + * A concatenated string representing all the third-party libraries and version numbers. + */ ++ (NSString *)firebaseUserAgent; + +/** + * Can be used by the unit tests in each SDK to reset `FirebaseApp`. This method is thread unsafe. + */ ++ (void)resetApps; + +/** + * Can be used by the unit tests in each SDK to set customized options. + */ +- (instancetype)initInstanceWithName:(NSString *)name options:(FIROptions *)options; + +@end + +NS_ASSUME_NONNULL_END + +#endif // FIREBASECORE_FIRAPPINTERNAL_H diff --git a/Pods/FirebaseInstallations/FirebaseCore/Extension/FIRComponent.h b/Pods/FirebaseInstallations/FirebaseCore/Extension/FIRComponent.h new file mode 100644 index 0000000..98c7a89 --- /dev/null +++ b/Pods/FirebaseInstallations/FirebaseCore/Extension/FIRComponent.h @@ -0,0 +1,89 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FIREBASECORE_FIRCOMPONENT_H +#define FIREBASECORE_FIRCOMPONENT_H + +#import + +@class FIRApp; +@class FIRComponentContainer; + +NS_ASSUME_NONNULL_BEGIN + +/// Provides a system to clean up cached instances returned from the component system. +NS_SWIFT_NAME(ComponentLifecycleMaintainer) +@protocol FIRComponentLifecycleMaintainer +/// The associated app will be deleted, clean up any resources as they are about to be deallocated. +- (void)appWillBeDeleted:(FIRApp *)app; +@end + +typedef _Nullable id (^FIRComponentCreationBlock)(FIRComponentContainer *container, + BOOL *isCacheable) + NS_SWIFT_NAME(ComponentCreationBlock); + +/// Describes the timing of instantiation. Note: new components should default to lazy unless there +/// is a strong reason to be eager. +typedef NS_ENUM(NSInteger, FIRInstantiationTiming) { + FIRInstantiationTimingLazy, + FIRInstantiationTimingAlwaysEager, + FIRInstantiationTimingEagerInDefaultApp +} NS_SWIFT_NAME(InstantiationTiming); + +/// A component that can be used from other Firebase SDKs. +NS_SWIFT_NAME(Component) +@interface FIRComponent : NSObject + +/// The protocol describing functionality provided from the `Component`. +@property(nonatomic, strong, readonly) Protocol *protocol; + +/// The timing of instantiation. +@property(nonatomic, readonly) FIRInstantiationTiming instantiationTiming; + +/// A block to instantiate an instance of the component with the appropriate dependencies. +@property(nonatomic, copy, readonly) FIRComponentCreationBlock creationBlock; + +// There's an issue with long NS_SWIFT_NAMES that causes compilation to fail, disable clang-format +// for the next two methods. +// clang-format off + +/// Creates a component with no dependencies that will be lazily initialized. ++ (instancetype)componentWithProtocol:(Protocol *)protocol + creationBlock:(FIRComponentCreationBlock)creationBlock +NS_SWIFT_NAME(init(_:creationBlock:)); + +/// Creates a component to be registered with the component container. +/// +/// @param protocol - The protocol describing functionality provided by the component. +/// @param instantiationTiming - When the component should be initialized. Use .lazy unless there's +/// a good reason to be instantiated earlier. +/// @param creationBlock - A block to instantiate the component with a container, and if +/// @return A component that can be registered with the component container. ++ (instancetype)componentWithProtocol:(Protocol *)protocol + instantiationTiming:(FIRInstantiationTiming)instantiationTiming + creationBlock:(FIRComponentCreationBlock)creationBlock +NS_SWIFT_NAME(init(_:instantiationTiming:creationBlock:)); + +// clang-format on + +/// Unavailable. +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END + +#endif // FIREBASECORE_FIRCOMPONENT_H diff --git a/Pods/FirebaseInstallations/FirebaseCore/Extension/FIRComponentContainer.h b/Pods/FirebaseInstallations/FirebaseCore/Extension/FIRComponentContainer.h new file mode 100644 index 0000000..6864087 --- /dev/null +++ b/Pods/FirebaseInstallations/FirebaseCore/Extension/FIRComponentContainer.h @@ -0,0 +1,51 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FIREBASECORE_FIRCOMPONENTCONTAINER_H +#define FIREBASECORE_FIRCOMPONENTCONTAINER_H + +#import + +NS_ASSUME_NONNULL_BEGIN + +/// A type-safe macro to retrieve a component from a container. This should be used to retrieve +/// components instead of using the container directly. +#define FIR_COMPONENT(type, container) \ + [FIRComponentType> instanceForProtocol:@protocol(type) inContainer:container] + +@class FIRApp; + +/// A container that holds different components that are registered via the +/// `registerAsComponentRegistrant` call. These classes should conform to `ComponentRegistrant` +/// in order to properly register components for Core. +NS_SWIFT_NAME(FirebaseComponentContainer) +@interface FIRComponentContainer : NSObject + +/// A weak reference to the app that an instance of the container belongs to. +@property(nonatomic, weak, readonly) FIRApp *app; + +// TODO: See if we can get improved type safety here. +/// A Swift only API for fetching an instance since the top macro isn't available. +- (nullable id)__instanceForProtocol:(Protocol *)protocol NS_SWIFT_NAME(instance(for:)); + +/// Unavailable. Use the `container` property on `FirebaseApp`. +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END + +#endif // FIREBASECORE_FIRCOMPONENTCONTAINER_H diff --git a/Pods/FirebaseInstallations/FirebaseCore/Extension/FIRComponentType.h b/Pods/FirebaseInstallations/FirebaseCore/Extension/FIRComponentType.h new file mode 100644 index 0000000..92a5aab --- /dev/null +++ b/Pods/FirebaseInstallations/FirebaseCore/Extension/FIRComponentType.h @@ -0,0 +1,40 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FIREBASECORE_FIRCOMPONENTTYPE_H +#define FIREBASECORE_FIRCOMPONENTTYPE_H + +#import + +@class FIRComponentContainer; + +NS_ASSUME_NONNULL_BEGIN + +/// Do not use directly. A placeholder type in order to provide a macro that will warn users of +/// mis-matched protocols. +NS_SWIFT_NAME(ComponentType) +@interface FIRComponentType<__covariant T> : NSObject + +/// Do not use directly. A factory method to retrieve an instance that provides a specific +/// functionality. ++ (nullable T)instanceForProtocol:(Protocol *)protocol + inContainer:(FIRComponentContainer *)container; + +@end + +NS_ASSUME_NONNULL_END + +#endif // FIREBASECORE_FIRCOMPONENTTYPE_H diff --git a/Pods/FirebaseInstallations/FirebaseCore/Extension/FIRHeartbeatLogger.h b/Pods/FirebaseInstallations/FirebaseCore/Extension/FIRHeartbeatLogger.h new file mode 100644 index 0000000..95497d2 --- /dev/null +++ b/Pods/FirebaseInstallations/FirebaseCore/Extension/FIRHeartbeatLogger.h @@ -0,0 +1,110 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef FIREBASECORE_FIRHEARTBEATLOGGER_H +#define FIREBASECORE_FIRHEARTBEATLOGGER_H + +#import + +NS_ASSUME_NONNULL_BEGIN + +#ifndef FIREBASE_BUILD_CMAKE +@class FIRHeartbeatsPayload; +#endif // FIREBASE_BUILD_CMAKE + +/// Enum representing different daily heartbeat codes. +/// This enum is only used by clients using platform logging V1. This is because +/// the V1 payload only supports a single daily heartbeat. +typedef NS_ENUM(NSInteger, FIRDailyHeartbeatCode) { + /// Represents the absence of a daily heartbeat. + FIRDailyHeartbeatCodeNone = 0, + /// Represents the presence of a daily heartbeat. + FIRDailyHeartbeatCodeSome = 2, +}; + +NS_SWIFT_SENDABLE +@protocol FIRHeartbeatLoggerProtocol + +/// Asynchronously logs a heartbeat. +- (void)log; + +/// Gets the heartbeat code for today. +- (FIRDailyHeartbeatCode)heartbeatCodeForToday; + +#ifndef FIREBASE_BUILD_CMAKE +/// Returns the header value for the heartbeat logger via the given completion handler.. +- (void)asyncHeaderValueWithCompletionHandler:(void (^)(NSString *_Nullable))completionHandler + API_AVAILABLE(ios(13.0), macosx(10.15), macCatalyst(13.0), tvos(13.0), watchos(6.0)); + +/// Return the header value for the heartbeat logger. +- (NSString *_Nullable)headerValue; +#endif // FIREBASE_BUILD_CMAKE + +@end + +#ifndef FIREBASE_BUILD_CMAKE +/// Returns a nullable string header value from a given heartbeats payload. +/// +/// This API returns `nil` when the given heartbeats payload is considered empty. +/// +/// @param heartbeatsPayload The heartbeats payload. +NSString *_Nullable FIRHeaderValueFromHeartbeatsPayload(FIRHeartbeatsPayload *heartbeatsPayload); +#endif // FIREBASE_BUILD_CMAKE + +/// A thread safe, synchronized object that logs and flushes platform logging info. +@interface FIRHeartbeatLogger : NSObject + +/// Designated initializer. +/// +/// @param appID The app ID that this heartbeat logger corresponds to. +- (instancetype)initWithAppID:(NSString *)appID; + +/// Asynchronously logs a new heartbeat corresponding to the Firebase User Agent, if needed. +/// +/// @note This API is thread-safe. +- (void)log; + +#ifndef FIREBASE_BUILD_CMAKE +/// Synchronously flushes heartbeats from storage into a structured payload of heartbeats. +/// +/// This API is for clients using platform logging V2. +/// +/// @note This API is thread-safe. +/// @return A payload of heartbeats. +- (FIRHeartbeatsPayload *)flushHeartbeatsIntoPayload; + +/// Asynchronously flushes heartbeats from storage into a structured payload of heartbeats. +/// +/// This API is for clients using platform logging V2. +/// +/// @note This API is thread-safe. +/// @param completionHandler A completion handler to process the flushed payload of heartbeats. +- (void)flushHeartbeatsIntoPayloadWithCompletionHandler: + (void (^)(FIRHeartbeatsPayload *))completionHandler + API_AVAILABLE(ios(13.0), macosx(10.15), macCatalyst(13.0), tvos(13.0), watchos(6.0)); +#endif // FIREBASE_BUILD_CMAKE + +/// Gets today's corresponding heartbeat code. +/// +/// This API is for clients using platform logging V1. +/// +/// @note This API is thread-safe. +/// @return Heartbeat code indicating whether or not there is an unsent global heartbeat. +- (FIRDailyHeartbeatCode)heartbeatCodeForToday; + +@end + +NS_ASSUME_NONNULL_END + +#endif // FIREBASECORE_FIRHEARTBEATLOGGER_H diff --git a/Pods/FirebaseInstallations/FirebaseCore/Extension/FIRLibrary.h b/Pods/FirebaseInstallations/FirebaseCore/Extension/FIRLibrary.h new file mode 100644 index 0000000..fe256ad --- /dev/null +++ b/Pods/FirebaseInstallations/FirebaseCore/Extension/FIRLibrary.h @@ -0,0 +1,44 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FIREBASECORE_FIRLIBRARY_H +#define FIREBASECORE_FIRLIBRARY_H + +#ifndef FIRLibrary_h +#define FIRLibrary_h + +#import + +@class FIRApp; +@class FIRComponent; + +NS_ASSUME_NONNULL_BEGIN + +/// Provide an interface to register a library for userAgent logging and availability to others. +NS_SWIFT_NAME(Library) +@protocol FIRLibrary + +/// Returns one or more Components that will be registered in +/// FirebaseApp and participate in dependency resolution and injection. ++ (NSArray *)componentsToRegister; + +@end + +NS_ASSUME_NONNULL_END + +#endif /* FIRLibrary_h */ + +#endif // FIREBASECORE_FIRLIBRARY_H diff --git a/Pods/FirebaseInstallations/FirebaseCore/Extension/FIRLogger.h b/Pods/FirebaseInstallations/FirebaseCore/Extension/FIRLogger.h new file mode 100644 index 0000000..8117189 --- /dev/null +++ b/Pods/FirebaseInstallations/FirebaseCore/Extension/FIRLogger.h @@ -0,0 +1,198 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FIREBASECORE_FIRLOGGER_H +#define FIREBASECORE_FIRLOGGER_H + +#import + +typedef NS_ENUM(NSInteger, FIRLoggerLevel); + +NS_ASSUME_NONNULL_BEGIN + +/** + * The Firebase services used in Firebase logger. + */ +typedef NSString *const FIRLoggerService; + +extern NSString *const kFIRLoggerAnalytics; +extern NSString *const kFIRLoggerCrash; +extern NSString *const kFIRLoggerCore; +extern NSString *const kFIRLoggerRemoteConfig; + +/** + * The key used to store the logger's error count. + */ +extern NSString *const kFIRLoggerErrorCountKey; + +/** + * The key used to store the logger's warning count. + */ +extern NSString *const kFIRLoggerWarningCountKey; + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/** + * Enables or disables Analytics debug mode. + * If set to true, the logging level for Analytics will be set to FirebaseLoggerLevelDebug. + * Enabling the debug mode has no effect if the app is running from App Store. + * (required) analytics debug mode flag. + */ +void FIRSetAnalyticsDebugMode(BOOL analyticsDebugMode); + +/** + * Gets the current FIRLoggerLevel. + */ +FIRLoggerLevel FIRGetLoggerLevel(void); + +/** + * Changes the default logging level of FirebaseLoggerLevelNotice to a user-specified level. + * The default level cannot be set above FirebaseLoggerLevelNotice if the app is running from App + * Store. (required) log level (one of the FirebaseLoggerLevel enum values). + */ +void FIRSetLoggerLevel(FIRLoggerLevel loggerLevel); + +void FIRSetLoggerLevelNotice(void); +void FIRSetLoggerLevelWarning(void); +void FIRSetLoggerLevelError(void); +void FIRSetLoggerLevelDebug(void); + +/** + * Checks if the specified logger level is loggable given the current settings. + * (required) log level (one of the FirebaseLoggerLevel enum values). + * (required) whether or not this function is called from the Analytics component. + */ +BOOL FIRIsLoggableLevel(FIRLoggerLevel loggerLevel, BOOL analyticsComponent); + +BOOL FIRIsLoggableLevelNotice(void); +BOOL FIRIsLoggableLevelWarning(void); +BOOL FIRIsLoggableLevelError(void); +BOOL FIRIsLoggableLevelDebug(void); + +/** + * Logs a message to the Xcode console and the device log. If running from AppStore, will + * not log any messages with a level higher than FirebaseLoggerLevelNotice to avoid log spamming. + * (required) log level (one of the FirebaseLoggerLevel enum values). + * (required) service name of type FirebaseLoggerService. + * (required) message code starting with "I-" which means iOS, followed by a capitalized + * three-character service identifier and a six digit integer message ID that is unique + * within the service. + * An example of the message code is @"I-COR000001". + * (required) message string which can be a format string. + * (optional) variable arguments list obtained from calling va_start, used when message is a format + * string. + */ +extern void FIRLogBasic(FIRLoggerLevel level, + NSString *category, + NSString *messageCode, + NSString *message, +// On 64-bit simulators, va_list is not a pointer, so cannot be marked nullable +// See: http://stackoverflow.com/q/29095469 +#if __LP64__ && TARGET_OS_SIMULATOR || TARGET_OS_OSX + va_list args_ptr +#else + va_list _Nullable args_ptr +#endif +); + +/** + * The following functions accept the following parameters in order: + * (required) service name of type FirebaseLoggerService. + * (required) message code starting from "I-" which means iOS, followed by a capitalized + * three-character service identifier and a six digit integer message ID that is unique + * within the service. + * An example of the message code is @"I-COR000001". + * See go/firebase-log-proposal for details. + * (required) message string which can be a format string. + * (optional) the list of arguments to substitute into the format string. + * Example usage: + * FirebaseLogError(kFirebaseLoggerCore, @"I-COR000001", @"Configuration of %@ failed.", app.name); + */ +extern void FIRLogError(NSString *category, NSString *messageCode, NSString *message, ...) + NS_FORMAT_FUNCTION(3, 4); +extern void FIRLogWarning(NSString *category, NSString *messageCode, NSString *message, ...) + NS_FORMAT_FUNCTION(3, 4); +extern void FIRLogNotice(NSString *category, NSString *messageCode, NSString *message, ...) + NS_FORMAT_FUNCTION(3, 4); +extern void FIRLogInfo(NSString *category, NSString *messageCode, NSString *message, ...) + NS_FORMAT_FUNCTION(3, 4); +extern void FIRLogDebug(NSString *category, NSString *messageCode, NSString *message, ...) + NS_FORMAT_FUNCTION(3, 4); + +/** + * This function is similar to the one above, except it takes a `va_list` instead of the listed + * variables. + * + * The following functions accept the following parameters in order: (required) service + * name of type FirebaseLoggerService. + * + * (required) message code starting from "I-" which means iOS, + * followed by a capitalized three-character service identifier and a six digit integer message + * ID that is unique within the service. An example of the message code is @"I-COR000001". + * See go/firebase-log-proposal for details. + * (required) message string which can be a format string. + * (optional) A va_list + */ +extern void FIRLogBasicError(NSString *category, + NSString *messageCode, + NSString *message, + va_list args_ptr); +extern void FIRLogBasicWarning(NSString *category, + NSString *messageCode, + NSString *message, + va_list args_ptr); +extern void FIRLogBasicNotice(NSString *category, + NSString *messageCode, + NSString *message, + va_list args_ptr); +extern void FIRLogBasicInfo(NSString *category, + NSString *messageCode, + NSString *message, + va_list args_ptr); +extern void FIRLogBasicDebug(NSString *category, + NSString *messageCode, + NSString *message, + va_list args_ptr); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + +NS_SWIFT_NAME(FirebaseLogger) +@interface FIRLoggerWrapper : NSObject + +/// Logs a given message at a given log level. +/// +/// - Parameters: +/// - level: The log level to use (defined by `FirebaseLoggerLevel` enum values). +/// - category: The service name of type `FirebaseLoggerService`. +/// - code: The message code. Starting with "I-" which means iOS, followed by a capitalized +/// three-character service identifier and a six digit integer message ID that is unique within +/// the service. An example of the message code is @"I-COR000001". +/// - message: Formatted string to be used as the log's message. ++ (void)logWithLevel:(FIRLoggerLevel)level + service:(NSString *)category + code:(NSString *)code + message:(NSString *)message + __attribute__((__swift_name__("log(level:service:code:message:)"))); + +@end + +NS_ASSUME_NONNULL_END + +#endif // FIREBASECORE_FIRLOGGER_H diff --git a/Pods/FirebaseInstallations/FirebaseCore/Extension/FirebaseCoreInternal.h b/Pods/FirebaseInstallations/FirebaseCore/Extension/FirebaseCoreInternal.h new file mode 100644 index 0000000..2561008 --- /dev/null +++ b/Pods/FirebaseInstallations/FirebaseCore/Extension/FirebaseCoreInternal.h @@ -0,0 +1,28 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef FIREBASECORE_FIREBASECOREINTERNAL_H +#define FIREBASECORE_FIREBASECOREINTERNAL_H + +@import FirebaseCore; + +#import "FIRAppInternal.h" +#import "FIRComponent.h" +#import "FIRComponentContainer.h" +#import "FIRComponentType.h" +#import "FIRHeartbeatLogger.h" +#import "FIRLibrary.h" +#import "FIRLogger.h" + +#endif // FIREBASECORE_FIREBASECOREINTERNAL_H diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Errors/FIRInstallationsErrorUtil.h b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Errors/FIRInstallationsErrorUtil.h new file mode 100644 index 0000000..8aed7b1 --- /dev/null +++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Errors/FIRInstallationsErrorUtil.h @@ -0,0 +1,65 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FirebaseInstallations/Source/Library/Public/FirebaseInstallations/FIRInstallationsErrors.h" + +@class FIRInstallationsHTTPError; +@class FBLPromise; + +NS_ASSUME_NONNULL_BEGIN + +void FIRInstallationsItemSetErrorToPointer(NSError *error, NSError **pointer); + +@interface FIRInstallationsErrorUtil : NSObject + ++ (NSError *)keyedArchiverErrorWithException:(NSException *)exception; ++ (NSError *)keyedArchiverErrorWithError:(NSError *)error; + ++ (NSError *)keychainErrorWithFunction:(NSString *)keychainFunction status:(OSStatus)status; + ++ (NSError *)installationItemNotFoundForAppID:(NSString *)appID appName:(NSString *)appName; + ++ (NSError *)JSONSerializationError:(NSError *)error; + ++ (NSError *)networkErrorWithError:(NSError *)error; + ++ (NSError *)FIDRegistrationErrorWithResponseMissingField:(NSString *)missingFieldName; + ++ (NSError *)corruptedIIDTokenData; + ++ (FIRInstallationsHTTPError *)APIErrorWithHTTPResponse:(NSHTTPURLResponse *)HTTPResponse + data:(nullable NSData *)data; ++ (BOOL)isAPIError:(NSError *)error withHTTPCode:(NSInteger)HTTPCode; + ++ (NSError *)backoffIntervalWaitError; + +/** + * Returns the passed error if it is already in the public domain or a new error with the passed + * error at `NSUnderlyingErrorKey`. + */ ++ (NSError *)publicDomainErrorWithError:(NSError *)error; + ++ (FBLPromise *)rejectedPromiseWithError:(NSError *)error; + ++ (NSError *)installationsErrorWithCode:(FIRInstallationsErrorCode)code + failureReason:(nullable NSString *)failureReason + underlyingError:(nullable NSError *)underlyingError; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Errors/FIRInstallationsErrorUtil.m b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Errors/FIRInstallationsErrorUtil.m new file mode 100644 index 0000000..5673600 --- /dev/null +++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Errors/FIRInstallationsErrorUtil.m @@ -0,0 +1,145 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseInstallations/Source/Library/Errors/FIRInstallationsErrorUtil.h" + +#import "FirebaseInstallations/Source/Library/Errors/FIRInstallationsHTTPError.h" + +#if __has_include() +#import +#else +#import "FBLPromises.h" +#endif + +NSString *const kFirebaseInstallationsErrorDomain = @"com.firebase.installations"; + +void FIRInstallationsItemSetErrorToPointer(NSError *error, NSError **pointer) { + if (pointer != NULL) { + *pointer = error; + } +} + +@implementation FIRInstallationsErrorUtil + ++ (NSError *)keyedArchiverErrorWithException:(NSException *)exception { + NSString *failureReason = [NSString + stringWithFormat:@"NSKeyedArchiver exception with name: %@, reason: %@, userInfo: %@", + exception.name, exception.reason, exception.userInfo]; + return [self installationsErrorWithCode:FIRInstallationsErrorCodeUnknown + failureReason:failureReason + underlyingError:nil]; +} + ++ (NSError *)keyedArchiverErrorWithError:(NSError *)error { + NSString *failureReason = [NSString stringWithFormat:@"NSKeyedArchiver error."]; + return [self installationsErrorWithCode:FIRInstallationsErrorCodeUnknown + failureReason:failureReason + underlyingError:error]; +} + ++ (NSError *)keychainErrorWithFunction:(NSString *)keychainFunction status:(OSStatus)status { + NSString *failureReason = [NSString stringWithFormat:@"%@ (%li)", keychainFunction, (long)status]; + return [self installationsErrorWithCode:FIRInstallationsErrorCodeKeychain + failureReason:failureReason + underlyingError:nil]; +} + ++ (NSError *)installationItemNotFoundForAppID:(NSString *)appID appName:(NSString *)appName { + NSString *failureReason = + [NSString stringWithFormat:@"Installation for appID %@ appName %@ not found", appID, appName]; + return [self installationsErrorWithCode:FIRInstallationsErrorCodeUnknown + failureReason:failureReason + underlyingError:nil]; +} + ++ (NSError *)corruptedIIDTokenData { + NSString *failureReason = + @"IID token data stored in Keychain is corrupted or in an incompatible format."; + return [self installationsErrorWithCode:FIRInstallationsErrorCodeUnknown + failureReason:failureReason + underlyingError:nil]; +} + ++ (FIRInstallationsHTTPError *)APIErrorWithHTTPResponse:(NSHTTPURLResponse *)HTTPResponse + data:(nullable NSData *)data { + return [[FIRInstallationsHTTPError alloc] initWithHTTPResponse:HTTPResponse data:data]; +} + ++ (BOOL)isAPIError:(NSError *)error withHTTPCode:(NSInteger)HTTPCode { + if (![error isKindOfClass:[FIRInstallationsHTTPError class]]) { + return NO; + } + + return [(FIRInstallationsHTTPError *)error HTTPResponse].statusCode == HTTPCode; +} + ++ (NSError *)JSONSerializationError:(NSError *)error { + NSString *failureReason = [NSString stringWithFormat:@"Failed to serialize JSON data."]; + return [self installationsErrorWithCode:FIRInstallationsErrorCodeUnknown + failureReason:failureReason + underlyingError:nil]; +} + ++ (NSError *)FIDRegistrationErrorWithResponseMissingField:(NSString *)missingFieldName { + NSString *failureReason = [NSString + stringWithFormat:@"A required response field with name %@ is missing", missingFieldName]; + return [self installationsErrorWithCode:FIRInstallationsErrorCodeUnknown + failureReason:failureReason + underlyingError:nil]; +} + ++ (NSError *)networkErrorWithError:(NSError *)error { + return [self installationsErrorWithCode:FIRInstallationsErrorCodeServerUnreachable + failureReason:@"Network connection error." + underlyingError:error]; +} + ++ (NSError *)backoffIntervalWaitError { + return [self installationsErrorWithCode:FIRInstallationsErrorCodeServerUnreachable + failureReason:@"Too many server requests." + underlyingError:nil]; +} + ++ (NSError *)publicDomainErrorWithError:(NSError *)error { + if ([error.domain isEqualToString:kFirebaseInstallationsErrorDomain]) { + return error; + } + + return [self installationsErrorWithCode:FIRInstallationsErrorCodeUnknown + failureReason:nil + underlyingError:error]; +} + ++ (NSError *)installationsErrorWithCode:(FIRInstallationsErrorCode)code + failureReason:(nullable NSString *)failureReason + underlyingError:(nullable NSError *)underlyingError { + NSMutableDictionary *userInfo = [NSMutableDictionary dictionary]; + userInfo[NSUnderlyingErrorKey] = underlyingError; + userInfo[NSLocalizedFailureReasonErrorKey] = + failureReason + ?: [NSString + stringWithFormat:@"Underlying error: %@", underlyingError.localizedDescription]; + + return [NSError errorWithDomain:kFirebaseInstallationsErrorDomain code:code userInfo:userInfo]; +} + ++ (FBLPromise *)rejectedPromiseWithError:(NSError *)error { + FBLPromise *rejectedPromise = [FBLPromise pendingPromise]; + [rejectedPromise reject:error]; + return rejectedPromise; +} + +@end diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Errors/FIRInstallationsHTTPError.h b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Errors/FIRInstallationsHTTPError.h new file mode 100644 index 0000000..b978b77 --- /dev/null +++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Errors/FIRInstallationsHTTPError.h @@ -0,0 +1,53 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** Represents an error caused by an unexpected API response. */ +@interface FIRInstallationsHTTPError : NSError + +@property(nonatomic, readonly) NSHTTPURLResponse *HTTPResponse; +@property(nonatomic, readonly, nonnull) NSData *data; + +- (instancetype)init NS_UNAVAILABLE; + +- (instancetype)initWithHTTPResponse:(NSHTTPURLResponse *)HTTPResponse data:(nullable NSData *)data; + +@end + +NS_ASSUME_NONNULL_END + +typedef NS_ENUM(NSInteger, FIRInstallationsHTTPCodes) { + FIRInstallationsHTTPCodesTooManyRequests = 429, + FIRInstallationsHTTPCodesServerInternalError = 500, +}; + +/** Possible response HTTP codes for `CreateInstallation` API request. */ +typedef NS_ENUM(NSInteger, FIRInstallationsRegistrationHTTPCode) { + FIRInstallationsRegistrationHTTPCodeSuccess = 201, + FIRInstallationsRegistrationHTTPCodeInvalidArgument = 400, + FIRInstallationsRegistrationHTTPCodeAPIKeyToProjectIDMismatch = 403, + FIRInstallationsRegistrationHTTPCodeProjectNotFound = 404, + FIRInstallationsRegistrationHTTPCodeTooManyRequests = 429, + FIRInstallationsRegistrationHTTPCodeServerInternalError = 500 +}; + +typedef NS_ENUM(NSInteger, FIRInstallationsAuthTokenHTTPCode) { + FIRInstallationsAuthTokenHTTPCodeInvalidAuthentication = 401, + FIRInstallationsAuthTokenHTTPCodeFIDNotFound = 404, +}; diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Errors/FIRInstallationsHTTPError.m b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Errors/FIRInstallationsHTTPError.m new file mode 100644 index 0000000..4236f45 --- /dev/null +++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Errors/FIRInstallationsHTTPError.m @@ -0,0 +1,79 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseInstallations/Source/Library/Errors/FIRInstallationsHTTPError.h" +#import "FirebaseInstallations/Source/Library/Errors/FIRInstallationsErrorUtil.h" + +@implementation FIRInstallationsHTTPError + +- (instancetype)initWithHTTPResponse:(NSHTTPURLResponse *)HTTPResponse + data:(nullable NSData *)data { + NSDictionary *userInfo = [FIRInstallationsHTTPError userInfoWithHTTPResponse:HTTPResponse + data:data]; + self = [super + initWithDomain:kFirebaseInstallationsErrorDomain + code:[FIRInstallationsHTTPError errorCodeWithHTTPCode:HTTPResponse.statusCode] + userInfo:userInfo]; + if (self) { + _HTTPResponse = HTTPResponse; + _data = data; + } + return self; +} + ++ (FIRInstallationsErrorCode)errorCodeWithHTTPCode:(NSInteger)HTTPCode { + return FIRInstallationsErrorCodeUnknown; +} + ++ (NSDictionary *)userInfoWithHTTPResponse:(NSHTTPURLResponse *)HTTPResponse + data:(nullable NSData *)data { + NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; + NSString *failureReason = + [NSString stringWithFormat:@"The server responded with an error: \n - URL: %@ \n - HTTP " + @"status code: %ld \n - Response body: %@", + HTTPResponse.URL, (long)HTTPResponse.statusCode, responseString]; + return @{NSLocalizedFailureReasonErrorKey : failureReason}; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + return [[FIRInstallationsHTTPError alloc] initWithHTTPResponse:self.HTTPResponse data:self.data]; +} + +#pragma mark - NSSecureCoding + +- (nullable instancetype)initWithCoder:(NSCoder *)coder { + NSHTTPURLResponse *HTTPResponse = [coder decodeObjectOfClass:[NSHTTPURLResponse class] + forKey:@"HTTPResponse"]; + if (!HTTPResponse) { + return nil; + } + NSData *data = [coder decodeObjectOfClass:[NSData class] forKey:@"data"]; + + return [self initWithHTTPResponse:HTTPResponse data:data]; +} + +- (void)encodeWithCoder:(NSCoder *)coder { + [coder encodeObject:self.HTTPResponse forKey:@"HTTPResponse"]; + [coder encodeObject:self.data forKey:@"data"]; +} + ++ (BOOL)supportsSecureCoding { + return YES; +} + +@end diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallations.m b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallations.m new file mode 100644 index 0000000..4ee099e --- /dev/null +++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallations.m @@ -0,0 +1,284 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseInstallations/Source/Library/Public/FirebaseInstallations/FIRInstallations.h" + +#if __has_include() +#import +#else +#import "FBLPromises.h" +#endif + +#import "FirebaseCore/Extension/FirebaseCoreInternal.h" + +#import "FirebaseInstallations/Source/Library/FIRInstallationsAuthTokenResultInternal.h" + +#import "FirebaseInstallations/Source/Library/Errors/FIRInstallationsErrorUtil.h" +#import "FirebaseInstallations/Source/Library/FIRInstallationsItem.h" +#import "FirebaseInstallations/Source/Library/FIRInstallationsLogger.h" +#import "FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsIDController.h" +#import "FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStoredAuthToken.h" + +NS_ASSUME_NONNULL_BEGIN + +static const NSUInteger kExpectedAPIKeyLength = 39; + +@protocol FIRInstallationsInstanceProvider +@end + +@interface FIRInstallations () +@property(nonatomic, readonly) FIROptions *appOptions; +@property(nonatomic, readonly) NSString *appName; + +@property(nonatomic, readonly) FIRInstallationsIDController *installationsIDController; + +@end + +@implementation FIRInstallations + +#pragma mark - Firebase component + ++ (void)load { + [FIRApp registerInternalLibrary:(Class)self withName:@"fire-install"]; +} + ++ (nonnull NSArray *)componentsToRegister { + FIRComponentCreationBlock creationBlock = + ^id _Nullable(FIRComponentContainer *container, BOOL *isCacheable) { + *isCacheable = YES; + FIRInstallations *installations = [[FIRInstallations alloc] initWithApp:container.app]; + return installations; + }; + + FIRComponent *installationsProvider = + [FIRComponent componentWithProtocol:@protocol(FIRInstallationsInstanceProvider) + instantiationTiming:FIRInstantiationTimingAlwaysEager + creationBlock:creationBlock]; + return @[ installationsProvider ]; +} + +- (instancetype)initWithApp:(FIRApp *)app { + FIRInstallationsIDController *IDController = + [[FIRInstallationsIDController alloc] initWithApp:app]; + + // `prefetchAuthToken` is disabled due to b/156746574. + return [self initWithAppOptions:app.options + appName:app.name + installationsIDController:IDController + prefetchAuthToken:NO]; +} + +/// This designated initializer can be exposed for testing. +- (instancetype)initWithAppOptions:(FIROptions *)appOptions + appName:(NSString *)appName + installationsIDController:(FIRInstallationsIDController *)installationsIDController + prefetchAuthToken:(BOOL)prefetchAuthToken { + self = [super init]; + if (self) { + [[self class] validateAppOptions:appOptions appName:appName]; + [[self class] assertCompatibleIIDVersion]; + + _appOptions = [appOptions copy]; + _appName = [appName copy]; + _installationsIDController = installationsIDController; + + // Pre-fetch auth token. + if (prefetchAuthToken) { + [self authTokenWithCompletion:^(FIRInstallationsAuthTokenResult *_Nullable tokenResult, + NSError *_Nullable error){ + }]; + } + } + return self; +} + ++ (void)validateAppOptions:(FIROptions *)appOptions appName:(NSString *)appName { + NSMutableArray *missingFields = [NSMutableArray array]; + if (appName.length < 1) { + [missingFields addObject:@"`FirebaseApp.name`"]; + } + if (appOptions.APIKey.length < 1) { + [missingFields addObject:@"`FirebaseOptions.APIKey`"]; + } + if (appOptions.googleAppID.length < 1) { + [missingFields addObject:@"`FirebaseOptions.googleAppID`"]; + } + + if (appOptions.projectID.length < 1) { + [missingFields addObject:@"`FirebaseOptions.projectID`"]; + } + + if (missingFields.count > 0) { + [NSException + raise:kFirebaseInstallationsErrorDomain + format: + @"%@[%@] Could not configure Firebase Installations due to invalid FirebaseApp " + @"options. The following parameters are nil or empty: %@. If you use " + @"GoogleServices-Info.plist please download the most recent version from the Firebase " + @"Console. If you configure Firebase in code, please make sure you specify all " + @"required parameters.", + kFIRLoggerInstallations, kFIRInstallationsMessageCodeInvalidFirebaseAppOptions, + [missingFields componentsJoinedByString:@", "]]; + } + + [self validateAPIKey:appOptions.APIKey]; +} + ++ (void)validateAPIKey:(nullable NSString *)APIKey { + NSMutableArray *validationIssues = [[NSMutableArray alloc] init]; + + if (APIKey.length != kExpectedAPIKeyLength) { + [validationIssues addObject:[NSString stringWithFormat:@"API Key length must be %lu characters", + (unsigned long)kExpectedAPIKeyLength]]; + } + + if (![[APIKey substringToIndex:1] isEqualToString:@"A"]) { + [validationIssues addObject:@"API Key must start with `A`"]; + } + + NSMutableCharacterSet *allowedCharacters = [NSMutableCharacterSet alphanumericCharacterSet]; + [allowedCharacters + formUnionWithCharacterSet:[NSCharacterSet characterSetWithCharactersInString:@"-_"]]; + + NSCharacterSet *characters = [NSCharacterSet characterSetWithCharactersInString:APIKey]; + if (![allowedCharacters isSupersetOfSet:characters]) { + [validationIssues addObject:@"API Key must contain only base64 url-safe characters characters"]; + } + + if (validationIssues.count > 0) { + [NSException + raise:kFirebaseInstallationsErrorDomain + format: + @"%@[%@] Could not configure Firebase Installations due to invalid FirebaseApp " + @"options. `FirebaseOptions.APIKey` doesn't match the expected format: %@. If you use " + @"GoogleServices-Info.plist please download the most recent version from the Firebase " + @"Console. If you configure Firebase in code, please make sure you specify all " + @"required parameters.", + kFIRLoggerInstallations, kFIRInstallationsMessageCodeInvalidFirebaseAppOptions, + [validationIssues componentsJoinedByString:@", "]]; + } +} + +#pragma mark - Public + ++ (FIRInstallations *)installations { + FIRApp *defaultApp = [FIRApp defaultApp]; + if (!defaultApp) { + [NSException raise:kFirebaseInstallationsErrorDomain + format:@"The default FirebaseApp instance must be configured before the default" + @"FirebaseApp instance can be initialized. One way to ensure this is to " + @"call `FirebaseApp.configure()` in the App Delegate's " + @"`application(_:didFinishLaunchingWithOptions:)` " + @"(or the `@main` struct's initializer in SwiftUI)."]; + } + + return [self installationsWithApp:defaultApp]; +} + ++ (FIRInstallations *)installationsWithApp:(FIRApp *)app { + id installations = + FIR_COMPONENT(FIRInstallationsInstanceProvider, app.container); + return (FIRInstallations *)installations; +} + +- (void)installationIDWithCompletion:(FIRInstallationsIDHandler)completion { + [self.installationsIDController getInstallationItem] + .then(^id(FIRInstallationsItem *installation) { + completion(installation.firebaseInstallationID, nil); + return nil; + }) + .catch(^(NSError *error) { + completion(nil, [FIRInstallationsErrorUtil publicDomainErrorWithError:error]); + }); +} + +- (void)authTokenWithCompletion:(FIRInstallationsTokenHandler)completion { + [self authTokenForcingRefresh:NO completion:completion]; +} + +- (void)authTokenForcingRefresh:(BOOL)forceRefresh + completion:(FIRInstallationsTokenHandler)completion { + [self.installationsIDController getAuthTokenForcingRefresh:forceRefresh] + .then(^FIRInstallationsAuthTokenResult *(FIRInstallationsItem *installation) { + FIRInstallationsAuthTokenResult *result = [[FIRInstallationsAuthTokenResult alloc] + initWithToken:installation.authToken.token + expirationDate:installation.authToken.expirationDate]; + return result; + }) + .then(^id(FIRInstallationsAuthTokenResult *token) { + completion(token, nil); + return nil; + }) + .catch(^void(NSError *error) { + completion(nil, [FIRInstallationsErrorUtil publicDomainErrorWithError:error]); + }); +} + +- (void)deleteWithCompletion:(void (^)(NSError *__nullable error))completion { + [self.installationsIDController deleteInstallation] + .then(^id(id result) { + completion(nil); + return nil; + }) + .catch(^void(NSError *error) { + completion([FIRInstallationsErrorUtil publicDomainErrorWithError:error]); + }); +} + +#pragma mark - IID version compatibility + ++ (void)assertCompatibleIIDVersion { + // We use this flag to disable IID compatibility exception for unit tests. +#ifdef FIR_INSTALLATIONS_ALLOWS_INCOMPATIBLE_IID_VERSION + return; +#else + if (![self isIIDVersionCompatible]) { + [NSException + raise:kFirebaseInstallationsErrorDomain + format:@"Firebase Instance ID is not compatible with Firebase 8.x+. Please remove the " + @"dependency from the app. See the documentation at " + @"https://firebase.google.com/docs/cloud-messaging/ios/" + @"client#fetching-the-current-registration-token."]; + } +#endif +} + ++ (BOOL)isIIDVersionCompatible { + Class IIDClass = NSClassFromString(@"FIRInstanceID"); + if (IIDClass == nil) { + // It is OK if there is no IID at all. + return YES; + } + // We expect a compatible version having the method `+[FIRInstanceID usesFIS]` defined. + BOOL isCompatibleVersion = [IIDClass respondsToSelector:NSSelectorFromString(@"usesFIS")]; + return isCompatibleVersion; +} + +#pragma mark - Force Category Linking + +extern void FIRInclude_FIRInstallationsItem_RegisterInstallationAPI_Category(void); + +/// Does nothing when called, and not meant to be called. +/// +/// This method forces the linker to include categories even if +/// users do not include the '-ObjC' linker flag in their project. ++ (void)noop { + FIRInclude_FIRInstallationsItem_RegisterInstallationAPI_Category(); +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsAuthTokenResult.m b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsAuthTokenResult.m new file mode 100644 index 0000000..47a71e8 --- /dev/null +++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsAuthTokenResult.m @@ -0,0 +1,30 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseInstallations/Source/Library/FIRInstallationsAuthTokenResultInternal.h" + +@implementation FIRInstallationsAuthTokenResult + +- (instancetype)initWithToken:(NSString *)token expirationDate:(NSDate *)expirationDate { + self = [super init]; + if (self) { + _authToken = [token copy]; + _expirationDate = expirationDate; + } + return self; +} + +@end diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsAuthTokenResultInternal.h b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsAuthTokenResultInternal.h new file mode 100644 index 0000000..662802e --- /dev/null +++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsAuthTokenResultInternal.h @@ -0,0 +1,27 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseInstallations/Source/Library/Public/FirebaseInstallations/FIRInstallationsAuthTokenResult.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRInstallationsAuthTokenResult (Internal) + +- (instancetype)initWithToken:(NSString *)token expirationDate:(NSDate *)expirationTime; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsItem.h b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsItem.h new file mode 100644 index 0000000..8aa3a5e --- /dev/null +++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsItem.h @@ -0,0 +1,93 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsStatus.h" + +@class FIRInstallationsStoredItem; +@class FIRInstallationsStoredAuthToken; +@class FIRInstallationsStoredIIDCheckin; + +NS_ASSUME_NONNULL_BEGIN + +/** + * The class represents the required installation ID and auth token data including possible states. + * The data is stored to Keychain via `FIRInstallationsStoredItem` which has only the storage + * relevant data and does not contain any logic. `FIRInstallationsItem` must be used on the logic + * level (not `FIRInstallationsStoredItem`). + */ +@interface FIRInstallationsItem : NSObject + +/// A `FirebaseApp` identifier. +@property(nonatomic, readonly) NSString *appID; +/// A `FirebaseApp` name. +@property(nonatomic, readonly) NSString *firebaseAppName; +/// A stable identifier that uniquely identifies the app instance. +@property(nonatomic, copy, nullable) NSString *firebaseInstallationID; +/// The `refreshToken` is used to authorize the auth token requests. +@property(nonatomic, copy, nullable) NSString *refreshToken; + +@property(nonatomic, nullable) FIRInstallationsStoredAuthToken *authToken; +@property(nonatomic, assign) FIRInstallationsStatus registrationStatus; + +/// Instance ID default token imported from IID store as a part of IID migration. +@property(nonatomic, nullable) NSString *IIDDefaultToken; + +- (instancetype)initWithAppID:(NSString *)appID firebaseAppName:(NSString *)firebaseAppName; + +/** + * Populates `FIRInstallationsItem` properties with data from `FIRInstallationsStoredItem`. + * @param item An instance of `FIRInstallationsStoredItem` to get data from. + */ +- (void)updateWithStoredItem:(FIRInstallationsStoredItem *)item; + +/** + * Creates a stored item with data from the object. + * @return Returns a `FIRInstallationsStoredItem` instance with the data from the object. + */ +- (FIRInstallationsStoredItem *)storedItem; + +/** + * The installation identifier. + * @return Returns a string uniquely identifying the installation. + */ +- (NSString *)identifier; + +/** Validates if all the required item fields are populated and values don't explicitly conflict + * with each other. + * @param outError A reference to be populated with an error containing validation failure details. + * @return `YES` if the item it valid, `NO` otherwise. + */ +- (BOOL)isValid:(NSError *_Nullable *)outError; + +/** + * The installation identifier. + * @param appID A `FirebaseApp` identifier. + * @param appName A `FirebaseApp` name. + * @return Returns a string uniquely identifying the installation. + */ ++ (NSString *)identifierWithAppID:(NSString *)appID appName:(NSString *)appName; + +/** + * Generate a new Firebase Installation Identifier. + * @return Returns a 22 characters long globally unique string created based on UUID. + */ ++ (NSString *)generateFID; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsItem.m b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsItem.m new file mode 100644 index 0000000..0316e45 --- /dev/null +++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsItem.m @@ -0,0 +1,161 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseInstallations/Source/Library/FIRInstallationsItem.h" + +#import "FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStoredAuthToken.h" +#import "FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStoredItem.h" + +#import "FirebaseInstallations/Source/Library/Errors/FIRInstallationsErrorUtil.h" + +@implementation FIRInstallationsItem + +- (instancetype)initWithAppID:(NSString *)appID firebaseAppName:(NSString *)firebaseAppName { + self = [super init]; + if (self) { + _appID = [appID copy]; + _firebaseAppName = [firebaseAppName copy]; + } + return self; +} + +- (nonnull id)copyWithZone:(nullable NSZone *)zone { + FIRInstallationsItem *clone = [[FIRInstallationsItem alloc] initWithAppID:self.appID + firebaseAppName:self.firebaseAppName]; + clone.firebaseInstallationID = [self.firebaseInstallationID copy]; + clone.refreshToken = [self.refreshToken copy]; + clone.authToken = [self.authToken copy]; + clone.registrationStatus = self.registrationStatus; + clone.IIDDefaultToken = [self.IIDDefaultToken copy]; + + return clone; +} + +- (void)updateWithStoredItem:(FIRInstallationsStoredItem *)item { + self.firebaseInstallationID = item.firebaseInstallationID; + self.refreshToken = item.refreshToken; + self.authToken = item.authToken; + self.registrationStatus = item.registrationStatus; + self.IIDDefaultToken = item.IIDDefaultToken; +} + +- (FIRInstallationsStoredItem *)storedItem { + FIRInstallationsStoredItem *storedItem = [[FIRInstallationsStoredItem alloc] init]; + storedItem.firebaseInstallationID = self.firebaseInstallationID; + storedItem.refreshToken = self.refreshToken; + storedItem.authToken = self.authToken; + storedItem.registrationStatus = self.registrationStatus; + storedItem.IIDDefaultToken = self.IIDDefaultToken; + return storedItem; +} + +- (nonnull NSString *)identifier { + return [[self class] identifierWithAppID:self.appID appName:self.firebaseAppName]; +} + +- (BOOL)isValid:(NSError *_Nullable *)outError { + NSMutableArray *validationIssues = [NSMutableArray array]; + + if (self.appID.length == 0) { + [validationIssues addObject:@"`appID` must not be empty"]; + } + + if (self.firebaseAppName.length == 0) { + [validationIssues addObject:@"`firebaseAppName` must not be empty"]; + } + + if (self.firebaseInstallationID.length == 0) { + [validationIssues addObject:@"`firebaseInstallationID` must not be empty"]; + } + + switch (self.registrationStatus) { + case FIRInstallationStatusUnknown: + [validationIssues addObject:@"invalid `registrationStatus`"]; + break; + + case FIRInstallationStatusRegistered: + if (self.refreshToken == 0) { + [validationIssues addObject:@"registered installation must have non-empty `refreshToken`"]; + } + + if (self.authToken.token == 0) { + [validationIssues + addObject:@"registered installation must have non-empty `authToken.token`"]; + } + + if (self.authToken.expirationDate == nil) { + [validationIssues + addObject:@"registered installation must have non-empty `authToken.expirationDate`"]; + } + + case FIRInstallationStatusUnregistered: + break; + } + + BOOL isValid = validationIssues.count == 0; + + if (!isValid && outError) { + NSString *failureReason = + [NSString stringWithFormat:@"FIRInstallationsItem validation errors: %@", + [validationIssues componentsJoinedByString:@", "]]; + *outError = + [FIRInstallationsErrorUtil installationsErrorWithCode:FIRInstallationsErrorCodeUnknown + failureReason:failureReason + underlyingError:nil]; + } + + return isValid; +} + ++ (NSString *)identifierWithAppID:(NSString *)appID appName:(NSString *)appName { + return [appID stringByAppendingString:appName]; +} + ++ (NSString *)generateFID { + NSUUID *UUID = [NSUUID UUID]; + uuid_t UUIDBytes; + [UUID getUUIDBytes:UUIDBytes]; + + NSUInteger UUIDLength = sizeof(uuid_t); + NSData *UUIDData = [NSData dataWithBytes:UUIDBytes length:UUIDLength]; + + uint8_t UUIDLast4Bits = UUIDBytes[UUIDLength - 1] & 0b00001111; + + // FID first 4 bits must be `0111`. The last 4 UUID bits will be cut later to form a proper FID. + // To keep 16 random bytes we copy these last 4 UUID to the FID 1st byte after `0111` prefix. + uint8_t FIDPrefix = 0b01110000 | UUIDLast4Bits; + NSMutableData *FIDData = [NSMutableData dataWithBytes:&FIDPrefix length:1]; + + [FIDData appendData:UUIDData]; + NSString *FIDString = [self base64URLEncodedStringWithData:FIDData]; + + // A valid FID has exactly 22 base64 characters, which is 132 bits, or 16.5 bytes. + // Our generated ID has 16 bytes UUID + 1 byte prefix which after encoding with base64 will become + // 23 characters plus 1 character for "=" padding. + + // Remove the 23rd character that was added because of the extra 4 bits at the + // end of our 17 byte data and the '=' padding. + return [FIDString substringWithRange:NSMakeRange(0, 22)]; +} + ++ (NSString *)base64URLEncodedStringWithData:(NSData *)data { + NSString *string = [data base64EncodedStringWithOptions:0]; + string = [string stringByReplacingOccurrencesOfString:@"/" withString:@"_"]; + string = [string stringByReplacingOccurrencesOfString:@"+" withString:@"-"]; + return string; +} + +@end diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsLogger.h b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsLogger.h new file mode 100644 index 0000000..7ad9967 --- /dev/null +++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsLogger.h @@ -0,0 +1,52 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FirebaseCore/Extension/FirebaseCoreInternal.h" + +extern FIRLoggerService kFIRLoggerInstallations; + +// FIRInstallationsAPIService.m +extern NSString *const kFIRInstallationsMessageCodeSendAPIRequest; +extern NSString *const kFIRInstallationsMessageCodeAPIRequestNetworkError; +extern NSString *const kFIRInstallationsMessageCodeAPIRequestResponse; +extern NSString *const kFIRInstallationsMessageCodeUnexpectedAPIRequestResponse; +extern NSString *const kFIRInstallationsMessageCodeParsingAPIResponse; +extern NSString *const kFIRInstallationsMessageCodeAPIResponseParsingInstallationFailed; +extern NSString *const kFIRInstallationsMessageCodeAPIResponseParsingInstallationSucceed; +extern NSString *const kFIRInstallationsMessageCodeAPIResponseParsingAuthTokenFailed; +extern NSString *const kFIRInstallationsMessageCodeAPIResponseParsingAuthTokenSucceed; + +// FIRInstallationsIDController.m +extern NSString *const kFIRInstallationsMessageCodeNewGetInstallationOperationCreated; +extern NSString *const kFIRInstallationsMessageCodeNewGetAuthTokenOperationCreated; +extern NSString *const kFIRInstallationsMessageCodeNewDeleteInstallationOperationCreated; +extern NSString *const kFIRInstallationsMessageCodeInvalidFirebaseConfiguration; +extern NSString *const kFIRInstallationsMessageCodeCorruptedStoredInstallation; + +// FIRInstallationsStoredItem.m +extern NSString *const kFIRInstallationsMessageCodeInstallationCoderVersionMismatch; + +// FIRInstallationsStoredAuthToken.m +extern NSString *const kFIRInstallationsMessageCodeAuthTokenCoderVersionMismatch; + +// FIRInstallationsStoredIIDCheckin.m +extern NSString *const kFIRInstallationsMessageCodeIIDCheckinCoderVersionMismatch; +extern NSString *const kFIRInstallationsMessageCodeIIDCheckinFailedToDecode; + +// FIRInstallations.m +extern NSString *const kFIRInstallationsMessageCodeInvalidFirebaseAppOptions; diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsLogger.m b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsLogger.m new file mode 100644 index 0000000..5187f97 --- /dev/null +++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsLogger.m @@ -0,0 +1,50 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseInstallations/Source/Library/FIRInstallationsLogger.h" + +FIRLoggerService kFIRLoggerInstallations = @"[FirebaseInstallations]"; + +// FIRInstallationsAPIService.m +NSString *const kFIRInstallationsMessageCodeSendAPIRequest = @"I-FIS001001"; +NSString *const kFIRInstallationsMessageCodeAPIRequestNetworkError = @"I-FIS001002"; +NSString *const kFIRInstallationsMessageCodeAPIRequestResponse = @"I-FIS001003"; +NSString *const kFIRInstallationsMessageCodeUnexpectedAPIRequestResponse = @"I-FIS001004"; +NSString *const kFIRInstallationsMessageCodeParsingAPIResponse = @"I-FIS001005"; +NSString *const kFIRInstallationsMessageCodeAPIResponseParsingInstallationFailed = @"I-FIS001006"; +NSString *const kFIRInstallationsMessageCodeAPIResponseParsingInstallationSucceed = @"I-FIS001007"; +NSString *const kFIRInstallationsMessageCodeAPIResponseParsingAuthTokenFailed = @"I-FIS001008"; +NSString *const kFIRInstallationsMessageCodeAPIResponseParsingAuthTokenSucceed = @"I-FIS001009"; + +// FIRInstallationsIDController.m +NSString *const kFIRInstallationsMessageCodeNewGetInstallationOperationCreated = @"I-FIS002000"; +NSString *const kFIRInstallationsMessageCodeNewGetAuthTokenOperationCreated = @"I-FIS002001"; +NSString *const kFIRInstallationsMessageCodeNewDeleteInstallationOperationCreated = @"I-FIS002002"; +NSString *const kFIRInstallationsMessageCodeInvalidFirebaseConfiguration = @"I-FIS002003"; +NSString *const kFIRInstallationsMessageCodeCorruptedStoredInstallation = @"I-FIS002004"; + +// FIRInstallationsStoredItem.m +NSString *const kFIRInstallationsMessageCodeInstallationCoderVersionMismatch = @"I-FIS003000"; + +// FIRInstallationsStoredAuthToken.m +NSString *const kFIRInstallationsMessageCodeAuthTokenCoderVersionMismatch = @"I-FIS004000"; + +// FIRInstallationsStoredIIDCheckin.m +NSString *const kFIRInstallationsMessageCodeIIDCheckinCoderVersionMismatch = @"I-FIS007000"; +NSString *const kFIRInstallationsMessageCodeIIDCheckinFailedToDecode = @"I-FIS007001"; + +// FIRInstallations.m +NSString *const kFIRInstallationsMessageCodeInvalidFirebaseAppOptions = @"I-FIS008000"; diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDStore.h b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDStore.h new file mode 100644 index 0000000..e2408ca --- /dev/null +++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDStore.h @@ -0,0 +1,48 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FBLPromise; + +NS_ASSUME_NONNULL_BEGIN + +/** The class encapsulates a port of a piece FirebaseInstanceID logic required to migrate IID. */ +@interface FIRInstallationsIIDStore : NSObject + +/** + * Retrieves existing IID if present. + * @return Returns a promise that is resolved with IID string if IID has been found or rejected with + * an error otherwise. + */ +- (FBLPromise *)existingIID; + +/** + * Deletes existing IID if present. + * @return Returns a promise that is resolved with `[NSNull null]` if the IID was successfully. + * deleted or was not found. The promise is rejected otherwise. + */ +- (FBLPromise *)deleteExistingIID; + +#if TARGET_OS_OSX +/// If not `nil`, then only this keychain will be used to save and read data (see +/// `kSecMatchSearchList` and `kSecUseKeychain`. It is mostly intended to be used by unit tests. +@property(nonatomic, nullable) SecKeychainRef keychainRef; +#endif // TARGET_OSX + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDStore.m b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDStore.m new file mode 100644 index 0000000..1c2f5d3 --- /dev/null +++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDStore.m @@ -0,0 +1,242 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDStore.h" + +#if __has_include() +#import +#else +#import "FBLPromises.h" +#endif + +#import +#import "FirebaseInstallations/Source/Library/Errors/FIRInstallationsErrorUtil.h" + +static NSString *const kFIRInstallationsIIDKeyPairPublicTagPrefix = + @"com.google.iid.keypair.public-"; +static NSString *const kFIRInstallationsIIDKeyPairPrivateTagPrefix = + @"com.google.iid.keypair.private-"; +static NSString *const kFIRInstallationsIIDCreationTimePlistKey = @"|S|cre"; + +@implementation FIRInstallationsIIDStore + +- (FBLPromise *)existingIID { + return [FBLPromise onQueue:dispatch_get_global_queue(QOS_CLASS_UTILITY, 0) + do:^id _Nullable { + if (![self hasPlistIIDFlag]) { + return nil; + } + + NSData *IIDPublicKeyData = [self IIDPublicKeyData]; + return [self IIDWithPublicKeyData:IIDPublicKeyData]; + }] + .validate(^BOOL(NSString *_Nullable IID) { + return IID.length > 0; + }); +} + +- (FBLPromise *)deleteExistingIID { + return [FBLPromise onQueue:dispatch_get_global_queue(QOS_CLASS_UTILITY, 0) + do:^id _Nullable { + NSError *error; + if (![self deleteIIDFlagFromPlist:&error]) { + return error; + } + + if (![self deleteIID:&error]) { + return error; + } + + return [NSNull null]; + }]; +} + +#pragma mark - IID decoding + +- (NSString *)IIDWithPublicKeyData:(NSData *)publicKeyData { + NSData *publicKeySHA1 = [self sha1WithData:publicKeyData]; + + const uint8_t *bytes = publicKeySHA1.bytes; + NSMutableData *identityData = [NSMutableData dataWithData:publicKeySHA1]; + + uint8_t b0 = bytes[0]; + // Take the first byte and make the initial four 7 by initially making the initial 4 bits 0 + // and then adding 0x70 to it. + b0 = 0x70 + (0xF & b0); + // failsafe should give you back b0 itself + b0 = (b0 & 0xFF); + [identityData replaceBytesInRange:NSMakeRange(0, 1) withBytes:&b0]; + NSData *data = [identityData subdataWithRange:NSMakeRange(0, 8 * sizeof(Byte))]; + return [self base64URLEncodedStringWithData:data]; +} + +/** FirebaseInstallations SDK uses the SHA1 hash for backwards compatibility with the legacy + * FirebaseInstanceID SDK. The SHA1 hash is used to access Instance IDs stored on the device and not + * for any security-relevant process. This is a one-time step that allows migration of old client + * identifiers. Cryptographic security is not needed here, so potential hash collisions are not a + * problem. + */ +- (NSData *)sha1WithData:(NSData *)data { + unsigned char output[CC_SHA1_DIGEST_LENGTH]; + unsigned int length = (unsigned int)[data length]; + + CC_SHA1(data.bytes, length, output); + return [NSData dataWithBytes:output length:CC_SHA1_DIGEST_LENGTH]; +} + +- (NSString *)base64URLEncodedStringWithData:(NSData *)data { + NSString *string = [data base64EncodedStringWithOptions:0]; + string = [string stringByReplacingOccurrencesOfString:@"/" withString:@"_"]; + string = [string stringByReplacingOccurrencesOfString:@"+" withString:@"-"]; + string = [string stringByReplacingOccurrencesOfString:@"=" withString:@""]; + return string; +} + +#pragma mark - Keychain + +- (NSData *)IIDPublicKeyData { + NSString *tag = [self keychainKeyTagWithPrefix:kFIRInstallationsIIDKeyPairPublicTagPrefix]; + NSDictionary *query = [self keyPairQueryWithTag:tag returnData:YES]; + + CFTypeRef keyRef = NULL; + OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)query, (CFTypeRef *)&keyRef); + + if (status != noErr) { + if (keyRef) { + CFRelease(keyRef); + } + return nil; + } + + return (__bridge NSData *)keyRef; +} + +- (BOOL)deleteIID:(NSError **)outError { + if (![self deleteKeychainKeyWithTagPrefix:kFIRInstallationsIIDKeyPairPublicTagPrefix + error:outError]) { + return NO; + } + + if (![self deleteKeychainKeyWithTagPrefix:kFIRInstallationsIIDKeyPairPrivateTagPrefix + error:outError]) { + return NO; + } + + return YES; +} + +- (BOOL)deleteKeychainKeyWithTagPrefix:(NSString *)tagPrefix error:(NSError **)outError { + NSString *keyTag = [self keychainKeyTagWithPrefix:kFIRInstallationsIIDKeyPairPublicTagPrefix]; + NSDictionary *keyQuery = [self keyPairQueryWithTag:keyTag returnData:NO]; + + OSStatus status = SecItemDelete((__bridge CFDictionaryRef)keyQuery); + + // When item is not found, it should NOT be considered as an error. The operation should + // continue. + if (status != noErr && status != errSecItemNotFound) { + FIRInstallationsItemSetErrorToPointer( + [FIRInstallationsErrorUtil keychainErrorWithFunction:@"SecItemDelete" status:status], + outError); + return NO; + } + + return YES; +} + +- (NSDictionary *)keyPairQueryWithTag:(NSString *)tag returnData:(BOOL)shouldReturnData { + NSMutableDictionary *query = [NSMutableDictionary dictionary]; + NSData *tagData = [tag dataUsingEncoding:NSUTF8StringEncoding]; + + query[(__bridge id)kSecClass] = (__bridge id)kSecClassKey; + query[(__bridge id)kSecAttrApplicationTag] = tagData; + query[(__bridge id)kSecAttrKeyType] = (__bridge id)kSecAttrKeyTypeRSA; + if (shouldReturnData) { + query[(__bridge id)kSecReturnData] = @(YES); + } + +#if TARGET_OS_OSX + if (self.keychainRef) { + query[(__bridge NSString *)kSecMatchSearchList] = @[ (__bridge id)(self.keychainRef) ]; + } +#endif // TARGET_OSX + + return query; +} + +- (NSString *)keychainKeyTagWithPrefix:(NSString *)prefix { + NSString *mainAppBundleID = [[NSBundle mainBundle] bundleIdentifier]; + if (mainAppBundleID.length == 0) { + return nil; + } + return [NSString stringWithFormat:@"%@%@", prefix, mainAppBundleID]; +} + +- (NSString *)mainbundleIdentifier { + NSString *bundleIdentifier = [[NSBundle mainBundle] bundleIdentifier]; + if (!bundleIdentifier.length) { + return nil; + } + return bundleIdentifier; +} + +#pragma mark - Plist + +- (BOOL)deleteIIDFlagFromPlist:(NSError **)outError { + NSString *path = [self plistPath]; + if (![[NSFileManager defaultManager] fileExistsAtPath:path]) { + return YES; + } + + NSMutableDictionary *plistContent = [[NSMutableDictionary alloc] initWithContentsOfFile:path]; + plistContent[kFIRInstallationsIIDCreationTimePlistKey] = nil; + + if (@available(macOS 10.13, iOS 11.0, tvOS 11.0, *)) { + return [plistContent writeToURL:[NSURL fileURLWithPath:path] error:outError]; + } + + return [plistContent writeToFile:path atomically:YES]; +} + +- (BOOL)hasPlistIIDFlag { + NSString *path = [self plistPath]; + if (![[NSFileManager defaultManager] fileExistsAtPath:path]) { + return NO; + } + + NSDictionary *plistContent = [[NSDictionary alloc] initWithContentsOfFile:path]; + return plistContent[kFIRInstallationsIIDCreationTimePlistKey] != nil; +} + +- (NSString *)plistPath { + NSString *plistNameWithExtension = @"com.google.iid-keypair.plist"; + NSString *_subDirectoryName = @"Google/FirebaseInstanceID"; + + NSArray *directoryPaths = + NSSearchPathForDirectoriesInDomains([self supportedDirectory], NSUserDomainMask, YES); + NSArray *components = @[ directoryPaths.lastObject, _subDirectoryName, plistNameWithExtension ]; + + return [NSString pathWithComponents:components]; +} + +- (NSSearchPathDirectory)supportedDirectory { +#if TARGET_OS_TV + return NSCachesDirectory; +#else + return NSApplicationSupportDirectory; +#endif +} + +@end diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDTokenStore.h b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDTokenStore.h new file mode 100644 index 0000000..ed98e3d --- /dev/null +++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDTokenStore.h @@ -0,0 +1,36 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FBLPromise; + +NS_ASSUME_NONNULL_BEGIN + +/** + * The class reads a default IID token from IID store if available. + */ +@interface FIRInstallationsIIDTokenStore : NSObject + +- (instancetype)init NS_UNAVAILABLE; + +- (instancetype)initWithGCMSenderID:(NSString *)GCMSenderID; + +- (FBLPromise *)existingIIDDefaultToken; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDTokenStore.m b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDTokenStore.m new file mode 100644 index 0000000..5ef3331 --- /dev/null +++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDTokenStore.m @@ -0,0 +1,158 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDTokenStore.h" + +#if __has_include() +#import +#else +#import "FBLPromises.h" +#endif + +#import + +#import "FirebaseInstallations/Source/Library/Errors/FIRInstallationsErrorUtil.h" + +static NSString *const kFIRInstallationsIIDTokenKeychainId = @"com.google.iid-tokens"; + +@interface FIRInstallationsIIDTokenInfo : NSObject +@property(nonatomic, nullable, copy) NSString *token; +@end + +@implementation FIRInstallationsIIDTokenInfo + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (void)encodeWithCoder:(nonnull NSCoder *)coder { +} + +- (nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { + self = [super init]; + if (self) { + _token = [coder decodeObjectOfClass:[NSString class] forKey:@"token"]; + } + return self; +} + +@end + +@interface FIRInstallationsIIDTokenStore () +@property(nonatomic, readonly) NSString *GCMSenderID; +@end + +@implementation FIRInstallationsIIDTokenStore + +- (instancetype)initWithGCMSenderID:(NSString *)GCMSenderID { + self = [super init]; + if (self) { + _GCMSenderID = GCMSenderID; + } + return self; +} + +- (FBLPromise *)existingIIDDefaultToken { + return [[FBLPromise onQueue:dispatch_get_global_queue(QOS_CLASS_UTILITY, 0) + do:^id _Nullable { + return [self IIDDefaultTokenData]; + }] onQueue:dispatch_get_global_queue(QOS_CLASS_UTILITY, 0) + then:^id _Nullable(NSData *_Nullable keychainData) { + return [self IIDCheckinWithData:keychainData]; + }]; +} + +- (FBLPromise *)IIDCheckinWithData:(NSData *)data { + FBLPromise *resultPromise = [FBLPromise pendingPromise]; + + NSError *archiverError; + NSKeyedUnarchiver *unarchiver; + if (@available(iOS 11.0, tvOS 11.0, macOS 10.13, *)) { + unarchiver = [[NSKeyedUnarchiver alloc] initForReadingFromData:data error:&archiverError]; + } else { + @try { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; +#pragma clang diagnostic pop + } @catch (NSException *exception) { + archiverError = [FIRInstallationsErrorUtil keyedArchiverErrorWithException:exception]; + } + } + + if (!unarchiver) { + NSError *error = archiverError ?: [FIRInstallationsErrorUtil corruptedIIDTokenData]; + [resultPromise reject:error]; + return resultPromise; + } + + [unarchiver setClass:[FIRInstallationsIIDTokenInfo class] forClassName:@"FIRInstanceIDTokenInfo"]; + FIRInstallationsIIDTokenInfo *IIDTokenInfo = + [unarchiver decodeObjectOfClass:[FIRInstallationsIIDTokenInfo class] + forKey:NSKeyedArchiveRootObjectKey]; + + if (IIDTokenInfo.token.length < 1) { + [resultPromise reject:[FIRInstallationsErrorUtil corruptedIIDTokenData]]; + return resultPromise; + } + + [resultPromise fulfill:IIDTokenInfo.token]; + + return resultPromise; +} + +- (FBLPromise *)IIDDefaultTokenData { + FBLPromise *resultPromise = [FBLPromise pendingPromise]; + + NSMutableDictionary *keychainQuery = [self IIDDefaultTokenDataKeychainQuery]; + NSError *error; + NSData *data = [GULKeychainUtils getItemWithQuery:keychainQuery error:&error]; + + if (data) { + [resultPromise fulfill:data]; + return resultPromise; + } else { + NSError *outError = error ?: [FIRInstallationsErrorUtil corruptedIIDTokenData]; + [resultPromise reject:outError]; + return resultPromise; + } +} + +- (NSMutableDictionary *)IIDDefaultTokenDataKeychainQuery { + NSDictionary *query = @{(__bridge id)kSecClass : (__bridge id)kSecClassGenericPassword}; + + NSMutableDictionary *finalQuery = [NSMutableDictionary dictionaryWithDictionary:query]; + finalQuery[(__bridge NSString *)kSecAttrGeneric] = kFIRInstallationsIIDTokenKeychainId; + + NSString *account = [self IIDAppIdentifier]; + if ([account length]) { + finalQuery[(__bridge NSString *)kSecAttrAccount] = account; + } + + finalQuery[(__bridge NSString *)kSecAttrService] = + [self serviceKeyForAuthorizedEntity:self.GCMSenderID scope:@"*"]; + return finalQuery; +} + +- (NSString *)IIDAppIdentifier { + return [[NSBundle mainBundle] bundleIdentifier] ?: @""; +} + +- (NSString *)serviceKeyForAuthorizedEntity:(NSString *)authorizedEntity scope:(NSString *)scope { + return [NSString stringWithFormat:@"%@:%@", authorizedEntity, scope]; +} + +@end diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsAPI/FIRInstallationsAPIService.h b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsAPI/FIRInstallationsAPIService.h new file mode 100644 index 0000000..1601bdc --- /dev/null +++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsAPI/FIRInstallationsAPIService.h @@ -0,0 +1,65 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FBLPromise; +@class FIRInstallationsItem; + +@protocol FIRHeartbeatLoggerProtocol; + +NS_ASSUME_NONNULL_BEGIN + +FOUNDATION_EXPORT NSString *const kFIRInstallationsHeartbeatKey; + +/** + * The class is responsible for interacting with HTTP REST API for Installations. + */ +@interface FIRInstallationsAPIService : NSObject + +/** + * The default initializer. + * @param APIKey The Firebase project API key (see `FIROptions.APIKey`). + * @param projectID The Firebase project ID (see `FIROptions.projectID`). + * @param heartbeatLogger The heartbeat logger used to populate heartbeat data in request headers. + */ +- (instancetype)initWithAPIKey:(NSString *)APIKey + projectID:(NSString *)projectID + heartbeatLogger:(id)heartbeatLogger; + +/** + * Sends a request to register a new FID to get auth and refresh tokens. + * @param installation The `FIRInstallationsItem` instance with the FID to register. + * @return A promise that is resolved with a new `FIRInstallationsItem` instance with valid tokens. + * It is rejected with an error in case of a failure. + */ +- (FBLPromise *)registerInstallation:(FIRInstallationsItem *)installation; + +- (FBLPromise *)refreshAuthTokenForInstallation: + (FIRInstallationsItem *)installation; + +/** + * Sends a request to delete the installation, related auth tokens and all related data from the + * server. + * @param installation The installation to delete. + * @return Returns a promise that is resolved with the passed installation on successful deletion or + * is rejected with an error otherwise. + */ +- (FBLPromise *)deleteInstallation:(FIRInstallationsItem *)installation; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsAPI/FIRInstallationsAPIService.m b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsAPI/FIRInstallationsAPIService.m new file mode 100644 index 0000000..99dd215 --- /dev/null +++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsAPI/FIRInstallationsAPIService.m @@ -0,0 +1,382 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseInstallations/Source/Library/InstallationsAPI/FIRInstallationsAPIService.h" + +#if __has_include() +#import +#else +#import "FBLPromises.h" +#endif + +#import "FirebaseCore/Extension/FirebaseCoreInternal.h" +#import "FirebaseInstallations/Source/Library/Errors/FIRInstallationsErrorUtil.h" +#import "FirebaseInstallations/Source/Library/Errors/FIRInstallationsHTTPError.h" +#import "FirebaseInstallations/Source/Library/FIRInstallationsLogger.h" +#import "FirebaseInstallations/Source/Library/InstallationsAPI/FIRInstallationsItem+RegisterInstallationAPI.h" + +NSString *const kFIRInstallationsAPIBaseURL = @"https://firebaseinstallations.googleapis.com"; +NSString *const kFIRInstallationsAPIKey = @"X-Goog-Api-Key"; +NSString *const kFIRInstallationsBundleId = @"X-Ios-Bundle-Identifier"; +NSString *const kFIRInstallationsIIDMigrationAuthHeader = @"x-goog-fis-ios-iid-migration-auth"; +NSString *const kFIRInstallationsHeartbeatKey = @"X-firebase-client"; + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRInstallationsURLSessionResponse : NSObject +@property(nonatomic) NSHTTPURLResponse *HTTPResponse; +@property(nonatomic) NSData *data; + +- (instancetype)initWithResponse:(NSHTTPURLResponse *)response data:(nullable NSData *)data; +@end + +@implementation FIRInstallationsURLSessionResponse + +- (instancetype)initWithResponse:(NSHTTPURLResponse *)response data:(nullable NSData *)data { + self = [super init]; + if (self) { + _HTTPResponse = response; + _data = data ?: [NSData data]; + } + return self; +} + +@end + +@interface FIRInstallationsAPIService () +@property(nonatomic, readonly) NSURLSession *URLSession; +@property(nonatomic, readonly) NSString *APIKey; +@property(nonatomic, readonly) NSString *projectID; +@property(readonly) id heartbeatLogger; +@end + +NS_ASSUME_NONNULL_END + +@implementation FIRInstallationsAPIService + +- (instancetype)initWithAPIKey:(NSString *)APIKey + projectID:(NSString *)projectID + heartbeatLogger:(id)heartbeatLogger { + NSURLSession *URLSession = [NSURLSession + sessionWithConfiguration:[NSURLSessionConfiguration ephemeralSessionConfiguration]]; + return [self initWithURLSession:URLSession + APIKey:APIKey + projectID:projectID + heartbeatLogger:heartbeatLogger]; +} + +/// The initializer for tests. +- (instancetype)initWithURLSession:(NSURLSession *)URLSession + APIKey:(NSString *)APIKey + projectID:(NSString *)projectID + heartbeatLogger:(id)heartbeatLogger { + self = [super init]; + if (self) { + _URLSession = URLSession; + _APIKey = [APIKey copy]; + _projectID = [projectID copy]; + _heartbeatLogger = heartbeatLogger; + } + return self; +} + +#pragma mark - Public + +- (FBLPromise *)registerInstallation:(FIRInstallationsItem *)installation { + return [self validateInstallation:installation] + .then(^id _Nullable(FIRInstallationsItem *_Nullable validInstallation) { + return [self registerRequestWithInstallation:validInstallation]; + }) + .then(^id _Nullable(NSURLRequest *_Nullable request) { + return [self sendURLRequest:request]; + }) + .then(^id _Nullable(FIRInstallationsURLSessionResponse *response) { + return [self registeredInstallationWithInstallation:installation serverResponse:response]; + }); +} + +- (FBLPromise *)refreshAuthTokenForInstallation: + (FIRInstallationsItem *)installation { + return [self authTokenRequestWithInstallation:installation] + .then(^id _Nullable(NSURLRequest *_Nullable request) { + return [self sendURLRequest:request]; + }) + .then(^FBLPromise *( + FIRInstallationsURLSessionResponse *response) { + return [self authTokenWithServerResponse:response]; + }) + .then(^FIRInstallationsItem *(FIRInstallationsStoredAuthToken *authToken) { + FIRInstallationsItem *updatedInstallation = [installation copy]; + updatedInstallation.authToken = authToken; + return updatedInstallation; + }); +} + +- (FBLPromise *)deleteInstallation:(FIRInstallationsItem *)installation { + return [self deleteInstallationRequestWithInstallation:installation] + .then(^id _Nullable(NSURLRequest *_Nullable request) { + return [self sendURLRequest:request]; + }) + .then(^id _Nullable(FIRInstallationsURLSessionResponse *_Nullable value) { + // Return the original installation on success. + return installation; + }); +} + +#pragma mark - Register Installation + +- (FBLPromise *)registerRequestWithInstallation: + (FIRInstallationsItem *)installation { + NSString *URLString = [NSString stringWithFormat:@"%@/v1/projects/%@/installations/", + kFIRInstallationsAPIBaseURL, self.projectID]; + NSURL *URL = [NSURL URLWithString:URLString]; + + NSDictionary *bodyDict = @{ + // `firebaseInstallationID` is validated before but let's make sure it is not `nil` one more + // time to prevent a crash. + @"fid" : installation.firebaseInstallationID ?: @"", + @"authVersion" : @"FIS_v2", + @"appId" : installation.appID, + @"sdkVersion" : [self SDKVersion] + }; + + NSDictionary *headers; + if (installation.IIDDefaultToken) { + headers = @{kFIRInstallationsIIDMigrationAuthHeader : installation.IIDDefaultToken}; + } + + return [self requestWithURL:URL + HTTPMethod:@"POST" + bodyDict:bodyDict + refreshToken:nil + additionalHeaders:headers]; +} + +- (FBLPromise *) + registeredInstallationWithInstallation:(FIRInstallationsItem *)installation + serverResponse:(FIRInstallationsURLSessionResponse *)response { + return [FBLPromise do:^id { + FIRLogDebug(kFIRLoggerInstallations, kFIRInstallationsMessageCodeParsingAPIResponse, + @"Parsing server response for %@.", response.HTTPResponse.URL); + NSError *error; + FIRInstallationsItem *registeredInstallation = + [installation registeredInstallationWithJSONData:response.data + date:[NSDate date] + error:&error]; + if (registeredInstallation == nil) { + FIRLogDebug(kFIRLoggerInstallations, + kFIRInstallationsMessageCodeAPIResponseParsingInstallationFailed, + @"Failed to parse FIRInstallationsItem: %@.", error); + return error; + } + + FIRLogDebug(kFIRLoggerInstallations, + kFIRInstallationsMessageCodeAPIResponseParsingInstallationSucceed, + @"FIRInstallationsItem parsed successfully."); + return registeredInstallation; + }]; +} + +#pragma mark - Auth token + +- (FBLPromise *)authTokenRequestWithInstallation: + (FIRInstallationsItem *)installation { + NSString *URLString = + [NSString stringWithFormat:@"%@/v1/projects/%@/installations/%@/authTokens:generate", + kFIRInstallationsAPIBaseURL, self.projectID, + installation.firebaseInstallationID]; + NSURL *URL = [NSURL URLWithString:URLString]; + + NSDictionary *bodyDict = @{@"installation" : @{@"sdkVersion" : [self SDKVersion]}}; + return [self requestWithURL:URL + HTTPMethod:@"POST" + bodyDict:bodyDict + refreshToken:installation.refreshToken]; +} + +- (FBLPromise *)authTokenWithServerResponse: + (FIRInstallationsURLSessionResponse *)response { + return [FBLPromise do:^id { + FIRLogDebug(kFIRLoggerInstallations, kFIRInstallationsMessageCodeParsingAPIResponse, + @"Parsing server response for %@.", response.HTTPResponse.URL); + NSError *error; + FIRInstallationsStoredAuthToken *token = + [FIRInstallationsItem authTokenWithGenerateTokenAPIJSONData:response.data + date:[NSDate date] + error:&error]; + if (token == nil) { + FIRLogDebug(kFIRLoggerInstallations, + kFIRInstallationsMessageCodeAPIResponseParsingAuthTokenFailed, + @"Failed to parse FIRInstallationsStoredAuthToken: %@.", error); + return error; + } + + FIRLogDebug(kFIRLoggerInstallations, + kFIRInstallationsMessageCodeAPIResponseParsingAuthTokenSucceed, + @"FIRInstallationsStoredAuthToken parsed successfully."); + return token; + }]; +} + +#pragma mark - Delete Installation + +- (FBLPromise *)deleteInstallationRequestWithInstallation: + (FIRInstallationsItem *)installation { + NSString *URLString = [NSString stringWithFormat:@"%@/v1/projects/%@/installations/%@/", + kFIRInstallationsAPIBaseURL, self.projectID, + installation.firebaseInstallationID]; + NSURL *URL = [NSURL URLWithString:URLString]; + + return [self requestWithURL:URL + HTTPMethod:@"DELETE" + bodyDict:@{} + refreshToken:installation.refreshToken]; +} + +#pragma mark - URL Request +- (FBLPromise *)requestWithURL:(NSURL *)requestURL + HTTPMethod:(NSString *)HTTPMethod + bodyDict:(NSDictionary *)bodyDict + refreshToken:(nullable NSString *)refreshToken { + return [self requestWithURL:requestURL + HTTPMethod:HTTPMethod + bodyDict:bodyDict + refreshToken:refreshToken + additionalHeaders:nil]; +} + +- (FBLPromise *)requestWithURL:(NSURL *)requestURL + HTTPMethod:(NSString *)HTTPMethod + bodyDict:(NSDictionary *)bodyDict + refreshToken:(nullable NSString *)refreshToken + additionalHeaders:(nullable NSDictionary *) + additionalHeaders { + return [FBLPromise + onQueue:dispatch_get_global_queue(QOS_CLASS_UTILITY, 0) + do:^id _Nullable { + __block NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:requestURL]; + request.HTTPMethod = HTTPMethod; + NSString *bundleIdentifier = [[NSBundle mainBundle] bundleIdentifier]; + [request addValue:self.APIKey forHTTPHeaderField:kFIRInstallationsAPIKey]; + [request addValue:bundleIdentifier forHTTPHeaderField:kFIRInstallationsBundleId]; + [self setJSONHTTPBody:bodyDict forRequest:request]; + if (refreshToken) { + NSString *authHeader = [NSString stringWithFormat:@"FIS_v2 %@", refreshToken]; + [request setValue:authHeader forHTTPHeaderField:@"Authorization"]; + } + // Heartbeat Header. + [request setValue:[self.heartbeatLogger headerValue] + forHTTPHeaderField:kFIRInstallationsHeartbeatKey]; + + [additionalHeaders + enumerateKeysAndObjectsUsingBlock:^(NSString *_Nonnull key, NSString *_Nonnull obj, + BOOL *_Nonnull stop) { + [request setValue:obj forHTTPHeaderField:key]; + }]; + + return [request copy]; + }]; +} + +- (FBLPromise *)URLRequestPromise:(NSURLRequest *)request { + return [[FBLPromise async:^(FBLPromiseFulfillBlock fulfill, FBLPromiseRejectBlock reject) { + FIRLogDebug(kFIRLoggerInstallations, kFIRInstallationsMessageCodeSendAPIRequest, + @"Sending request: %@, body:%@, headers: %@.", request, + [[NSString alloc] initWithData:request.HTTPBody encoding:NSUTF8StringEncoding], + request.allHTTPHeaderFields); + [[self.URLSession + dataTaskWithRequest:request + completionHandler:^(NSData *_Nullable data, NSURLResponse *_Nullable response, + NSError *_Nullable error) { + if (error) { + FIRLogDebug(kFIRLoggerInstallations, + kFIRInstallationsMessageCodeAPIRequestNetworkError, + @"Request failed: %@, error: %@.", request, error); + reject(error); + } else { + FIRLogDebug(kFIRLoggerInstallations, kFIRInstallationsMessageCodeAPIRequestResponse, + @"Request response received: %@, error: %@, body: %@.", request, error, + [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); + fulfill([[FIRInstallationsURLSessionResponse alloc] + initWithResponse:(NSHTTPURLResponse *)response + data:data]); + } + }] resume]; + }] then:^id _Nullable(FIRInstallationsURLSessionResponse *response) { + return [self validateHTTPResponseStatusCode:response]; + }]; +} + +- (FBLPromise *)validateHTTPResponseStatusCode: + (FIRInstallationsURLSessionResponse *)response { + NSInteger statusCode = response.HTTPResponse.statusCode; + return [FBLPromise do:^id _Nullable { + if (statusCode < 200 || statusCode >= 300) { + FIRLogDebug(kFIRLoggerInstallations, kFIRInstallationsMessageCodeUnexpectedAPIRequestResponse, + @"Unexpected API response: %@, body: %@.", response.HTTPResponse, + [[NSString alloc] initWithData:response.data encoding:NSUTF8StringEncoding]); + return [FIRInstallationsErrorUtil APIErrorWithHTTPResponse:response.HTTPResponse + data:response.data]; + } + return response; + }]; +} + +- (FBLPromise *)sendURLRequest:(NSURLRequest *)request { + return [FBLPromise attempts:1 + delay:1 + condition:^BOOL(NSInteger remainingAttempts, NSError *_Nonnull error) { + return [FIRInstallationsErrorUtil isAPIError:error + withHTTPCode:FIRInstallationsHTTPCodesServerInternalError]; + } + retry:^id _Nullable { + return [self URLRequestPromise:request]; + }]; +} + +- (NSString *)SDKVersion { + return [NSString stringWithFormat:@"i:%@", FIRFirebaseVersion()]; +} + +#pragma mark - Validation + +- (FBLPromise *)validateInstallation:(FIRInstallationsItem *)installation { + FBLPromise *result = [FBLPromise pendingPromise]; + + NSError *validationError; + if ([installation isValid:&validationError]) { + [result fulfill:installation]; + } else { + [result reject:validationError]; + } + return result; +} + +#pragma mark - JSON + +- (void)setJSONHTTPBody:(NSDictionary *)body + forRequest:(NSMutableURLRequest *)request { + [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; + + NSError *error; + NSData *JSONData = [NSJSONSerialization dataWithJSONObject:body options:0 error:&error]; + if (JSONData == nil) { + // TODO: Log or return an error. + } + request.HTTPBody = JSONData; +} + +@end diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsAPI/FIRInstallationsItem+RegisterInstallationAPI.h b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsAPI/FIRInstallationsItem+RegisterInstallationAPI.h new file mode 100644 index 0000000..ec0217f --- /dev/null +++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsAPI/FIRInstallationsItem+RegisterInstallationAPI.h @@ -0,0 +1,53 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseInstallations/Source/Library/FIRInstallationsItem.h" + +@class FIRInstallationsStoredAuthToken; + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRInstallationsItem (RegisterInstallationAPI) + +/** + * Parses and validates the Register Installation API response and returns a corresponding + * `FIRInstallationsItem` instance on success. + * @param JSONData The data with JSON encoded API response. + * @param date The installation auth token expiration date will be calculated as `date` + + * `response.authToken.expiresIn`. For most of the cases `[NSDate date]` should be passed there. A + * different value may be passed e.g. for unit tests. + * @param outError A pointer to assign a specific `NSError` instance in case of failure. No error is + * assigned in case of success. + * @return Returns a new `FIRInstallationsItem` instance in the success case or `nil` otherwise. + */ +- (nullable FIRInstallationsItem *)registeredInstallationWithJSONData:(NSData *)JSONData + date:(NSDate *)date + error: + (NSError *_Nullable *)outError; + ++ (nullable FIRInstallationsStoredAuthToken *)authTokenWithGenerateTokenAPIJSONData:(NSData *)data + date:(NSDate *)date + error:(NSError **) + outError; + ++ (nullable FIRInstallationsStoredAuthToken *)authTokenWithJSONDict: + (NSDictionary *)dict + date:(NSDate *)date + error:(NSError **)outError; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsAPI/FIRInstallationsItem+RegisterInstallationAPI.m b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsAPI/FIRInstallationsItem+RegisterInstallationAPI.m new file mode 100644 index 0000000..90696f0 --- /dev/null +++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsAPI/FIRInstallationsItem+RegisterInstallationAPI.m @@ -0,0 +1,146 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseInstallations/Source/Library/InstallationsAPI/FIRInstallationsItem+RegisterInstallationAPI.h" + +#import "FirebaseInstallations/Source/Library/Errors/FIRInstallationsErrorUtil.h" +#import "FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStoredAuthToken.h" + +@implementation FIRInstallationsItem (RegisterInstallationAPI) + +- (nullable FIRInstallationsItem *) + registeredInstallationWithJSONData:(NSData *)data + date:(NSDate *)date + error:(NSError *__autoreleasing _Nullable *_Nullable)outError { + NSDictionary *responseJSON = [FIRInstallationsItem dictionaryFromJSONData:data error:outError]; + if (!responseJSON) { + return nil; + } + + NSString *refreshToken = [FIRInstallationsItem validStringOrNilForKey:@"refreshToken" + fromDict:responseJSON]; + if (refreshToken == nil) { + FIRInstallationsItemSetErrorToPointer( + [FIRInstallationsErrorUtil FIDRegistrationErrorWithResponseMissingField:@"refreshToken"], + outError); + return nil; + } + + NSDictionary *authTokenDict = responseJSON[@"authToken"]; + if (![authTokenDict isKindOfClass:[NSDictionary class]]) { + FIRInstallationsItemSetErrorToPointer( + [FIRInstallationsErrorUtil FIDRegistrationErrorWithResponseMissingField:@"authToken"], + outError); + return nil; + } + + FIRInstallationsStoredAuthToken *authToken = + [FIRInstallationsItem authTokenWithJSONDict:authTokenDict date:date error:outError]; + if (authToken == nil) { + return nil; + } + + FIRInstallationsItem *installation = + [[FIRInstallationsItem alloc] initWithAppID:self.appID firebaseAppName:self.firebaseAppName]; + NSString *installationID = [FIRInstallationsItem validStringOrNilForKey:@"fid" + fromDict:responseJSON]; + installation.firebaseInstallationID = installationID ?: self.firebaseInstallationID; + installation.refreshToken = refreshToken; + installation.authToken = authToken; + installation.registrationStatus = FIRInstallationStatusRegistered; + + return installation; +} + +#pragma mark - Auth token + ++ (nullable FIRInstallationsStoredAuthToken *)authTokenWithGenerateTokenAPIJSONData:(NSData *)data + date:(NSDate *)date + error:(NSError **) + outError { + NSDictionary *dict = [self dictionaryFromJSONData:data error:outError]; + if (!dict) { + return nil; + } + + return [self authTokenWithJSONDict:dict date:date error:outError]; +} + ++ (nullable FIRInstallationsStoredAuthToken *)authTokenWithJSONDict: + (NSDictionary *)dict + date:(NSDate *)date + error:(NSError **)outError { + NSString *token = [self validStringOrNilForKey:@"token" fromDict:dict]; + if (token == nil) { + FIRInstallationsItemSetErrorToPointer( + [FIRInstallationsErrorUtil FIDRegistrationErrorWithResponseMissingField:@"authToken.token"], + outError); + return nil; + } + + NSString *expiresInString = [self validStringOrNilForKey:@"expiresIn" fromDict:dict]; + if (expiresInString == nil) { + FIRInstallationsItemSetErrorToPointer( + [FIRInstallationsErrorUtil + FIDRegistrationErrorWithResponseMissingField:@"authToken.expiresIn"], + outError); + return nil; + } + + // The response should contain the string in format like "604800s". + // The server should never response with anything else except seconds. + // Just drop the last character and parse a number from string. + NSString *expiresInSeconds = [expiresInString substringToIndex:expiresInString.length - 1]; + NSTimeInterval expiresIn = [expiresInSeconds doubleValue]; + NSDate *expirationDate = [date dateByAddingTimeInterval:expiresIn]; + + FIRInstallationsStoredAuthToken *authToken = [[FIRInstallationsStoredAuthToken alloc] init]; + authToken.status = FIRInstallationsAuthTokenStatusTokenReceived; + authToken.token = token; + authToken.expirationDate = expirationDate; + + return authToken; +} + +#pragma mark - JSON + ++ (nullable NSDictionary *)dictionaryFromJSONData:(NSData *)data + error:(NSError **)outError { + NSError *error; + NSDictionary *responseJSON = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; + + if (![responseJSON isKindOfClass:[NSDictionary class]]) { + FIRInstallationsItemSetErrorToPointer([FIRInstallationsErrorUtil JSONSerializationError:error], + outError); + return nil; + } + + return responseJSON; +} + ++ (NSString *)validStringOrNilForKey:(NSString *)key fromDict:(NSDictionary *)dict { + NSString *string = dict[key]; + if ([string isKindOfClass:[NSString class]] && string.length > 0) { + return string; + } + return nil; +} + +@end + +/// Stub used to force the linker to include the categories in this file. +void FIRInclude_FIRInstallationsItem_RegisterInstallationAPI_Category(void) { +} diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsIDController/FIRCurrentDateProvider.h b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsIDController/FIRCurrentDateProvider.h new file mode 100644 index 0000000..4d40338 --- /dev/null +++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsIDController/FIRCurrentDateProvider.h @@ -0,0 +1,27 @@ +/* + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** A block returning current date. */ +typedef NSDate *_Nonnull (^FIRCurrentDateProvider)(void); + +/** The function returns a `FIRCurrentDateProvider` block that returns a real current date. */ +FIRCurrentDateProvider FIRRealCurrentDateProvider(void); + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsIDController/FIRCurrentDateProvider.m b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsIDController/FIRCurrentDateProvider.m new file mode 100644 index 0000000..d2a1d40 --- /dev/null +++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsIDController/FIRCurrentDateProvider.m @@ -0,0 +1,23 @@ +/* + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseInstallations/Source/Library/InstallationsIDController/FIRCurrentDateProvider.h" + +FIRCurrentDateProvider FIRRealCurrentDateProvider(void) { + return ^NSDate *(void) { + return [NSDate date]; + }; +} diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsBackoffController.h b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsBackoffController.h new file mode 100644 index 0000000..5760618 --- /dev/null +++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsBackoffController.h @@ -0,0 +1,54 @@ +/* + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FirebaseInstallations/Source/Library/InstallationsIDController/FIRCurrentDateProvider.h" + +NS_ASSUME_NONNULL_BEGIN + +typedef NS_ENUM(NSInteger, FIRInstallationsBackoffEvent) { + FIRInstallationsBackoffEventSuccess, + FIRInstallationsBackoffEventRecoverableFailure, + FIRInstallationsBackoffEventUnrecoverableFailure +}; + +/** The protocol defines API for a class that encapsulates backoff logic that prevents the SDK from + * sending unnecessary server requests. See API docs for the methods for more details. */ + +@protocol FIRInstallationsBackoffControllerProtocol + +/** The client must call the method each time a protected server request succeeds of fails. It will + * affect the `isNextRequestAllowed` method result for the current time, e.g. when 3 recoverable + * errors were logged in a row, then `isNextRequestAllowed` will return `YES` only in `pow(2, 3)` + * seconds. */ +- (void)registerEvent:(FIRInstallationsBackoffEvent)event; + +/** Returns if sending a next protected is recommended based on the time and the sequence of logged + * events and the current time. See also `registerEvent:`. */ +- (BOOL)isNextRequestAllowed; + +@end + +/** An implementation of `FIRInstallationsBackoffControllerProtocol` with exponential backoff for + * recoverable errors and constant backoff for recoverable errors. */ +@interface FIRInstallationsBackoffController : NSObject + +- (instancetype)initWithCurrentDateProvider:(FIRCurrentDateProvider)currentDateProvider; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsBackoffController.m b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsBackoffController.m new file mode 100644 index 0000000..25f9b42 --- /dev/null +++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsBackoffController.m @@ -0,0 +1,132 @@ +/* + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsBackoffController.h" + +static const NSTimeInterval k24Hours = 24 * 60 * 60; +static const NSTimeInterval k30Minutes = 30 * 60; + +/** The class represents `FIRInstallationsBackoffController` state required to calculate next + allowed request time. The properties of the class are intentionally immutable because changing them + separately leads to an inconsistent state. */ +@interface FIRInstallationsBackoffEventData : NSObject + +@property(nonatomic, readonly) FIRInstallationsBackoffEvent eventType; +@property(nonatomic, readonly) NSDate *lastEventDate; +@property(nonatomic, readonly) NSInteger eventCount; + +@property(nonatomic, readonly) NSTimeInterval backoffTimeInterval; + +@end + +@implementation FIRInstallationsBackoffEventData + +- (instancetype)initWithEvent:(FIRInstallationsBackoffEvent)eventType + lastEventDate:(NSDate *)lastEventDate + eventCount:(NSInteger)eventCount { + self = [super init]; + if (self) { + _eventType = eventType; + _lastEventDate = lastEventDate; + _eventCount = eventCount; + + _backoffTimeInterval = [[self class] backoffTimeIntervalWithEvent:eventType + eventCount:eventCount]; + } + return self; +} + ++ (NSTimeInterval)backoffTimeIntervalWithEvent:(FIRInstallationsBackoffEvent)eventType + eventCount:(NSInteger)eventCount { + switch (eventType) { + case FIRInstallationsBackoffEventSuccess: + return 0; + break; + + case FIRInstallationsBackoffEventRecoverableFailure: + return [self recoverableErrorBackoffTimeForAttemptNumber:eventCount]; + break; + + case FIRInstallationsBackoffEventUnrecoverableFailure: + return k24Hours; + break; + } +} + ++ (NSTimeInterval)recoverableErrorBackoffTimeForAttemptNumber:(NSInteger)attemptNumber { + NSTimeInterval exponentialInterval = pow(2, attemptNumber) + [self randomMilliseconds]; + return MIN(exponentialInterval, k30Minutes); +} + ++ (NSTimeInterval)randomMilliseconds { + int32_t random_millis = ABS(arc4random() % 1000); + return (double)random_millis * 0.001; +} + +@end + +@interface FIRInstallationsBackoffController () + +@property(nonatomic, readonly) FIRCurrentDateProvider currentDateProvider; + +@property(nonatomic, nullable) FIRInstallationsBackoffEventData *lastEventData; + +@end + +@implementation FIRInstallationsBackoffController + +- (instancetype)init { + return [self initWithCurrentDateProvider:FIRRealCurrentDateProvider()]; +} + +- (instancetype)initWithCurrentDateProvider:(FIRCurrentDateProvider)currentDateProvider { + self = [super init]; + if (self) { + _currentDateProvider = [currentDateProvider copy]; + } + return self; +} + +- (BOOL)isNextRequestAllowed { + @synchronized(self) { + if (self.lastEventData == nil) { + return YES; + } + + NSTimeInterval timeSinceLastEvent = + [self.currentDateProvider() timeIntervalSinceDate:self.lastEventData.lastEventDate]; + return timeSinceLastEvent >= self.lastEventData.backoffTimeInterval; + } +} + +- (void)registerEvent:(FIRInstallationsBackoffEvent)event { + @synchronized(self) { + // Event of the same type as was registered before. + if (self.lastEventData && self.lastEventData.eventType == event) { + self.lastEventData = [[FIRInstallationsBackoffEventData alloc] + initWithEvent:event + lastEventDate:self.currentDateProvider() + eventCount:self.lastEventData.eventCount + 1]; + } else { // A different event. + self.lastEventData = + [[FIRInstallationsBackoffEventData alloc] initWithEvent:event + lastEventDate:self.currentDateProvider() + eventCount:1]; + } + } +} + +@end diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsIDController.h b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsIDController.h new file mode 100644 index 0000000..8e66af9 --- /dev/null +++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsIDController.h @@ -0,0 +1,40 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +@class FBLPromise; +@class FIRApp; +@class FIRInstallationsItem; + +/** + * The class is responsible for managing FID for a given `FIRApp`. + */ +@interface FIRInstallationsIDController : NSObject + +- (instancetype)initWithApp:(FIRApp *)app; + +- (FBLPromise *)getInstallationItem; + +- (FBLPromise *)getAuthTokenForcingRefresh:(BOOL)forceRefresh; + +- (FBLPromise *)deleteInstallation; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsIDController.m b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsIDController.m new file mode 100644 index 0000000..6ade8cc --- /dev/null +++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsIDController.m @@ -0,0 +1,530 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsIDController.h" + +#if __has_include() +#import +#else +#import "FBLPromises.h" +#endif + +#import +#import "FirebaseCore/Extension/FirebaseCoreInternal.h" + +#import "FirebaseInstallations/Source/Library/Errors/FIRInstallationsErrorUtil.h" +#import "FirebaseInstallations/Source/Library/FIRInstallationsItem.h" +#import "FirebaseInstallations/Source/Library/FIRInstallationsLogger.h" +#import "FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDStore.h" +#import "FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDTokenStore.h" +#import "FirebaseInstallations/Source/Library/InstallationsAPI/FIRInstallationsAPIService.h" +#import "FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsBackoffController.h" +#import "FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsSingleOperationPromiseCache.h" +#import "FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStore.h" + +#import "FirebaseInstallations/Source/Library/Errors/FIRInstallationsHTTPError.h" +#import "FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStoredAuthToken.h" + +const NSNotificationName FIRInstallationIDDidChangeNotification = + @"FIRInstallationIDDidChangeNotification"; +NSString *const kFIRInstallationIDDidChangeNotificationAppNameKey = + @"FIRInstallationIDDidChangeNotification"; + +NSTimeInterval const kFIRInstallationsTokenExpirationThreshold = 60 * 60; // 1 hour. + +static NSString *const kKeychainService = @"com.firebase.FIRInstallations.installations"; + +@interface FIRInstallationsIDController () +@property(nonatomic, readonly) NSString *appID; +@property(nonatomic, readonly) NSString *appName; + +@property(nonatomic, readonly) FIRInstallationsStore *installationsStore; +@property(nonatomic, readonly) FIRInstallationsIIDStore *IIDStore; +@property(nonatomic, readonly) FIRInstallationsIIDTokenStore *IIDTokenStore; + +@property(nonatomic, readonly) FIRInstallationsAPIService *APIService; + +@property(nonatomic, readonly) id backoffController; + +@property(nonatomic, readonly) FIRInstallationsSingleOperationPromiseCache + *getInstallationPromiseCache; +@property(nonatomic, readonly) + FIRInstallationsSingleOperationPromiseCache *authTokenPromiseCache; +@property(nonatomic, readonly) FIRInstallationsSingleOperationPromiseCache + *authTokenForcingRefreshPromiseCache; +@property(nonatomic, readonly) + FIRInstallationsSingleOperationPromiseCache *deleteInstallationPromiseCache; +@end + +@implementation FIRInstallationsIDController + +- (instancetype)initWithApp:(FIRApp *)app { + NSString *serviceName = + [FIRInstallationsIDController keychainServiceWithAppID:app.options.googleAppID]; + GULKeychainStorage *secureStorage = [[GULKeychainStorage alloc] initWithService:serviceName]; + FIRInstallationsStore *installationsStore = + [[FIRInstallationsStore alloc] initWithSecureStorage:secureStorage + accessGroup:app.options.appGroupID]; + + FIRInstallationsAPIService *apiService = + [[FIRInstallationsAPIService alloc] initWithAPIKey:app.options.APIKey + projectID:app.options.projectID + heartbeatLogger:app.heartbeatLogger]; + + FIRInstallationsIIDStore *IIDStore = [[FIRInstallationsIIDStore alloc] init]; + FIRInstallationsIIDTokenStore *IIDCheckingStore = + [[FIRInstallationsIIDTokenStore alloc] initWithGCMSenderID:app.options.GCMSenderID]; + + FIRInstallationsBackoffController *backoffController = + [[FIRInstallationsBackoffController alloc] init]; + + return [self initWithGoogleAppID:app.options.googleAppID + appName:app.name + installationsStore:installationsStore + APIService:apiService + IIDStore:IIDStore + IIDTokenStore:IIDCheckingStore + backoffController:backoffController]; +} + +/// The initializer is supposed to be used by tests to inject `installationsStore`. +- (instancetype)initWithGoogleAppID:(NSString *)appID + appName:(NSString *)appName + installationsStore:(FIRInstallationsStore *)installationsStore + APIService:(FIRInstallationsAPIService *)APIService + IIDStore:(FIRInstallationsIIDStore *)IIDStore + IIDTokenStore:(FIRInstallationsIIDTokenStore *)IIDTokenStore + backoffController: + (id)backoffController { + self = [super init]; + if (self) { + _appID = appID; + _appName = appName; + _installationsStore = installationsStore; + _APIService = APIService; + _IIDStore = IIDStore; + _IIDTokenStore = IIDTokenStore; + _backoffController = backoffController; + + __weak FIRInstallationsIDController *weakSelf = self; + + _getInstallationPromiseCache = [[FIRInstallationsSingleOperationPromiseCache alloc] + initWithNewOperationHandler:^FBLPromise *_Nonnull { + FIRInstallationsIDController *strongSelf = weakSelf; + return [strongSelf createGetInstallationItemPromise]; + }]; + + _authTokenPromiseCache = [[FIRInstallationsSingleOperationPromiseCache alloc] + initWithNewOperationHandler:^FBLPromise *_Nonnull { + FIRInstallationsIDController *strongSelf = weakSelf; + return [strongSelf installationWithValidAuthTokenForcingRefresh:NO]; + }]; + + _authTokenForcingRefreshPromiseCache = [[FIRInstallationsSingleOperationPromiseCache alloc] + initWithNewOperationHandler:^FBLPromise *_Nonnull { + FIRInstallationsIDController *strongSelf = weakSelf; + return [strongSelf installationWithValidAuthTokenForcingRefresh:YES]; + }]; + + _deleteInstallationPromiseCache = [[FIRInstallationsSingleOperationPromiseCache alloc] + initWithNewOperationHandler:^FBLPromise *_Nonnull { + FIRInstallationsIDController *strongSelf = weakSelf; + return [strongSelf createDeleteInstallationPromise]; + }]; + } + return self; +} + +#pragma mark - Get Installation. + +- (FBLPromise *)getInstallationItem { + return [self.getInstallationPromiseCache getExistingPendingOrCreateNewPromise]; +} + +- (FBLPromise *)createGetInstallationItemPromise { + FIRLogDebug(kFIRLoggerInstallations, + kFIRInstallationsMessageCodeNewGetInstallationOperationCreated, @"%s, appName: %@", + __PRETTY_FUNCTION__, self.appName); + + FBLPromise *installationItemPromise = + [self getStoredInstallation].recover(^id(NSError *error) { + return [self createAndSaveFID]; + }); + + // Initiate registration process on success if needed, but return the installation without waiting + // for it. + installationItemPromise.then(^id(FIRInstallationsItem *installation) { + [self getAuthTokenForcingRefresh:NO]; + return nil; + }); + + return installationItemPromise; +} + +- (FBLPromise *)getStoredInstallation { + return [self.installationsStore installationForAppID:self.appID appName:self.appName].validate( + ^BOOL(FIRInstallationsItem *installation) { + NSError *validationError; + BOOL isValid = [installation isValid:&validationError]; + + if (!isValid) { + FIRLogWarning( + kFIRLoggerInstallations, kFIRInstallationsMessageCodeCorruptedStoredInstallation, + @"Stored installation validation error: %@", validationError.localizedDescription); + } + + return isValid; + }); +} + +- (FBLPromise *)createAndSaveFID { + return [self migrateOrGenerateInstallation] + .then(^FBLPromise *(FIRInstallationsItem *installation) { + return [self saveInstallation:installation]; + }) + .then(^FIRInstallationsItem *(FIRInstallationsItem *installation) { + [self postFIDDidChangeNotification]; + return installation; + }); +} + +- (FBLPromise *)saveInstallation:(FIRInstallationsItem *)installation { + return [self.installationsStore saveInstallation:installation].then( + ^FIRInstallationsItem *(NSNull *result) { + return installation; + }); +} + +/** + * Tries to migrate IID data stored by FirebaseInstanceID SDK or generates a new Installation ID if + * not found. + */ +- (FBLPromise *)migrateOrGenerateInstallation { + if (![self isDefaultApp]) { + // Existing IID should be used only for default FirebaseApp. + FIRInstallationsItem *installation = + [self createInstallationWithFID:[FIRInstallationsItem generateFID] IIDDefaultToken:nil]; + return [FBLPromise resolvedWith:installation]; + } + + return [[[FBLPromise + all:@[ [self.IIDStore existingIID], [self.IIDTokenStore existingIIDDefaultToken] ]] + then:^id _Nullable(NSArray *_Nullable results) { + NSString *existingIID = results[0]; + NSString *IIDDefaultToken = results[1]; + + return [self createInstallationWithFID:existingIID IIDDefaultToken:IIDDefaultToken]; + }] recover:^id _Nullable(NSError *_Nonnull error) { + return [self createInstallationWithFID:[FIRInstallationsItem generateFID] IIDDefaultToken:nil]; + }]; +} + +- (FIRInstallationsItem *)createInstallationWithFID:(NSString *)FID + IIDDefaultToken:(nullable NSString *)IIDDefaultToken { + FIRInstallationsItem *installation = [[FIRInstallationsItem alloc] initWithAppID:self.appID + firebaseAppName:self.appName]; + installation.firebaseInstallationID = FID; + installation.IIDDefaultToken = IIDDefaultToken; + installation.registrationStatus = FIRInstallationStatusUnregistered; + return installation; +} + +#pragma mark - FID registration + +- (FBLPromise *)registerInstallationIfNeeded: + (FIRInstallationsItem *)installation { + switch (installation.registrationStatus) { + case FIRInstallationStatusRegistered: + // Already registered. Do nothing. + return [FBLPromise resolvedWith:installation]; + + case FIRInstallationStatusUnknown: + case FIRInstallationStatusUnregistered: + // Registration required. Proceed. + break; + } + + // Check for backoff. + if (![self.backoffController isNextRequestAllowed]) { + return [FIRInstallationsErrorUtil + rejectedPromiseWithError:[FIRInstallationsErrorUtil backoffIntervalWaitError]]; + } + + return [self.APIService registerInstallation:installation] + .catch(^(NSError *_Nonnull error) { + [self updateBackoffWithSuccess:NO APIError:error]; + + if ([self doesRegistrationErrorRequireConfigChange:error]) { + FIRLogError(kFIRLoggerInstallations, + kFIRInstallationsMessageCodeInvalidFirebaseConfiguration, + @"Firebase Installation registration failed for app with name: %@, error:\n" + @"%@\nPlease make sure you use valid GoogleService-Info.plist", + self.appName, error.userInfo[NSLocalizedFailureReasonErrorKey]); + } + }) + .then(^id(FIRInstallationsItem *registeredInstallation) { + [self updateBackoffWithSuccess:YES APIError:nil]; + return [self saveInstallation:registeredInstallation]; + }) + .then(^FIRInstallationsItem *(FIRInstallationsItem *registeredInstallation) { + // Server may respond with a different FID if the sent one cannot be accepted. + if (![registeredInstallation.firebaseInstallationID + isEqualToString:installation.firebaseInstallationID]) { + [self postFIDDidChangeNotification]; + } + return registeredInstallation; + }); +} + +- (BOOL)doesRegistrationErrorRequireConfigChange:(NSError *)error { + FIRInstallationsHTTPError *HTTPError = (FIRInstallationsHTTPError *)error; + if (![HTTPError isKindOfClass:[FIRInstallationsHTTPError class]]) { + return NO; + } + + switch (HTTPError.HTTPResponse.statusCode) { + // These are the errors that require Firebase configuration change. + case FIRInstallationsRegistrationHTTPCodeInvalidArgument: + case FIRInstallationsRegistrationHTTPCodeAPIKeyToProjectIDMismatch: + case FIRInstallationsRegistrationHTTPCodeProjectNotFound: + return YES; + + default: + return NO; + } +} + +#pragma mark - Auth Token + +- (FBLPromise *)getAuthTokenForcingRefresh:(BOOL)forceRefresh { + if (forceRefresh || [self.authTokenForcingRefreshPromiseCache getExistingPendingPromise] != nil) { + return [self.authTokenForcingRefreshPromiseCache getExistingPendingOrCreateNewPromise]; + } else { + return [self.authTokenPromiseCache getExistingPendingOrCreateNewPromise]; + } +} + +- (FBLPromise *)installationWithValidAuthTokenForcingRefresh: + (BOOL)forceRefresh { + FIRLogDebug(kFIRLoggerInstallations, kFIRInstallationsMessageCodeNewGetAuthTokenOperationCreated, + @"-[FIRInstallationsIDController installationWithValidAuthTokenForcingRefresh:%@], " + @"appName: %@", + @(forceRefresh), self.appName); + + return [self getInstallationItem] + .then(^FBLPromise *(FIRInstallationsItem *installation) { + return [self registerInstallationIfNeeded:installation]; + }) + .then(^id(FIRInstallationsItem *registeredInstallation) { + BOOL isTokenExpiredOrExpiresSoon = + [registeredInstallation.authToken.expirationDate timeIntervalSinceDate:[NSDate date]] < + kFIRInstallationsTokenExpirationThreshold; + if (forceRefresh || isTokenExpiredOrExpiresSoon) { + return [self refreshAuthTokenForInstallation:registeredInstallation]; + } else { + return registeredInstallation; + } + }) + .recover(^id(NSError *error) { + return [self regenerateFIDOnRefreshTokenErrorIfNeeded:error]; + }); +} + +- (FBLPromise *)refreshAuthTokenForInstallation: + (FIRInstallationsItem *)installation { + // Check for backoff. + if (![self.backoffController isNextRequestAllowed]) { + return [FIRInstallationsErrorUtil + rejectedPromiseWithError:[FIRInstallationsErrorUtil backoffIntervalWaitError]]; + } + + return [[[self.APIService refreshAuthTokenForInstallation:installation] + then:^id _Nullable(FIRInstallationsItem *_Nullable refreshedInstallation) { + [self updateBackoffWithSuccess:YES APIError:nil]; + return [self saveInstallation:refreshedInstallation]; + }] recover:^id _Nullable(NSError *_Nonnull error) { + // Pass the error to the backoff controller. + [self updateBackoffWithSuccess:NO APIError:error]; + return error; + }]; +} + +- (id)regenerateFIDOnRefreshTokenErrorIfNeeded:(NSError *)error { + if (![error isKindOfClass:[FIRInstallationsHTTPError class]]) { + // No recovery possible. Return the same error. + return error; + } + + FIRInstallationsHTTPError *HTTPError = (FIRInstallationsHTTPError *)error; + switch (HTTPError.HTTPResponse.statusCode) { + case FIRInstallationsAuthTokenHTTPCodeInvalidAuthentication: + case FIRInstallationsAuthTokenHTTPCodeFIDNotFound: + // The stored installation was damaged or blocked by the server. + // Delete the stored installation then generate and register a new one. + return [self getInstallationItem] + .then(^FBLPromise *(FIRInstallationsItem *installation) { + return [self deleteInstallationLocally:installation]; + }) + .then(^FBLPromise *(id result) { + return [self installationWithValidAuthTokenForcingRefresh:NO]; + }); + + default: + // No recovery possible. Return the same error. + return error; + } +} + +#pragma mark - Delete FID + +- (FBLPromise *)deleteInstallation { + return [self.deleteInstallationPromiseCache getExistingPendingOrCreateNewPromise]; +} + +- (FBLPromise *)createDeleteInstallationPromise { + FIRLogDebug(kFIRLoggerInstallations, + kFIRInstallationsMessageCodeNewDeleteInstallationOperationCreated, @"%s, appName: %@", + __PRETTY_FUNCTION__, self.appName); + + // Check for ongoing requests first, if there is no a request, then check local storage for + // existing installation. + FBLPromise *currentInstallationPromise = + [self mostRecentInstallationOperation] ?: [self getStoredInstallation]; + + return currentInstallationPromise + .then(^id(FIRInstallationsItem *installation) { + return [self sendDeleteInstallationRequestIfNeeded:installation]; + }) + .then(^id(FIRInstallationsItem *installation) { + // Remove the installation from the local storage. + return [self deleteInstallationLocally:installation]; + }); +} + +- (FBLPromise *)deleteInstallationLocally:(FIRInstallationsItem *)installation { + return [self.installationsStore removeInstallationForAppID:installation.appID + appName:installation.firebaseAppName] + .then(^FBLPromise *(NSNull *result) { + return [self deleteExistingIIDIfNeeded]; + }) + .then(^NSNull *(NSNull *result) { + [self postFIDDidChangeNotification]; + return result; + }); +} + +- (FBLPromise *)sendDeleteInstallationRequestIfNeeded: + (FIRInstallationsItem *)installation { + switch (installation.registrationStatus) { + case FIRInstallationStatusUnknown: + case FIRInstallationStatusUnregistered: + // The installation is not registered, so it is safe to be deleted as is, so return early. + return [FBLPromise resolvedWith:installation]; + break; + + case FIRInstallationStatusRegistered: + // Proceed to de-register the installation on the server. + break; + } + + return [self.APIService deleteInstallation:installation].recover(^id(NSError *APIError) { + if ([FIRInstallationsErrorUtil isAPIError:APIError withHTTPCode:404]) { + // The installation was not found on the server. + // Return success. + return installation; + } else { + // Re-throw the error otherwise. + return APIError; + } + }); +} + +- (FBLPromise *)deleteExistingIIDIfNeeded { + if ([self isDefaultApp]) { + return [self.IIDStore deleteExistingIID]; + } else { + return [FBLPromise resolvedWith:[NSNull null]]; + } +} + +- (nullable FBLPromise *)mostRecentInstallationOperation { + return [self.authTokenForcingRefreshPromiseCache getExistingPendingPromise] + ?: [self.authTokenPromiseCache getExistingPendingPromise] + ?: [self.getInstallationPromiseCache getExistingPendingPromise]; +} + +#pragma mark - Backoff + +- (void)updateBackoffWithSuccess:(BOOL)success APIError:(nullable NSError *)APIError { + if (success) { + [self.backoffController registerEvent:FIRInstallationsBackoffEventSuccess]; + } else if ([APIError isKindOfClass:[FIRInstallationsHTTPError class]]) { + FIRInstallationsHTTPError *HTTPResponseError = (FIRInstallationsHTTPError *)APIError; + NSInteger statusCode = HTTPResponseError.HTTPResponse.statusCode; + + if (statusCode == FIRInstallationsAuthTokenHTTPCodeInvalidAuthentication || + statusCode == FIRInstallationsAuthTokenHTTPCodeFIDNotFound) { + // These errors are explicitly excluded because they are handled by FIS SDK itself so don't + // require backoff. + } else if (statusCode == 400 || statusCode == 403) { // Explicitly unrecoverable errors. + [self.backoffController registerEvent:FIRInstallationsBackoffEventUnrecoverableFailure]; + } else if (statusCode == 429 || + (statusCode >= 500 && statusCode < 600)) { // Explicitly recoverable errors. + [self.backoffController registerEvent:FIRInstallationsBackoffEventRecoverableFailure]; + } else { // Treat all unknown errors as recoverable. + [self.backoffController registerEvent:FIRInstallationsBackoffEventRecoverableFailure]; + } + } + + // If the error class is not `FIRInstallationsHTTPError` it indicates a connection error. Such + // errors should not change backoff interval. +} + +#pragma mark - Notifications + +- (void)postFIDDidChangeNotification { + [[NSNotificationCenter defaultCenter] + postNotificationName:FIRInstallationIDDidChangeNotification + object:nil + userInfo:@{kFIRInstallationIDDidChangeNotificationAppNameKey : self.appName}]; +} + +#pragma mark - Default App + +- (BOOL)isDefaultApp { + return [self.appName isEqualToString:kFIRDefaultAppName]; +} + +#pragma mark - Keychain + ++ (NSString *)keychainServiceWithAppID:(NSString *)appID { +#if TARGET_OS_MACCATALYST || TARGET_OS_OSX + // We need to keep service name unique per application on macOS. + // Applications on macOS may request access to Keychain items stored by other applications. It + // means that when the app looks up for a relevant Keychain item in the service scope it will + // request user password to grant access to the Keychain if there are other Keychain items from + // other applications stored under the same Keychain Service. + return [kKeychainService stringByAppendingFormat:@".%@", appID]; +#else + // Use a constant Keychain service for non-macOS because: + // 1. Keychain items cannot be shared between apps until configured specifically so the service + // name collisions are not a concern + // 2. We don't want to change the service name to avoid doing a migration. + return kKeychainService; +#endif +} + +@end diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsSingleOperationPromiseCache.h b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsSingleOperationPromiseCache.h new file mode 100644 index 0000000..aeb54e5 --- /dev/null +++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsSingleOperationPromiseCache.h @@ -0,0 +1,58 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FBLPromise; + +NS_ASSUME_NONNULL_BEGIN + +/** + * The class makes sure the a single operation (represented by a promise) is performed at a time. If + * there is an ongoing operation, then its existing corresponding promise will be returned instead + * of starting a new operation. + */ +@interface FIRInstallationsSingleOperationPromiseCache<__covariant ResultType> : NSObject + +- (instancetype)init NS_UNAVAILABLE; + +/** + * The designated initializer. + * @param newOperationHandler The block that must return a new promise representing the + * single-at-a-time operation. The promise should be fulfilled when the operation is completed. The + * factory block will be used to create a new promise when needed. + */ +- (instancetype)initWithNewOperationHandler: + (FBLPromise *_Nonnull (^)(void))newOperationHandler NS_DESIGNATED_INITIALIZER; + +/** + * Creates a new promise or returns an existing pending one. + * @return Returns and existing pending promise if exists. If the pending promise does not exist + * then a new one will be created using the `factory` block passed in the initializer. Once the + * pending promise gets resolved, it is removed, so calling the method again will lead to creating + * and caching another promise. + */ +- (FBLPromise *)getExistingPendingOrCreateNewPromise; + +/** + * Returns an existing pending promise or `nil`. + * @return Returns an existing pending promise if there is one or `nil` otherwise. + */ +- (nullable FBLPromise *)getExistingPendingPromise; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsSingleOperationPromiseCache.m b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsSingleOperationPromiseCache.m new file mode 100644 index 0000000..7ae8781 --- /dev/null +++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsSingleOperationPromiseCache.m @@ -0,0 +1,75 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsSingleOperationPromiseCache.h" + +#if __has_include() +#import +#else +#import "FBLPromises.h" +#endif + +@interface FIRInstallationsSingleOperationPromiseCache () +@property(nonatomic, readonly) FBLPromise *_Nonnull (^newOperationHandler)(void); +@property(nonatomic, nullable) FBLPromise *pendingPromise; +@end + +@implementation FIRInstallationsSingleOperationPromiseCache + +- (instancetype)initWithNewOperationHandler: + (FBLPromise *_Nonnull (^)(void))newOperationHandler { + if (newOperationHandler == nil) { + [NSException raise:NSInvalidArgumentException + format:@"`newOperationHandler` must not be `nil`."]; + } + + self = [super init]; + if (self) { + _newOperationHandler = [newOperationHandler copy]; + } + return self; +} + +- (FBLPromise *)getExistingPendingOrCreateNewPromise { + @synchronized(self) { + if (!self.pendingPromise) { + self.pendingPromise = self.newOperationHandler(); + + self.pendingPromise + .then(^id(id result) { + @synchronized(self) { + self.pendingPromise = nil; + return nil; + } + }) + .catch(^void(NSError *error) { + @synchronized(self) { + self.pendingPromise = nil; + } + }); + } + + return self.pendingPromise; + } +} + +- (nullable FBLPromise *)getExistingPendingPromise { + @synchronized(self) { + return self.pendingPromise; + } +} + +@end diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsStatus.h b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsStatus.h new file mode 100644 index 0000000..3edc692 --- /dev/null +++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsStatus.h @@ -0,0 +1,35 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +/** + * The enum represent possible states of the installation ID. + * + * WARNING: The enum is stored to Keychain as a part of `FIRInstallationsStoredItem`. Modification + * of it can lead to incompatibility with previous version. Any modification must be evaluated and, + * if it is really needed, the `storageVersion` must be bumped and proper migration code added. + */ +typedef NS_ENUM(NSInteger, FIRInstallationsStatus) { + /** Represents either an initial status when a FIRInstallationsItem instance was created but not + * stored to Keychain or an undefined status (e.g. when the status failed to deserialize). + */ + FIRInstallationStatusUnknown, + /// The Firebase Installation has not yet been registered with FIS. + FIRInstallationStatusUnregistered, + /// The Firebase Installation has successfully been registered with FIS. + FIRInstallationStatusRegistered, +}; diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStore.h b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStore.h new file mode 100644 index 0000000..b86fb39 --- /dev/null +++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStore.h @@ -0,0 +1,71 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FBLPromise; +@class FIRInstallationsItem; +@class GULKeychainStorage; + +NS_ASSUME_NONNULL_BEGIN + +/// The user defaults suite name used to store data. +extern NSString *const kFIRInstallationsStoreUserDefaultsID; + +/// The class is responsible for storing and accessing the installations data. +@interface FIRInstallationsStore : NSObject + +/** + * The default initializer. + * @param storage The secure storage to save installations data. + * @param accessGroup The Keychain Access Group to store and request the installations data. + */ +- (instancetype)initWithSecureStorage:(GULKeychainStorage *)storage + accessGroup:(nullable NSString *)accessGroup; + +/** + * Retrieves existing installation ID if there is. + * @param appID The Firebase(Google) Application ID. + * @param appName The Firebase Application Name. + * + * @return Returns a `FBLPromise` instance. The promise is resolved with a FIRInstallationsItem + * instance if there is a valid installation stored for `appID` and `appName`. The promise is + * rejected with a specific error when the installation has not been found or with another possible + * error. + */ +- (FBLPromise *)installationForAppID:(NSString *)appID + appName:(NSString *)appName; + +/** + * Saves the given installation. + * + * @param installationItem The installation data. + * @return Returns a promise that is resolved with `[NSNull null]` on success. + */ +- (FBLPromise *)saveInstallation:(FIRInstallationsItem *)installationItem; + +/** + * Removes installation data for the given app parameters. + * @param appID The Firebase(Google) Application ID. + * @param appName The Firebase Application Name. + * + * @return Returns a promise that is resolved with `[NSNull null]` on success. + */ +- (FBLPromise *)removeInstallationForAppID:(NSString *)appID appName:(NSString *)appName; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStore.m b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStore.m new file mode 100644 index 0000000..617b2d9 --- /dev/null +++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStore.m @@ -0,0 +1,140 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStore.h" + +#import + +#if __has_include() +#import +#else +#import "FBLPromises.h" +#endif + +#import + +#import "FirebaseInstallations/Source/Library/Errors/FIRInstallationsErrorUtil.h" +#import "FirebaseInstallations/Source/Library/FIRInstallationsItem.h" +#import "FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStoredItem.h" + +NSString *const kFIRInstallationsStoreUserDefaultsID = @"com.firebase.FIRInstallations"; + +@interface FIRInstallationsStore () +@property(nonatomic, readonly) GULKeychainStorage *secureStorage; +@property(nonatomic, readonly, nullable) NSString *accessGroup; +@property(nonatomic, readonly) dispatch_queue_t queue; +@property(nonatomic, readonly) GULUserDefaults *userDefaults; +@end + +@implementation FIRInstallationsStore + +- (instancetype)initWithSecureStorage:(GULKeychainStorage *)storage + accessGroup:(NSString *)accessGroup { + self = [super init]; + if (self) { + _secureStorage = storage; + _accessGroup = [accessGroup copy]; + _queue = dispatch_queue_create("com.firebase.FIRInstallationsStore", DISPATCH_QUEUE_SERIAL); + + NSString *userDefaultsSuiteName = _accessGroup ?: kFIRInstallationsStoreUserDefaultsID; + _userDefaults = [[GULUserDefaults alloc] initWithSuiteName:userDefaultsSuiteName]; + } + return self; +} + +- (FBLPromise *)installationForAppID:(NSString *)appID + appName:(NSString *)appName { + NSString *itemID = [FIRInstallationsItem identifierWithAppID:appID appName:appName]; + return [self installationExistsForAppID:appID appName:appName] + .then(^id(id result) { + return [FBLPromise + wrapObjectOrErrorCompletion:^(FBLPromiseObjectOrErrorCompletion _Nonnull handler) { + [self.secureStorage getObjectForKey:itemID + objectClass:[FIRInstallationsStoredItem class] + accessGroup:self.accessGroup + completionHandler:handler]; + }]; + }) + .then(^id(FIRInstallationsStoredItem *_Nullable storedItem) { + if (storedItem == nil) { + return [FIRInstallationsErrorUtil installationItemNotFoundForAppID:appID appName:appName]; + } + + FIRInstallationsItem *item = [[FIRInstallationsItem alloc] initWithAppID:appID + firebaseAppName:appName]; + [item updateWithStoredItem:storedItem]; + return item; + }); +} + +- (FBLPromise *)saveInstallation:(FIRInstallationsItem *)installationItem { + FIRInstallationsStoredItem *storedItem = [installationItem storedItem]; + NSString *identifier = [installationItem identifier]; + + return + [FBLPromise wrapObjectOrErrorCompletion:^( + FBLPromiseObjectOrErrorCompletion _Nonnull handler) { + [self.secureStorage setObject:storedItem + forKey:identifier + accessGroup:self.accessGroup + completionHandler:handler]; + }].then(^id(id __unused unusedResult) { + return [self setInstallationExists:YES forItemWithIdentifier:identifier]; + }); +} + +- (FBLPromise *)removeInstallationForAppID:(NSString *)appID appName:(NSString *)appName { + NSString *identifier = [FIRInstallationsItem identifierWithAppID:appID appName:appName]; + + return + [FBLPromise wrapErrorCompletion:^(FBLPromiseErrorCompletion _Nonnull handler) { + [self.secureStorage removeObjectForKey:identifier + accessGroup:self.accessGroup + completionHandler:handler]; + }].then(^id(id __unused result) { + return [self setInstallationExists:NO forItemWithIdentifier:identifier]; + }); +} + +#pragma mark - User defaults + +- (FBLPromise *)installationExistsForAppID:(NSString *)appID appName:(NSString *)appName { + NSString *identifier = [FIRInstallationsItem identifierWithAppID:appID appName:appName]; + return [FBLPromise onQueue:self.queue + do:^id _Nullable { + return [[self userDefaults] objectForKey:identifier] != nil + ? [NSNull null] + : [FIRInstallationsErrorUtil + installationItemNotFoundForAppID:appID + appName:appName]; + }]; +} + +- (FBLPromise *)setInstallationExists:(BOOL)exists + forItemWithIdentifier:(NSString *)identifier { + return [FBLPromise onQueue:self.queue + do:^id _Nullable { + if (exists) { + [[self userDefaults] setBool:YES forKey:identifier]; + } else { + [[self userDefaults] removeObjectForKey:identifier]; + } + + return [NSNull null]; + }]; +} + +@end diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStoredAuthToken.h b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStoredAuthToken.h new file mode 100644 index 0000000..4da2337 --- /dev/null +++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStoredAuthToken.h @@ -0,0 +1,58 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + * The enum represent possible states of the installation auth token. + * + * WARNING: The enum is stored to Keychain as a part of `FIRInstallationsStoredAuthToken`. + * Modification of it can lead to incompatibility with previous version. Any modification must be + * evaluated and, if it is really needed, the `storageVersion` must be bumped and proper migration + * code added. + */ +typedef NS_ENUM(NSInteger, FIRInstallationsAuthTokenStatus) { + /// An initial status or an undefined value. + FIRInstallationsAuthTokenStatusUnknown, + /// The auth token has been received from the server. + FIRInstallationsAuthTokenStatusTokenReceived +}; + +/** + * This class serializes and deserializes the installation data into/from `NSData` to be stored in + * Keychain. This class is primarily used by `FIRInstallationsStore`. It is also used on the logic + * level as a data object (see `FIRInstallationsItem.authToken`). + * + * WARNING: Modification of the class properties can lead to incompatibility with the stored data + * encoded by the previous class versions. Any modification must be evaluated and, if it is really + * needed, the `storageVersion` must be bumped and proper migration code added. + */ +@interface FIRInstallationsStoredAuthToken : NSObject +@property FIRInstallationsAuthTokenStatus status; + +/// The installation auth token string that can be used to authorize requests to Firebase backend. +@property(nullable, copy) NSString *token; +/// The installation auth token expiration date. +@property(nullable, copy) NSDate *expirationDate; + +/// The version of local storage. +@property(nonatomic, readonly) NSInteger storageVersion; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStoredAuthToken.m b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStoredAuthToken.m new file mode 100644 index 0000000..8236f2a --- /dev/null +++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStoredAuthToken.m @@ -0,0 +1,77 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStoredAuthToken.h" + +#import "FirebaseInstallations/Source/Library/FIRInstallationsLogger.h" + +NSString *const kFIRInstallationsStoredAuthTokenStatusKey = @"status"; +NSString *const kFIRInstallationsStoredAuthTokenTokenKey = @"token"; +NSString *const kFIRInstallationsStoredAuthTokenExpirationDateKey = @"expirationDate"; +NSString *const kFIRInstallationsStoredAuthTokenStorageVersionKey = @"storageVersion"; + +NSInteger const kFIRInstallationsStoredAuthTokenStorageVersion = 1; + +@implementation FIRInstallationsStoredAuthToken + +- (NSInteger)storageVersion { + return kFIRInstallationsStoredAuthTokenStorageVersion; +} + +- (nonnull id)copyWithZone:(nullable NSZone *)zone { + FIRInstallationsStoredAuthToken *clone = [[FIRInstallationsStoredAuthToken alloc] init]; + clone.status = self.status; + clone.token = [self.token copy]; + clone.expirationDate = self.expirationDate; + return clone; +} + +- (void)encodeWithCoder:(nonnull NSCoder *)aCoder { + [aCoder encodeInteger:self.status forKey:kFIRInstallationsStoredAuthTokenStatusKey]; + [aCoder encodeObject:self.token forKey:kFIRInstallationsStoredAuthTokenTokenKey]; + [aCoder encodeObject:self.expirationDate + forKey:kFIRInstallationsStoredAuthTokenExpirationDateKey]; + [aCoder encodeInteger:self.storageVersion + forKey:kFIRInstallationsStoredAuthTokenStorageVersionKey]; +} + +- (nullable instancetype)initWithCoder:(nonnull NSCoder *)aDecoder { + NSInteger storageVersion = + [aDecoder decodeIntegerForKey:kFIRInstallationsStoredAuthTokenStorageVersionKey]; + if (storageVersion > kFIRInstallationsStoredAuthTokenStorageVersion) { + FIRLogWarning(kFIRLoggerInstallations, + kFIRInstallationsMessageCodeAuthTokenCoderVersionMismatch, + @"FIRInstallationsStoredAuthToken was encoded by a newer coder version %ld. " + @"Current coder version is %ld. Some auth token data may be lost.", + (long)storageVersion, (long)kFIRInstallationsStoredAuthTokenStorageVersion); + } + + FIRInstallationsStoredAuthToken *object = [[FIRInstallationsStoredAuthToken alloc] init]; + object.status = [aDecoder decodeIntegerForKey:kFIRInstallationsStoredAuthTokenStatusKey]; + object.token = [aDecoder decodeObjectOfClass:[NSString class] + forKey:kFIRInstallationsStoredAuthTokenTokenKey]; + object.expirationDate = + [aDecoder decodeObjectOfClass:[NSDate class] + forKey:kFIRInstallationsStoredAuthTokenExpirationDateKey]; + + return object; +} + ++ (BOOL)supportsSecureCoding { + return YES; +} + +@end diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStoredItem.h b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStoredItem.h new file mode 100644 index 0000000..0126eb0 --- /dev/null +++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStoredItem.h @@ -0,0 +1,51 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsStatus.h" + +@class FIRInstallationsStoredAuthToken; +@class FIRInstallationsStoredIIDCheckin; + +NS_ASSUME_NONNULL_BEGIN + +/** + * The class is supposed to be used by `FIRInstallationsStore` only. It is required to + * serialize/deserialize the installation data into/from `NSData` to be stored in Keychain. + * + * WARNING: Modification of the class properties can lead to incompatibility with the stored data + * encoded by the previous class versions. Any modification must be evaluated and, if it is really + * needed, the `storageVersion` must be bumped and proper migration code added. + */ +@interface FIRInstallationsStoredItem : NSObject + +/// A stable identifier that uniquely identifies the app instance. +@property(nonatomic, copy, nullable) NSString *firebaseInstallationID; +/// The `refreshToken` is used to authorize the installation auth token requests. +@property(nonatomic, copy, nullable) NSString *refreshToken; + +@property(nonatomic, nullable) FIRInstallationsStoredAuthToken *authToken; +@property(nonatomic) FIRInstallationsStatus registrationStatus; + +/// Instance ID default auth token imported from IID store as a part of IID migration. +@property(nonatomic, nullable) NSString *IIDDefaultToken; + +/// The version of local storage. +@property(nonatomic, readonly) NSInteger storageVersion; +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStoredItem.m b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStoredItem.m new file mode 100644 index 0000000..4e19955 --- /dev/null +++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStoredItem.m @@ -0,0 +1,80 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStoredItem.h" + +#import "FirebaseInstallations/Source/Library/FIRInstallationsLogger.h" +#import "FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStoredAuthToken.h" + +NSString *const kFIRInstallationsStoredItemFirebaseInstallationIDKey = @"firebaseInstallationID"; +NSString *const kFIRInstallationsStoredItemRefreshTokenKey = @"refreshToken"; +NSString *const kFIRInstallationsStoredItemAuthTokenKey = @"authToken"; +NSString *const kFIRInstallationsStoredItemRegistrationStatusKey = @"registrationStatus"; +NSString *const kFIRInstallationsStoredItemIIDDefaultTokenKey = @"IIDDefaultToken"; +NSString *const kFIRInstallationsStoredItemStorageVersionKey = @"storageVersion"; + +NSInteger const kFIRInstallationsStoredItemStorageVersion = 1; + +@implementation FIRInstallationsStoredItem + +- (NSInteger)storageVersion { + return kFIRInstallationsStoredItemStorageVersion; +} + +- (void)encodeWithCoder:(nonnull NSCoder *)aCoder { + [aCoder encodeObject:self.firebaseInstallationID + forKey:kFIRInstallationsStoredItemFirebaseInstallationIDKey]; + [aCoder encodeObject:self.refreshToken forKey:kFIRInstallationsStoredItemRefreshTokenKey]; + [aCoder encodeObject:self.authToken forKey:kFIRInstallationsStoredItemAuthTokenKey]; + [aCoder encodeInteger:self.registrationStatus + forKey:kFIRInstallationsStoredItemRegistrationStatusKey]; + [aCoder encodeObject:self.IIDDefaultToken forKey:kFIRInstallationsStoredItemIIDDefaultTokenKey]; + [aCoder encodeInteger:self.storageVersion forKey:kFIRInstallationsStoredItemStorageVersionKey]; +} + +- (nullable instancetype)initWithCoder:(nonnull NSCoder *)aDecoder { + NSInteger storageVersion = + [aDecoder decodeIntegerForKey:kFIRInstallationsStoredItemStorageVersionKey]; + if (storageVersion > self.storageVersion) { + FIRLogWarning(kFIRLoggerInstallations, + kFIRInstallationsMessageCodeInstallationCoderVersionMismatch, + @"FIRInstallationsStoredItem was encoded by a newer coder version %ld. Current " + @"coder version is %ld. Some installation data may be lost.", + (long)storageVersion, (long)kFIRInstallationsStoredItemStorageVersion); + } + + FIRInstallationsStoredItem *item = [[FIRInstallationsStoredItem alloc] init]; + item.firebaseInstallationID = + [aDecoder decodeObjectOfClass:[NSString class] + forKey:kFIRInstallationsStoredItemFirebaseInstallationIDKey]; + item.refreshToken = [aDecoder decodeObjectOfClass:[NSString class] + forKey:kFIRInstallationsStoredItemRefreshTokenKey]; + item.authToken = [aDecoder decodeObjectOfClass:[FIRInstallationsStoredAuthToken class] + forKey:kFIRInstallationsStoredItemAuthTokenKey]; + item.registrationStatus = + [aDecoder decodeIntegerForKey:kFIRInstallationsStoredItemRegistrationStatusKey]; + item.IIDDefaultToken = + [aDecoder decodeObjectOfClass:[NSString class] + forKey:kFIRInstallationsStoredItemIIDDefaultTokenKey]; + + return item; +} + ++ (BOOL)supportsSecureCoding { + return YES; +} + +@end diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Private/FirebaseInstallationsInternal.h b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Private/FirebaseInstallationsInternal.h new file mode 100644 index 0000000..0c850e9 --- /dev/null +++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Private/FirebaseInstallationsInternal.h @@ -0,0 +1,19 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// An umbrella header, for any other libraries in this repo to access Firebase +// Installations Public headers. Any package manager complexity should be +// handled here. + +#import diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Public/FirebaseInstallations/FIRInstallations.h b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Public/FirebaseInstallations/FIRInstallations.h new file mode 100644 index 0000000..7670d40 --- /dev/null +++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Public/FirebaseInstallations/FIRInstallations.h @@ -0,0 +1,126 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FIRApp; +@class FIRInstallationsAuthTokenResult; + +NS_ASSUME_NONNULL_BEGIN + +/** A notification with this name is sent each time an installation is created or deleted. */ +// clang-format off +// clang-format12 merges the next two lines. +FOUNDATION_EXPORT const NSNotificationName FIRInstallationIDDidChangeNotification + NS_SWIFT_NAME(InstallationIDDidChange); +/** `userInfo` key for the `FirebaseApp.name` in `InstallationIDDidChangeNotification`. */ +FOUNDATION_EXPORT NSString *const kFIRInstallationIDDidChangeNotificationAppNameKey + NS_SWIFT_NAME(InstallationIDDidChangeAppNameKey); +// clang-format on + +/** + * An installation ID handler block. + * @param identifier The installation ID string if exists or `nil` otherwise. + * @param error The error when `identifier == nil` or `nil` otherwise. + */ +typedef void (^FIRInstallationsIDHandler)(NSString *__nullable identifier, + NSError *__nullable error) + NS_SWIFT_UNAVAILABLE("Use Swift's closure syntax instead."); + +/** + * An authorization token handler block. + * @param tokenResult An instance of `InstallationsAuthTokenResult` in case of success or `nil` + * otherwise. + * @param error The error when `tokenResult == nil` or `nil` otherwise. + */ +typedef void (^FIRInstallationsTokenHandler)( + FIRInstallationsAuthTokenResult *__nullable tokenResult, NSError *__nullable error) + NS_SWIFT_UNAVAILABLE("Use Swift's closure syntax instead."); + +/** + * The class provides API for Firebase Installations. + * Each configured `FirebaseApp` has a corresponding single instance of `Installations`. + * An instance of the class provides access to the installation info for the `FirebaseApp` as well + * as the ability to delete it. A Firebase Installation is unique by `FirebaseApp.name` and + * `FirebaseApp.options.googleAppID` . + */ +NS_SWIFT_NAME(Installations) NS_SWIFT_SENDABLE @interface FIRInstallations : NSObject + +- (instancetype)init NS_UNAVAILABLE; + +/** + * Returns a default instance of `Installations`. + * @return An instance of `Installations` for `FirebaseApp.defaultApp(). + * @throw Throws an exception if the default app is not configured yet or required `FirebaseApp` + * options are missing. + */ ++ (FIRInstallations *)installations NS_SWIFT_NAME(installations()); + +/** + * Returns an instance of `Installations` for an application. + * @param application A configured `FirebaseApp` instance. + * @return An instance of `Installations` corresponding to the passed application. + * @throw Throws an exception if required `FirebaseApp` options are missing. + */ ++ (FIRInstallations *)installationsWithApp:(FIRApp *)application NS_SWIFT_NAME(installations(app:)); + +/** + * The method creates or retrieves an installation ID. The installation ID is a stable identifier + * that uniquely identifies the app instance. NOTE: If the application already has an existing + * FirebaseInstanceID then the InstanceID identifier will be used. + * @param completion A completion handler which is invoked when the operation completes. + */ +- (void)installationIDWithCompletion:(void (^)(NSString *__nullable identifier, + NSError *__nullable error))completion; + +/** + * Retrieves (locally if it exists or from the server) a valid installation auth token. An existing + * token may be invalidated or expired, so it is recommended to fetch the installation auth token + * before each server request. The method does the same as + * `Installations.authToken(forcingRefresh:completion:)` with forcing refresh `false`. + * @param completion A completion handler which is invoked when the operation completes. + */ +- (void)authTokenWithCompletion:(void (^)(FIRInstallationsAuthTokenResult *__nullable tokenResult, + NSError *__nullable error))completion; + +/** + * Retrieves (locally or from the server depending on `forceRefresh` value) a valid installation + * auth token. An existing token may be invalidated or expire, so it is recommended to fetch the + * installation auth token before each server request. This method should be used with `forceRefresh + * == true` when e.g. a request with the previously fetched installation auth token failed with "Not + * Authorized" error. + * @param forceRefresh If `true` then the locally cached installation auth token will be ignored and + * a new one will be requested from the server. If `false`, then the locally cached installation + * auth token will be returned if exists and has not expired yet. + * @param completion A completion handler which is invoked when the operation completes. See + * `InstallationsTokenHandler` for additional details. + */ +- (void)authTokenForcingRefresh:(BOOL)forceRefresh + completion:(void (^)(FIRInstallationsAuthTokenResult *__nullable tokenResult, + NSError *__nullable error))completion; + +/** + * Deletes all the installation data including the unique identifier, auth tokens and + * all related data on the server side. A network connection is required for the method to + * succeed. If fails, the existing installation data remains untouched. + * @param completion A completion handler which is invoked when the operation completes. `error == + * nil` indicates success. + */ +- (void)deleteWithCompletion:(void (^)(NSError *__nullable error))completion; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Public/FirebaseInstallations/FIRInstallationsAuthTokenResult.h b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Public/FirebaseInstallations/FIRInstallationsAuthTokenResult.h new file mode 100644 index 0000000..501ac4e --- /dev/null +++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Public/FirebaseInstallations/FIRInstallationsAuthTokenResult.h @@ -0,0 +1,33 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** The class represents a result of the installation auth token request. */ +NS_SWIFT_NAME(InstallationsAuthTokenResult) +@interface FIRInstallationsAuthTokenResult : NSObject + +/** The installation auth token string. */ +@property(nonatomic, readonly) NSString *authToken; + +/** The installation auth token expiration date. */ +@property(nonatomic, readonly) NSDate *expirationDate; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Public/FirebaseInstallations/FIRInstallationsErrors.h b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Public/FirebaseInstallations/FIRInstallationsErrors.h new file mode 100644 index 0000000..939ca0a --- /dev/null +++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Public/FirebaseInstallations/FIRInstallationsErrors.h @@ -0,0 +1,35 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +extern NSString *const kFirebaseInstallationsErrorDomain NS_SWIFT_NAME(InstallationsErrorDomain); + +typedef NS_ERROR_ENUM(kFirebaseInstallationsErrorDomain, FIRInstallationsErrorCode){ + /** Unknown error. See `userInfo` for details. */ + FIRInstallationsErrorCodeUnknown = 0, + + /** Keychain error. See `userInfo` for details. */ + FIRInstallationsErrorCodeKeychain = 1, + + /** Server unreachable. A network error or server is unavailable. See `userInfo` for details. */ + FIRInstallationsErrorCodeServerUnreachable = 2, + + /** FirebaseApp configuration issues e.g. invalid GMP-App-ID, etc. See `userInfo` for details. + */ + FIRInstallationsErrorCodeInvalidConfiguration = 3, + +} NS_SWIFT_NAME(InstallationsErrorCode); diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Public/FirebaseInstallations/FirebaseInstallations.h b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Public/FirebaseInstallations/FirebaseInstallations.h new file mode 100644 index 0000000..8a9b3c1 --- /dev/null +++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Public/FirebaseInstallations/FirebaseInstallations.h @@ -0,0 +1,19 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRInstallations.h" +#import "FIRInstallationsAuthTokenResult.h" +#import "FIRInstallationsErrors.h" diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Resources/PrivacyInfo.xcprivacy b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Resources/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..1e83fa6 --- /dev/null +++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Resources/PrivacyInfo.xcprivacy @@ -0,0 +1,30 @@ + + + + + NSPrivacyTracking + + NSPrivacyTrackingDomains + + + NSPrivacyCollectedDataTypes + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypeOtherDiagnosticData + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + NSPrivacyCollectedDataTypePurposeAnalytics + + + + NSPrivacyAccessedAPITypes + + + + + diff --git a/Pods/FirebaseInstallations/LICENSE b/Pods/FirebaseInstallations/LICENSE new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/Pods/FirebaseInstallations/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/Pods/FirebaseInstallations/README.md b/Pods/FirebaseInstallations/README.md new file mode 100644 index 0000000..15a560d --- /dev/null +++ b/Pods/FirebaseInstallations/README.md @@ -0,0 +1,302 @@ +

+ + + + + + + + +
+ + + + + + +

+ +# Firebase Apple Open Source Development + +This repository contains the source code for all Apple platform Firebase SDKs except FirebaseAnalytics. + +Firebase is an app development platform with tools to help you build, grow, and +monetize your app. More information about Firebase can be found on the +[official Firebase website](https://firebase.google.com). + +## Installation + +See the subsections below for details about the different installation methods. Where +available, it's recommended to install any libraries with a `Swift` suffix to get the +best experience when writing your app in Swift. + +1. [Standard pod install](#standard-pod-install) +2. [Swift Package Manager](#swift-package-manager) +3. [Installing from the GitHub repo](#installing-from-github) +4. [Experimental Carthage](#carthage-ios-only) + +### Standard pod install + +For instructions on the standard pod install, visit: +[https://firebase.google.com/docs/ios/setup](https://firebase.google.com/docs/ios/setup). + +### Swift Package Manager + +Instructions for [Swift Package Manager](https://swift.org/package-manager/) support can be +found in the [SwiftPackageManager.md](SwiftPackageManager.md) Markdown file. + +### Installing from GitHub + +These instructions can be used to access the Firebase repo at other branches, +tags, or commits. + +#### Background + +See [the Podfile Syntax Reference](https://guides.cocoapods.org/syntax/podfile.html#pod) +for instructions and options about overriding pod source locations. + +#### Accessing Firebase Source Snapshots + +All official releases are tagged in this repo and available via CocoaPods. To access a local +source snapshot or unreleased branch, use Podfile directives like the following: + +To access FirebaseFirestore via a branch: +```ruby +pod 'FirebaseCore', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :branch => 'main' +pod 'FirebaseFirestore', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :branch => 'main' +``` + +To access FirebaseMessaging via a checked-out version of the firebase-ios-sdk repo: +```ruby +pod 'FirebaseCore', :path => '/path/to/firebase-ios-sdk' +pod 'FirebaseMessaging', :path => '/path/to/firebase-ios-sdk' +``` + +### Carthage (iOS only) + +Instructions for the experimental Carthage distribution can be found at +[Carthage.md](Carthage.md). + +### Using Firebase from a Framework or a library + +For details on using Firebase from a Framework or a library, refer to [firebase_in_libraries.md](docs/firebase_in_libraries.md). + +## Development + +To develop Firebase software in this repository, ensure that you have at least +the following software: + +* Xcode 16.2 (or later) + +CocoaPods is still the canonical way to develop, but much of the repo now supports +development with Swift Package Manager. + +### CocoaPods + +Install the following: +* CocoaPods 1.12.0 (or later) +* [CocoaPods generate](https://github.com/square/cocoapods-generate) + +For the pod that you want to develop: + +```ruby +pod gen Firebase{name here}.podspec --local-sources=./ --auto-open --platforms=ios +``` + +Note: If the CocoaPods cache is out of date, you may need to run +`pod repo update` before the `pod gen` command. + +Note: Set the `--platforms` option to `macos` or `tvos` to develop/test for +those platforms. Since 10.2, Xcode does not properly handle multi-platform +CocoaPods workspaces. + +Firestore has a self-contained Xcode project. See +[Firestore/README](Firestore/README.md) Markdown file. + +#### Development for Catalyst +* `pod gen {name here}.podspec --local-sources=./ --auto-open --platforms=ios` +* Check the Mac box in the App-iOS Build Settings +* Sign the App in the Settings Signing & Capabilities tab +* Click Pods in the Project Manager +* Add Signing to the iOS host app and unit test targets +* Select the Unit-unit scheme +* Run it to build and test + +Alternatively, disable signing in each target: +* Go to Build Settings tab +* Click `+` +* Select `Add User-Defined Setting` +* Add `CODE_SIGNING_REQUIRED` setting with a value of `NO` + +### Swift Package Manager +* To enable test schemes: `./scripts/setup_spm_tests.sh` +* `open Package.swift` or double click `Package.swift` in Finder. +* Xcode will open the project + * Choose a scheme for a library to build or test suite to run + * Choose a target platform by selecting the run destination along with the scheme + +### Adding a New Firebase Pod + +Refer to [AddNewPod](docs/AddNewPod.md) Markdown file for details. + +### Managing Headers and Imports + +For information about managing headers and imports, see [HeadersImports](HeadersImports.md) Markdown file. + +### Code Formatting + +To ensure that the code is formatted consistently, run the script +[./scripts/check.sh](https://github.com/firebase/firebase-ios-sdk/blob/main/scripts/check.sh) +before creating a pull request (PR). + +GitHub Actions will verify that any code changes are done in a style-compliant +way. Install `clang-format` and `mint`: + +```console +brew install clang-format@21 +brew install mint +``` + +### Running Unit Tests + +Select a scheme and press Command-u to build a component and run its unit tests. + +### Running Sample Apps +To run the sample apps and integration tests, you'll need a valid +`GoogleService-Info.plist +` file. The Firebase Xcode project contains dummy plist +files without real values, but they can be replaced with real plist files. To get your own +`GoogleService-Info.plist` files: + +1. Go to the [Firebase Console](https://console.firebase.google.com/) +2. Create a new Firebase project, if you don't already have one +3. For each sample app you want to test, create a new Firebase app with the sample app's bundle +identifier (e.g., `com.google.Database-Example`) +4. Download the resulting `GoogleService-Info.plist` and add it to the Xcode project. + +### Coverage Report Generation + +For coverage report generation instructions, see [scripts/code_coverage_report/README](scripts/code_coverage_report/README.md) Markdown file. + +## Specific Component Instructions +See the sections below for any special instructions for those components. + +### Firebase AI Logic + +See the [Firebase AI Logic README](FirebaseAI#development) for instructions +about building and testing the SDK. + +### Firebase Auth + +For specific Firebase Auth development, refer to the [Auth Sample README](FirebaseAuth/Tests/Sample/README.md) for instructions about +building and running the FirebaseAuth pod along with various samples and tests. + +### Firebase Database + +The Firebase Database Integration tests can be run against a locally running Database Emulator +or against a production instance. + +To run against a local emulator instance, invoke `./scripts/run_database_emulator.sh start` before +running the integration test. + +To run against a production instance, provide a valid `GoogleServices-Info.plist` and copy it to +`FirebaseDatabase/Tests/Resources/GoogleService-Info.plist`. Your Security Rule must be set to +[public](https://firebase.google.com/docs/database/security/quickstart) while your tests are +running. + +### Firebase Dynamic Links + +Firebase Dynamic Links is **deprecated** and should not be used in new projects. The service will shut down on August 25, 2025. + +Please see our [Dynamic Links Deprecation FAQ documentation](https://firebase.google.com/support/dynamic-links-faq) for more guidance. + +### Firebase Performance Monitoring + +For specific Firebase Performance Monitoring development, see +[the Performance README](FirebasePerformance/README.md) for instructions about building the SDK +and [the Performance TestApp README](FirebasePerformance/Tests/TestApp/README.md) for instructions about +integrating Performance with the dev test App. + +### Firebase Storage + +To run the Storage Integration tests, follow the instructions in +[StorageIntegration.swift](FirebaseStorage/Tests/Integration/StorageIntegration.swift). + +#### Push Notifications + +Push notifications can only be delivered to specially provisioned App IDs in the developer portal. +In order to test receiving push notifications, you will need to: + +1. Change the bundle identifier of the sample app to something you own in your Apple Developer +account and enable that App ID for push notifications. +2. You'll also need to +[upload your APNs Provider Authentication Key or certificate to the +Firebase Console](https://firebase.google.com/docs/cloud-messaging/ios/certs) +at **Project Settings > Cloud Messaging > [Your Firebase App]**. +3. Ensure your iOS device is added to your Apple Developer portal as a test device. + +#### iOS Simulator + +The iOS Simulator cannot register for remote notifications and will not receive push notifications. +To receive push notifications, follow the steps above and run the app on a physical device. + +## Building with Firebase on Apple platforms + +Firebase provides official beta support for macOS, Catalyst, and tvOS. visionOS and watchOS +are community supported. Thanks to community contributions for many of the multi-platform PRs. + +At this time, most of Firebase's products are available across Apple platforms. There are still +a few gaps, especially on visionOS and watchOS. For details about the current support matrix, see +[this chart](https://firebase.google.com/docs/ios/learn-more#firebase_library_support_by_platform) +in Firebase's documentation. + +### visionOS + +Where supported, visionOS works as expected with the exception of Firestore via Swift Package +Manager where it is required to use the source distribution. + +To enable the Firestore source distribution, quit Xcode and open the desired +project from the command line with the `FIREBASE_SOURCE_FIRESTORE` environment +variable: `open --env FIREBASE_SOURCE_FIRESTORE /path/to/project.xcodeproj`. +To go back to using the binary distribution of Firestore, quit Xcode and open +Xcode like normal, without the environment variable. + +### watchOS +Thanks to contributions from the community, many of Firebase SDKs now compile, run unit tests, and +work on watchOS. See the [Independent Watch App Sample](Example/watchOSSample). + +Keep in mind that watchOS is not officially supported by Firebase. While we can catch basic unit +test issues with GitHub Actions, there may be some changes where the SDK no longer works as expected +on watchOS. If you encounter this, please +[file an issue](https://github.com/firebase/firebase-ios-sdk/issues). + +During app setup in the console, you may get to a step that mentions something like "Checking if the +app has communicated with our servers". This relies on Analytics and will not work on watchOS. +**It's safe to ignore the message and continue**, the rest of the SDKs will work as expected. + +#### Additional Crashlytics Notes +* watchOS has limited support. Due to watchOS restrictions, mach exceptions and signal crashes are +not recorded. (Crashes in SwiftUI are generated as mach exceptions, so will not be recorded) + +## Combine +Thanks to contributions from the community, _FirebaseCombineSwift_ contains support for Apple's Combine +framework. This module is currently under development and not yet supported for use in production +environments. For more details, please refer to the [docs](FirebaseCombineSwift/README.md). + +## Roadmap + +See [Roadmap](ROADMAP.md) for more about the Firebase Apple SDK Open Source +plans and directions. + +## Contributing + +See [Contributing](CONTRIBUTING.md) for more information on contributing to the Firebase +Apple SDK. + +## License + +The contents of this repository are licensed under the +[Apache License, version 2.0](http://www.apache.org/licenses/LICENSE-2.0). + +Your use of Firebase is governed by the +[Terms of Service for Firebase Services](https://firebase.google.com/terms/). diff --git a/Pods/FirebaseRemoteConfigInterop/FirebaseRemoteConfig/Interop/RemoteConfigConstants.swift b/Pods/FirebaseRemoteConfigInterop/FirebaseRemoteConfig/Interop/RemoteConfigConstants.swift new file mode 100644 index 0000000..f9a10e4 --- /dev/null +++ b/Pods/FirebaseRemoteConfigInterop/FirebaseRemoteConfig/Interop/RemoteConfigConstants.swift @@ -0,0 +1,21 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation + +@objc(FIRRemoteConfigConstants) +public final class RemoteConfigConstants: NSObject { + @objc(FIRNamespaceGoogleMobilePlatform) public static let NamespaceGoogleMobilePlatform = + "firebase" +} diff --git a/Pods/FirebaseRemoteConfigInterop/FirebaseRemoteConfig/Interop/RemoteConfigInterop.swift b/Pods/FirebaseRemoteConfigInterop/FirebaseRemoteConfig/Interop/RemoteConfigInterop.swift new file mode 100644 index 0000000..b7988ef --- /dev/null +++ b/Pods/FirebaseRemoteConfigInterop/FirebaseRemoteConfig/Interop/RemoteConfigInterop.swift @@ -0,0 +1,21 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation + +@objc(FIRRemoteConfigInterop) +public protocol RemoteConfigInterop { + func registerRolloutsStateSubscriber(_ subscriber: RolloutsStateSubscriber, + for namespace: String) +} diff --git a/Pods/FirebaseRemoteConfigInterop/FirebaseRemoteConfig/Interop/RolloutAssignment.swift b/Pods/FirebaseRemoteConfigInterop/FirebaseRemoteConfig/Interop/RolloutAssignment.swift new file mode 100644 index 0000000..715412b --- /dev/null +++ b/Pods/FirebaseRemoteConfigInterop/FirebaseRemoteConfig/Interop/RolloutAssignment.swift @@ -0,0 +1,47 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation + +@objc(FIRRolloutAssignment) +public class RolloutAssignment: NSObject { + @objc public var rolloutId: String + @objc public var variantId: String + @objc public var templateVersion: Int64 + @objc public var parameterKey: String + @objc public var parameterValue: String + + @objc public init(rolloutId: String, variantId: String, templateVersion: Int64, + parameterKey: String, + parameterValue: String) { + self.rolloutId = rolloutId + self.variantId = variantId + self.templateVersion = templateVersion + self.parameterKey = parameterKey + self.parameterValue = parameterValue + super.init() + } +} + +@objc(FIRRolloutsState) +public class RolloutsState: NSObject { + @objc public var assignments: Set = Set() + + @objc public init(assignmentList: [RolloutAssignment]) { + for assignment in assignmentList { + assignments.insert(assignment) + } + super.init() + } +} diff --git a/Pods/FirebaseRemoteConfigInterop/FirebaseRemoteConfig/Interop/RolloutsStateSubscriber.swift b/Pods/FirebaseRemoteConfigInterop/FirebaseRemoteConfig/Interop/RolloutsStateSubscriber.swift new file mode 100644 index 0000000..88e5ba8 --- /dev/null +++ b/Pods/FirebaseRemoteConfigInterop/FirebaseRemoteConfig/Interop/RolloutsStateSubscriber.swift @@ -0,0 +1,20 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation + +@objc(FIRRolloutsStateSubscriber) +public protocol RolloutsStateSubscriber { + func rolloutsStateDidChange(_ rolloutsState: RolloutsState) +} diff --git a/Pods/FirebaseRemoteConfigInterop/LICENSE b/Pods/FirebaseRemoteConfigInterop/LICENSE new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/Pods/FirebaseRemoteConfigInterop/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/Pods/FirebaseRemoteConfigInterop/README.md b/Pods/FirebaseRemoteConfigInterop/README.md new file mode 100644 index 0000000..15a560d --- /dev/null +++ b/Pods/FirebaseRemoteConfigInterop/README.md @@ -0,0 +1,302 @@ +

+ + + + + + + + +
+ + + + + + +

+ +# Firebase Apple Open Source Development + +This repository contains the source code for all Apple platform Firebase SDKs except FirebaseAnalytics. + +Firebase is an app development platform with tools to help you build, grow, and +monetize your app. More information about Firebase can be found on the +[official Firebase website](https://firebase.google.com). + +## Installation + +See the subsections below for details about the different installation methods. Where +available, it's recommended to install any libraries with a `Swift` suffix to get the +best experience when writing your app in Swift. + +1. [Standard pod install](#standard-pod-install) +2. [Swift Package Manager](#swift-package-manager) +3. [Installing from the GitHub repo](#installing-from-github) +4. [Experimental Carthage](#carthage-ios-only) + +### Standard pod install + +For instructions on the standard pod install, visit: +[https://firebase.google.com/docs/ios/setup](https://firebase.google.com/docs/ios/setup). + +### Swift Package Manager + +Instructions for [Swift Package Manager](https://swift.org/package-manager/) support can be +found in the [SwiftPackageManager.md](SwiftPackageManager.md) Markdown file. + +### Installing from GitHub + +These instructions can be used to access the Firebase repo at other branches, +tags, or commits. + +#### Background + +See [the Podfile Syntax Reference](https://guides.cocoapods.org/syntax/podfile.html#pod) +for instructions and options about overriding pod source locations. + +#### Accessing Firebase Source Snapshots + +All official releases are tagged in this repo and available via CocoaPods. To access a local +source snapshot or unreleased branch, use Podfile directives like the following: + +To access FirebaseFirestore via a branch: +```ruby +pod 'FirebaseCore', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :branch => 'main' +pod 'FirebaseFirestore', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :branch => 'main' +``` + +To access FirebaseMessaging via a checked-out version of the firebase-ios-sdk repo: +```ruby +pod 'FirebaseCore', :path => '/path/to/firebase-ios-sdk' +pod 'FirebaseMessaging', :path => '/path/to/firebase-ios-sdk' +``` + +### Carthage (iOS only) + +Instructions for the experimental Carthage distribution can be found at +[Carthage.md](Carthage.md). + +### Using Firebase from a Framework or a library + +For details on using Firebase from a Framework or a library, refer to [firebase_in_libraries.md](docs/firebase_in_libraries.md). + +## Development + +To develop Firebase software in this repository, ensure that you have at least +the following software: + +* Xcode 16.2 (or later) + +CocoaPods is still the canonical way to develop, but much of the repo now supports +development with Swift Package Manager. + +### CocoaPods + +Install the following: +* CocoaPods 1.12.0 (or later) +* [CocoaPods generate](https://github.com/square/cocoapods-generate) + +For the pod that you want to develop: + +```ruby +pod gen Firebase{name here}.podspec --local-sources=./ --auto-open --platforms=ios +``` + +Note: If the CocoaPods cache is out of date, you may need to run +`pod repo update` before the `pod gen` command. + +Note: Set the `--platforms` option to `macos` or `tvos` to develop/test for +those platforms. Since 10.2, Xcode does not properly handle multi-platform +CocoaPods workspaces. + +Firestore has a self-contained Xcode project. See +[Firestore/README](Firestore/README.md) Markdown file. + +#### Development for Catalyst +* `pod gen {name here}.podspec --local-sources=./ --auto-open --platforms=ios` +* Check the Mac box in the App-iOS Build Settings +* Sign the App in the Settings Signing & Capabilities tab +* Click Pods in the Project Manager +* Add Signing to the iOS host app and unit test targets +* Select the Unit-unit scheme +* Run it to build and test + +Alternatively, disable signing in each target: +* Go to Build Settings tab +* Click `+` +* Select `Add User-Defined Setting` +* Add `CODE_SIGNING_REQUIRED` setting with a value of `NO` + +### Swift Package Manager +* To enable test schemes: `./scripts/setup_spm_tests.sh` +* `open Package.swift` or double click `Package.swift` in Finder. +* Xcode will open the project + * Choose a scheme for a library to build or test suite to run + * Choose a target platform by selecting the run destination along with the scheme + +### Adding a New Firebase Pod + +Refer to [AddNewPod](docs/AddNewPod.md) Markdown file for details. + +### Managing Headers and Imports + +For information about managing headers and imports, see [HeadersImports](HeadersImports.md) Markdown file. + +### Code Formatting + +To ensure that the code is formatted consistently, run the script +[./scripts/check.sh](https://github.com/firebase/firebase-ios-sdk/blob/main/scripts/check.sh) +before creating a pull request (PR). + +GitHub Actions will verify that any code changes are done in a style-compliant +way. Install `clang-format` and `mint`: + +```console +brew install clang-format@21 +brew install mint +``` + +### Running Unit Tests + +Select a scheme and press Command-u to build a component and run its unit tests. + +### Running Sample Apps +To run the sample apps and integration tests, you'll need a valid +`GoogleService-Info.plist +` file. The Firebase Xcode project contains dummy plist +files without real values, but they can be replaced with real plist files. To get your own +`GoogleService-Info.plist` files: + +1. Go to the [Firebase Console](https://console.firebase.google.com/) +2. Create a new Firebase project, if you don't already have one +3. For each sample app you want to test, create a new Firebase app with the sample app's bundle +identifier (e.g., `com.google.Database-Example`) +4. Download the resulting `GoogleService-Info.plist` and add it to the Xcode project. + +### Coverage Report Generation + +For coverage report generation instructions, see [scripts/code_coverage_report/README](scripts/code_coverage_report/README.md) Markdown file. + +## Specific Component Instructions +See the sections below for any special instructions for those components. + +### Firebase AI Logic + +See the [Firebase AI Logic README](FirebaseAI#development) for instructions +about building and testing the SDK. + +### Firebase Auth + +For specific Firebase Auth development, refer to the [Auth Sample README](FirebaseAuth/Tests/Sample/README.md) for instructions about +building and running the FirebaseAuth pod along with various samples and tests. + +### Firebase Database + +The Firebase Database Integration tests can be run against a locally running Database Emulator +or against a production instance. + +To run against a local emulator instance, invoke `./scripts/run_database_emulator.sh start` before +running the integration test. + +To run against a production instance, provide a valid `GoogleServices-Info.plist` and copy it to +`FirebaseDatabase/Tests/Resources/GoogleService-Info.plist`. Your Security Rule must be set to +[public](https://firebase.google.com/docs/database/security/quickstart) while your tests are +running. + +### Firebase Dynamic Links + +Firebase Dynamic Links is **deprecated** and should not be used in new projects. The service will shut down on August 25, 2025. + +Please see our [Dynamic Links Deprecation FAQ documentation](https://firebase.google.com/support/dynamic-links-faq) for more guidance. + +### Firebase Performance Monitoring + +For specific Firebase Performance Monitoring development, see +[the Performance README](FirebasePerformance/README.md) for instructions about building the SDK +and [the Performance TestApp README](FirebasePerformance/Tests/TestApp/README.md) for instructions about +integrating Performance with the dev test App. + +### Firebase Storage + +To run the Storage Integration tests, follow the instructions in +[StorageIntegration.swift](FirebaseStorage/Tests/Integration/StorageIntegration.swift). + +#### Push Notifications + +Push notifications can only be delivered to specially provisioned App IDs in the developer portal. +In order to test receiving push notifications, you will need to: + +1. Change the bundle identifier of the sample app to something you own in your Apple Developer +account and enable that App ID for push notifications. +2. You'll also need to +[upload your APNs Provider Authentication Key or certificate to the +Firebase Console](https://firebase.google.com/docs/cloud-messaging/ios/certs) +at **Project Settings > Cloud Messaging > [Your Firebase App]**. +3. Ensure your iOS device is added to your Apple Developer portal as a test device. + +#### iOS Simulator + +The iOS Simulator cannot register for remote notifications and will not receive push notifications. +To receive push notifications, follow the steps above and run the app on a physical device. + +## Building with Firebase on Apple platforms + +Firebase provides official beta support for macOS, Catalyst, and tvOS. visionOS and watchOS +are community supported. Thanks to community contributions for many of the multi-platform PRs. + +At this time, most of Firebase's products are available across Apple platforms. There are still +a few gaps, especially on visionOS and watchOS. For details about the current support matrix, see +[this chart](https://firebase.google.com/docs/ios/learn-more#firebase_library_support_by_platform) +in Firebase's documentation. + +### visionOS + +Where supported, visionOS works as expected with the exception of Firestore via Swift Package +Manager where it is required to use the source distribution. + +To enable the Firestore source distribution, quit Xcode and open the desired +project from the command line with the `FIREBASE_SOURCE_FIRESTORE` environment +variable: `open --env FIREBASE_SOURCE_FIRESTORE /path/to/project.xcodeproj`. +To go back to using the binary distribution of Firestore, quit Xcode and open +Xcode like normal, without the environment variable. + +### watchOS +Thanks to contributions from the community, many of Firebase SDKs now compile, run unit tests, and +work on watchOS. See the [Independent Watch App Sample](Example/watchOSSample). + +Keep in mind that watchOS is not officially supported by Firebase. While we can catch basic unit +test issues with GitHub Actions, there may be some changes where the SDK no longer works as expected +on watchOS. If you encounter this, please +[file an issue](https://github.com/firebase/firebase-ios-sdk/issues). + +During app setup in the console, you may get to a step that mentions something like "Checking if the +app has communicated with our servers". This relies on Analytics and will not work on watchOS. +**It's safe to ignore the message and continue**, the rest of the SDKs will work as expected. + +#### Additional Crashlytics Notes +* watchOS has limited support. Due to watchOS restrictions, mach exceptions and signal crashes are +not recorded. (Crashes in SwiftUI are generated as mach exceptions, so will not be recorded) + +## Combine +Thanks to contributions from the community, _FirebaseCombineSwift_ contains support for Apple's Combine +framework. This module is currently under development and not yet supported for use in production +environments. For more details, please refer to the [docs](FirebaseCombineSwift/README.md). + +## Roadmap + +See [Roadmap](ROADMAP.md) for more about the Firebase Apple SDK Open Source +plans and directions. + +## Contributing + +See [Contributing](CONTRIBUTING.md) for more information on contributing to the Firebase +Apple SDK. + +## License + +The contents of this repository are licensed under the +[Apache License, version 2.0](http://www.apache.org/licenses/LICENSE-2.0). + +Your use of Firebase is governed by the +[Terms of Service for Firebase Services](https://firebase.google.com/terms/). diff --git a/Pods/FirebaseSessions/FirebaseSessions/Sources/ApplicationInfo.swift b/Pods/FirebaseSessions/FirebaseSessions/Sources/ApplicationInfo.swift new file mode 100644 index 0000000..85c42a9 --- /dev/null +++ b/Pods/FirebaseSessions/FirebaseSessions/Sources/ApplicationInfo.swift @@ -0,0 +1,123 @@ +// +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation + +internal import FirebaseCore + +#if SWIFT_PACKAGE + import FirebaseSessionsObjC +#endif // SWIFT_PACKAGE + +#if SWIFT_PACKAGE + internal import GoogleUtilities_Environment +#else + internal import GoogleUtilities +#endif // SWIFT_PACKAGE + +/// Development environment for the application. +enum DevEnvironment: String { + case prod // Prod environment + case staging // Staging environment + case autopush // Autopush environment +} + +protocol ApplicationInfoProtocol: Sendable { + /// Google App ID / GMP App ID + var appID: String { get } + + /// Version of the Firebase SDK + var sdkVersion: String { get } + + /// Crashlytics-specific device / OS filter values. + var osName: String { get } + + /// Model of the device + var deviceModel: String { get } + + /// Network information for the application + var networkInfo: NetworkInfoProtocol { get } + + /// Development environment on which the application is running. + var environment: DevEnvironment { get } + + var appBuildVersion: String { get } + + var appDisplayVersion: String { get } + + var osBuildVersion: String { get } + + var osDisplayVersion: String { get } +} + +final class ApplicationInfo: ApplicationInfoProtocol { + let appID: String + + private let networkInformation: NetworkInfoProtocol + private let envParams: [String: String] + + // Used to hold bundle info, so the `Any` params should also + // be Sendable. + private nonisolated(unsafe) let infoDict: [String: Any]? + + init(appID: String, networkInfo: NetworkInfoProtocol = NetworkInfo(), + envParams: [String: String] = ProcessInfo.processInfo.environment, + infoDict: [String: Any]? = Bundle.main.infoDictionary) { + self.appID = appID + networkInformation = networkInfo + self.envParams = envParams + self.infoDict = infoDict + } + + var sdkVersion: String { + return FirebaseVersion() + } + + var osName: String { + return GULAppEnvironmentUtil.appleDevicePlatform() + } + + var deviceModel: String { + return GULAppEnvironmentUtil.deviceSimulatorModel() ?? "" + } + + var networkInfo: NetworkInfoProtocol { + return networkInformation + } + + var environment: DevEnvironment { + if let environment = envParams["FirebaseSessionsRunEnvironment"] { + return DevEnvironment(rawValue: environment.trimmingCharacters(in: .whitespaces).lowercased()) + ?? DevEnvironment.prod + } + return DevEnvironment.prod + } + + var appBuildVersion: String { + return infoDict?["CFBundleVersion"] as? String ?? "" + } + + var appDisplayVersion: String { + return infoDict?["CFBundleShortVersionString"] as? String ?? "" + } + + var osBuildVersion: String { + return FIRSESGetSysctlEntry("kern.osversion") ?? "" + } + + var osDisplayVersion: String { + return GULAppEnvironmentUtil.systemVersion() + } +} diff --git a/Pods/FirebaseSessions/FirebaseSessions/Sources/Development/DevEventConsoleLogger.swift b/Pods/FirebaseSessions/FirebaseSessions/Sources/Development/DevEventConsoleLogger.swift new file mode 100644 index 0000000..8eeb177 --- /dev/null +++ b/Pods/FirebaseSessions/FirebaseSessions/Sources/Development/DevEventConsoleLogger.swift @@ -0,0 +1,75 @@ +// +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation + +#if SWIFT_PACKAGE + import FirebaseSessionsObjC +#endif // SWIFT_PACKAGE + +final class DevEventConsoleLogger: EventGDTLoggerProtocol { + private let commandLineArgument = "-FIRSessionsDebugEvents" + + func logEvent(event: SessionStartEvent, completion: @escaping (Result) -> Void) { + if !ProcessInfo.processInfo.arguments.contains(commandLineArgument) { + return + } + + let proto = event.encodeDecodeEvent() + prettyPrint(proto: proto) + } + + func prettyPrint(proto: firebase_appquality_sessions_SessionEvent) { + let logOutput = """ + Printing Session Event due to \"\(commandLineArgument)\" command line argument + Session Event: + event_type: \(proto.event_type) + session_data + session_id: \(proto.session_data.session_id.description) + first_session_id: \(proto.session_data.first_session_id.description) + session_index: \(proto.session_data.session_index) + event_timestamp_us: \(proto.session_data.event_timestamp_us) + firebase_installation_id: \(proto.session_data.firebase_installation_id.description) + firebase_authentication_token: + \(proto.session_data.firebase_authentication_token.description) + data_collection_status + crashlytics: \(proto.session_data.data_collection_status.crashlytics) + performance: \(proto.session_data.data_collection_status.performance) + session_sampling_rate: \(proto.session_data.data_collection_status.session_sampling_rate) + application_info + app_id: \(proto.application_info.app_id.description) + session_sdk_version: \(proto.application_info.session_sdk_version.description) + os_version: \(proto.application_info.os_version.description) + device_model: \(proto.application_info.device_model.description) + development_platform_name: \(proto.application_info.development_platform_name.description) + development_platform_version: \(proto.application_info.development_platform_version + .description) + session_sdk_version: \(proto.application_info.session_sdk_version.description) + apple_app_info + bundle_short_version: \(proto.application_info.apple_app_info.bundle_short_version + .description) + app_build_version: \(proto.application_info.apple_app_info.app_build_version.description) + network_connection_info + network_type: \(proto.application_info.apple_app_info.network_connection_info + .network_type.rawValue) + mobile_subtype: \(proto.application_info.apple_app_info.network_connection_info + .mobile_subtype.rawValue) + os_name: \(proto.application_info.apple_app_info.os_name.description) + log_environment: \(proto.application_info.log_environment) + """ + + Logger.logInfo(logOutput) + } +} diff --git a/Pods/FirebaseSessions/FirebaseSessions/Sources/Development/NanoPB+CustomStringConvertible.swift b/Pods/FirebaseSessions/FirebaseSessions/Sources/Development/NanoPB+CustomStringConvertible.swift new file mode 100644 index 0000000..28e927a --- /dev/null +++ b/Pods/FirebaseSessions/FirebaseSessions/Sources/Development/NanoPB+CustomStringConvertible.swift @@ -0,0 +1,131 @@ +// +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation + +#if SWIFT_PACKAGE + import FirebaseSessionsObjC +#endif // SWIFT_PACKAGE + +/// +/// These extensions allows us to console log properties of our Session Events +/// proto for development and debugging purposes without having to call decode +/// on each field manually. Instead you can read `.description`. +/// + +extension firebase_appquality_sessions_EventType: Swift.CustomStringConvertible { + public var description: String { + switch self { + case firebase_appquality_sessions_EventType_SESSION_START: + return "SESSION_START" + case firebase_appquality_sessions_EventType_EVENT_TYPE_UNKNOWN: + return "UNKNOWN" + default: + return "Unrecognized EventType. Please update the firebase_appquality_sessions_EventType CustomStringConvertible extension" + } + } +} + +extension firebase_appquality_sessions_DataCollectionState: Swift.CustomStringConvertible { + public var description: String { + switch self { + case firebase_appquality_sessions_DataCollectionState_COLLECTION_ENABLED: + return "ENABLED" + case firebase_appquality_sessions_DataCollectionState_COLLECTION_SAMPLED: + return "SAMPLED" + case firebase_appquality_sessions_DataCollectionState_COLLECTION_UNKNOWN: + return "UNKNOWN" + case firebase_appquality_sessions_DataCollectionState_COLLECTION_DISABLED: + return "DISABLED" + case firebase_appquality_sessions_DataCollectionState_COLLECTION_DISABLED_REMOTE: + return "DISABLED_REMOTE" + case firebase_appquality_sessions_DataCollectionState_COLLECTION_SDK_NOT_INSTALLED: + return "SDK_NOT_INSTALLED" + default: + return "Unrecognized DataCollectionState. Please update the firebase_appquality_sessions_DataCollectionState CustomStringConvertible extension" + } + } +} + +extension firebase_appquality_sessions_OsName: Swift.CustomStringConvertible { + public var description: String { + switch self { + case firebase_appquality_sessions_OsName_IOS: + return "IOS" + case firebase_appquality_sessions_OsName_IPADOS: + return "IPADOS" + case firebase_appquality_sessions_OsName_TVOS: + return "TVOS" + case firebase_appquality_sessions_OsName_IOS_ON_MAC: + return "IOS_ON_MAC" + case firebase_appquality_sessions_OsName_MACOS: + return "MACOS" + case firebase_appquality_sessions_OsName_MACCATALYST: + return "MACCATALYST" + case firebase_appquality_sessions_OsName_WATCHOS: + return "WATCHOS" + case firebase_appquality_sessions_OsName_UNKNOWN_OSNAME: + return "UNKNOWN_OSNAME" + case firebase_appquality_sessions_OsName_UNSPECIFIED: + return "UNSPECIFIED" + default: + return "Unrecognized OsName. Please update the firebase_appquality_sessions_OsName CustomStringConvertible extension" + } + } +} + +extension firebase_appquality_sessions_LogEnvironment: Swift.CustomStringConvertible { + public var description: String { + switch self { + case firebase_appquality_sessions_LogEnvironment_LOG_ENVIRONMENT_PROD: + return "PROD" + case firebase_appquality_sessions_LogEnvironment_LOG_ENVIRONMENT_STAGING: + return "STAGING" + case firebase_appquality_sessions_LogEnvironment_LOG_ENVIRONMENT_AUTOPUSH: + return "AUTOPUSH" + case firebase_appquality_sessions_LogEnvironment_LOG_ENVIRONMENT_UNKNOWN: + return "UNKNOWN" + default: + return "Unrecognized LogEnvironment. Please update the firebase_appquality_sessions_LogEnvironment CustomStringConvertible extension" + } + } +} + +// This is written like this for Swift backwards-compatibility. +// Once we upgrade to Xcode 14, this can be written as +// UnsafeMutablePointer +extension UnsafeMutablePointer: Swift.CustomStringConvertible where Pointee == pb_bytes_array_t { + public var description: String { + let decoded = FIRSESDecodeString(self) + if decoded.count == 0 { + return "" + } + return decoded + } +} + +// For an optional field +// This is written like this for Swift backwards-compatibility. +// Once we upgrade to Xcode 14, this can be written as +// UnsafeMutablePointer? +extension Optional: Swift.CustomStringConvertible + where Wrapped == UnsafeMutablePointer { + public var description: String { + guard let this = self else { + return "" + } + return this.description + } +} diff --git a/Pods/FirebaseSessions/FirebaseSessions/Sources/EventGDTLogger.swift b/Pods/FirebaseSessions/FirebaseSessions/Sources/EventGDTLogger.swift new file mode 100644 index 0000000..00798f3 --- /dev/null +++ b/Pods/FirebaseSessions/FirebaseSessions/Sources/EventGDTLogger.swift @@ -0,0 +1,56 @@ +// +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation + +internal import GoogleDataTransport + +protocol EventGDTLoggerProtocol: Sendable { + func logEvent(event: SessionStartEvent, + completion: @escaping @Sendable (Result) -> Void) +} + +/// +/// EventGDTLogger is responsible for +/// 1) Creating GDT Events and logging them to the GoogleDataTransport SDK +/// 2) Handling debugging situations (eg. running in Simulator or printing the event to console) +/// +final class EventGDTLogger: EventGDTLoggerProtocol { + let googleDataTransport: GoogleDataTransportProtocol + let devEventConsoleLogger: EventGDTLoggerProtocol + + init(googleDataTransport: GoogleDataTransportProtocol, + devEventConsoleLogger: EventGDTLoggerProtocol = DevEventConsoleLogger()) { + self.googleDataTransport = googleDataTransport + self.devEventConsoleLogger = devEventConsoleLogger + } + + /// Logs the event to FireLog, taking into account debugging cases such as running + /// in simulator. + func logEvent(event: SessionStartEvent, + completion: @escaping @Sendable (Result) -> Void) { + let gdtEvent = googleDataTransport.eventForTransport() + gdtEvent.dataObject = event + gdtEvent.qosTier = GDTCOREventQoS.qosDefault + #if targetEnvironment(simulator) + Logger.logDebug("Logging events using fast QOS due to running on a simulator") + gdtEvent.qosTier = GDTCOREventQoS.qoSFast + #endif // targetEnvironment(simulator) + + devEventConsoleLogger.logEvent(event: event) { _ in } + + googleDataTransport.logGDTEvent(event: gdtEvent, completion: completion) + } +} diff --git a/Pods/FirebaseSessions/FirebaseSessions/Sources/FirebaseSessions.swift b/Pods/FirebaseSessions/FirebaseSessions/Sources/FirebaseSessions.swift new file mode 100644 index 0000000..0894bf2 --- /dev/null +++ b/Pods/FirebaseSessions/FirebaseSessions/Sources/FirebaseSessions.swift @@ -0,0 +1,306 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation + +// Avoids exposing internal FirebaseCore APIs to Swift users. +internal import FirebaseCoreExtension +internal import FirebaseInstallations +internal import GoogleDataTransport + +#if swift(>=6.0) + internal import Promises +#elseif swift(>=5.10) + import Promises +#else + internal import Promises +#endif + +private enum GoogleDataTransportConfig { + static let sessionsLogSource = "1974" + static let sessionsTarget = GDTCORTarget.FLL +} + +@objc(FIRSessions) final class Sessions: NSObject, Library, SessionsProvider { + // MARK: - Private Variables + + /// The Firebase App ID associated with Sessions. + private let appID: String + + /// Top-level Classes in the Sessions SDK + private let coordinator: SessionCoordinatorProtocol + private let initiator: SessionInitiator + private let sessionGenerator: SessionGenerator + private let appInfo: ApplicationInfoProtocol + private let settings: SettingsProtocol + + /// Subscribers + /// `subscribers` are used to determine the Data Collection state of the Sessions SDK. + /// If any Subscribers has Data Collection enabled, the Sessions SDK will send events + private var subscribers: [SessionsSubscriber] = [] + /// `subscriberPromises` are used to wait until all Subscribers have registered + /// themselves. Subscribers must have Data Collection state available upon registering. + private var subscriberPromises: [SessionsSubscriberName: Promise] = [:] + + /// Notifications + static let SessionIDChangedNotificationName = Notification + .Name("SessionIDChangedNotificationName") + let notificationCenter = NotificationCenter() + + // MARK: - Initializers + + // Initializes the SDK and top-level classes + required convenience init(appID: String, installations: InstallationsProtocol) { + let googleDataTransport = GoogleDataTransporter( + mappingID: GoogleDataTransportConfig.sessionsLogSource, + transformers: nil, + target: GoogleDataTransportConfig.sessionsTarget + ) + + let fireLogger = EventGDTLogger(googleDataTransport: googleDataTransport) + + let appInfo = ApplicationInfo(appID: appID) + let settings = SessionsSettings( + appInfo: appInfo, + installations: installations + ) + + let sessionGenerator = SessionGenerator(collectEvents: Sessions + .shouldCollectEvents(settings: settings)) + let coordinator = SessionCoordinator( + installations: installations, + fireLogger: fireLogger + ) + + let initiator = SessionInitiator(settings: settings) + + self.init(appID: appID, + sessionGenerator: sessionGenerator, + coordinator: coordinator, + initiator: initiator, + appInfo: appInfo, + settings: settings) { result in + switch result { + case .success(()): + Logger.logInfo("Successfully logged Session Start event") + case let .failure(sessionsError): + switch sessionsError { + case let .SessionInstallationsError(error): + Logger.logError( + "Error getting Firebase Installation ID: \(error). Skipping this Session Event" + ) + case let .DataTransportError(error): + Logger + .logError( + "Error logging Session Start event to GoogleDataTransport: \(error)." + ) + case .NoDependenciesError: + Logger + .logError( + "Sessions SDK did not have any dependent SDKs register as dependencies. Events will not be sent." + ) + case .SessionSamplingError: + Logger + .logDebug( + "Sessions SDK has sampled this session" + ) + case .DisabledViaSettingsError: + Logger + .logDebug( + "Sessions SDK is disabled via Settings" + ) + case .DataCollectionError: + Logger + .logDebug( + "Data Collection is disabled for all subscribers. Skipping this Session Event" + ) + case .SessionInstallationsTimeOutError: + Logger.logError( + "Error getting Firebase Installation ID due to timeout. Skipping this Session Event" + ) + } + } + } + } + + // Initializes the SDK and begins the process of listening for lifecycle events and logging + // events. `logEventCallback` is invoked on a global background queue. + init(appID: String, sessionGenerator: SessionGenerator, coordinator: SessionCoordinatorProtocol, + initiator: SessionInitiator, appInfo: ApplicationInfoProtocol, settings: SettingsProtocol, + loggedEventCallback: @escaping @Sendable (Result) -> Void) { + self.appID = appID + + self.sessionGenerator = sessionGenerator + self.coordinator = coordinator + self.initiator = initiator + self.appInfo = appInfo + self.settings = settings + + super.init() + + let dependencies = SessionsDependencies.dependencies + for subscriberName in dependencies { + subscriberPromises[subscriberName] = Promise.pending() + } + + Logger + .logDebug( + "Version \(FirebaseVersion()). Expecting subscriptions from: \(dependencies)" + ) + + self.initiator.beginListening { + // Generating a Session ID early is important as Subscriber + // SDKs will need to read it immediately upon registration. + let sessionInfo = self.sessionGenerator.generateNewSession() + + // Post a notification so subscriber SDKs can get an updated Session ID + self.notificationCenter.post(name: Sessions.SessionIDChangedNotificationName, + object: nil) + + let event = SessionStartEvent(sessionInfo: sessionInfo, appInfo: self.appInfo) + + // If there are no Dependencies, then the Sessions SDK can't acknowledge + // any products data collection state, so the Sessions SDK won't send events. + guard !self.subscriberPromises.isEmpty else { + loggedEventCallback(.failure(.NoDependenciesError)) + return + } + + // Wait until all subscriber promises have been fulfilled before + // doing any data collection. + all(self.subscriberPromises.values).then(on: .global(qos: .background)) { _ in + guard self.isAnyDataCollectionEnabled else { + loggedEventCallback(.failure(.DataCollectionError)) + return + } + + Logger.logDebug("Data Collection is enabled for at least one Subscriber") + + // Fetch settings if they have expired. This must happen after the check for + // data collection because it uses the network, but it must happen before the + // check for sessionsEnabled from Settings because otherwise we would permanently + // turn off the Sessions SDK when we disabled it. + self.settings.updateSettings() + + self.addSubscriberFields(event: event) + event.setSamplingRate(samplingRate: self.settings.samplingRate) + + guard sessionInfo.shouldDispatchEvents else { + loggedEventCallback(.failure(.SessionSamplingError)) + return + } + + guard self.settings.sessionsEnabled else { + loggedEventCallback(.failure(.DisabledViaSettingsError)) + return + } + + self.coordinator.attemptLoggingSessionStart(event: event) { result in + loggedEventCallback(result) + } + } + } + } + + // MARK: - Sampling + + static func shouldCollectEvents(settings: SettingsProtocol) -> Bool { + // Calculate whether we should sample events using settings data + // Sampling rate of 1 means we do not sample. + let randomValue = Double.random(in: 0 ... 1) + return randomValue <= settings.samplingRate + } + + // MARK: - Data Collection + + var isAnyDataCollectionEnabled: Bool { + for subscriber in subscribers { + if subscriber.isDataCollectionEnabled { + return true + } + } + return false + } + + func addSubscriberFields(event: SessionStartEvent) { + for subscriber in subscribers { + event.set(subscriber: subscriber.sessionsSubscriberName, + isDataCollectionEnabled: subscriber.isDataCollectionEnabled, + appInfo: appInfo) + } + } + + // MARK: - SessionsProvider + + var currentSessionDetails: SessionDetails { + return SessionDetails(sessionId: sessionGenerator.currentSession?.sessionId) + } + + // This type is not actually sendable, but works around an issue below. + // It's safe only if executed on the main actor. + private struct MainActorNotificationCallback: @unchecked Sendable { + private let callback: (Notification) -> Void + + init(_ callback: @escaping (Notification) -> Void) { + self.callback = callback + } + + func invoke(notification: Notification) { + dispatchPrecondition(condition: .onQueue(.main)) + callback(notification) + } + } + + func register(subscriber: SessionsSubscriber) { + Logger + .logDebug( + "Registering Sessions SDK subscriber with name: \(subscriber.sessionsSubscriberName), data collection enabled: \(subscriber.isDataCollectionEnabled)" + ) + + // TODO(Firebase 12): After bumping to iOS 13, this hack should be replaced + // with `Task { @MainActor in }`. + let callback = MainActorNotificationCallback { notification in + subscriber.onSessionChanged(self.currentSessionDetails) + } + + // Guaranteed to execute its callback on the main queue because of the queue parameter. + notificationCenter.addObserver( + forName: Sessions.SessionIDChangedNotificationName, + object: nil, + queue: OperationQueue.main + ) { notification in + callback.invoke(notification: notification) + } + // Immediately call the callback because the Sessions SDK starts + // before subscribers, so subscribers will miss the first Notification + subscriber.onSessionChanged(currentSessionDetails) + + // Fulfil this subscriber's promise + subscribers.append(subscriber) + subscriberPromises[subscriber.sessionsSubscriberName]?.fulfill(()) + } + + // MARK: - Library conformance + + static func componentsToRegister() -> [Component] { + return [Component(SessionsProvider.self, + instantiationTiming: .alwaysEager) { container, isCacheable in + // Sessions SDK only works for the default app + guard let app = container.app, app.isDefaultApp else { return nil } + isCacheable.pointee = true + let installations = Installations.installations(app: app) + return self.init(appID: app.options.googleAppID, installations: installations) + }] + } +} diff --git a/Pods/FirebaseSessions/FirebaseSessions/Sources/FirebaseSessionsError.swift b/Pods/FirebaseSessions/FirebaseSessions/Sources/FirebaseSessionsError.swift new file mode 100644 index 0000000..6bfae66 --- /dev/null +++ b/Pods/FirebaseSessions/FirebaseSessions/Sources/FirebaseSessionsError.swift @@ -0,0 +1,35 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation + +/// Contains the list of errors that are localized for Firebase Sessions Library +enum FirebaseSessionsError: Error, Sendable { + /// Event sampling related error + case SessionSamplingError + /// Firebase Installation ID related error + case SessionInstallationsError(Error) + /// Firebase Installation ID related timeout error + case SessionInstallationsTimeOutError + /// Error from the GoogleDataTransport SDK + case DataTransportError(Error) + /// Sessions SDK is disabled via settings error + case DisabledViaSettingsError + /// Sessions SDK is disabled because all Subscribers have their + /// data collection disabled + case DataCollectionError + /// Sessions SDK didn't have any Subscribers depend + /// on it via addDependency in SessionDependencies + case NoDependenciesError +} diff --git a/Pods/FirebaseSessions/FirebaseSessions/Sources/GoogleDataTransport+GoogleDataTransportProtocol.swift b/Pods/FirebaseSessions/FirebaseSessions/Sources/GoogleDataTransport+GoogleDataTransportProtocol.swift new file mode 100644 index 0000000..e52cbb6 --- /dev/null +++ b/Pods/FirebaseSessions/FirebaseSessions/Sources/GoogleDataTransport+GoogleDataTransportProtocol.swift @@ -0,0 +1,58 @@ +// +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation + +@preconcurrency internal import GoogleDataTransport + +enum GoogleDataTransportProtocolErrors: Error { + case writeFailure +} + +protocol GoogleDataTransportProtocol: Sendable { + func logGDTEvent(event: GDTCOREvent, + completion: @escaping @Sendable (Result) -> Void) + func eventForTransport() -> GDTCOREvent +} + +/// Workaround in combo with preconcurrency import of GDT. When GDT's +/// `GDTCORTransport`type conforms to Sendable within the GDT module, +/// this can be removed. +final class GoogleDataTransporter: GoogleDataTransportProtocol { + private let transporter: GDTCORTransport + + init(mappingID: String, + transformers: [any GDTCOREventTransformer]?, + target: GDTCORTarget) { + transporter = GDTCORTransport(mappingID: mappingID, transformers: transformers, target: target)! + } + + func logGDTEvent(event: GDTCOREvent, + completion: @escaping @Sendable (Result) -> Void) { + transporter.sendDataEvent(event) { wasWritten, error in + if let error { + completion(.failure(error)) + } else if !wasWritten { + completion(.failure(GoogleDataTransportProtocolErrors.writeFailure)) + } else { + completion(.success(())) + } + } + } + + func eventForTransport() -> GDTCOREvent { + transporter.eventForTransport() + } +} diff --git a/Pods/FirebaseSessions/FirebaseSessions/Sources/Installations+InstallationsProtocol.swift b/Pods/FirebaseSessions/FirebaseSessions/Sources/Installations+InstallationsProtocol.swift new file mode 100644 index 0000000..158be0b --- /dev/null +++ b/Pods/FirebaseSessions/FirebaseSessions/Sources/Installations+InstallationsProtocol.swift @@ -0,0 +1,82 @@ +// +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation + +internal import FirebaseInstallations +internal import FirebaseCoreInternal + +protocol InstallationsProtocol: Sendable { + var installationsWaitTimeInSecond: Int { get } + + /// Override Installation function for testing + func authToken(completion: @escaping @Sendable (InstallationsAuthTokenResult?, Error?) -> Void) + + /// Override Installation function for testing + func installationID(completion: @escaping @Sendable (String?, Error?) -> Void) + + /// Return a tuple: (installationID, authenticationToken) for success result + func installationID(completion: @escaping (Result<(String, String), Error>) -> Void) +} + +extension InstallationsProtocol { + var installationsWaitTimeInSecond: Int { + return 10 + } + + // TODO(ncooke3): Convert o async await ahead of Firebase 12. + + func installationID(completion: @escaping (Result<(String, String), Error>) -> Void) { + let authTokenComplete = UnfairLock("") + let installationComplete = UnfairLock(nil) + let errorComplete = UnfairLock(nil) + + let workingGroup = DispatchGroup() + + workingGroup.enter() + authToken { (authTokenResult: InstallationsAuthTokenResult?, error: Error?) in + authTokenComplete.withLock { $0 = authTokenResult?.authToken ?? "" } + workingGroup.leave() + } + + workingGroup.enter() + installationID { (installationID: String?, error: Error?) in + if let installationID { + installationComplete.withLock { $0 = installationID } + } else if let error { + errorComplete.withLock { $0 = error } + } + workingGroup.leave() + } + + // adding timeout for 10 seconds + let result = workingGroup + .wait(timeout: .now() + DispatchTimeInterval.seconds(installationsWaitTimeInSecond)) + + switch result { + case .timedOut: + completion(.failure(FirebaseSessionsError.SessionInstallationsTimeOutError)) + return + default: + if let installationComplete = installationComplete.value() { + completion(.success((installationComplete, authTokenComplete.value()))) + } else if let errorComplete = errorComplete.value() { + completion(.failure(errorComplete)) + } + } + } +} + +extension Installations: InstallationsProtocol {} diff --git a/Pods/FirebaseSessions/FirebaseSessions/Sources/Logger.swift b/Pods/FirebaseSessions/FirebaseSessions/Sources/Logger.swift new file mode 100644 index 0000000..a8a3b3e --- /dev/null +++ b/Pods/FirebaseSessions/FirebaseSessions/Sources/Logger.swift @@ -0,0 +1,62 @@ +// +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation + +internal import FirebaseCoreExtension + +/// +/// Logger is responsible for printing console logs +/// +enum Logger { + private static let logServiceTag = "[FirebaseSessions]" + private static let logCode = "I-SES000000" + + static func logInfo(_ message: String) { + FirebaseLogger.log( + level: .info, + service: logServiceTag, + code: logCode, + message: message + ) + } + + static func logDebug(_ message: String) { + FirebaseLogger.log( + level: .debug, + service: logServiceTag, + code: logCode, + message: message + ) + } + + static func logWarning(_ message: String) { + FirebaseLogger.log( + level: .warning, + service: logServiceTag, + code: logCode, + message: message + ) + } + + static func logError(_ message: String) { + FirebaseLogger.log( + level: .error, + service: logServiceTag, + code: logCode, + message: message + ) + } +} diff --git a/Pods/FirebaseSessions/FirebaseSessions/Sources/NetworkInfo.swift b/Pods/FirebaseSessions/FirebaseSessions/Sources/NetworkInfo.swift new file mode 100644 index 0000000..8d7e411 --- /dev/null +++ b/Pods/FirebaseSessions/FirebaseSessions/Sources/NetworkInfo.swift @@ -0,0 +1,42 @@ +// +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation + +#if SWIFT_PACKAGE + import FirebaseSessionsObjC +#endif // SWIFT_PACKAGE + +#if SWIFT_PACKAGE + internal import GoogleUtilities_Environment +#else + internal import GoogleUtilities +#endif // SWIFT_PACKAGE + +protocol NetworkInfoProtocol: Sendable { + var networkType: GULNetworkType { get } + + var mobileSubtype: String { get } +} + +final class NetworkInfo: NetworkInfoProtocol { + var networkType: GULNetworkType { + return GULNetworkInfo.getNetworkType() + } + + var mobileSubtype: String { + return GULNetworkInfo.getNetworkRadioType() + } +} diff --git a/Pods/FirebaseSessions/FirebaseSessions/Sources/Public/SessionsDependencies.swift b/Pods/FirebaseSessions/FirebaseSessions/Sources/Public/SessionsDependencies.swift new file mode 100644 index 0000000..923bd1d --- /dev/null +++ b/Pods/FirebaseSessions/FirebaseSessions/Sources/Public/SessionsDependencies.swift @@ -0,0 +1,48 @@ +// +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation + +private import FirebaseCoreInternal + +/// Sessions Dependencies determines when a dependent SDK is +/// installed in the app. The Sessions SDK uses this to figure +/// out which dependencies to wait for to getting the data +/// collection state. +/// +/// This is important because the Sessions SDK starts up before +/// dependent SDKs +@objc(FIRSessionsDependencies) +public class SessionsDependencies: NSObject { + private static let _dependencies = + UnfairLock>(Set()) + + static var dependencies: Set { + _dependencies.value() + } + + @objc public static func addDependency(name: SessionsSubscriberName) { + _dependencies.withLock { dependencies in + dependencies.insert(name) + } + } + + /// For testing only. + static func removeAll() { + _dependencies.withLock { dependencies in + dependencies.removeAll() + } + } +} diff --git a/Pods/FirebaseSessions/FirebaseSessions/Sources/Public/SessionsProvider.swift b/Pods/FirebaseSessions/FirebaseSessions/Sources/Public/SessionsProvider.swift new file mode 100644 index 0000000..ef73e18 --- /dev/null +++ b/Pods/FirebaseSessions/FirebaseSessions/Sources/Public/SessionsProvider.swift @@ -0,0 +1,23 @@ +// +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation + +// Sessions Provider is the Session SDK's internal +// interface for other 1P SDKs to talk to. +@objc(FIRSessionsProvider) +public protocol SessionsProvider { + @objc func register(subscriber: SessionsSubscriber) +} diff --git a/Pods/FirebaseSessions/FirebaseSessions/Sources/Public/SessionsSubscriber.swift b/Pods/FirebaseSessions/FirebaseSessions/Sources/Public/SessionsSubscriber.swift new file mode 100644 index 0000000..3f6225f --- /dev/null +++ b/Pods/FirebaseSessions/FirebaseSessions/Sources/Public/SessionsSubscriber.swift @@ -0,0 +1,56 @@ +// +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation + +/// Sessions Subscriber is an interface that dependent SDKs +/// must implement. +@objc(FIRSessionsSubscriber) +public protocol SessionsSubscriber: Sendable { + func onSessionChanged(_ session: SessionDetails) + var isDataCollectionEnabled: Bool { get } + var sessionsSubscriberName: SessionsSubscriberName { get } +} + +/// Session Payload is a container for Session Data passed to Subscribers +/// whenever the Session changes +@objc(FIRSessionDetails) +public final class SessionDetails: NSObject, Sendable { + @objc public let sessionId: String? + + public init(sessionId: String?) { + self.sessionId = sessionId + super.init() + } +} + +/// Session Subscriber Names are used for identifying subscribers +@objc(FIRSessionsSubscriberName) +public enum SessionsSubscriberName: Int, CustomStringConvertible, Sendable { + case Unknown + case Crashlytics + case Performance + + public var description: String { + switch self { + case .Crashlytics: + return "Crashlytics" + case .Performance: + return "Performance" + default: + return "Unknown" + } + } +} diff --git a/Pods/FirebaseSessions/FirebaseSessions/Sources/SessionCoordinator.swift b/Pods/FirebaseSessions/FirebaseSessions/Sources/SessionCoordinator.swift new file mode 100644 index 0000000..09aa88c --- /dev/null +++ b/Pods/FirebaseSessions/FirebaseSessions/Sources/SessionCoordinator.swift @@ -0,0 +1,86 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation + +protocol SessionCoordinatorProtocol: Sendable { + func attemptLoggingSessionStart(event: SessionStartEvent, + callback: @escaping @Sendable (Result) -> Void) +} + +/// +/// SessionCoordinator is responsible for coordinating the systems in this SDK +/// involved with sending a Session Start event. +/// +final class SessionCoordinator: SessionCoordinatorProtocol { + let installations: InstallationsProtocol + + let fireLogger: EventGDTLoggerProtocol + + init(installations: InstallationsProtocol, + fireLogger: EventGDTLoggerProtocol) { + self.installations = installations + self.fireLogger = fireLogger + } + + /// Begins the process of logging a SessionStartEvent to FireLog after + /// it has been approved for sending + func attemptLoggingSessionStart(event: SessionStartEvent, + callback: @escaping @Sendable (Result< + Void, + FirebaseSessionsError + >) + -> Void) { + /// Order of execution + /// 1. Fetch the installations Id. Regardless of success, move to step 2 + /// 2. Log the event. If successful, all is good. Else, log the message with error. + /// 3. If there was a FireLog error, expose it to the callback. Otherwise expose the FIID + /// error if it exists. Otherwise, success. + fillInFIID(event: event) { fiidResult in + self.fireLogger.logEvent(event: event) { logResult in + switch logResult { + case .success(): + Logger.logDebug("Successfully logged Session Start event to GoogleDataTransport") + + switch fiidResult { + case .success(()): + callback(.success(())) + case let .failure(error): + callback(.failure(error)) + } + case let .failure(error): + callback(.failure(FirebaseSessionsError.DataTransportError(error))) + } + } + } + } + + private func fillInFIID(event: SessionStartEvent, + callback: @escaping (Result) + -> Void) { + installations.installationID { result in + switch result { + case let .success(installationsInfo): + event.setInstallationID(installationId: installationsInfo.0) + event.setAuthenticationToken(authenticationToken: installationsInfo.1) + callback(.success(())) + case let .failure(error): + event.setInstallationID(installationId: "") + event.setAuthenticationToken(authenticationToken: "") + callback(.failure(FirebaseSessionsError.SessionInstallationsError(error))) + } + } + } +} diff --git a/Pods/FirebaseSessions/FirebaseSessions/Sources/SessionGenerator.swift b/Pods/FirebaseSessions/FirebaseSessions/Sources/SessionGenerator.swift new file mode 100644 index 0000000..a237f87 --- /dev/null +++ b/Pods/FirebaseSessions/FirebaseSessions/Sources/SessionGenerator.swift @@ -0,0 +1,76 @@ +// +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation + +internal import FirebaseInstallations + +struct SessionInfo { + let sessionId: String + let firstSessionId: String + let shouldDispatchEvents: Bool + let sessionIndex: Int32 + + init(sessionId: String, firstSessionId: String, dispatchEvents: Bool, sessionIndex: Int32) { + self.sessionId = sessionId + self.firstSessionId = firstSessionId + shouldDispatchEvents = dispatchEvents + self.sessionIndex = sessionIndex + } +} + +/// +/// Generator is responsible for: +/// 1) Generating the Session ID +/// 2) Persisting and reading the Session ID from the last session +/// (Maybe) 3) Persisting, reading, and incrementing an increasing index +/// +class SessionGenerator { + private var thisSession: SessionInfo? + + private var firstSessionId = "" + private var sessionIndex: Int32 + private var collectEvents: Bool + + init(collectEvents: Bool) { + // This will be incremented to 0 on the first generation + sessionIndex = -1 + + self.collectEvents = collectEvents + } + + // Generates a new Session ID. If there was already a generated Session ID + // from the last session during the app's lifecycle, it will also set the last Session ID + func generateNewSession() -> SessionInfo { + let newSessionId = UUID().uuidString.replacingOccurrences(of: "-", with: "").lowercased() + + // If firstSessionId is set, use it. Otherwise set it to the + // first generated Session ID + firstSessionId = firstSessionId.isEmpty ? newSessionId : firstSessionId + + sessionIndex += 1 + + let newSession = SessionInfo(sessionId: newSessionId, + firstSessionId: firstSessionId, + dispatchEvents: collectEvents, + sessionIndex: sessionIndex) + thisSession = newSession + return newSession + } + + var currentSession: SessionInfo? { + return thisSession + } +} diff --git a/Pods/FirebaseSessions/FirebaseSessions/Sources/SessionInitiator.swift b/Pods/FirebaseSessions/FirebaseSessions/Sources/SessionInitiator.swift new file mode 100644 index 0000000..0255983 --- /dev/null +++ b/Pods/FirebaseSessions/FirebaseSessions/Sources/SessionInitiator.swift @@ -0,0 +1,121 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation +#if os(iOS) || os(tvOS) || os(visionOS) + import UIKit +#elseif os(macOS) + import AppKit + import Cocoa +#elseif os(watchOS) + import WatchKit +#endif // os(iOS) || os(tvOS) + +#if SWIFT_PACKAGE + internal import GoogleUtilities_Environment +#else + internal import GoogleUtilities +#endif // SWIFT_PACKAGE + +/// The SessionInitiator is responsible for: +/// 1) Running the initiate callback whenever a Session Start Event should +/// begin sending. This can happen at a cold start of the app, and when it +/// been in the background for a period of time (originally set at 30 mins) +/// and comes to the foreground. +/// +class SessionInitiator { + let currentTime: () -> Date + let settings: SettingsProtocol + private var backgroundTime = Date.distantFuture + private var initiateSessionStart: () -> Void = {} + + init(settings: SettingsProtocol, currentTimeProvider: @escaping () -> Date = Date.init) { + currentTime = currentTimeProvider + self.settings = settings + } + + func beginListening(initiateSessionStart: @escaping () -> Void) { + self.initiateSessionStart = initiateSessionStart + self.initiateSessionStart() + + let notificationCenter = NotificationCenter.default + #if os(iOS) || os(tvOS) || os(visionOS) + // Change background update event listener for iPadOS 26 multi-windowing support + if #available(iOS 26, *), GULAppEnvironmentUtil.appleDevicePlatform().contains("ipados") { + notificationCenter.addObserver( + self, + selector: #selector(appBackgrounded), + name: UIApplication.willResignActiveNotification, + object: nil + ) + } else { + notificationCenter.addObserver( + self, + selector: #selector(appBackgrounded), + name: UIApplication.didEnterBackgroundNotification, + object: nil + ) + } + notificationCenter.addObserver( + self, + selector: #selector(appForegrounded), + name: UIApplication.didBecomeActiveNotification, + object: nil + ) + #elseif os(macOS) + notificationCenter.addObserver( + self, + selector: #selector(appBackgrounded), + name: NSApplication.didResignActiveNotification, + object: nil + ) + notificationCenter.addObserver( + self, + selector: #selector(appForegrounded), + name: NSApplication.didBecomeActiveNotification, + object: nil + ) + #elseif os(watchOS) + // Versions below WatchOS 7 do not support lifecycle events + if #available(watchOSApplicationExtension 7.0, *) { + notificationCenter.addObserver( + self, + selector: #selector(appBackgrounded), + name: WKExtension.applicationDidEnterBackgroundNotification, + object: nil + ) + notificationCenter.addObserver( + self, + selector: #selector(appForegrounded), + name: WKExtension.applicationDidBecomeActiveNotification, + object: nil + ) + } + #endif // os(iOS) || os(tvOS) + } + + @objc private func appBackgrounded() { + backgroundTime = currentTime() + } + + @objc private func appForegrounded() { + let interval = currentTime().timeIntervalSince(backgroundTime) + + // If the interval is greater than the session timeout duration, generate + // a new session. + if interval > settings.sessionTimeout { + initiateSessionStart() + } + } +} diff --git a/Pods/FirebaseSessions/FirebaseSessions/Sources/SessionStartEvent.swift b/Pods/FirebaseSessions/FirebaseSessions/Sources/SessionStartEvent.swift new file mode 100644 index 0000000..8b39290 --- /dev/null +++ b/Pods/FirebaseSessions/FirebaseSessions/Sources/SessionStartEvent.swift @@ -0,0 +1,300 @@ +// +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation + +internal import GoogleDataTransport + +#if SWIFT_PACKAGE + import FirebaseSessionsObjC +#endif // SWIFT_PACKAGE + +#if SWIFT_PACKAGE + internal import GoogleUtilities_Environment +#else + internal import GoogleUtilities +#endif // SWIFT_PACKAGE + +/// +/// SessionStartEvent is responsible for: +/// 1) Writing fields to the Session proto +/// 2) Synthesizing itself for persisting to disk and logging to GoogleDataTransport +/// +class SessionStartEvent: NSObject, GDTCOREventDataObject { + var proto: firebase_appquality_sessions_SessionEvent + + init(sessionInfo: SessionInfo, appInfo: ApplicationInfoProtocol, + time: TimeProvider = Time()) { + proto = firebase_appquality_sessions_SessionEvent() + + super.init() + + // Note: If you add a proto string field here, remember to free it in the deinit. + proto.event_type = firebase_appquality_sessions_EventType_SESSION_START + proto.session_data.session_id = makeProtoString(sessionInfo.sessionId) + proto.session_data.first_session_id = makeProtoString(sessionInfo.firstSessionId) + proto.session_data.session_index = sessionInfo.sessionIndex + proto.session_data.event_timestamp_us = time.timestampUS + + proto.application_info.app_id = makeProtoString(appInfo.appID) + proto.application_info.session_sdk_version = makeProtoString(appInfo.sdkVersion) + proto.application_info.os_version = makeProtoString(appInfo.osDisplayVersion) + proto.application_info.log_environment = convertLogEnvironment(environment: appInfo.environment) + proto.application_info.device_model = makeProtoString(appInfo.deviceModel) +// proto.application_info.development_platform_name; +// proto.application_info.development_platform_version; + + // `which_platform_info` tells nanopb which oneof we're choosing to fill in for our proto + proto.application_info.which_platform_info = FIRSESGetAppleApplicationInfoTag() + proto.application_info.apple_app_info + .bundle_short_version = makeProtoString(appInfo.appDisplayVersion) + proto.application_info.apple_app_info + .app_build_version = makeProtoString(appInfo.appBuildVersion) + proto.application_info.apple_app_info.os_name = convertOSName(osName: appInfo.osName) + + // Set network info to base values but don't fill them in with the real + // value because these are only tracked when Performance is installed + proto.application_info.apple_app_info.mcc_mnc = makeProtoString("") + proto.application_info.apple_app_info.network_connection_info + .network_type = convertNetworkType(networkType: .none) + proto.application_info.apple_app_info.network_connection_info + .mobile_subtype = convertMobileSubtype(mobileSubtype: "") + + proto.session_data.data_collection_status + .crashlytics = firebase_appquality_sessions_DataCollectionState_COLLECTION_SDK_NOT_INSTALLED + proto.session_data.data_collection_status + .performance = firebase_appquality_sessions_DataCollectionState_COLLECTION_SDK_NOT_INSTALLED + } + + deinit { + let garbage: [UnsafeMutablePointer?] = [ + proto.application_info.app_id, + proto.application_info.apple_app_info.app_build_version, + proto.application_info.apple_app_info.bundle_short_version, + proto.application_info.apple_app_info.mcc_mnc, + proto.application_info.development_platform_name, + proto.application_info.development_platform_version, + proto.application_info.device_model, + proto.application_info.os_version, + proto.application_info.session_sdk_version, + proto.session_data.session_id, + proto.session_data.firebase_installation_id, + proto.session_data.firebase_authentication_token, + proto.session_data.first_session_id, + ] + for pointer in garbage { + nanopb_free(pointer) + } + } + + func setInstallationID(installationId: String) { + let oldID = proto.session_data.firebase_installation_id + proto.session_data.firebase_installation_id = makeProtoString(installationId) + nanopb_free(oldID) + } + + func setAuthenticationToken(authenticationToken: String) { + let oldToken = proto.session_data.firebase_authentication_token + proto.session_data.firebase_authentication_token = makeProtoString(authenticationToken) + nanopb_free(oldToken) + } + + func setSamplingRate(samplingRate: Double) { + proto.session_data.data_collection_status.session_sampling_rate = samplingRate + } + + func set(subscriber: SessionsSubscriberName, isDataCollectionEnabled: Bool, + appInfo: ApplicationInfoProtocol) { + let dataCollectionState = makeDataCollectionProto(isDataCollectionEnabled) + switch subscriber { + case .Crashlytics: + proto.session_data.data_collection_status.crashlytics = dataCollectionState + case .Performance: + proto.session_data.data_collection_status.performance = dataCollectionState + default: + Logger + .logWarning("Attempted to set Data Collection status for unknown Subscriber: \(subscriber)") + } + + // Only set restricted fields if Data Collection is enabled. If it's disabled, + // we're treating that as if the product isn't installed. + if isDataCollectionEnabled { + setRestrictedFields(subscriber: subscriber, + appInfo: appInfo) + } + } + + /// This method should be called for every subscribed Subscriber. This is for cases where + /// fields should only be collected if a specific SDK is installed. + private func setRestrictedFields(subscriber: SessionsSubscriberName, + appInfo: ApplicationInfoProtocol) { + switch subscriber { + case .Performance: + let oldString = proto.application_info.apple_app_info.mcc_mnc + proto.application_info.apple_app_info.mcc_mnc = makeProtoString("") + nanopb_free(oldString) + proto.application_info.apple_app_info.network_connection_info + .network_type = convertNetworkType(networkType: appInfo.networkInfo.networkType) + proto.application_info.apple_app_info.network_connection_info + .mobile_subtype = convertMobileSubtype(mobileSubtype: appInfo.networkInfo.mobileSubtype) + default: + break + } + } + + // MARK: - GDTCOREventDataObject + + func transportBytes() -> Data { + return FIRSESTransportBytes(&proto) + } + + // MARK: - Data Conversion + + func makeDataCollectionProto(_ isDataCollectionEnabled: Bool) + -> firebase_appquality_sessions_DataCollectionState { + if isDataCollectionEnabled { + return firebase_appquality_sessions_DataCollectionState_COLLECTION_ENABLED + } else { + return firebase_appquality_sessions_DataCollectionState_COLLECTION_DISABLED + } + } + + private func makeProtoStringOrNil(_ string: String?) -> UnsafeMutablePointer? { + guard let string = string else { + return nil + } + return FIRSESEncodeString(string) + } + + private func makeProtoString(_ string: String) -> UnsafeMutablePointer? { + return FIRSESEncodeString(string) + } + + private func convertOSName(osName: String) -> firebase_appquality_sessions_OsName { + switch osName.lowercased() { + case "macos": + return firebase_appquality_sessions_OsName_MACOS + case "maccatalyst": + return firebase_appquality_sessions_OsName_MACCATALYST + case "ios_on_mac": + return firebase_appquality_sessions_OsName_IOS_ON_MAC + case "ios": + return firebase_appquality_sessions_OsName_IOS + case "tvos": + return firebase_appquality_sessions_OsName_TVOS + case "watchos": + return firebase_appquality_sessions_OsName_WATCHOS + case "ipados": + return firebase_appquality_sessions_OsName_IPADOS + default: + Logger.logWarning("Found unknown OSName: \"\(osName)\" while converting.") + return firebase_appquality_sessions_OsName_UNKNOWN_OSNAME + } + } + + /// Encodes the proto in this SessionStartEvent to Data, and then decodes the Data back into + /// the proto object and returns the decoded proto. This is used for validating encoding works + /// and should not be used in production code. + func encodeDecodeEvent() -> firebase_appquality_sessions_SessionEvent { + let transportBytes = self.transportBytes() + var proto = firebase_appquality_sessions_SessionEvent() + var fields = firebase_appquality_sessions_SessionEvent_fields + + let bytes = (transportBytes as NSData).bytes + var istream: pb_istream_t = pb_istream_from_buffer(bytes, transportBytes.count) + + if !pb_decode(&istream, &fields.0, &proto) { + let errorMessage = FIRSESPBGetError(istream) + if errorMessage.count > 0 { + Logger.logError("Session Event failed to decode transportBytes: \(errorMessage)") + } + } + return proto + } + + /// Converts the provided log environment to its Proto format. + private func convertLogEnvironment(environment: DevEnvironment) + -> firebase_appquality_sessions_LogEnvironment { + switch environment { + case .prod: + return firebase_appquality_sessions_LogEnvironment_LOG_ENVIRONMENT_PROD + case .staging: + return firebase_appquality_sessions_LogEnvironment_LOG_ENVIRONMENT_STAGING + case .autopush: + return firebase_appquality_sessions_LogEnvironment_LOG_ENVIRONMENT_AUTOPUSH + } + } + + private func convertNetworkType(networkType: GULNetworkType) + -> firebase_appquality_sessions_NetworkConnectionInfo_NetworkType { + switch networkType { + case .WIFI: + return firebase_appquality_sessions_NetworkConnectionInfo_NetworkType_WIFI + case .mobile: + return firebase_appquality_sessions_NetworkConnectionInfo_NetworkType_MOBILE + case .none: + return firebase_appquality_sessions_NetworkConnectionInfo_NetworkType_DUMMY + @unknown default: + return firebase_appquality_sessions_NetworkConnectionInfo_NetworkType_DUMMY + } + } + + private func convertMobileSubtype(mobileSubtype: String) + -> firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype { + var subtype: firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype + + #if os(iOS) && !targetEnvironment(macCatalyst) + switch mobileSubtype { + case CTRadioAccessTechnologyGPRS: + subtype = firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_GPRS + case CTRadioAccessTechnologyEdge: + subtype = firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_EDGE + case CTRadioAccessTechnologyWCDMA: + subtype = firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_CDMA + case CTRadioAccessTechnologyCDMA1x: + subtype = firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_CDMA + case CTRadioAccessTechnologyHSDPA: + subtype = firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_HSDPA + case CTRadioAccessTechnologyHSUPA: + subtype = firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_HSUPA + case CTRadioAccessTechnologyCDMAEVDORev0: + subtype = firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_EVDO_0 + case CTRadioAccessTechnologyCDMAEVDORevA: + subtype = firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_EVDO_A + case CTRadioAccessTechnologyCDMAEVDORevB: + subtype = firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_EVDO_B + case CTRadioAccessTechnologyeHRPD: + subtype = firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_EHRPD + case CTRadioAccessTechnologyLTE: + subtype = firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_LTE + default: + subtype = + firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_UNKNOWN_MOBILE_SUBTYPE + } + + if #available(iOS 14.1, *) { + if mobileSubtype == CTRadioAccessTechnologyNRNSA || mobileSubtype == + CTRadioAccessTechnologyNR { + subtype = firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_NR + } + } + #else // os(iOS) && !targetEnvironment(macCatalyst) + subtype = + firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_UNKNOWN_MOBILE_SUBTYPE + #endif // os(iOS) && !targetEnvironment(macCatalyst) + + return subtype + } +} diff --git a/Pods/FirebaseSessions/FirebaseSessions/Sources/Settings/LocalOverrideSettings.swift b/Pods/FirebaseSessions/FirebaseSessions/Sources/Settings/LocalOverrideSettings.swift new file mode 100644 index 0000000..e096120 --- /dev/null +++ b/Pods/FirebaseSessions/FirebaseSessions/Sources/Settings/LocalOverrideSettings.swift @@ -0,0 +1,60 @@ +// +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation + +/// Class that manages the local overrides configs related to the library. +class LocalOverrideSettings: SettingsProvider { + private enum PlistKey: String { + /// This will disable Sessions SDK Events, but not Settings requests. + /// If any apps use this flag to disable the Firebase Sessions SDK, + /// keep in mind this may break metrics future features with products like + /// FirePerf and Crashlytics. As a result, we would recommend apps + /// use another way to disable data collection (like disabling it via + /// the product public data collection APIs themselves). + /// This flag is internal and may break in the future. + case sessionsEnabled = "FirebaseSessionsEnabled" + case sessionsTimeout = "FirebaseSessionsTimeout" + case sessionsSamplingRate = "FirebaseSessionsSampingRate" + } + + var sessionsEnabled: Bool? { + let isEnabled = plistValue(for: .sessionsEnabled) + return isEnabled as? Bool + } + + var sessionTimeout: TimeInterval? { + let timeout = plistValue(for: .sessionsTimeout) + return timeout as? Double + } + + var samplingRate: Double? { + let rate = plistValue(for: .sessionsSamplingRate) + return rate as? Double + } + + private func plistValue(for key: PlistKey) -> Any? { + return Bundle.main.infoDictionary?[key.rawValue] + } + + func updateSettings() { + // Nothing to be done since there is nothing to be updated. + } + + func isSettingsStale() -> Bool { + // Settings are never stale since all of these are local settings from Plist + return false + } +} diff --git a/Pods/FirebaseSessions/FirebaseSessions/Sources/Settings/RemoteSettings.swift b/Pods/FirebaseSessions/FirebaseSessions/Sources/Settings/RemoteSettings.swift new file mode 100644 index 0000000..5429e02 --- /dev/null +++ b/Pods/FirebaseSessions/FirebaseSessions/Sources/Settings/RemoteSettings.swift @@ -0,0 +1,105 @@ +// +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation +internal import FirebaseCoreInternal + +/// Extends ApplicationInfoProtocol to string-format a combined appDisplayVersion and +/// appBuildVersion +extension ApplicationInfoProtocol { + var synthesizedVersion: String { return "\(appDisplayVersion) (\(appBuildVersion))" } +} + +final class RemoteSettings: SettingsProvider, Sendable { + private static let flagSessionsEnabled = "sessions_enabled" + private static let flagSamplingRate = "sampling_rate" + private static let flagSessionTimeout = "session_timeout_seconds" + private static let flagSessionsCache = "app_quality" + private let appInfo: ApplicationInfoProtocol + private let downloader: SettingsDownloadClient + private let cache: UnfairLock + + private var sessionsCache: [String: Any] { + cache.withLock { cache in + cache.cacheContent[RemoteSettings.flagSessionsCache] as? [String: Any] ?? [:] + } + } + + init(appInfo: ApplicationInfoProtocol, + downloader: SettingsDownloadClient, + cache: SettingsCacheClient = SettingsCache()) { + self.appInfo = appInfo + self.cache = UnfairLock(cache) + self.downloader = downloader + } + + private func fetchAndCacheSettings(currentTime: Date) { + let shouldFetch = cache.withLock { cache in + // Only fetch if cache is expired, otherwise do nothing + guard cache.isExpired(for: appInfo, time: currentTime) else { + Logger.logDebug("[Settings] Cache is not expired, no fetch will be made.") + return false + } + return true + } + + if shouldFetch { + downloader.fetch { result in + + switch result { + case let .success(dictionary): + self.cache.withLock { cache in + // Saves all newly fetched Settings to cache + cache.cacheContent = dictionary + // Saves a "cache-key" which carries TTL metadata about current cache + cache.cacheKey = CacheKey( + createdAt: currentTime, + googleAppID: self.appInfo.appID, + appVersion: self.appInfo.synthesizedVersion + ) + } + case let .failure(error): + Logger.logError("[Settings] Fetching newest settings failed with error: \(error)") + } + } + } + } + + var sessionsEnabled: Bool? { + return sessionsCache[RemoteSettings.flagSessionsEnabled] as? Bool + } + + var samplingRate: Double? { + return sessionsCache[RemoteSettings.flagSamplingRate] as? Double + } + + var sessionTimeout: TimeInterval? { + return sessionsCache[RemoteSettings.flagSessionTimeout] as? Double + } + + func updateSettings(currentTime: Date) { + fetchAndCacheSettings(currentTime: currentTime) + } + + func updateSettings() { + updateSettings(currentTime: Date()) + } + + func isSettingsStale() -> Bool { + cache.withLock { cache in + cache.isExpired(for: appInfo, time: Date()) + } + } +} diff --git a/Pods/FirebaseSessions/FirebaseSessions/Sources/Settings/SDKDefaultSettings.swift b/Pods/FirebaseSessions/FirebaseSessions/Sources/Settings/SDKDefaultSettings.swift new file mode 100644 index 0000000..9c11822 --- /dev/null +++ b/Pods/FirebaseSessions/FirebaseSessions/Sources/Settings/SDKDefaultSettings.swift @@ -0,0 +1,46 @@ +// +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation + +/// Class that manages the local overrides configs related to the library. +class SDKDefaultSettings: SettingsProvider { + var sessionsEnabled: Bool? { + // Default is sessions enabled + return true + } + + var sessionTimeout: TimeInterval? { + // Default is 30 minutes + return 30 * 60 + } + + var samplingRate: Double? { + // Default is all events are dispatched + return 1.0 + } +} + +typealias SDKDefaultSettingsProvider = SDKDefaultSettings +extension SDKDefaultSettingsProvider { + func updateSettings() { + // Nothing to be done since there is nothing to be updated. + } + + func isSettingsStale() -> Bool { + // Settings are never stale since all of these are local settings from Plist + return false + } +} diff --git a/Pods/FirebaseSessions/FirebaseSessions/Sources/Settings/SessionsSettings.swift b/Pods/FirebaseSessions/FirebaseSessions/Sources/Settings/SessionsSettings.swift new file mode 100644 index 0000000..1871eb4 --- /dev/null +++ b/Pods/FirebaseSessions/FirebaseSessions/Sources/Settings/SessionsSettings.swift @@ -0,0 +1,84 @@ +// +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation + +/// Class that manages the configs related to the settings library +class SessionsSettings: SettingsProtocol { + private let appInfo: ApplicationInfoProtocol + private let installations: InstallationsProtocol + private let sdkDefaults: SDKDefaultSettings + private let localOverrides: LocalOverrideSettings + private let remoteSettings: RemoteSettings + + convenience init(appInfo: ApplicationInfoProtocol, installations: InstallationsProtocol) { + self.init(appInfo: appInfo, + installations: installations, + sdkDefaults: SDKDefaultSettings(), + localOverrides: LocalOverrideSettings(), + remoteSettings: RemoteSettings(appInfo: appInfo, + downloader: SettingsDownloader(appInfo: appInfo, + installations: installations))) + } + + init(appInfo: ApplicationInfoProtocol, + installations: InstallationsProtocol, + sdkDefaults: SDKDefaultSettings, + localOverrides: LocalOverrideSettings, + remoteSettings: RemoteSettings) { + self.appInfo = appInfo + self.installations = installations + self.sdkDefaults = sdkDefaults + self.localOverrides = localOverrides + self.remoteSettings = remoteSettings + } + + var sessionsEnabled: Bool { + // Order of precedence LocalOverrides > Remote Settings > SDK Defaults + if let sessionEnabled = localOverrides.sessionsEnabled { + return sessionEnabled + } else if let sessionEnabled = remoteSettings.sessionsEnabled { + return sessionEnabled + } + return sdkDefaults.sessionsEnabled! + } + + var sessionTimeout: TimeInterval { + // Order of precedence LocalOverrides > Remote Settings > SDK Defaults + if let sessionTimeout = localOverrides.sessionTimeout { + return sessionTimeout + } else if let sessionTimeout = remoteSettings.sessionTimeout { + return sessionTimeout + } + return sdkDefaults.sessionTimeout! + } + + var samplingRate: Double { + // Order of precedence LocalOverrides > Remote Settings > SDK Defaults + if let samplingRate = localOverrides.samplingRate { + return samplingRate + } else if let samplingRate = remoteSettings.samplingRate { + return samplingRate + } + return sdkDefaults.samplingRate! + } + + func updateSettings() { + // Update the settings for all the settings providers + sdkDefaults.updateSettings() + remoteSettings.updateSettings() + localOverrides.updateSettings() + } +} diff --git a/Pods/FirebaseSessions/FirebaseSessions/Sources/Settings/SettingsCacheClient.swift b/Pods/FirebaseSessions/FirebaseSessions/Sources/Settings/SettingsCacheClient.swift new file mode 100644 index 0000000..79a2e1f --- /dev/null +++ b/Pods/FirebaseSessions/FirebaseSessions/Sources/Settings/SettingsCacheClient.swift @@ -0,0 +1,135 @@ +// +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation + +// TODO: sendable (remove preconcurrency) +#if SWIFT_PACKAGE + @preconcurrency internal import GoogleUtilities_UserDefaults +#else + @preconcurrency internal import GoogleUtilities +#endif // SWIFT_PACKAGE + +/// CacheKey is like a "key" to a "safe". It provides necessary metadata about the current cache to +/// know if it should be expired. +struct CacheKey: Codable { + var createdAt: Date + var googleAppID: String + var appVersion: String +} + +/// SettingsCacheClient is responsible for accessing the cache that Settings are stored in. +protocol SettingsCacheClient: Sendable { + /// Returns in-memory cache content in O(1) time. Returns empty dictionary if it does not exist in + /// cache. + var cacheContent: [String: Any] { get set } + /// Returns in-memory cache-key, no performance guarantee because type-casting depends on size of + /// CacheKey + var cacheKey: CacheKey? { get set } + /// Removes all cache content and cache-key + func removeCache() + /// Returns whether the cache is expired for the given app info structure and time. + func isExpired(for appInfo: ApplicationInfoProtocol, time: Date) -> Bool +} + +/// SettingsCache uses UserDefaults to store Settings on-disk, but also directly query UserDefaults +/// when accessing Settings values during run-time. This is because UserDefaults encapsulates both +/// in-memory and persisted-on-disk storage, allowing fast synchronous access in-app while hiding +/// away the complexity of managing persistence asynchronously. +final class SettingsCache: SettingsCacheClient { + private static let cacheDurationSecondsDefault: TimeInterval = 60 * 60 + private static let flagCacheDuration = "cache_duration" + private static let settingsVersion: Int = 1 + private enum UserDefaultsKeys { + static let forContent = "firebase-sessions-settings" + static let forCacheKey = "firebase-sessions-cache-key" + } + + /// UserDefaults holds values in memory, making access O(1) and synchronous within the app, while + /// abstracting away async disk IO. + private let cache: GULUserDefaults = .standard() + + /// Converting to dictionary is O(1) because object conversion is O(1) + var cacheContent: [String: Any] { + get { + return (cache.object(forKey: UserDefaultsKeys.forContent) as? [String: Any]) ?? [:] + } + set { + cache.setObject(newValue, forKey: UserDefaultsKeys.forContent) + } + } + + /// Casting to Codable from Data is O(n) + var cacheKey: CacheKey? { + get { + if let data = cache.object(forKey: UserDefaultsKeys.forCacheKey) as? Data { + do { + return try JSONDecoder().decode(CacheKey.self, from: data) + } catch { + Logger.logError("[Settings] Decoding CacheKey failed with error: \(error)") + } + } + return nil + } + set { + do { + try cache.setObject(JSONEncoder().encode(newValue), forKey: UserDefaultsKeys.forCacheKey) + } catch { + Logger.logError("[Settings] Encoding CacheKey failed with error: \(error)") + } + } + } + + /// Removes stored cache + func removeCache() { + cache.setObject(nil, forKey: UserDefaultsKeys.forContent) + cache.setObject(nil, forKey: UserDefaultsKeys.forCacheKey) + } + + func isExpired(for appInfo: ApplicationInfoProtocol, time: Date) -> Bool { + guard !cacheContent.isEmpty else { + removeCache() + return true + } + guard let cacheKey = cacheKey else { + Logger.logError("[Settings] Could not load settings cache key") + removeCache() + return true + } + guard cacheKey.googleAppID == appInfo.appID else { + Logger + .logDebug("[Settings] Cache expired because Google App ID changed") + removeCache() + return true + } + if time.timeIntervalSince(cacheKey.createdAt) > cacheDuration() { + Logger.logDebug("[Settings] Cache TTL expired") + return true + } + if appInfo.synthesizedVersion != cacheKey.appVersion { + Logger.logDebug("[Settings] Cache expired because app version changed") + return true + } + return false + } + + private func cacheDuration() -> TimeInterval { + guard let duration = cacheContent[Self.flagCacheDuration] as? Double else { + return Self.cacheDurationSecondsDefault + } + Logger.logDebug("[Settings] Cache duration: \(duration)") + return duration + } +} diff --git a/Pods/FirebaseSessions/FirebaseSessions/Sources/Settings/SettingsDownloadClient.swift b/Pods/FirebaseSessions/FirebaseSessions/Sources/Settings/SettingsDownloadClient.swift new file mode 100644 index 0000000..a1e1dea --- /dev/null +++ b/Pods/FirebaseSessions/FirebaseSessions/Sources/Settings/SettingsDownloadClient.swift @@ -0,0 +1,109 @@ +// +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation + +#if SWIFT_PACKAGE + internal import GoogleUtilities_Environment +#else + internal import GoogleUtilities +#endif // SWIFT_PACKAGE + +protocol SettingsDownloadClient: Sendable { + func fetch(completion: @Sendable @escaping (Result<[String: Any], SettingsDownloaderError>) + -> Void) +} + +enum SettingsDownloaderError: Error { + /// Error constructing the URL + case URLError(String) + /// Error from the URLSession task + case URLSessionError(String) + /// Error parsing the JSON response from Settings + case JSONParseError(String) + /// Error getting the Installation ID + case InstallationIDError(String) +} + +final class SettingsDownloader: SettingsDownloadClient { + private let appInfo: ApplicationInfoProtocol + private let installations: InstallationsProtocol + + init(appInfo: ApplicationInfoProtocol, installations: InstallationsProtocol) { + self.appInfo = appInfo + self.installations = installations + } + + func fetch(completion: @Sendable @escaping (Result<[String: Any], SettingsDownloaderError>) + -> Void) { + guard let validURL = url else { + completion(.failure(.URLError("Invalid URL"))) + return + } + + installations.installationID { result in + switch result { + case let .success(installationsInfo): + let request = self.buildRequest(url: validURL, fiid: installationsInfo.0) + let task = URLSession.shared.dataTask(with: request) { data, response, error in + if let data { + if let dict = try? JSONSerialization.jsonObject(with: data) as? [String: Any] { + completion(.success(dict)) + } else { + completion(.failure( + .JSONParseError("Failed to parse JSON to dictionary") + )) + } + } else if let error { + completion(.failure(.URLSessionError(error.localizedDescription))) + } + } + // Start the task that sends the network request + task.resume() + case let .failure(error): + completion(.failure(.InstallationIDError(error.localizedDescription))) + } + } + } + + private var url: URL? { + var components = URLComponents() + components.scheme = "https" + components.host = "firebase-settings.crashlytics.com" + components.path = "/spi/v2/platforms/\(appInfo.osName)/gmp/\(appInfo.appID)/settings" + components.queryItems = [ + URLQueryItem(name: "build_version", value: appInfo.appBuildVersion), + URLQueryItem(name: "display_version", value: appInfo.appDisplayVersion), + ] + return components.url + } + + private func buildRequest(url: URL, fiid: String) -> URLRequest { + var request = URLRequest(url: url) + request.setValue("application/json", forHTTPHeaderField: "Accept") + request.setValue(fiid, forHTTPHeaderField: "X-Crashlytics-Installation-ID") + request.setValue(appInfo.deviceModel, forHTTPHeaderField: "X-Crashlytics-Device-Model") + request.setValue( + appInfo.osBuildVersion, + forHTTPHeaderField: "X-Crashlytics-OS-Build-Version" + ) + request.setValue( + appInfo.osDisplayVersion, + forHTTPHeaderField: "X-Crashlytics-OS-Display-Version" + ) + request.setValue(appInfo.sdkVersion, forHTTPHeaderField: "X-Crashlytics-API-Client-Version") + return request + } +} diff --git a/Pods/FirebaseSessions/FirebaseSessions/Sources/Settings/SettingsProtocol.swift b/Pods/FirebaseSessions/FirebaseSessions/Sources/Settings/SettingsProtocol.swift new file mode 100644 index 0000000..ab145ec --- /dev/null +++ b/Pods/FirebaseSessions/FirebaseSessions/Sources/Settings/SettingsProtocol.swift @@ -0,0 +1,31 @@ +// +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation + +/// Provides the APIs to access Settings and their configuration values +protocol SettingsProtocol { + // Update the settings for all the settings providers + func updateSettings() + + // Config to show if sessions is enabled + var sessionsEnabled: Bool { get } + + // Config showing the sampling rate for sessions + var samplingRate: Double { get } + + // Background timeout config value before which a new session is generated + var sessionTimeout: TimeInterval { get } +} diff --git a/Pods/FirebaseSessions/FirebaseSessions/Sources/Settings/SettingsProvider.swift b/Pods/FirebaseSessions/FirebaseSessions/Sources/Settings/SettingsProvider.swift new file mode 100644 index 0000000..15ab257 --- /dev/null +++ b/Pods/FirebaseSessions/FirebaseSessions/Sources/Settings/SettingsProvider.swift @@ -0,0 +1,35 @@ +// +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation + +/// APIs that needs to be implemented by any settings provider +protocol SettingsProvider { + // API to update the settings + func updateSettings() + + // API to check if the settings are stale + func isSettingsStale() -> Bool + + // Config to show if sessions is enabled + var sessionsEnabled: Bool? { get } + + // Config showing the sampling rate for sessions + + var samplingRate: Double? { get } + + // Background timeout config value before which a new session is generated + var sessionTimeout: TimeInterval? { get } +} diff --git a/Pods/FirebaseSessions/FirebaseSessions/Sources/Time.swift b/Pods/FirebaseSessions/FirebaseSessions/Sources/Time.swift new file mode 100644 index 0000000..24305e8 --- /dev/null +++ b/Pods/FirebaseSessions/FirebaseSessions/Sources/Time.swift @@ -0,0 +1,31 @@ +// +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation + +protocol TimeProvider { + var timestampUS: Int64 { get } +} + +/// +/// Time is provides timestamp values in different formats to classes in the Sessions SDK. It mainly +/// exists for testing purposes. +/// +class Time: TimeProvider { + // Returns the current time as a timestamp in microseconds + var timestampUS: Int64 { + return Int64(UInt64(Date().timeIntervalSince1970) * USEC_PER_SEC) + } +} diff --git a/Pods/FirebaseSessions/FirebaseSessions/SourcesObjC/NanoPB/FIRSESNanoPBHelpers.h b/Pods/FirebaseSessions/FirebaseSessions/SourcesObjC/NanoPB/FIRSESNanoPBHelpers.h new file mode 100644 index 0000000..a0d5a6f --- /dev/null +++ b/Pods/FirebaseSessions/FirebaseSessions/SourcesObjC/NanoPB/FIRSESNanoPBHelpers.h @@ -0,0 +1,99 @@ +// +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef FIRSESNanoPBHelpers_h +#define FIRSESNanoPBHelpers_h + +#import + +#import +#if __has_include("CoreTelephony/CTTelephonyNetworkInfo.h") && !TARGET_OS_MACCATALYST && \ + !TARGET_OS_OSX && !TARGET_OS_TV +#define TARGET_HAS_MOBILE_CONNECTIVITY +#import +#import +#endif + +#import +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +/// Deinitializes a nanopb struct. Rewritten here to expose to Swift, since `pb_free` is a macro. +void nanopb_free(void* _Nullable); + +/// Returns an error associated with the istream. Written in Objective-C because Swift does not +/// support C language macros +NSString* FIRSESPBGetError(pb_istream_t istream); + +// It seems impossible to specify the nullability of the `fields` parameter below, +// yet the compiler complains that it's missing a nullability specifier. Google +// yields no results at this time. +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wnullability-completeness" +NSData* _Nullable FIRSESEncodeProto(const pb_field_t fields[], + const void* _Nonnull proto, + NSError** error); +#pragma clang diagnostic pop + +/// Callocs a pb_bytes_array and copies the given NSData bytes into the bytes array. +/// @note Memory needs to be freed manually, through pb_free or pb_release. +/// @param data The data to copy into the new bytes array. +pb_bytes_array_t* _Nullable FIRSESEncodeData(NSData* _Nullable data); + +/// Callocs a pb_bytes_array and copies the given NSString's bytes into the bytes array. +/// @note Memory needs to be freed manually, through pb_free or pb_release. +/// @param string The string to encode as pb_bytes. +pb_bytes_array_t* _Nullable FIRSESEncodeString(NSString* _Nullable string); + +/// Decodes an array of nanopb bytes into an NSData object +/// @param pbData nanopb data +NSData* FIRSESDecodeData(pb_bytes_array_t* pbData); + +/// Decodes an array of nanopb bytes into an NSString object +/// @param pbData nanopb data +NSString* FIRSESDecodeString(pb_bytes_array_t* pbData); + +/// Checks if 2 nanopb arrays are equal +/// @param array array to check +/// @param expected expected value of the array +BOOL FIRSESIsPBArrayEqual(pb_bytes_array_t* _Nullable array, pb_bytes_array_t* _Nullable expected); + +/// Checks if a nanopb string is equal to an NSString +/// @param pbString nanopb string to check +/// @param str NSString that's expected +BOOL FIRSESIsPBStringEqual(pb_bytes_array_t* _Nullable pbString, NSString* _Nullable str); + +/// Checks if a nanopb array is equal to NSData +/// @param pbArray nanopb array to check +/// @param data NSData that's expected +BOOL FIRSESIsPBDataEqual(pb_bytes_array_t* _Nullable pbArray, NSData* _Nullable data); + +/// Returns the protobuf tag number. Use this to specify which oneof message type we are +/// using for the platform\_info field. This function is required to be in Objective-C because +/// Swift does not support c-style macros. +pb_size_t FIRSESGetAppleApplicationInfoTag(void); + +/// Returns sysctl entry, useful for obtaining OS build version from the kernel. Copied from a +/// private method in GULAppEnvironmentUtil. +NSString* _Nullable FIRSESGetSysctlEntry(const char* sysctlKey); + +/// C function to bridge from Swift to do nanopb bytes transfer. +NSData* FIRSESTransportBytes(const void* _Nonnull proto); + +NS_ASSUME_NONNULL_END + +#endif /* FIRSESNanoPBHelpers_h */ diff --git a/Pods/FirebaseSessions/FirebaseSessions/SourcesObjC/NanoPB/FIRSESNanoPBHelpers.m b/Pods/FirebaseSessions/FirebaseSessions/SourcesObjC/NanoPB/FIRSESNanoPBHelpers.m new file mode 100644 index 0000000..17dd086 --- /dev/null +++ b/Pods/FirebaseSessions/FirebaseSessions/SourcesObjC/NanoPB/FIRSESNanoPBHelpers.m @@ -0,0 +1,205 @@ +// +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +#import + +#import "FirebaseSessions/SourcesObjC/NanoPB/FIRSESNanoPBHelpers.h" + +#import "FirebaseSessions/SourcesObjC/Protogen/nanopb/sessions.nanopb.h" + +@import FirebaseCoreExtension; + +#import +#import +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +void nanopb_free(void *_Nullable ptr) { + pb_free(ptr); +} + +NSError *FIRSESMakeEncodeError(NSString *description) { + return [NSError errorWithDomain:@"FIRSESEncodeError" + code:-1 + userInfo:@{@"NSLocalizedDescriptionKey" : description}]; +} + +NSString *FIRSESPBGetError(pb_istream_t istream) { + return [NSString stringWithCString:PB_GET_ERROR(&istream) encoding:NSASCIIStringEncoding]; +} + +// It seems impossible to specify the nullability of the `fields` parameter below, +// yet the compiler complains that it's missing a nullability specifier. Google +// yields no results at this time. +// +// Note 4/17/2023: The warning seems to be spurious (pb_field_t is a non-pointer +// type) and is not present on Xcode 14+. This pragma can be removed after the +// minimum supported Xcode version is above 14. +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wnullability-completeness" +NSData *_Nullable FIRSESEncodeProto(const pb_field_t fields[], + const void *_Nonnull proto, + NSError **error) { + pb_ostream_t sizestream = PB_OSTREAM_SIZING; + + // Encode 1 time to determine the size. + if (!pb_encode(&sizestream, fields, proto)) { + NSString *errorString = [NSString + stringWithFormat:@"Error in nanopb encoding to get size: %s", PB_GET_ERROR(&sizestream)]; + if (error != NULL) { + *error = FIRSESMakeEncodeError(errorString); + } + return nil; + } + + // Encode a 2nd time to actually get the bytes from it. + size_t bufferSize = sizestream.bytes_written; + CFMutableDataRef dataRef = CFDataCreateMutable(CFAllocatorGetDefault(), bufferSize); + CFDataSetLength(dataRef, bufferSize); + pb_ostream_t ostream = pb_ostream_from_buffer((void *)CFDataGetBytePtr(dataRef), bufferSize); + if (!pb_encode(&ostream, fields, proto)) { + NSString *errorString = + [NSString stringWithFormat:@"Error in nanopb encoding: %s", PB_GET_ERROR(&sizestream)]; + if (error != NULL) { + *error = FIRSESMakeEncodeError(errorString); + } + CFBridgingRelease(dataRef); + return nil; + } + + return CFBridgingRelease(dataRef); +} +#pragma clang diagnostic pop + +/** Callocs a pb_bytes_array and copies the given NSData bytes into the bytes array. + * @note Memory needs to be free manually, through pb_free or pb_release. + * @param data The data to copy into the new bytes array. + */ +pb_bytes_array_t *_Nullable FIRSESEncodeData(NSData *_Nullable data) { + pb_bytes_array_t *pbBytes = calloc(1, PB_BYTES_ARRAY_T_ALLOCSIZE(data.length)); + if (pbBytes == NULL) { + return NULL; + } + [data getBytes:pbBytes->bytes length:data.length]; + pbBytes->size = (pb_size_t)data.length; + return pbBytes; +} + +/** Callocs a pb_bytes_array and copies the given NSString's bytes into the bytes array. + * @note Memory needs to be freed manually, through pb_free or pb_release. + * @param string The string to encode as pb_bytes. + */ +pb_bytes_array_t *_Nullable FIRSESEncodeString(NSString *_Nullable string) { + if ([string isMemberOfClass:[NSNull class]]) { + string = nil; + } + NSString *stringToEncode = string ? string : @""; + NSData *stringBytes = [stringToEncode dataUsingEncoding:NSUTF8StringEncoding]; + return FIRSESEncodeData(stringBytes); +} + +NSData *FIRSESDecodeData(pb_bytes_array_t *pbData) { + NSData *data = [NSData dataWithBytes:&(pbData->bytes) length:pbData->size]; + return data; +} + +NSString *FIRSESDecodeString(pb_bytes_array_t *pbData) { + if (pbData->size == 0) { + return @""; + } + NSData *data = FIRSESDecodeData(pbData); + // There was a bug where length 32 strings were sometimes null after encoding + // and decoding. We found that this was due to the null terminator sometimes not + // being included in the decoded code. Using stringWithCString assumes the string + // is null terminated, so we switched to initWithBytes because it takes a length. + return [[NSString alloc] initWithBytes:data.bytes + length:data.length + encoding:NSUTF8StringEncoding]; +} + +BOOL FIRSESIsPBArrayEqual(pb_bytes_array_t *_Nullable array, pb_bytes_array_t *_Nullable expected) { + // Treat the empty string as the same as a missing field + if (array == nil) { + return expected->size == 0; + } + + if (array->size != expected->size) { + return false; + } + + for (int i = 0; i < array->size; i++) { + if (expected->bytes[i] != array->bytes[i]) { + return false; + } + } + + return true; +} + +BOOL FIRSESIsPBStringEqual(pb_bytes_array_t *_Nullable pbString, NSString *_Nullable str) { + pb_bytes_array_t *expected = FIRSESEncodeString(str); + return FIRSESIsPBArrayEqual(pbString, expected); +} + +BOOL FIRSESIsPBDataEqual(pb_bytes_array_t *_Nullable pbArray, NSData *_Nullable data) { + pb_bytes_array_t *expected = FIRSESEncodeData(data); + BOOL equal = FIRSESIsPBArrayEqual(pbArray, expected); + free(expected); + return equal; +} + +pb_size_t FIRSESGetAppleApplicationInfoTag(void) { + return firebase_appquality_sessions_ApplicationInfo_apple_app_info_tag; +} + +/// Copied from a private method in GULAppEnvironmentUtil. +NSString *_Nullable FIRSESGetSysctlEntry(const char *sysctlKey) { + static NSString *entryValue; + size_t size; + sysctlbyname(sysctlKey, NULL, &size, NULL, 0); + if (size > 0) { + char *entryValueCStr = calloc(1, size); + sysctlbyname(sysctlKey, entryValueCStr, &size, NULL, 0); + entryValue = [NSString stringWithCString:entryValueCStr encoding:NSUTF8StringEncoding]; + free(entryValueCStr); + return entryValue; + } else { + return nil; + } +} + +NSData *FIRSESTransportBytes(const void *_Nonnull proto) { + const pb_field_t *fields = firebase_appquality_sessions_SessionEvent_fields; + NSError *error; + NSData *data = FIRSESEncodeProto(fields, proto, &error); + if (error != nil) { + FIRLogError( + @"FirebaseSessions", @"I-SES000001", @"%@", + [NSString stringWithFormat:@"Session Event failed to encode as proto with error: %@", + error.debugDescription]); + } + if (data == nil) { + data = [NSData data]; + FIRLogError(@"FirebaseSessions", @"I-SES000002", + @"Session Event generated nil transportBytes. Returning empty data."); + } + return data; +} + +NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseSessions/FirebaseSessions/SourcesObjC/Protogen/nanopb/sessions.nanopb.c b/Pods/FirebaseSessions/FirebaseSessions/SourcesObjC/Protogen/nanopb/sessions.nanopb.c new file mode 100644 index 0000000..f89596a --- /dev/null +++ b/Pods/FirebaseSessions/FirebaseSessions/SourcesObjC/Protogen/nanopb/sessions.nanopb.c @@ -0,0 +1,125 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* Automatically generated nanopb constant definitions */ +/* Generated by nanopb-0.3.9.9 */ + +#include "FirebaseSessions/SourcesObjC/Protogen/nanopb/sessions.nanopb.h" + +/* @@protoc_insertion_point(includes) */ +#if PB_PROTO_HEADER_VERSION != 30 +#error Regenerate this file with the current version of nanopb generator. +#endif + + + +const pb_field_t firebase_appquality_sessions_SessionEvent_fields[4] = { + PB_FIELD( 1, UENUM , SINGULAR, STATIC , FIRST, firebase_appquality_sessions_SessionEvent, event_type, event_type, 0), + PB_FIELD( 2, MESSAGE , SINGULAR, STATIC , OTHER, firebase_appquality_sessions_SessionEvent, session_data, event_type, &firebase_appquality_sessions_SessionInfo_fields), + PB_FIELD( 3, MESSAGE , SINGULAR, STATIC , OTHER, firebase_appquality_sessions_SessionEvent, application_info, session_data, &firebase_appquality_sessions_ApplicationInfo_fields), + PB_LAST_FIELD +}; + +const pb_field_t firebase_appquality_sessions_NetworkConnectionInfo_fields[3] = { + PB_FIELD( 1, UENUM , SINGULAR, STATIC , FIRST, firebase_appquality_sessions_NetworkConnectionInfo, network_type, network_type, 0), + PB_FIELD( 2, UENUM , SINGULAR, STATIC , OTHER, firebase_appquality_sessions_NetworkConnectionInfo, mobile_subtype, network_type, 0), + PB_LAST_FIELD +}; + +const pb_field_t firebase_appquality_sessions_SessionInfo_fields[8] = { + PB_FIELD( 1, BYTES , SINGULAR, POINTER , FIRST, firebase_appquality_sessions_SessionInfo, session_id, session_id, 0), + PB_FIELD( 3, BYTES , SINGULAR, POINTER , OTHER, firebase_appquality_sessions_SessionInfo, firebase_installation_id, session_id, 0), + PB_FIELD( 4, INT64 , SINGULAR, STATIC , OTHER, firebase_appquality_sessions_SessionInfo, event_timestamp_us, firebase_installation_id, 0), + PB_FIELD( 6, MESSAGE , SINGULAR, STATIC , OTHER, firebase_appquality_sessions_SessionInfo, data_collection_status, event_timestamp_us, &firebase_appquality_sessions_DataCollectionStatus_fields), + PB_FIELD( 7, BYTES , SINGULAR, POINTER , OTHER, firebase_appquality_sessions_SessionInfo, first_session_id, data_collection_status, 0), + PB_FIELD( 8, INT32 , SINGULAR, STATIC , OTHER, firebase_appquality_sessions_SessionInfo, session_index, first_session_id, 0), + PB_FIELD( 9, BYTES , SINGULAR, POINTER , OTHER, firebase_appquality_sessions_SessionInfo, firebase_authentication_token, session_index, 0), + PB_LAST_FIELD +}; + +const pb_field_t firebase_appquality_sessions_DataCollectionStatus_fields[4] = { + PB_FIELD( 1, UENUM , SINGULAR, STATIC , FIRST, firebase_appquality_sessions_DataCollectionStatus, performance, performance, 0), + PB_FIELD( 2, UENUM , SINGULAR, STATIC , OTHER, firebase_appquality_sessions_DataCollectionStatus, crashlytics, performance, 0), + PB_FIELD( 3, DOUBLE , SINGULAR, STATIC , OTHER, firebase_appquality_sessions_DataCollectionStatus, session_sampling_rate, crashlytics, 0), + PB_LAST_FIELD +}; + +const pb_field_t firebase_appquality_sessions_ApplicationInfo_fields[10] = { + PB_FIELD( 1, BYTES , SINGULAR, POINTER , FIRST, firebase_appquality_sessions_ApplicationInfo, app_id, app_id, 0), + PB_FIELD( 2, BYTES , SINGULAR, POINTER , OTHER, firebase_appquality_sessions_ApplicationInfo, device_model, app_id, 0), + PB_FIELD( 3, BYTES , SINGULAR, POINTER , OTHER, firebase_appquality_sessions_ApplicationInfo, development_platform_name, device_model, 0), + PB_FIELD( 4, BYTES , SINGULAR, POINTER , OTHER, firebase_appquality_sessions_ApplicationInfo, development_platform_version, development_platform_name, 0), + PB_ANONYMOUS_ONEOF_FIELD(platform_info, 5, MESSAGE , ONEOF, STATIC , OTHER, firebase_appquality_sessions_ApplicationInfo, android_app_info, development_platform_version, &firebase_appquality_sessions_AndroidApplicationInfo_fields), + PB_ANONYMOUS_ONEOF_FIELD(platform_info, 6, MESSAGE , ONEOF, STATIC , UNION, firebase_appquality_sessions_ApplicationInfo, apple_app_info, development_platform_version, &firebase_appquality_sessions_AppleApplicationInfo_fields), + PB_FIELD( 7, BYTES , SINGULAR, POINTER , OTHER, firebase_appquality_sessions_ApplicationInfo, session_sdk_version, apple_app_info, 0), + PB_FIELD( 8, UENUM , SINGULAR, STATIC , OTHER, firebase_appquality_sessions_ApplicationInfo, log_environment, session_sdk_version, 0), + PB_FIELD( 9, BYTES , SINGULAR, POINTER , OTHER, firebase_appquality_sessions_ApplicationInfo, os_version, log_environment, 0), + PB_LAST_FIELD +}; + +const pb_field_t firebase_appquality_sessions_AndroidApplicationInfo_fields[3] = { + PB_FIELD( 1, BYTES , SINGULAR, POINTER , FIRST, firebase_appquality_sessions_AndroidApplicationInfo, package_name, package_name, 0), + PB_FIELD( 3, BYTES , SINGULAR, POINTER , OTHER, firebase_appquality_sessions_AndroidApplicationInfo, version_name, package_name, 0), + PB_LAST_FIELD +}; + +const pb_field_t firebase_appquality_sessions_AppleApplicationInfo_fields[6] = { + PB_FIELD( 1, BYTES , SINGULAR, POINTER , FIRST, firebase_appquality_sessions_AppleApplicationInfo, bundle_short_version, bundle_short_version, 0), + PB_FIELD( 3, MESSAGE , SINGULAR, STATIC , OTHER, firebase_appquality_sessions_AppleApplicationInfo, network_connection_info, bundle_short_version, &firebase_appquality_sessions_NetworkConnectionInfo_fields), + PB_FIELD( 4, UENUM , SINGULAR, STATIC , OTHER, firebase_appquality_sessions_AppleApplicationInfo, os_name, network_connection_info, 0), + PB_FIELD( 5, BYTES , SINGULAR, POINTER , OTHER, firebase_appquality_sessions_AppleApplicationInfo, mcc_mnc, os_name, 0), + PB_FIELD( 6, BYTES , SINGULAR, POINTER , OTHER, firebase_appquality_sessions_AppleApplicationInfo, app_build_version, mcc_mnc, 0), + PB_LAST_FIELD +}; + + + + + + + + +/* Check that field information fits in pb_field_t */ +#if !defined(PB_FIELD_32BIT) +/* If you get an error here, it means that you need to define PB_FIELD_32BIT + * compile-time option. You can do that in pb.h or on compiler command line. + * + * The reason you need to do this is that some of your messages contain tag + * numbers or field sizes that are larger than what can fit in 8 or 16 bit + * field descriptors. + */ +PB_STATIC_ASSERT((pb_membersize(firebase_appquality_sessions_SessionEvent, session_data) < 65536 && pb_membersize(firebase_appquality_sessions_SessionEvent, application_info) < 65536 && pb_membersize(firebase_appquality_sessions_SessionInfo, data_collection_status) < 65536 && pb_membersize(firebase_appquality_sessions_ApplicationInfo, android_app_info) < 65536 && pb_membersize(firebase_appquality_sessions_ApplicationInfo, apple_app_info) < 65536 && pb_membersize(firebase_appquality_sessions_AppleApplicationInfo, network_connection_info) < 65536), YOU_MUST_DEFINE_PB_FIELD_32BIT_FOR_MESSAGES_firebase_appquality_sessions_SessionEvent_firebase_appquality_sessions_NetworkConnectionInfo_firebase_appquality_sessions_SessionInfo_firebase_appquality_sessions_DataCollectionStatus_firebase_appquality_sessions_ApplicationInfo_firebase_appquality_sessions_AndroidApplicationInfo_firebase_appquality_sessions_AppleApplicationInfo) +#endif + +#if !defined(PB_FIELD_16BIT) && !defined(PB_FIELD_32BIT) +/* If you get an error here, it means that you need to define PB_FIELD_16BIT + * compile-time option. You can do that in pb.h or on compiler command line. + * + * The reason you need to do this is that some of your messages contain tag + * numbers or field sizes that are larger than what can fit in the default + * 8 bit descriptors. + */ +PB_STATIC_ASSERT((pb_membersize(firebase_appquality_sessions_SessionEvent, session_data) < 256 && pb_membersize(firebase_appquality_sessions_SessionEvent, application_info) < 256 && pb_membersize(firebase_appquality_sessions_SessionInfo, data_collection_status) < 256 && pb_membersize(firebase_appquality_sessions_ApplicationInfo, android_app_info) < 256 && pb_membersize(firebase_appquality_sessions_ApplicationInfo, apple_app_info) < 256 && pb_membersize(firebase_appquality_sessions_AppleApplicationInfo, network_connection_info) < 256), YOU_MUST_DEFINE_PB_FIELD_16BIT_FOR_MESSAGES_firebase_appquality_sessions_SessionEvent_firebase_appquality_sessions_NetworkConnectionInfo_firebase_appquality_sessions_SessionInfo_firebase_appquality_sessions_DataCollectionStatus_firebase_appquality_sessions_ApplicationInfo_firebase_appquality_sessions_AndroidApplicationInfo_firebase_appquality_sessions_AppleApplicationInfo) +#endif + + +/* On some platforms (such as AVR), double is really float. + * These are not directly supported by nanopb, but see example_avr_double. + * To get rid of this error, remove any double fields from your .proto. + */ +PB_STATIC_ASSERT(sizeof(double) == 8, DOUBLE_MUST_BE_8_BYTES) + +/* @@protoc_insertion_point(eof) */ diff --git a/Pods/FirebaseSessions/FirebaseSessions/SourcesObjC/Protogen/nanopb/sessions.nanopb.h b/Pods/FirebaseSessions/FirebaseSessions/SourcesObjC/Protogen/nanopb/sessions.nanopb.h new file mode 100644 index 0000000..5b604e9 --- /dev/null +++ b/Pods/FirebaseSessions/FirebaseSessions/SourcesObjC/Protogen/nanopb/sessions.nanopb.h @@ -0,0 +1,270 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* Automatically generated nanopb header */ +/* Generated by nanopb-0.3.9.9 */ + +#ifndef PB_FIREBASE_APPQUALITY_SESSIONS_SESSIONS_NANOPB_H_INCLUDED +#define PB_FIREBASE_APPQUALITY_SESSIONS_SESSIONS_NANOPB_H_INCLUDED +#include + +/* @@protoc_insertion_point(includes) */ +#if PB_PROTO_HEADER_VERSION != 30 +#error Regenerate this file with the current version of nanopb generator. +#endif + + +/* Enum definitions */ +typedef enum _firebase_appquality_sessions_EventType { + firebase_appquality_sessions_EventType_EVENT_TYPE_UNKNOWN = 0, + firebase_appquality_sessions_EventType_SESSION_START = 1 +} firebase_appquality_sessions_EventType; +#define _firebase_appquality_sessions_EventType_MIN firebase_appquality_sessions_EventType_EVENT_TYPE_UNKNOWN +#define _firebase_appquality_sessions_EventType_MAX firebase_appquality_sessions_EventType_SESSION_START +#define _firebase_appquality_sessions_EventType_ARRAYSIZE ((firebase_appquality_sessions_EventType)(firebase_appquality_sessions_EventType_SESSION_START+1)) + +typedef enum _firebase_appquality_sessions_DataCollectionState { + firebase_appquality_sessions_DataCollectionState_COLLECTION_UNKNOWN = 0, + firebase_appquality_sessions_DataCollectionState_COLLECTION_SDK_NOT_INSTALLED = 1, + firebase_appquality_sessions_DataCollectionState_COLLECTION_ENABLED = 2, + firebase_appquality_sessions_DataCollectionState_COLLECTION_DISABLED = 3, + firebase_appquality_sessions_DataCollectionState_COLLECTION_DISABLED_REMOTE = 4, + firebase_appquality_sessions_DataCollectionState_COLLECTION_SAMPLED = 5 +} firebase_appquality_sessions_DataCollectionState; +#define _firebase_appquality_sessions_DataCollectionState_MIN firebase_appquality_sessions_DataCollectionState_COLLECTION_UNKNOWN +#define _firebase_appquality_sessions_DataCollectionState_MAX firebase_appquality_sessions_DataCollectionState_COLLECTION_SAMPLED +#define _firebase_appquality_sessions_DataCollectionState_ARRAYSIZE ((firebase_appquality_sessions_DataCollectionState)(firebase_appquality_sessions_DataCollectionState_COLLECTION_SAMPLED+1)) + +typedef enum _firebase_appquality_sessions_OsName { + firebase_appquality_sessions_OsName_UNKNOWN_OSNAME = 0, + firebase_appquality_sessions_OsName_MACOS = 1, + firebase_appquality_sessions_OsName_MACCATALYST = 2, + firebase_appquality_sessions_OsName_IOS_ON_MAC = 3, + firebase_appquality_sessions_OsName_IOS = 4, + firebase_appquality_sessions_OsName_TVOS = 5, + firebase_appquality_sessions_OsName_WATCHOS = 6, + firebase_appquality_sessions_OsName_IPADOS = 7, + firebase_appquality_sessions_OsName_UNSPECIFIED = 8 +} firebase_appquality_sessions_OsName; +#define _firebase_appquality_sessions_OsName_MIN firebase_appquality_sessions_OsName_UNKNOWN_OSNAME +#define _firebase_appquality_sessions_OsName_MAX firebase_appquality_sessions_OsName_UNSPECIFIED +#define _firebase_appquality_sessions_OsName_ARRAYSIZE ((firebase_appquality_sessions_OsName)(firebase_appquality_sessions_OsName_UNSPECIFIED+1)) + +typedef enum _firebase_appquality_sessions_LogEnvironment { + firebase_appquality_sessions_LogEnvironment_LOG_ENVIRONMENT_UNKNOWN = 0, + firebase_appquality_sessions_LogEnvironment_LOG_ENVIRONMENT_AUTOPUSH = 1, + firebase_appquality_sessions_LogEnvironment_LOG_ENVIRONMENT_STAGING = 2, + firebase_appquality_sessions_LogEnvironment_LOG_ENVIRONMENT_PROD = 3 +} firebase_appquality_sessions_LogEnvironment; +#define _firebase_appquality_sessions_LogEnvironment_MIN firebase_appquality_sessions_LogEnvironment_LOG_ENVIRONMENT_UNKNOWN +#define _firebase_appquality_sessions_LogEnvironment_MAX firebase_appquality_sessions_LogEnvironment_LOG_ENVIRONMENT_PROD +#define _firebase_appquality_sessions_LogEnvironment_ARRAYSIZE ((firebase_appquality_sessions_LogEnvironment)(firebase_appquality_sessions_LogEnvironment_LOG_ENVIRONMENT_PROD+1)) + +typedef enum _firebase_appquality_sessions_NetworkConnectionInfo_NetworkType { + firebase_appquality_sessions_NetworkConnectionInfo_NetworkType_MOBILE = 0, + firebase_appquality_sessions_NetworkConnectionInfo_NetworkType_WIFI = 1, + firebase_appquality_sessions_NetworkConnectionInfo_NetworkType_MOBILE_MMS = 2, + firebase_appquality_sessions_NetworkConnectionInfo_NetworkType_MOBILE_SUPL = 3, + firebase_appquality_sessions_NetworkConnectionInfo_NetworkType_MOBILE_DUN = 4, + firebase_appquality_sessions_NetworkConnectionInfo_NetworkType_MOBILE_HIPRI = 5, + firebase_appquality_sessions_NetworkConnectionInfo_NetworkType_WIMAX = 6, + firebase_appquality_sessions_NetworkConnectionInfo_NetworkType_BLUETOOTH = 7, + firebase_appquality_sessions_NetworkConnectionInfo_NetworkType_DUMMY = 8, + firebase_appquality_sessions_NetworkConnectionInfo_NetworkType_ETHERNET = 9, + firebase_appquality_sessions_NetworkConnectionInfo_NetworkType_MOBILE_FOTA = 10, + firebase_appquality_sessions_NetworkConnectionInfo_NetworkType_MOBILE_IMS = 11, + firebase_appquality_sessions_NetworkConnectionInfo_NetworkType_MOBILE_CBS = 12, + firebase_appquality_sessions_NetworkConnectionInfo_NetworkType_WIFI_P2P = 13, + firebase_appquality_sessions_NetworkConnectionInfo_NetworkType_MOBILE_IA = 14, + firebase_appquality_sessions_NetworkConnectionInfo_NetworkType_MOBILE_EMERGENCY = 15, + firebase_appquality_sessions_NetworkConnectionInfo_NetworkType_PROXY = 16, + firebase_appquality_sessions_NetworkConnectionInfo_NetworkType_VPN = 17 +} firebase_appquality_sessions_NetworkConnectionInfo_NetworkType; +#define _firebase_appquality_sessions_NetworkConnectionInfo_NetworkType_MIN firebase_appquality_sessions_NetworkConnectionInfo_NetworkType_MOBILE +#define _firebase_appquality_sessions_NetworkConnectionInfo_NetworkType_MAX firebase_appquality_sessions_NetworkConnectionInfo_NetworkType_VPN +#define _firebase_appquality_sessions_NetworkConnectionInfo_NetworkType_ARRAYSIZE ((firebase_appquality_sessions_NetworkConnectionInfo_NetworkType)(firebase_appquality_sessions_NetworkConnectionInfo_NetworkType_VPN+1)) + +typedef enum _firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype { + firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_UNKNOWN_MOBILE_SUBTYPE = 0, + firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_GPRS = 1, + firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_EDGE = 2, + firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_UMTS = 3, + firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_CDMA = 4, + firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_EVDO_0 = 5, + firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_EVDO_A = 6, + firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_RTT = 7, + firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_HSDPA = 8, + firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_HSUPA = 9, + firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_HSPA = 10, + firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_IDEN = 11, + firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_EVDO_B = 12, + firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_LTE = 13, + firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_EHRPD = 14, + firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_HSPAP = 15, + firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_GSM = 16, + firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_TD_SCDMA = 17, + firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_IWLAN = 18, + firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_LTE_CA = 19, + firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_NR = 20, + firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_COMBINED = 100 +} firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype; +#define _firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_MIN firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_UNKNOWN_MOBILE_SUBTYPE +#define _firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_MAX firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_COMBINED +#define _firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_ARRAYSIZE ((firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype)(firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_COMBINED+1)) + +/* Struct definitions */ +typedef struct _firebase_appquality_sessions_AndroidApplicationInfo { + pb_bytes_array_t *package_name; + pb_bytes_array_t *version_name; +/* @@protoc_insertion_point(struct:firebase_appquality_sessions_AndroidApplicationInfo) */ +} firebase_appquality_sessions_AndroidApplicationInfo; + +typedef struct _firebase_appquality_sessions_DataCollectionStatus { + firebase_appquality_sessions_DataCollectionState performance; + firebase_appquality_sessions_DataCollectionState crashlytics; + double session_sampling_rate; +/* @@protoc_insertion_point(struct:firebase_appquality_sessions_DataCollectionStatus) */ +} firebase_appquality_sessions_DataCollectionStatus; + +typedef struct _firebase_appquality_sessions_NetworkConnectionInfo { + firebase_appquality_sessions_NetworkConnectionInfo_NetworkType network_type; + firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype mobile_subtype; +/* @@protoc_insertion_point(struct:firebase_appquality_sessions_NetworkConnectionInfo) */ +} firebase_appquality_sessions_NetworkConnectionInfo; + +typedef struct _firebase_appquality_sessions_AppleApplicationInfo { + pb_bytes_array_t *bundle_short_version; + firebase_appquality_sessions_NetworkConnectionInfo network_connection_info; + firebase_appquality_sessions_OsName os_name; + pb_bytes_array_t *mcc_mnc; + pb_bytes_array_t *app_build_version; +/* @@protoc_insertion_point(struct:firebase_appquality_sessions_AppleApplicationInfo) */ +} firebase_appquality_sessions_AppleApplicationInfo; + +typedef struct _firebase_appquality_sessions_SessionInfo { + pb_bytes_array_t *session_id; + pb_bytes_array_t *firebase_installation_id; + int64_t event_timestamp_us; + firebase_appquality_sessions_DataCollectionStatus data_collection_status; + pb_bytes_array_t *first_session_id; + int32_t session_index; + pb_bytes_array_t *firebase_authentication_token; +/* @@protoc_insertion_point(struct:firebase_appquality_sessions_SessionInfo) */ +} firebase_appquality_sessions_SessionInfo; + +typedef struct _firebase_appquality_sessions_ApplicationInfo { + pb_bytes_array_t *app_id; + pb_bytes_array_t *device_model; + pb_bytes_array_t *development_platform_name; + pb_bytes_array_t *development_platform_version; + pb_size_t which_platform_info; + union { + firebase_appquality_sessions_AndroidApplicationInfo android_app_info; + firebase_appquality_sessions_AppleApplicationInfo apple_app_info; + }; + pb_bytes_array_t *session_sdk_version; + firebase_appquality_sessions_LogEnvironment log_environment; + pb_bytes_array_t *os_version; +/* @@protoc_insertion_point(struct:firebase_appquality_sessions_ApplicationInfo) */ +} firebase_appquality_sessions_ApplicationInfo; + +typedef struct _firebase_appquality_sessions_SessionEvent { + firebase_appquality_sessions_EventType event_type; + firebase_appquality_sessions_SessionInfo session_data; + firebase_appquality_sessions_ApplicationInfo application_info; +/* @@protoc_insertion_point(struct:firebase_appquality_sessions_SessionEvent) */ +} firebase_appquality_sessions_SessionEvent; + +/* Default values for struct fields */ + +/* Initializer values for message structs */ +#define firebase_appquality_sessions_SessionEvent_init_default {_firebase_appquality_sessions_EventType_MIN, firebase_appquality_sessions_SessionInfo_init_default, firebase_appquality_sessions_ApplicationInfo_init_default} +#define firebase_appquality_sessions_NetworkConnectionInfo_init_default {_firebase_appquality_sessions_NetworkConnectionInfo_NetworkType_MIN, _firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_MIN} +#define firebase_appquality_sessions_SessionInfo_init_default {NULL, NULL, 0, firebase_appquality_sessions_DataCollectionStatus_init_default, NULL, 0} +#define firebase_appquality_sessions_DataCollectionStatus_init_default {_firebase_appquality_sessions_DataCollectionState_MIN, _firebase_appquality_sessions_DataCollectionState_MIN, 0} +#define firebase_appquality_sessions_ApplicationInfo_init_default {NULL, NULL, NULL, NULL, 0, {firebase_appquality_sessions_AndroidApplicationInfo_init_default}, NULL, _firebase_appquality_sessions_LogEnvironment_MIN, NULL} +#define firebase_appquality_sessions_AndroidApplicationInfo_init_default {NULL, NULL} +#define firebase_appquality_sessions_AppleApplicationInfo_init_default {NULL, firebase_appquality_sessions_NetworkConnectionInfo_init_default, _firebase_appquality_sessions_OsName_MIN, NULL, NULL} +#define firebase_appquality_sessions_SessionEvent_init_zero {_firebase_appquality_sessions_EventType_MIN, firebase_appquality_sessions_SessionInfo_init_zero, firebase_appquality_sessions_ApplicationInfo_init_zero} +#define firebase_appquality_sessions_NetworkConnectionInfo_init_zero {_firebase_appquality_sessions_NetworkConnectionInfo_NetworkType_MIN, _firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_MIN} +#define firebase_appquality_sessions_SessionInfo_init_zero {NULL, NULL, 0, firebase_appquality_sessions_DataCollectionStatus_init_zero, NULL, 0} +#define firebase_appquality_sessions_DataCollectionStatus_init_zero {_firebase_appquality_sessions_DataCollectionState_MIN, _firebase_appquality_sessions_DataCollectionState_MIN, 0} +#define firebase_appquality_sessions_ApplicationInfo_init_zero {NULL, NULL, NULL, NULL, 0, {firebase_appquality_sessions_AndroidApplicationInfo_init_zero}, NULL, _firebase_appquality_sessions_LogEnvironment_MIN, NULL} +#define firebase_appquality_sessions_AndroidApplicationInfo_init_zero {NULL, NULL} +#define firebase_appquality_sessions_AppleApplicationInfo_init_zero {NULL, firebase_appquality_sessions_NetworkConnectionInfo_init_zero, _firebase_appquality_sessions_OsName_MIN, NULL, NULL} + +/* Field tags (for use in manual encoding/decoding) */ +#define firebase_appquality_sessions_AndroidApplicationInfo_package_name_tag 1 +#define firebase_appquality_sessions_AndroidApplicationInfo_version_name_tag 3 +#define firebase_appquality_sessions_DataCollectionStatus_performance_tag 1 +#define firebase_appquality_sessions_DataCollectionStatus_crashlytics_tag 2 +#define firebase_appquality_sessions_DataCollectionStatus_session_sampling_rate_tag 3 +#define firebase_appquality_sessions_NetworkConnectionInfo_network_type_tag 1 +#define firebase_appquality_sessions_NetworkConnectionInfo_mobile_subtype_tag 2 +#define firebase_appquality_sessions_AppleApplicationInfo_bundle_short_version_tag 1 +#define firebase_appquality_sessions_AppleApplicationInfo_app_build_version_tag 6 +#define firebase_appquality_sessions_AppleApplicationInfo_network_connection_info_tag 3 +#define firebase_appquality_sessions_AppleApplicationInfo_os_name_tag 4 +#define firebase_appquality_sessions_AppleApplicationInfo_mcc_mnc_tag 5 +#define firebase_appquality_sessions_SessionInfo_session_id_tag 1 +#define firebase_appquality_sessions_SessionInfo_first_session_id_tag 7 +#define firebase_appquality_sessions_SessionInfo_session_index_tag 8 +#define firebase_appquality_sessions_SessionInfo_firebase_installation_id_tag 3 +#define firebase_appquality_sessions_SessionInfo_event_timestamp_us_tag 4 +#define firebase_appquality_sessions_SessionInfo_data_collection_status_tag 6 +#define firebase_appquality_sessions_SessionInfo_firebase_authentication_token_tag 9 +#define firebase_appquality_sessions_ApplicationInfo_android_app_info_tag 5 +#define firebase_appquality_sessions_ApplicationInfo_apple_app_info_tag 6 +#define firebase_appquality_sessions_ApplicationInfo_app_id_tag 1 +#define firebase_appquality_sessions_ApplicationInfo_device_model_tag 2 +#define firebase_appquality_sessions_ApplicationInfo_development_platform_name_tag 3 +#define firebase_appquality_sessions_ApplicationInfo_development_platform_version_tag 4 +#define firebase_appquality_sessions_ApplicationInfo_session_sdk_version_tag 7 +#define firebase_appquality_sessions_ApplicationInfo_os_version_tag 9 +#define firebase_appquality_sessions_ApplicationInfo_log_environment_tag 8 +#define firebase_appquality_sessions_SessionEvent_event_type_tag 1 +#define firebase_appquality_sessions_SessionEvent_session_data_tag 2 +#define firebase_appquality_sessions_SessionEvent_application_info_tag 3 + +/* Struct field encoding specification for nanopb */ +extern const pb_field_t firebase_appquality_sessions_SessionEvent_fields[4]; +extern const pb_field_t firebase_appquality_sessions_NetworkConnectionInfo_fields[3]; +extern const pb_field_t firebase_appquality_sessions_SessionInfo_fields[8]; +extern const pb_field_t firebase_appquality_sessions_DataCollectionStatus_fields[4]; +extern const pb_field_t firebase_appquality_sessions_ApplicationInfo_fields[10]; +extern const pb_field_t firebase_appquality_sessions_AndroidApplicationInfo_fields[3]; +extern const pb_field_t firebase_appquality_sessions_AppleApplicationInfo_fields[6]; + +/* Maximum encoded size of messages (where known) */ +/* firebase_appquality_sessions_SessionEvent_size depends on runtime parameters */ +#define firebase_appquality_sessions_NetworkConnectionInfo_size 4 +/* firebase_appquality_sessions_SessionInfo_size depends on runtime parameters */ +#define firebase_appquality_sessions_DataCollectionStatus_size 13 +/* firebase_appquality_sessions_ApplicationInfo_size depends on runtime parameters */ +/* firebase_appquality_sessions_AndroidApplicationInfo_size depends on runtime parameters */ +/* firebase_appquality_sessions_AppleApplicationInfo_size depends on runtime parameters */ + +/* Message IDs (where set with "msgid" option) */ +#ifdef PB_MSGID + +#define SESSIONS_MESSAGES \ + + +#endif + +/* @@protoc_insertion_point(eof) */ + +#endif diff --git a/Pods/FirebaseSessions/LICENSE b/Pods/FirebaseSessions/LICENSE new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/Pods/FirebaseSessions/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/Pods/FirebaseSessions/README.md b/Pods/FirebaseSessions/README.md new file mode 100644 index 0000000..15a560d --- /dev/null +++ b/Pods/FirebaseSessions/README.md @@ -0,0 +1,302 @@ +

+ + + + + + + + +
+ + + + + + +

+ +# Firebase Apple Open Source Development + +This repository contains the source code for all Apple platform Firebase SDKs except FirebaseAnalytics. + +Firebase is an app development platform with tools to help you build, grow, and +monetize your app. More information about Firebase can be found on the +[official Firebase website](https://firebase.google.com). + +## Installation + +See the subsections below for details about the different installation methods. Where +available, it's recommended to install any libraries with a `Swift` suffix to get the +best experience when writing your app in Swift. + +1. [Standard pod install](#standard-pod-install) +2. [Swift Package Manager](#swift-package-manager) +3. [Installing from the GitHub repo](#installing-from-github) +4. [Experimental Carthage](#carthage-ios-only) + +### Standard pod install + +For instructions on the standard pod install, visit: +[https://firebase.google.com/docs/ios/setup](https://firebase.google.com/docs/ios/setup). + +### Swift Package Manager + +Instructions for [Swift Package Manager](https://swift.org/package-manager/) support can be +found in the [SwiftPackageManager.md](SwiftPackageManager.md) Markdown file. + +### Installing from GitHub + +These instructions can be used to access the Firebase repo at other branches, +tags, or commits. + +#### Background + +See [the Podfile Syntax Reference](https://guides.cocoapods.org/syntax/podfile.html#pod) +for instructions and options about overriding pod source locations. + +#### Accessing Firebase Source Snapshots + +All official releases are tagged in this repo and available via CocoaPods. To access a local +source snapshot or unreleased branch, use Podfile directives like the following: + +To access FirebaseFirestore via a branch: +```ruby +pod 'FirebaseCore', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :branch => 'main' +pod 'FirebaseFirestore', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :branch => 'main' +``` + +To access FirebaseMessaging via a checked-out version of the firebase-ios-sdk repo: +```ruby +pod 'FirebaseCore', :path => '/path/to/firebase-ios-sdk' +pod 'FirebaseMessaging', :path => '/path/to/firebase-ios-sdk' +``` + +### Carthage (iOS only) + +Instructions for the experimental Carthage distribution can be found at +[Carthage.md](Carthage.md). + +### Using Firebase from a Framework or a library + +For details on using Firebase from a Framework or a library, refer to [firebase_in_libraries.md](docs/firebase_in_libraries.md). + +## Development + +To develop Firebase software in this repository, ensure that you have at least +the following software: + +* Xcode 16.2 (or later) + +CocoaPods is still the canonical way to develop, but much of the repo now supports +development with Swift Package Manager. + +### CocoaPods + +Install the following: +* CocoaPods 1.12.0 (or later) +* [CocoaPods generate](https://github.com/square/cocoapods-generate) + +For the pod that you want to develop: + +```ruby +pod gen Firebase{name here}.podspec --local-sources=./ --auto-open --platforms=ios +``` + +Note: If the CocoaPods cache is out of date, you may need to run +`pod repo update` before the `pod gen` command. + +Note: Set the `--platforms` option to `macos` or `tvos` to develop/test for +those platforms. Since 10.2, Xcode does not properly handle multi-platform +CocoaPods workspaces. + +Firestore has a self-contained Xcode project. See +[Firestore/README](Firestore/README.md) Markdown file. + +#### Development for Catalyst +* `pod gen {name here}.podspec --local-sources=./ --auto-open --platforms=ios` +* Check the Mac box in the App-iOS Build Settings +* Sign the App in the Settings Signing & Capabilities tab +* Click Pods in the Project Manager +* Add Signing to the iOS host app and unit test targets +* Select the Unit-unit scheme +* Run it to build and test + +Alternatively, disable signing in each target: +* Go to Build Settings tab +* Click `+` +* Select `Add User-Defined Setting` +* Add `CODE_SIGNING_REQUIRED` setting with a value of `NO` + +### Swift Package Manager +* To enable test schemes: `./scripts/setup_spm_tests.sh` +* `open Package.swift` or double click `Package.swift` in Finder. +* Xcode will open the project + * Choose a scheme for a library to build or test suite to run + * Choose a target platform by selecting the run destination along with the scheme + +### Adding a New Firebase Pod + +Refer to [AddNewPod](docs/AddNewPod.md) Markdown file for details. + +### Managing Headers and Imports + +For information about managing headers and imports, see [HeadersImports](HeadersImports.md) Markdown file. + +### Code Formatting + +To ensure that the code is formatted consistently, run the script +[./scripts/check.sh](https://github.com/firebase/firebase-ios-sdk/blob/main/scripts/check.sh) +before creating a pull request (PR). + +GitHub Actions will verify that any code changes are done in a style-compliant +way. Install `clang-format` and `mint`: + +```console +brew install clang-format@21 +brew install mint +``` + +### Running Unit Tests + +Select a scheme and press Command-u to build a component and run its unit tests. + +### Running Sample Apps +To run the sample apps and integration tests, you'll need a valid +`GoogleService-Info.plist +` file. The Firebase Xcode project contains dummy plist +files without real values, but they can be replaced with real plist files. To get your own +`GoogleService-Info.plist` files: + +1. Go to the [Firebase Console](https://console.firebase.google.com/) +2. Create a new Firebase project, if you don't already have one +3. For each sample app you want to test, create a new Firebase app with the sample app's bundle +identifier (e.g., `com.google.Database-Example`) +4. Download the resulting `GoogleService-Info.plist` and add it to the Xcode project. + +### Coverage Report Generation + +For coverage report generation instructions, see [scripts/code_coverage_report/README](scripts/code_coverage_report/README.md) Markdown file. + +## Specific Component Instructions +See the sections below for any special instructions for those components. + +### Firebase AI Logic + +See the [Firebase AI Logic README](FirebaseAI#development) for instructions +about building and testing the SDK. + +### Firebase Auth + +For specific Firebase Auth development, refer to the [Auth Sample README](FirebaseAuth/Tests/Sample/README.md) for instructions about +building and running the FirebaseAuth pod along with various samples and tests. + +### Firebase Database + +The Firebase Database Integration tests can be run against a locally running Database Emulator +or against a production instance. + +To run against a local emulator instance, invoke `./scripts/run_database_emulator.sh start` before +running the integration test. + +To run against a production instance, provide a valid `GoogleServices-Info.plist` and copy it to +`FirebaseDatabase/Tests/Resources/GoogleService-Info.plist`. Your Security Rule must be set to +[public](https://firebase.google.com/docs/database/security/quickstart) while your tests are +running. + +### Firebase Dynamic Links + +Firebase Dynamic Links is **deprecated** and should not be used in new projects. The service will shut down on August 25, 2025. + +Please see our [Dynamic Links Deprecation FAQ documentation](https://firebase.google.com/support/dynamic-links-faq) for more guidance. + +### Firebase Performance Monitoring + +For specific Firebase Performance Monitoring development, see +[the Performance README](FirebasePerformance/README.md) for instructions about building the SDK +and [the Performance TestApp README](FirebasePerformance/Tests/TestApp/README.md) for instructions about +integrating Performance with the dev test App. + +### Firebase Storage + +To run the Storage Integration tests, follow the instructions in +[StorageIntegration.swift](FirebaseStorage/Tests/Integration/StorageIntegration.swift). + +#### Push Notifications + +Push notifications can only be delivered to specially provisioned App IDs in the developer portal. +In order to test receiving push notifications, you will need to: + +1. Change the bundle identifier of the sample app to something you own in your Apple Developer +account and enable that App ID for push notifications. +2. You'll also need to +[upload your APNs Provider Authentication Key or certificate to the +Firebase Console](https://firebase.google.com/docs/cloud-messaging/ios/certs) +at **Project Settings > Cloud Messaging > [Your Firebase App]**. +3. Ensure your iOS device is added to your Apple Developer portal as a test device. + +#### iOS Simulator + +The iOS Simulator cannot register for remote notifications and will not receive push notifications. +To receive push notifications, follow the steps above and run the app on a physical device. + +## Building with Firebase on Apple platforms + +Firebase provides official beta support for macOS, Catalyst, and tvOS. visionOS and watchOS +are community supported. Thanks to community contributions for many of the multi-platform PRs. + +At this time, most of Firebase's products are available across Apple platforms. There are still +a few gaps, especially on visionOS and watchOS. For details about the current support matrix, see +[this chart](https://firebase.google.com/docs/ios/learn-more#firebase_library_support_by_platform) +in Firebase's documentation. + +### visionOS + +Where supported, visionOS works as expected with the exception of Firestore via Swift Package +Manager where it is required to use the source distribution. + +To enable the Firestore source distribution, quit Xcode and open the desired +project from the command line with the `FIREBASE_SOURCE_FIRESTORE` environment +variable: `open --env FIREBASE_SOURCE_FIRESTORE /path/to/project.xcodeproj`. +To go back to using the binary distribution of Firestore, quit Xcode and open +Xcode like normal, without the environment variable. + +### watchOS +Thanks to contributions from the community, many of Firebase SDKs now compile, run unit tests, and +work on watchOS. See the [Independent Watch App Sample](Example/watchOSSample). + +Keep in mind that watchOS is not officially supported by Firebase. While we can catch basic unit +test issues with GitHub Actions, there may be some changes where the SDK no longer works as expected +on watchOS. If you encounter this, please +[file an issue](https://github.com/firebase/firebase-ios-sdk/issues). + +During app setup in the console, you may get to a step that mentions something like "Checking if the +app has communicated with our servers". This relies on Analytics and will not work on watchOS. +**It's safe to ignore the message and continue**, the rest of the SDKs will work as expected. + +#### Additional Crashlytics Notes +* watchOS has limited support. Due to watchOS restrictions, mach exceptions and signal crashes are +not recorded. (Crashes in SwiftUI are generated as mach exceptions, so will not be recorded) + +## Combine +Thanks to contributions from the community, _FirebaseCombineSwift_ contains support for Apple's Combine +framework. This module is currently under development and not yet supported for use in production +environments. For more details, please refer to the [docs](FirebaseCombineSwift/README.md). + +## Roadmap + +See [Roadmap](ROADMAP.md) for more about the Firebase Apple SDK Open Source +plans and directions. + +## Contributing + +See [Contributing](CONTRIBUTING.md) for more information on contributing to the Firebase +Apple SDK. + +## License + +The contents of this repository are licensed under the +[Apache License, version 2.0](http://www.apache.org/licenses/LICENSE-2.0). + +Your use of Firebase is governed by the +[Terms of Service for Firebase Services](https://firebase.google.com/terms/). diff --git a/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/Info.plist b/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/Info.plist new file mode 100755 index 0000000..2ad2e0d --- /dev/null +++ b/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/Info.plist @@ -0,0 +1,44 @@ + + + + + AvailableLibraries + + + BinaryPath + GoogleAdsOnDeviceConversion.framework/GoogleAdsOnDeviceConversion + LibraryIdentifier + ios-arm64 + LibraryPath + GoogleAdsOnDeviceConversion.framework + SupportedArchitectures + + arm64 + + SupportedPlatform + ios + + + BinaryPath + GoogleAdsOnDeviceConversion.framework/GoogleAdsOnDeviceConversion + LibraryIdentifier + ios-arm64_x86_64-simulator + LibraryPath + GoogleAdsOnDeviceConversion.framework + SupportedArchitectures + + arm64 + x86_64 + + SupportedPlatform + ios + SupportedPlatformVariant + simulator + + + CFBundlePackageType + XFWK + XCFrameworkFormatVersion + 1.0 + + diff --git a/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/_CodeSignature/CodeDirectory b/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/_CodeSignature/CodeDirectory new file mode 100644 index 0000000..366f707 Binary files /dev/null and b/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/_CodeSignature/CodeDirectory differ diff --git a/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/_CodeSignature/CodeRequirements b/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/_CodeSignature/CodeRequirements new file mode 100644 index 0000000..daecdc1 Binary files /dev/null and b/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/_CodeSignature/CodeRequirements differ diff --git a/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/_CodeSignature/CodeRequirements-1 b/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/_CodeSignature/CodeRequirements-1 new file mode 100644 index 0000000..504cf60 Binary files /dev/null and b/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/_CodeSignature/CodeRequirements-1 differ diff --git a/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/_CodeSignature/CodeResources b/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/_CodeSignature/CodeResources new file mode 100644 index 0000000..3e123f4 --- /dev/null +++ b/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/_CodeSignature/CodeResources @@ -0,0 +1,278 @@ + + + + + files + + ios-arm64/GoogleAdsOnDeviceConversion.framework/GoogleAdsOnDeviceConversion + + 0Jb0mK62sEUcyDhHdEABw41hHWM= + + ios-arm64/GoogleAdsOnDeviceConversion.framework/Headers/GoogleAdsOnDeviceConversion.h + + uE+eARRe9sO1zgCd8CHYHhlkzaE= + + ios-arm64/GoogleAdsOnDeviceConversion.framework/Headers/ODCConversionManager.h + + 66wUjuGKmxL6DwKK8PG6NoyB2rs= + + ios-arm64/GoogleAdsOnDeviceConversion.framework/Headers/ODCConversionTypes.h + + 6E0N39QlH+OPiYwVxsREOiTjSmU= + + ios-arm64/GoogleAdsOnDeviceConversion.framework/Info.plist + + aw85hMMD7q5iqraUMXRzhd4fVSI= + + ios-arm64/GoogleAdsOnDeviceConversion.framework/Modules/module.modulemap + + Dk3i/Wxh1JfSIuRfJrvcL5HMKws= + + ios-arm64_x86_64-simulator/GoogleAdsOnDeviceConversion.framework/GoogleAdsOnDeviceConversion + + DBWIUsjSlKqqKBMoTaqZUvr80BI= + + ios-arm64_x86_64-simulator/GoogleAdsOnDeviceConversion.framework/Headers/GoogleAdsOnDeviceConversion.h + + uE+eARRe9sO1zgCd8CHYHhlkzaE= + + ios-arm64_x86_64-simulator/GoogleAdsOnDeviceConversion.framework/Headers/ODCConversionManager.h + + 66wUjuGKmxL6DwKK8PG6NoyB2rs= + + ios-arm64_x86_64-simulator/GoogleAdsOnDeviceConversion.framework/Headers/ODCConversionTypes.h + + 6E0N39QlH+OPiYwVxsREOiTjSmU= + + ios-arm64_x86_64-simulator/GoogleAdsOnDeviceConversion.framework/Info.plist + + OB5B8SNvwgIsOn7ZY2SWYfk+xX4= + + ios-arm64_x86_64-simulator/GoogleAdsOnDeviceConversion.framework/Modules/module.modulemap + + Dk3i/Wxh1JfSIuRfJrvcL5HMKws= + + + files2 + + ios-arm64/GoogleAdsOnDeviceConversion.framework/GoogleAdsOnDeviceConversion + + hash + + 0Jb0mK62sEUcyDhHdEABw41hHWM= + + hash2 + + A9t+UpmY1Q+4QSqVb4FQWY/S7nDnG1kuQIiGb16yQk8= + + + ios-arm64/GoogleAdsOnDeviceConversion.framework/Headers/GoogleAdsOnDeviceConversion.h + + hash + + uE+eARRe9sO1zgCd8CHYHhlkzaE= + + hash2 + + H+rQyRs58+LAPydbRayTgyKVGky4Xk/P6Z4NsbueZbw= + + + ios-arm64/GoogleAdsOnDeviceConversion.framework/Headers/ODCConversionManager.h + + hash + + 66wUjuGKmxL6DwKK8PG6NoyB2rs= + + hash2 + + uUFO/GWN4jMB6oYqsLlMf/4TEUnhcCz+32v35ysVHSo= + + + ios-arm64/GoogleAdsOnDeviceConversion.framework/Headers/ODCConversionTypes.h + + hash + + 6E0N39QlH+OPiYwVxsREOiTjSmU= + + hash2 + + ADblS/WPrbWH7VHH+ghujtXGnmU9ydC+TS4o05ttPmY= + + + ios-arm64/GoogleAdsOnDeviceConversion.framework/Info.plist + + hash + + aw85hMMD7q5iqraUMXRzhd4fVSI= + + hash2 + + 26T8Duv+Hqjd8S/sZxL4bOIK5bhj9tkxhGn8fBD8rMU= + + + ios-arm64/GoogleAdsOnDeviceConversion.framework/Modules/module.modulemap + + hash + + Dk3i/Wxh1JfSIuRfJrvcL5HMKws= + + hash2 + + DgFEB7hAJWLwGLFgX3YghRejsnnnW0jCOCXjW6Pdyhw= + + + ios-arm64_x86_64-simulator/GoogleAdsOnDeviceConversion.framework/GoogleAdsOnDeviceConversion + + hash + + DBWIUsjSlKqqKBMoTaqZUvr80BI= + + hash2 + + 9tL35n5uYgjDZJE7g48OnAtAwB8B5F9shH3NMVnGSK0= + + + ios-arm64_x86_64-simulator/GoogleAdsOnDeviceConversion.framework/Headers/GoogleAdsOnDeviceConversion.h + + hash + + uE+eARRe9sO1zgCd8CHYHhlkzaE= + + hash2 + + H+rQyRs58+LAPydbRayTgyKVGky4Xk/P6Z4NsbueZbw= + + + ios-arm64_x86_64-simulator/GoogleAdsOnDeviceConversion.framework/Headers/ODCConversionManager.h + + hash + + 66wUjuGKmxL6DwKK8PG6NoyB2rs= + + hash2 + + uUFO/GWN4jMB6oYqsLlMf/4TEUnhcCz+32v35ysVHSo= + + + ios-arm64_x86_64-simulator/GoogleAdsOnDeviceConversion.framework/Headers/ODCConversionTypes.h + + hash + + 6E0N39QlH+OPiYwVxsREOiTjSmU= + + hash2 + + ADblS/WPrbWH7VHH+ghujtXGnmU9ydC+TS4o05ttPmY= + + + ios-arm64_x86_64-simulator/GoogleAdsOnDeviceConversion.framework/Info.plist + + hash + + OB5B8SNvwgIsOn7ZY2SWYfk+xX4= + + hash2 + + SSa+vNZTWxOEKUTmWxQ8zSWjL514B9Kaltyaf+49l7I= + + + ios-arm64_x86_64-simulator/GoogleAdsOnDeviceConversion.framework/Modules/module.modulemap + + hash + + Dk3i/Wxh1JfSIuRfJrvcL5HMKws= + + hash2 + + DgFEB7hAJWLwGLFgX3YghRejsnnnW0jCOCXjW6Pdyhw= + + + + rules + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^version.plist$ + + + rules2 + + .*\.dSYM($|/) + + weight + 11 + + ^(.*/)?\.DS_Store$ + + omit + + weight + 2000 + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^Info\.plist$ + + omit + + weight + 20 + + ^PkgInfo$ + + omit + + weight + 20 + + ^embedded\.provisionprofile$ + + weight + 20 + + ^version\.plist$ + + weight + 20 + + + + diff --git a/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/_CodeSignature/CodeSignature b/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/_CodeSignature/CodeSignature new file mode 100644 index 0000000..5aa4f11 Binary files /dev/null and b/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/_CodeSignature/CodeSignature differ diff --git a/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/ios-arm64/GoogleAdsOnDeviceConversion.framework/GoogleAdsOnDeviceConversion b/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/ios-arm64/GoogleAdsOnDeviceConversion.framework/GoogleAdsOnDeviceConversion new file mode 100755 index 0000000..2d73d11 Binary files /dev/null and b/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/ios-arm64/GoogleAdsOnDeviceConversion.framework/GoogleAdsOnDeviceConversion differ diff --git a/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/ios-arm64/GoogleAdsOnDeviceConversion.framework/Headers/GoogleAdsOnDeviceConversion.h b/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/ios-arm64/GoogleAdsOnDeviceConversion.framework/Headers/GoogleAdsOnDeviceConversion.h new file mode 100755 index 0000000..a983a5a --- /dev/null +++ b/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/ios-arm64/GoogleAdsOnDeviceConversion.framework/Headers/GoogleAdsOnDeviceConversion.h @@ -0,0 +1,2 @@ +#import +#import diff --git a/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/ios-arm64/GoogleAdsOnDeviceConversion.framework/Headers/ODCConversionManager.h b/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/ios-arm64/GoogleAdsOnDeviceConversion.framework/Headers/ODCConversionManager.h new file mode 100755 index 0000000..3319bb5 --- /dev/null +++ b/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/ios-arm64/GoogleAdsOnDeviceConversion.framework/Headers/ODCConversionManager.h @@ -0,0 +1,44 @@ +#import + +#import "ODCConversionTypes.h" + +NS_ASSUME_NONNULL_BEGIN + +/// The top level on-device conversion manager singleton that provides methods for fetching the +/// aggregate conversion info for conversion reports. +NS_SWIFT_NAME(ConversionManager) +@interface ODCConversionManager : NSObject + +/// Returns the shared ConversionManager instance. +@property(class, nonatomic, readonly) ODCConversionManager *sharedInstance; + +/// The SDK version in the format of three period-separated integers, such as "10.14.1". +@property(nonatomic, readonly) NSString *versionString; + +/// Sets the timestamp when the application was first launched. +/// @param firstLaunchTime The timestamp when the application was first launched. +- (void)setFirstLaunchTime:(NSDate *)firstLaunchTime; + +/// Asynchronously fetches the aggregate conversion info of the current app instance for conversion +/// reports. +/// +/// The aggregate conversion info fetch could fail due to network failures etc. +/// +/// @param interaction The type of interaction to fetch. +/// @param completion The completion handler to call when the fetch is complete. This handler is +/// executed on a system-defined global concurrent queue. +/// This completion handler takes the following parameters: +/// aggregateConversionInfo The aggregate conversion info of the current app instance, or +/// `nil` if it's not available. +/// error An error object that indicates why the request failed, or `nil` if the request +/// was successful. +/// When the aggregate conversion info is expired, both parameters are nil, i.e. the aggregate +/// conversion info is not available and there is no error. +- (void)fetchAggregateConversionInfoForInteraction:(ODCInteractionType)interaction + completion: + (void (^)(NSString *_Nullable aggregateConversionInfo, + NSError *_Nullable error))completion; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/ios-arm64/GoogleAdsOnDeviceConversion.framework/Headers/ODCConversionTypes.h b/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/ios-arm64/GoogleAdsOnDeviceConversion.framework/Headers/ODCConversionTypes.h new file mode 100755 index 0000000..9e1bb03 --- /dev/null +++ b/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/ios-arm64/GoogleAdsOnDeviceConversion.framework/Headers/ODCConversionTypes.h @@ -0,0 +1,6 @@ +#import + +/// The type of interaction for fetching conversion info. +typedef NS_ENUM(NSInteger, ODCInteractionType) { + ODCInteractionTypeInstallation, +} NS_SWIFT_NAME(InteractionType); diff --git a/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/ios-arm64/GoogleAdsOnDeviceConversion.framework/Info.plist b/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/ios-arm64/GoogleAdsOnDeviceConversion.framework/Info.plist new file mode 100755 index 0000000..88cc791 --- /dev/null +++ b/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/ios-arm64/GoogleAdsOnDeviceConversion.framework/Info.plist @@ -0,0 +1,55 @@ + + + + + BuildMachineOSBuild + 24G231 + CFBundleDevelopmentRegion + en + CFBundleExecutable + GoogleAdsOnDeviceConversion + CFBundleIdentifier + com.google.ads.GoogleAdsOnDeviceConversion + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + GoogleAdsOnDeviceConversion + CFBundlePackageType + FMWK + CFBundleShortVersionString + 3.2.0 + CFBundleSupportedPlatforms + + iPhoneOS + + CFBundleVersion + 3.2.0 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + DTPlatformBuild + 24C94 + DTPlatformName + iphoneos + DTPlatformVersion + 15.2 + DTSDKBuild + 24C94 + DTSDKName + iphoneos18.2 + DTXcode + 1620 + DTXcodeBuild + 16C5032a + MinimumOSVersion + 100.0 + UIDeviceFamily + + 1 + 2 + + UIRequiredDeviceCapabilities + + arm64 + + + diff --git a/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/ios-arm64/GoogleAdsOnDeviceConversion.framework/Modules/module.modulemap b/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/ios-arm64/GoogleAdsOnDeviceConversion.framework/Modules/module.modulemap new file mode 100755 index 0000000..3517b80 --- /dev/null +++ b/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/ios-arm64/GoogleAdsOnDeviceConversion.framework/Modules/module.modulemap @@ -0,0 +1,7 @@ +framework module GoogleAdsOnDeviceConversion { + umbrella header "GoogleAdsOnDeviceConversion.h" + export * + module * { export * } + link framework "Foundation" + link "c++" +} diff --git a/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/ios-arm64_x86_64-simulator/GoogleAdsOnDeviceConversion.framework/GoogleAdsOnDeviceConversion b/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/ios-arm64_x86_64-simulator/GoogleAdsOnDeviceConversion.framework/GoogleAdsOnDeviceConversion new file mode 100755 index 0000000..1893c35 Binary files /dev/null and b/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/ios-arm64_x86_64-simulator/GoogleAdsOnDeviceConversion.framework/GoogleAdsOnDeviceConversion differ diff --git a/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/ios-arm64_x86_64-simulator/GoogleAdsOnDeviceConversion.framework/Headers/GoogleAdsOnDeviceConversion.h b/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/ios-arm64_x86_64-simulator/GoogleAdsOnDeviceConversion.framework/Headers/GoogleAdsOnDeviceConversion.h new file mode 100755 index 0000000..a983a5a --- /dev/null +++ b/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/ios-arm64_x86_64-simulator/GoogleAdsOnDeviceConversion.framework/Headers/GoogleAdsOnDeviceConversion.h @@ -0,0 +1,2 @@ +#import +#import diff --git a/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/ios-arm64_x86_64-simulator/GoogleAdsOnDeviceConversion.framework/Headers/ODCConversionManager.h b/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/ios-arm64_x86_64-simulator/GoogleAdsOnDeviceConversion.framework/Headers/ODCConversionManager.h new file mode 100755 index 0000000..3319bb5 --- /dev/null +++ b/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/ios-arm64_x86_64-simulator/GoogleAdsOnDeviceConversion.framework/Headers/ODCConversionManager.h @@ -0,0 +1,44 @@ +#import + +#import "ODCConversionTypes.h" + +NS_ASSUME_NONNULL_BEGIN + +/// The top level on-device conversion manager singleton that provides methods for fetching the +/// aggregate conversion info for conversion reports. +NS_SWIFT_NAME(ConversionManager) +@interface ODCConversionManager : NSObject + +/// Returns the shared ConversionManager instance. +@property(class, nonatomic, readonly) ODCConversionManager *sharedInstance; + +/// The SDK version in the format of three period-separated integers, such as "10.14.1". +@property(nonatomic, readonly) NSString *versionString; + +/// Sets the timestamp when the application was first launched. +/// @param firstLaunchTime The timestamp when the application was first launched. +- (void)setFirstLaunchTime:(NSDate *)firstLaunchTime; + +/// Asynchronously fetches the aggregate conversion info of the current app instance for conversion +/// reports. +/// +/// The aggregate conversion info fetch could fail due to network failures etc. +/// +/// @param interaction The type of interaction to fetch. +/// @param completion The completion handler to call when the fetch is complete. This handler is +/// executed on a system-defined global concurrent queue. +/// This completion handler takes the following parameters: +/// aggregateConversionInfo The aggregate conversion info of the current app instance, or +/// `nil` if it's not available. +/// error An error object that indicates why the request failed, or `nil` if the request +/// was successful. +/// When the aggregate conversion info is expired, both parameters are nil, i.e. the aggregate +/// conversion info is not available and there is no error. +- (void)fetchAggregateConversionInfoForInteraction:(ODCInteractionType)interaction + completion: + (void (^)(NSString *_Nullable aggregateConversionInfo, + NSError *_Nullable error))completion; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/ios-arm64_x86_64-simulator/GoogleAdsOnDeviceConversion.framework/Headers/ODCConversionTypes.h b/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/ios-arm64_x86_64-simulator/GoogleAdsOnDeviceConversion.framework/Headers/ODCConversionTypes.h new file mode 100755 index 0000000..9e1bb03 --- /dev/null +++ b/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/ios-arm64_x86_64-simulator/GoogleAdsOnDeviceConversion.framework/Headers/ODCConversionTypes.h @@ -0,0 +1,6 @@ +#import + +/// The type of interaction for fetching conversion info. +typedef NS_ENUM(NSInteger, ODCInteractionType) { + ODCInteractionTypeInstallation, +} NS_SWIFT_NAME(InteractionType); diff --git a/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/ios-arm64_x86_64-simulator/GoogleAdsOnDeviceConversion.framework/Info.plist b/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/ios-arm64_x86_64-simulator/GoogleAdsOnDeviceConversion.framework/Info.plist new file mode 100755 index 0000000..359ca79 --- /dev/null +++ b/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/ios-arm64_x86_64-simulator/GoogleAdsOnDeviceConversion.framework/Info.plist @@ -0,0 +1,51 @@ + + + + + BuildMachineOSBuild + 24G231 + CFBundleDevelopmentRegion + en + CFBundleExecutable + GoogleAdsOnDeviceConversion + CFBundleIdentifier + com.google.ads.GoogleAdsOnDeviceConversion + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + GoogleAdsOnDeviceConversion + CFBundlePackageType + FMWK + CFBundleShortVersionString + 3.2.0 + CFBundleSupportedPlatforms + + iPhoneSimulator + + CFBundleVersion + 3.2.0 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + DTPlatformBuild + 24C94 + DTPlatformName + iphonesimulator + DTPlatformVersion + 15.2 + DTSDKBuild + 24C94 + DTSDKName + iphonesimulator18.2 + DTXcode + 1620 + DTXcodeBuild + 16C5032a + MinimumOSVersion + 100.0 + UIDeviceFamily + + 1 + 2 + + + diff --git a/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/ios-arm64_x86_64-simulator/GoogleAdsOnDeviceConversion.framework/Modules/module.modulemap b/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/ios-arm64_x86_64-simulator/GoogleAdsOnDeviceConversion.framework/Modules/module.modulemap new file mode 100755 index 0000000..3517b80 --- /dev/null +++ b/Pods/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework/ios-arm64_x86_64-simulator/GoogleAdsOnDeviceConversion.framework/Modules/module.modulemap @@ -0,0 +1,7 @@ +framework module GoogleAdsOnDeviceConversion { + umbrella header "GoogleAdsOnDeviceConversion.h" + export * + module * { export * } + link framework "Foundation" + link "c++" +} diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/Info.plist b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/Info.plist new file mode 100644 index 0000000..5b3607b --- /dev/null +++ b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/Info.plist @@ -0,0 +1,107 @@ + + + + + AvailableLibraries + + + BinaryPath + GoogleAppMeasurement.framework/GoogleAppMeasurement + LibraryIdentifier + ios-arm64_x86_64-simulator + LibraryPath + GoogleAppMeasurement.framework + SupportedArchitectures + + arm64 + x86_64 + + SupportedPlatform + ios + SupportedPlatformVariant + simulator + + + BinaryPath + GoogleAppMeasurement.framework/GoogleAppMeasurement + LibraryIdentifier + tvos-arm64 + LibraryPath + GoogleAppMeasurement.framework + SupportedArchitectures + + arm64 + + SupportedPlatform + tvos + + + BinaryPath + GoogleAppMeasurement.framework/Versions/A/GoogleAppMeasurement + LibraryIdentifier + ios-arm64_x86_64-maccatalyst + LibraryPath + GoogleAppMeasurement.framework + SupportedArchitectures + + arm64 + x86_64 + + SupportedPlatform + ios + SupportedPlatformVariant + maccatalyst + + + BinaryPath + GoogleAppMeasurement.framework/Versions/A/GoogleAppMeasurement + LibraryIdentifier + macos-arm64_x86_64 + LibraryPath + GoogleAppMeasurement.framework + SupportedArchitectures + + arm64 + x86_64 + + SupportedPlatform + macos + + + BinaryPath + GoogleAppMeasurement.framework/GoogleAppMeasurement + LibraryIdentifier + tvos-arm64_x86_64-simulator + LibraryPath + GoogleAppMeasurement.framework + SupportedArchitectures + + arm64 + x86_64 + + SupportedPlatform + tvos + SupportedPlatformVariant + simulator + + + BinaryPath + GoogleAppMeasurement.framework/GoogleAppMeasurement + LibraryIdentifier + ios-arm64 + LibraryPath + GoogleAppMeasurement.framework + SupportedArchitectures + + arm64 + + SupportedPlatform + ios + + + CFBundlePackageType + XFWK + XCFrameworkFormatVersion + 1.0 + + diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/_CodeSignature/CodeDirectory b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/_CodeSignature/CodeDirectory new file mode 100644 index 0000000..2f217e0 Binary files /dev/null and b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/_CodeSignature/CodeDirectory differ diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/_CodeSignature/CodeRequirements b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/_CodeSignature/CodeRequirements new file mode 100644 index 0000000..001f5af Binary files /dev/null and b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/_CodeSignature/CodeRequirements differ diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/_CodeSignature/CodeRequirements-1 b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/_CodeSignature/CodeRequirements-1 new file mode 100644 index 0000000..daa9435 Binary files /dev/null and b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/_CodeSignature/CodeRequirements-1 differ diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/_CodeSignature/CodeResources b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/_CodeSignature/CodeResources new file mode 100644 index 0000000..dcd68dc --- /dev/null +++ b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/_CodeSignature/CodeResources @@ -0,0 +1,408 @@ + + + + + files + + ios-arm64/GoogleAppMeasurement.framework/GoogleAppMeasurement + + 3+2x98L2KsYtqZ5jl0k/xXroeKk= + + ios-arm64/GoogleAppMeasurement.framework/Info.plist + + PxjFBcntMJPElcbLxSNI7cIiAmg= + + ios-arm64/GoogleAppMeasurement.framework/Modules/module.modulemap + + on1mkulwTtm+ufPJ4eClavLWAuQ= + + ios-arm64_x86_64-maccatalyst/GoogleAppMeasurement.framework/Versions/A/GoogleAppMeasurement + + DGY32ZTr8+Y+Jht/s6BCVKhf7+4= + + ios-arm64_x86_64-maccatalyst/GoogleAppMeasurement.framework/Versions/A/Modules/module.modulemap + + on1mkulwTtm+ufPJ4eClavLWAuQ= + + ios-arm64_x86_64-maccatalyst/GoogleAppMeasurement.framework/Versions/A/Resources/Info.plist + + odcBJBBumY7EShjcGIQIfWRoVMI= + + ios-arm64_x86_64-simulator/GoogleAppMeasurement.framework/GoogleAppMeasurement + + 8AjDEHSDk1iVbw/EO45+OR2kcDY= + + ios-arm64_x86_64-simulator/GoogleAppMeasurement.framework/Info.plist + + vKVzuqMdfPPDcR3Y9eEvl6yQiiY= + + ios-arm64_x86_64-simulator/GoogleAppMeasurement.framework/Modules/module.modulemap + + on1mkulwTtm+ufPJ4eClavLWAuQ= + + macos-arm64_x86_64/GoogleAppMeasurement.framework/Versions/A/GoogleAppMeasurement + + qsUzxcanhOjsL2VkZphWFOX6gao= + + macos-arm64_x86_64/GoogleAppMeasurement.framework/Versions/A/Modules/module.modulemap + + on1mkulwTtm+ufPJ4eClavLWAuQ= + + macos-arm64_x86_64/GoogleAppMeasurement.framework/Versions/A/Resources/Info.plist + + aa1kEt6t32g3hG88L3w6+gTwjOE= + + tvos-arm64/GoogleAppMeasurement.framework/GoogleAppMeasurement + + euEbgY1dhRSO4KDfGq8PDBsM83Q= + + tvos-arm64/GoogleAppMeasurement.framework/Info.plist + + mW7pNZhfN4bTLNvM/zDn5RHJ2+I= + + tvos-arm64/GoogleAppMeasurement.framework/Modules/module.modulemap + + on1mkulwTtm+ufPJ4eClavLWAuQ= + + tvos-arm64_x86_64-simulator/GoogleAppMeasurement.framework/GoogleAppMeasurement + + flTu9X2UzaFpDpkAR4VH6wtmo3E= + + tvos-arm64_x86_64-simulator/GoogleAppMeasurement.framework/Info.plist + + LCDnTycvm59ggcnR6EgvvsSRigk= + + tvos-arm64_x86_64-simulator/GoogleAppMeasurement.framework/Modules/module.modulemap + + on1mkulwTtm+ufPJ4eClavLWAuQ= + + + files2 + + ios-arm64/GoogleAppMeasurement.framework/GoogleAppMeasurement + + hash + + 3+2x98L2KsYtqZ5jl0k/xXroeKk= + + hash2 + + axKvSs8bN28J0bL+dSL5Kkv+jDfSGc0nicogeJLL2Jo= + + + ios-arm64/GoogleAppMeasurement.framework/Info.plist + + hash + + PxjFBcntMJPElcbLxSNI7cIiAmg= + + hash2 + + RWPnFv6xbkSzeNOpnJFV23RFuU8aE+AAKbPhy0B5O8E= + + + ios-arm64/GoogleAppMeasurement.framework/Modules/module.modulemap + + hash + + on1mkulwTtm+ufPJ4eClavLWAuQ= + + hash2 + + gd8e5hMrJihnXu8TQ0xecVPl3Z71GpsKaYxiLbmHezw= + + + ios-arm64_x86_64-maccatalyst/GoogleAppMeasurement.framework/GoogleAppMeasurement + + symlink + Versions/Current/GoogleAppMeasurement + + ios-arm64_x86_64-maccatalyst/GoogleAppMeasurement.framework/Modules + + symlink + Versions/Current/Modules + + ios-arm64_x86_64-maccatalyst/GoogleAppMeasurement.framework/Resources + + symlink + Versions/Current/Resources + + ios-arm64_x86_64-maccatalyst/GoogleAppMeasurement.framework/Versions/A/GoogleAppMeasurement + + hash + + DGY32ZTr8+Y+Jht/s6BCVKhf7+4= + + hash2 + + EGlPy003urJXuyWLJ6qvyC/IRr+wdO5bvQnKylRDYus= + + + ios-arm64_x86_64-maccatalyst/GoogleAppMeasurement.framework/Versions/A/Modules/module.modulemap + + hash + + on1mkulwTtm+ufPJ4eClavLWAuQ= + + hash2 + + gd8e5hMrJihnXu8TQ0xecVPl3Z71GpsKaYxiLbmHezw= + + + ios-arm64_x86_64-maccatalyst/GoogleAppMeasurement.framework/Versions/A/Resources/Info.plist + + hash + + odcBJBBumY7EShjcGIQIfWRoVMI= + + hash2 + + mbWa8rp1/epiB+Mt0e1XKXG/CSQ+2yw0vools2D2n/8= + + + ios-arm64_x86_64-maccatalyst/GoogleAppMeasurement.framework/Versions/Current + + symlink + A + + ios-arm64_x86_64-simulator/GoogleAppMeasurement.framework/GoogleAppMeasurement + + hash + + 8AjDEHSDk1iVbw/EO45+OR2kcDY= + + hash2 + + Ao6Wki2AtFvTutAkaXWIFJx8BXVGwWfwfrx61wfVfSg= + + + ios-arm64_x86_64-simulator/GoogleAppMeasurement.framework/Info.plist + + hash + + vKVzuqMdfPPDcR3Y9eEvl6yQiiY= + + hash2 + + CoBifvCV9p+G7NMC8CtfKMEq6eyKbAYuIkHlFI2Vh4s= + + + ios-arm64_x86_64-simulator/GoogleAppMeasurement.framework/Modules/module.modulemap + + hash + + on1mkulwTtm+ufPJ4eClavLWAuQ= + + hash2 + + gd8e5hMrJihnXu8TQ0xecVPl3Z71GpsKaYxiLbmHezw= + + + macos-arm64_x86_64/GoogleAppMeasurement.framework/GoogleAppMeasurement + + symlink + Versions/Current/GoogleAppMeasurement + + macos-arm64_x86_64/GoogleAppMeasurement.framework/Modules + + symlink + Versions/Current/Modules + + macos-arm64_x86_64/GoogleAppMeasurement.framework/Resources + + symlink + Versions/Current/Resources + + macos-arm64_x86_64/GoogleAppMeasurement.framework/Versions/A/GoogleAppMeasurement + + hash + + qsUzxcanhOjsL2VkZphWFOX6gao= + + hash2 + + Cz9euEI3MIdKamLOqrL57hXyawJbOPP69N6/NFf5Xd4= + + + macos-arm64_x86_64/GoogleAppMeasurement.framework/Versions/A/Modules/module.modulemap + + hash + + on1mkulwTtm+ufPJ4eClavLWAuQ= + + hash2 + + gd8e5hMrJihnXu8TQ0xecVPl3Z71GpsKaYxiLbmHezw= + + + macos-arm64_x86_64/GoogleAppMeasurement.framework/Versions/A/Resources/Info.plist + + hash + + aa1kEt6t32g3hG88L3w6+gTwjOE= + + hash2 + + HrpLxZRZMxAOtdp8xbvXetJf7SIbPGG779+Qna26CGc= + + + macos-arm64_x86_64/GoogleAppMeasurement.framework/Versions/Current + + symlink + A + + tvos-arm64/GoogleAppMeasurement.framework/GoogleAppMeasurement + + hash + + euEbgY1dhRSO4KDfGq8PDBsM83Q= + + hash2 + + 2zC8GrlOkVOz4p6CnFLYizGbKwjXTBnYWlWloLXG41Y= + + + tvos-arm64/GoogleAppMeasurement.framework/Info.plist + + hash + + mW7pNZhfN4bTLNvM/zDn5RHJ2+I= + + hash2 + + 5RX9YzS1fdTgq3INfttCBImtLkq0pcfwvT2VCwJGN+Y= + + + tvos-arm64/GoogleAppMeasurement.framework/Modules/module.modulemap + + hash + + on1mkulwTtm+ufPJ4eClavLWAuQ= + + hash2 + + gd8e5hMrJihnXu8TQ0xecVPl3Z71GpsKaYxiLbmHezw= + + + tvos-arm64_x86_64-simulator/GoogleAppMeasurement.framework/GoogleAppMeasurement + + hash + + flTu9X2UzaFpDpkAR4VH6wtmo3E= + + hash2 + + KWnwx86v0peKm86ueeAaiKbUiWZSbHyWK6Xwju6h94w= + + + tvos-arm64_x86_64-simulator/GoogleAppMeasurement.framework/Info.plist + + hash + + LCDnTycvm59ggcnR6EgvvsSRigk= + + hash2 + + lnG4iA6mNCe7dhedXrAeqJeiwvKi9Z08N+BOYHYF+nw= + + + tvos-arm64_x86_64-simulator/GoogleAppMeasurement.framework/Modules/module.modulemap + + hash + + on1mkulwTtm+ufPJ4eClavLWAuQ= + + hash2 + + gd8e5hMrJihnXu8TQ0xecVPl3Z71GpsKaYxiLbmHezw= + + + + rules + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^version.plist$ + + + rules2 + + .*\.dSYM($|/) + + weight + 11 + + ^(.*/)?\.DS_Store$ + + omit + + weight + 2000 + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^Info\.plist$ + + omit + + weight + 20 + + ^PkgInfo$ + + omit + + weight + 20 + + ^embedded\.provisionprofile$ + + weight + 20 + + ^version\.plist$ + + weight + 20 + + + + diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/_CodeSignature/CodeSignature b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/_CodeSignature/CodeSignature new file mode 100644 index 0000000..eab0823 Binary files /dev/null and b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/_CodeSignature/CodeSignature differ diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/ios-arm64/GoogleAppMeasurement.framework/GoogleAppMeasurement b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/ios-arm64/GoogleAppMeasurement.framework/GoogleAppMeasurement new file mode 100644 index 0000000..d99bb40 Binary files /dev/null and b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/ios-arm64/GoogleAppMeasurement.framework/GoogleAppMeasurement differ diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/ios-arm64/GoogleAppMeasurement.framework/Info.plist b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/ios-arm64/GoogleAppMeasurement.framework/Info.plist new file mode 100644 index 0000000..0ea3c96 --- /dev/null +++ b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/ios-arm64/GoogleAppMeasurement.framework/Info.plist @@ -0,0 +1,57 @@ + + + + + BuildMachineOSBuild + 24G231 + CFBundleDevelopmentRegion + en + CFBundleExecutable + GoogleAppMeasurement + CFBundleIdentifier + org.cocoapods.GoogleAppMeasurement + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + GoogleAppMeasurement + CFBundlePackageType + FMWK + CFBundleShortVersionString + 12.5.0 + CFBundleSignature + ???? + CFBundleSupportedPlatforms + + iPhoneOS + + CFBundleVersion + 1 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + DTPlatformBuild + 22C146 + DTPlatformName + iphoneos + DTPlatformVersion + 18.2 + DTSDKBuild + 22C146 + DTSDKName + iphoneos18.2 + DTXcode + 1620 + DTXcodeBuild + 16C5032a + MinimumOSVersion + 100.0 + UIDeviceFamily + + 1 + 2 + + UIRequiredDeviceCapabilities + + arm64 + + + diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/ios-arm64/GoogleAppMeasurement.framework/Modules/module.modulemap b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/ios-arm64/GoogleAppMeasurement.framework/Modules/module.modulemap new file mode 100644 index 0000000..d3499f0 --- /dev/null +++ b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/ios-arm64/GoogleAppMeasurement.framework/Modules/module.modulemap @@ -0,0 +1,10 @@ +framework module GoogleAppMeasurement { +umbrella header "GoogleAppMeasurement-umbrella.h" +export * +module * { export * } + link framework "Security" + link framework "SystemConfiguration" + link "c++" + link "sqlite3" + link "z" +} diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/ios-arm64_x86_64-maccatalyst/GoogleAppMeasurement.framework/GoogleAppMeasurement b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/ios-arm64_x86_64-maccatalyst/GoogleAppMeasurement.framework/GoogleAppMeasurement new file mode 120000 index 0000000..5a946b2 --- /dev/null +++ b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/ios-arm64_x86_64-maccatalyst/GoogleAppMeasurement.framework/GoogleAppMeasurement @@ -0,0 +1 @@ +Versions/Current/GoogleAppMeasurement \ No newline at end of file diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/ios-arm64_x86_64-maccatalyst/GoogleAppMeasurement.framework/Modules b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/ios-arm64_x86_64-maccatalyst/GoogleAppMeasurement.framework/Modules new file mode 120000 index 0000000..5736f31 --- /dev/null +++ b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/ios-arm64_x86_64-maccatalyst/GoogleAppMeasurement.framework/Modules @@ -0,0 +1 @@ +Versions/Current/Modules \ No newline at end of file diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/ios-arm64_x86_64-maccatalyst/GoogleAppMeasurement.framework/Resources b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/ios-arm64_x86_64-maccatalyst/GoogleAppMeasurement.framework/Resources new file mode 120000 index 0000000..953ee36 --- /dev/null +++ b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/ios-arm64_x86_64-maccatalyst/GoogleAppMeasurement.framework/Resources @@ -0,0 +1 @@ +Versions/Current/Resources \ No newline at end of file diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/ios-arm64_x86_64-maccatalyst/GoogleAppMeasurement.framework/Versions/A/GoogleAppMeasurement b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/ios-arm64_x86_64-maccatalyst/GoogleAppMeasurement.framework/Versions/A/GoogleAppMeasurement new file mode 100644 index 0000000..cc37283 Binary files /dev/null and b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/ios-arm64_x86_64-maccatalyst/GoogleAppMeasurement.framework/Versions/A/GoogleAppMeasurement differ diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/ios-arm64_x86_64-maccatalyst/GoogleAppMeasurement.framework/Versions/A/Modules/module.modulemap b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/ios-arm64_x86_64-maccatalyst/GoogleAppMeasurement.framework/Versions/A/Modules/module.modulemap new file mode 100644 index 0000000..d3499f0 --- /dev/null +++ b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/ios-arm64_x86_64-maccatalyst/GoogleAppMeasurement.framework/Versions/A/Modules/module.modulemap @@ -0,0 +1,10 @@ +framework module GoogleAppMeasurement { +umbrella header "GoogleAppMeasurement-umbrella.h" +export * +module * { export * } + link framework "Security" + link framework "SystemConfiguration" + link "c++" + link "sqlite3" + link "z" +} diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/ios-arm64_x86_64-maccatalyst/GoogleAppMeasurement.framework/Versions/A/Resources/Info.plist b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/ios-arm64_x86_64-maccatalyst/GoogleAppMeasurement.framework/Versions/A/Resources/Info.plist new file mode 100644 index 0000000..3c76e56 --- /dev/null +++ b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/ios-arm64_x86_64-maccatalyst/GoogleAppMeasurement.framework/Versions/A/Resources/Info.plist @@ -0,0 +1,54 @@ + + + + + BuildMachineOSBuild + 24G231 + CFBundleDevelopmentRegion + en + CFBundleExecutable + GoogleAppMeasurement + CFBundleIdentifier + org.cocoapods.GoogleAppMeasurement + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + GoogleAppMeasurement + CFBundlePackageType + FMWK + CFBundleShortVersionString + 12.5.0 + CFBundleSignature + ???? + CFBundleSupportedPlatforms + + MacOSX + + CFBundleVersion + 1 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + DTPlatformBuild + 24C94 + DTPlatformName + macosx + DTPlatformVersion + 15.2 + DTSDKBuild + 24C94 + DTSDKName + macosx15.2 + DTXcode + 1620 + DTXcodeBuild + 16C5032a + LSMinimumSystemVersion + 12.0 + MinimumOSVersion + 100.0 + UIDeviceFamily + + 2 + + + diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/ios-arm64_x86_64-maccatalyst/GoogleAppMeasurement.framework/Versions/Current b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/ios-arm64_x86_64-maccatalyst/GoogleAppMeasurement.framework/Versions/Current new file mode 120000 index 0000000..8c7e5a6 --- /dev/null +++ b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/ios-arm64_x86_64-maccatalyst/GoogleAppMeasurement.framework/Versions/Current @@ -0,0 +1 @@ +A \ No newline at end of file diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/ios-arm64_x86_64-simulator/GoogleAppMeasurement.framework/GoogleAppMeasurement b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/ios-arm64_x86_64-simulator/GoogleAppMeasurement.framework/GoogleAppMeasurement new file mode 100644 index 0000000..36652e9 Binary files /dev/null and b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/ios-arm64_x86_64-simulator/GoogleAppMeasurement.framework/GoogleAppMeasurement differ diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/ios-arm64_x86_64-simulator/GoogleAppMeasurement.framework/Info.plist b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/ios-arm64_x86_64-simulator/GoogleAppMeasurement.framework/Info.plist new file mode 100644 index 0000000..cc5fd8c --- /dev/null +++ b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/ios-arm64_x86_64-simulator/GoogleAppMeasurement.framework/Info.plist @@ -0,0 +1,53 @@ + + + + + BuildMachineOSBuild + 24G231 + CFBundleDevelopmentRegion + en + CFBundleExecutable + GoogleAppMeasurement + CFBundleIdentifier + org.cocoapods.GoogleAppMeasurement + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + GoogleAppMeasurement + CFBundlePackageType + FMWK + CFBundleShortVersionString + 12.5.0 + CFBundleSignature + ???? + CFBundleSupportedPlatforms + + iPhoneSimulator + + CFBundleVersion + 1 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + DTPlatformBuild + 22C146 + DTPlatformName + iphonesimulator + DTPlatformVersion + 18.2 + DTSDKBuild + 22C146 + DTSDKName + iphonesimulator18.2 + DTXcode + 1620 + DTXcodeBuild + 16C5032a + MinimumOSVersion + 100.0 + UIDeviceFamily + + 1 + 2 + + + diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/ios-arm64_x86_64-simulator/GoogleAppMeasurement.framework/Modules/module.modulemap b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/ios-arm64_x86_64-simulator/GoogleAppMeasurement.framework/Modules/module.modulemap new file mode 100644 index 0000000..d3499f0 --- /dev/null +++ b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/ios-arm64_x86_64-simulator/GoogleAppMeasurement.framework/Modules/module.modulemap @@ -0,0 +1,10 @@ +framework module GoogleAppMeasurement { +umbrella header "GoogleAppMeasurement-umbrella.h" +export * +module * { export * } + link framework "Security" + link framework "SystemConfiguration" + link "c++" + link "sqlite3" + link "z" +} diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/macos-arm64_x86_64/GoogleAppMeasurement.framework/GoogleAppMeasurement b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/macos-arm64_x86_64/GoogleAppMeasurement.framework/GoogleAppMeasurement new file mode 120000 index 0000000..5a946b2 --- /dev/null +++ b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/macos-arm64_x86_64/GoogleAppMeasurement.framework/GoogleAppMeasurement @@ -0,0 +1 @@ +Versions/Current/GoogleAppMeasurement \ No newline at end of file diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/macos-arm64_x86_64/GoogleAppMeasurement.framework/Modules b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/macos-arm64_x86_64/GoogleAppMeasurement.framework/Modules new file mode 120000 index 0000000..5736f31 --- /dev/null +++ b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/macos-arm64_x86_64/GoogleAppMeasurement.framework/Modules @@ -0,0 +1 @@ +Versions/Current/Modules \ No newline at end of file diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/macos-arm64_x86_64/GoogleAppMeasurement.framework/Resources b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/macos-arm64_x86_64/GoogleAppMeasurement.framework/Resources new file mode 120000 index 0000000..953ee36 --- /dev/null +++ b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/macos-arm64_x86_64/GoogleAppMeasurement.framework/Resources @@ -0,0 +1 @@ +Versions/Current/Resources \ No newline at end of file diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/macos-arm64_x86_64/GoogleAppMeasurement.framework/Versions/A/GoogleAppMeasurement b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/macos-arm64_x86_64/GoogleAppMeasurement.framework/Versions/A/GoogleAppMeasurement new file mode 100644 index 0000000..2beb2d9 Binary files /dev/null and b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/macos-arm64_x86_64/GoogleAppMeasurement.framework/Versions/A/GoogleAppMeasurement differ diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/macos-arm64_x86_64/GoogleAppMeasurement.framework/Versions/A/Modules/module.modulemap b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/macos-arm64_x86_64/GoogleAppMeasurement.framework/Versions/A/Modules/module.modulemap new file mode 100644 index 0000000..d3499f0 --- /dev/null +++ b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/macos-arm64_x86_64/GoogleAppMeasurement.framework/Versions/A/Modules/module.modulemap @@ -0,0 +1,10 @@ +framework module GoogleAppMeasurement { +umbrella header "GoogleAppMeasurement-umbrella.h" +export * +module * { export * } + link framework "Security" + link framework "SystemConfiguration" + link "c++" + link "sqlite3" + link "z" +} diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/macos-arm64_x86_64/GoogleAppMeasurement.framework/Versions/A/Resources/Info.plist b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/macos-arm64_x86_64/GoogleAppMeasurement.framework/Versions/A/Resources/Info.plist new file mode 100644 index 0000000..c19120d --- /dev/null +++ b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/macos-arm64_x86_64/GoogleAppMeasurement.framework/Versions/A/Resources/Info.plist @@ -0,0 +1,50 @@ + + + + + BuildMachineOSBuild + 24G231 + CFBundleDevelopmentRegion + en + CFBundleExecutable + GoogleAppMeasurement + CFBundleIdentifier + org.cocoapods.GoogleAppMeasurement + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + GoogleAppMeasurement + CFBundlePackageType + FMWK + CFBundleShortVersionString + 12.5.0 + CFBundleSignature + ???? + CFBundleSupportedPlatforms + + MacOSX + + CFBundleVersion + 1 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + DTPlatformBuild + 24C94 + DTPlatformName + macosx + DTPlatformVersion + 15.2 + DTSDKBuild + 24C94 + DTSDKName + macosx15.2 + DTXcode + 1620 + DTXcodeBuild + 16C5032a + LSMinimumSystemVersion + 10.15 + MinimumOSVersion + 100.0 + + diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/macos-arm64_x86_64/GoogleAppMeasurement.framework/Versions/Current b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/macos-arm64_x86_64/GoogleAppMeasurement.framework/Versions/Current new file mode 120000 index 0000000..8c7e5a6 --- /dev/null +++ b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/macos-arm64_x86_64/GoogleAppMeasurement.framework/Versions/Current @@ -0,0 +1 @@ +A \ No newline at end of file diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/tvos-arm64/GoogleAppMeasurement.framework/GoogleAppMeasurement b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/tvos-arm64/GoogleAppMeasurement.framework/GoogleAppMeasurement new file mode 100644 index 0000000..9b35242 Binary files /dev/null and b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/tvos-arm64/GoogleAppMeasurement.framework/GoogleAppMeasurement differ diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/tvos-arm64/GoogleAppMeasurement.framework/Info.plist b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/tvos-arm64/GoogleAppMeasurement.framework/Info.plist new file mode 100644 index 0000000..2ce3f9c --- /dev/null +++ b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/tvos-arm64/GoogleAppMeasurement.framework/Info.plist @@ -0,0 +1,52 @@ + + + + + BuildMachineOSBuild + 24G231 + CFBundleDevelopmentRegion + en + CFBundleExecutable + GoogleAppMeasurement + CFBundleIdentifier + org.cocoapods.GoogleAppMeasurement + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + GoogleAppMeasurement + CFBundlePackageType + FMWK + CFBundleShortVersionString + 12.5.0 + CFBundleSignature + ???? + CFBundleSupportedPlatforms + + AppleTVOS + + CFBundleVersion + 1 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + DTPlatformBuild + 22K152 + DTPlatformName + appletvos + DTPlatformVersion + 18.2 + DTSDKBuild + 22K152 + DTSDKName + appletvos18.2 + DTXcode + 1620 + DTXcodeBuild + 16C5032a + MinimumOSVersion + 100.0 + UIDeviceFamily + + 3 + + + diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/tvos-arm64/GoogleAppMeasurement.framework/Modules/module.modulemap b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/tvos-arm64/GoogleAppMeasurement.framework/Modules/module.modulemap new file mode 100644 index 0000000..d3499f0 --- /dev/null +++ b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/tvos-arm64/GoogleAppMeasurement.framework/Modules/module.modulemap @@ -0,0 +1,10 @@ +framework module GoogleAppMeasurement { +umbrella header "GoogleAppMeasurement-umbrella.h" +export * +module * { export * } + link framework "Security" + link framework "SystemConfiguration" + link "c++" + link "sqlite3" + link "z" +} diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/tvos-arm64_x86_64-simulator/GoogleAppMeasurement.framework/GoogleAppMeasurement b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/tvos-arm64_x86_64-simulator/GoogleAppMeasurement.framework/GoogleAppMeasurement new file mode 100644 index 0000000..755235d Binary files /dev/null and b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/tvos-arm64_x86_64-simulator/GoogleAppMeasurement.framework/GoogleAppMeasurement differ diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/tvos-arm64_x86_64-simulator/GoogleAppMeasurement.framework/Info.plist b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/tvos-arm64_x86_64-simulator/GoogleAppMeasurement.framework/Info.plist new file mode 100644 index 0000000..ed92886 --- /dev/null +++ b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/tvos-arm64_x86_64-simulator/GoogleAppMeasurement.framework/Info.plist @@ -0,0 +1,52 @@ + + + + + BuildMachineOSBuild + 24G231 + CFBundleDevelopmentRegion + en + CFBundleExecutable + GoogleAppMeasurement + CFBundleIdentifier + org.cocoapods.GoogleAppMeasurement + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + GoogleAppMeasurement + CFBundlePackageType + FMWK + CFBundleShortVersionString + 12.5.0 + CFBundleSignature + ???? + CFBundleSupportedPlatforms + + AppleTVSimulator + + CFBundleVersion + 1 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + DTPlatformBuild + 22K152 + DTPlatformName + appletvsimulator + DTPlatformVersion + 18.2 + DTSDKBuild + 22K152 + DTSDKName + appletvsimulator18.2 + DTXcode + 1620 + DTXcodeBuild + 16C5032a + MinimumOSVersion + 100.0 + UIDeviceFamily + + 3 + + + diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/tvos-arm64_x86_64-simulator/GoogleAppMeasurement.framework/Modules/module.modulemap b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/tvos-arm64_x86_64-simulator/GoogleAppMeasurement.framework/Modules/module.modulemap new file mode 100644 index 0000000..d3499f0 --- /dev/null +++ b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/tvos-arm64_x86_64-simulator/GoogleAppMeasurement.framework/Modules/module.modulemap @@ -0,0 +1,10 @@ +framework module GoogleAppMeasurement { +umbrella header "GoogleAppMeasurement-umbrella.h" +export * +module * { export * } + link framework "Security" + link framework "SystemConfiguration" + link "c++" + link "sqlite3" + link "z" +} diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/Info.plist b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/Info.plist new file mode 100644 index 0000000..0eb5ec4 --- /dev/null +++ b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/Info.plist @@ -0,0 +1,107 @@ + + + + + AvailableLibraries + + + BinaryPath + GoogleAppMeasurementIdentitySupport.framework/GoogleAppMeasurementIdentitySupport + LibraryIdentifier + tvos-arm64 + LibraryPath + GoogleAppMeasurementIdentitySupport.framework + SupportedArchitectures + + arm64 + + SupportedPlatform + tvos + + + BinaryPath + GoogleAppMeasurementIdentitySupport.framework/Versions/A/GoogleAppMeasurementIdentitySupport + LibraryIdentifier + macos-arm64_x86_64 + LibraryPath + GoogleAppMeasurementIdentitySupport.framework + SupportedArchitectures + + arm64 + x86_64 + + SupportedPlatform + macos + + + BinaryPath + GoogleAppMeasurementIdentitySupport.framework/GoogleAppMeasurementIdentitySupport + LibraryIdentifier + ios-arm64 + LibraryPath + GoogleAppMeasurementIdentitySupport.framework + SupportedArchitectures + + arm64 + + SupportedPlatform + ios + + + BinaryPath + GoogleAppMeasurementIdentitySupport.framework/GoogleAppMeasurementIdentitySupport + LibraryIdentifier + ios-arm64_x86_64-simulator + LibraryPath + GoogleAppMeasurementIdentitySupport.framework + SupportedArchitectures + + arm64 + x86_64 + + SupportedPlatform + ios + SupportedPlatformVariant + simulator + + + BinaryPath + GoogleAppMeasurementIdentitySupport.framework/Versions/A/GoogleAppMeasurementIdentitySupport + LibraryIdentifier + ios-arm64_x86_64-maccatalyst + LibraryPath + GoogleAppMeasurementIdentitySupport.framework + SupportedArchitectures + + arm64 + x86_64 + + SupportedPlatform + ios + SupportedPlatformVariant + maccatalyst + + + BinaryPath + GoogleAppMeasurementIdentitySupport.framework/GoogleAppMeasurementIdentitySupport + LibraryIdentifier + tvos-arm64_x86_64-simulator + LibraryPath + GoogleAppMeasurementIdentitySupport.framework + SupportedArchitectures + + arm64 + x86_64 + + SupportedPlatform + tvos + SupportedPlatformVariant + simulator + + + CFBundlePackageType + XFWK + XCFrameworkFormatVersion + 1.0 + + diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/_CodeSignature/CodeDirectory b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/_CodeSignature/CodeDirectory new file mode 100644 index 0000000..a764909 Binary files /dev/null and b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/_CodeSignature/CodeDirectory differ diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/_CodeSignature/CodeRequirements b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/_CodeSignature/CodeRequirements new file mode 100644 index 0000000..b2a6e3a Binary files /dev/null and b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/_CodeSignature/CodeRequirements differ diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/_CodeSignature/CodeRequirements-1 b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/_CodeSignature/CodeRequirements-1 new file mode 100644 index 0000000..b500ecd Binary files /dev/null and b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/_CodeSignature/CodeRequirements-1 differ diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/_CodeSignature/CodeResources b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/_CodeSignature/CodeResources new file mode 100644 index 0000000..eed608d --- /dev/null +++ b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/_CodeSignature/CodeResources @@ -0,0 +1,408 @@ + + + + + files + + ios-arm64/GoogleAppMeasurementIdentitySupport.framework/GoogleAppMeasurementIdentitySupport + + M6ZbdObEAbfsPsMuKoRunEyXfXg= + + ios-arm64/GoogleAppMeasurementIdentitySupport.framework/Info.plist + + UzjQZcRHr/FFkxsZURlwMagJByQ= + + ios-arm64/GoogleAppMeasurementIdentitySupport.framework/Modules/module.modulemap + + ZCuUZzVZ47W3gsydCwK/7TEMjVw= + + ios-arm64_x86_64-maccatalyst/GoogleAppMeasurementIdentitySupport.framework/Versions/A/GoogleAppMeasurementIdentitySupport + + 3qa7VAocb8mU9HjtW02SsPMzuX0= + + ios-arm64_x86_64-maccatalyst/GoogleAppMeasurementIdentitySupport.framework/Versions/A/Modules/module.modulemap + + ZCuUZzVZ47W3gsydCwK/7TEMjVw= + + ios-arm64_x86_64-maccatalyst/GoogleAppMeasurementIdentitySupport.framework/Versions/A/Resources/Info.plist + + xkOyJ/8i466DosXHm0PtflD0JDg= + + ios-arm64_x86_64-simulator/GoogleAppMeasurementIdentitySupport.framework/GoogleAppMeasurementIdentitySupport + + uO2+Axt2Wng72ycTpIjw/rK+Xc0= + + ios-arm64_x86_64-simulator/GoogleAppMeasurementIdentitySupport.framework/Info.plist + + AI7WNZSkBMlIu+Pw/v985+Tw4S4= + + ios-arm64_x86_64-simulator/GoogleAppMeasurementIdentitySupport.framework/Modules/module.modulemap + + ZCuUZzVZ47W3gsydCwK/7TEMjVw= + + macos-arm64_x86_64/GoogleAppMeasurementIdentitySupport.framework/Versions/A/GoogleAppMeasurementIdentitySupport + + 3ksMefrIJcYagCYHUL6sIXzTy4I= + + macos-arm64_x86_64/GoogleAppMeasurementIdentitySupport.framework/Versions/A/Modules/module.modulemap + + ZCuUZzVZ47W3gsydCwK/7TEMjVw= + + macos-arm64_x86_64/GoogleAppMeasurementIdentitySupport.framework/Versions/A/Resources/Info.plist + + QFGa4/6z+QYMd5q3WAXCPI7xA1M= + + tvos-arm64/GoogleAppMeasurementIdentitySupport.framework/GoogleAppMeasurementIdentitySupport + + 1KNaTo7fwav5xJYLsbQLWS40hsA= + + tvos-arm64/GoogleAppMeasurementIdentitySupport.framework/Info.plist + + Jl6VU7/l2v6pz3SkZYhqJGPNRcw= + + tvos-arm64/GoogleAppMeasurementIdentitySupport.framework/Modules/module.modulemap + + ZCuUZzVZ47W3gsydCwK/7TEMjVw= + + tvos-arm64_x86_64-simulator/GoogleAppMeasurementIdentitySupport.framework/GoogleAppMeasurementIdentitySupport + + j4SiLbNEihH9vS8GCItJCL399nY= + + tvos-arm64_x86_64-simulator/GoogleAppMeasurementIdentitySupport.framework/Info.plist + + t+v4K/VW+abKvBEArsI6A/D+ynk= + + tvos-arm64_x86_64-simulator/GoogleAppMeasurementIdentitySupport.framework/Modules/module.modulemap + + ZCuUZzVZ47W3gsydCwK/7TEMjVw= + + + files2 + + ios-arm64/GoogleAppMeasurementIdentitySupport.framework/GoogleAppMeasurementIdentitySupport + + hash + + M6ZbdObEAbfsPsMuKoRunEyXfXg= + + hash2 + + 1aztTIyZDKe91Ljfa+rhF8F2eRhTW68YRMFRxxPFqEA= + + + ios-arm64/GoogleAppMeasurementIdentitySupport.framework/Info.plist + + hash + + UzjQZcRHr/FFkxsZURlwMagJByQ= + + hash2 + + poXXkze2sv9OIrFrcg53bVgFjb4Ru9ZE02wwQ+oJElg= + + + ios-arm64/GoogleAppMeasurementIdentitySupport.framework/Modules/module.modulemap + + hash + + ZCuUZzVZ47W3gsydCwK/7TEMjVw= + + hash2 + + UGhX/JwInh1Ja0+DYSnYvdaBKLCWcOy/3nH/ZRnTP7I= + + + ios-arm64_x86_64-maccatalyst/GoogleAppMeasurementIdentitySupport.framework/GoogleAppMeasurementIdentitySupport + + symlink + Versions/Current/GoogleAppMeasurementIdentitySupport + + ios-arm64_x86_64-maccatalyst/GoogleAppMeasurementIdentitySupport.framework/Modules + + symlink + Versions/Current/Modules + + ios-arm64_x86_64-maccatalyst/GoogleAppMeasurementIdentitySupport.framework/Resources + + symlink + Versions/Current/Resources + + ios-arm64_x86_64-maccatalyst/GoogleAppMeasurementIdentitySupport.framework/Versions/A/GoogleAppMeasurementIdentitySupport + + hash + + 3qa7VAocb8mU9HjtW02SsPMzuX0= + + hash2 + + Nv+xxoV37brJGtzk+1hGdLQ7WNkGOqtXoDojvO6IvFk= + + + ios-arm64_x86_64-maccatalyst/GoogleAppMeasurementIdentitySupport.framework/Versions/A/Modules/module.modulemap + + hash + + ZCuUZzVZ47W3gsydCwK/7TEMjVw= + + hash2 + + UGhX/JwInh1Ja0+DYSnYvdaBKLCWcOy/3nH/ZRnTP7I= + + + ios-arm64_x86_64-maccatalyst/GoogleAppMeasurementIdentitySupport.framework/Versions/A/Resources/Info.plist + + hash + + xkOyJ/8i466DosXHm0PtflD0JDg= + + hash2 + + ZbN2T6IdsYreedyT6F2z99M85F0hL4U1V2F85aizX14= + + + ios-arm64_x86_64-maccatalyst/GoogleAppMeasurementIdentitySupport.framework/Versions/Current + + symlink + A + + ios-arm64_x86_64-simulator/GoogleAppMeasurementIdentitySupport.framework/GoogleAppMeasurementIdentitySupport + + hash + + uO2+Axt2Wng72ycTpIjw/rK+Xc0= + + hash2 + + NNiecx9ZyuxU3y5W8DL5hyhGOwJy71MOkunmc+Rum8Y= + + + ios-arm64_x86_64-simulator/GoogleAppMeasurementIdentitySupport.framework/Info.plist + + hash + + AI7WNZSkBMlIu+Pw/v985+Tw4S4= + + hash2 + + vX1yS1rvBCphZWK2m8ImHSsx36k8Jc18RyrRbzPX77k= + + + ios-arm64_x86_64-simulator/GoogleAppMeasurementIdentitySupport.framework/Modules/module.modulemap + + hash + + ZCuUZzVZ47W3gsydCwK/7TEMjVw= + + hash2 + + UGhX/JwInh1Ja0+DYSnYvdaBKLCWcOy/3nH/ZRnTP7I= + + + macos-arm64_x86_64/GoogleAppMeasurementIdentitySupport.framework/GoogleAppMeasurementIdentitySupport + + symlink + Versions/Current/GoogleAppMeasurementIdentitySupport + + macos-arm64_x86_64/GoogleAppMeasurementIdentitySupport.framework/Modules + + symlink + Versions/Current/Modules + + macos-arm64_x86_64/GoogleAppMeasurementIdentitySupport.framework/Resources + + symlink + Versions/Current/Resources + + macos-arm64_x86_64/GoogleAppMeasurementIdentitySupport.framework/Versions/A/GoogleAppMeasurementIdentitySupport + + hash + + 3ksMefrIJcYagCYHUL6sIXzTy4I= + + hash2 + + e/eqO54+W5gTsU3EQokjzihYnHHAzpTK1Eo01fyE3e4= + + + macos-arm64_x86_64/GoogleAppMeasurementIdentitySupport.framework/Versions/A/Modules/module.modulemap + + hash + + ZCuUZzVZ47W3gsydCwK/7TEMjVw= + + hash2 + + UGhX/JwInh1Ja0+DYSnYvdaBKLCWcOy/3nH/ZRnTP7I= + + + macos-arm64_x86_64/GoogleAppMeasurementIdentitySupport.framework/Versions/A/Resources/Info.plist + + hash + + QFGa4/6z+QYMd5q3WAXCPI7xA1M= + + hash2 + + uUGHaOdTsb/7Rdo77Oml9RWFJi79nbY6WvRPjz9nSbM= + + + macos-arm64_x86_64/GoogleAppMeasurementIdentitySupport.framework/Versions/Current + + symlink + A + + tvos-arm64/GoogleAppMeasurementIdentitySupport.framework/GoogleAppMeasurementIdentitySupport + + hash + + 1KNaTo7fwav5xJYLsbQLWS40hsA= + + hash2 + + P/lw48KJctyvdlpLG5yxCYp0ltHZBNTts2WenMAUWFA= + + + tvos-arm64/GoogleAppMeasurementIdentitySupport.framework/Info.plist + + hash + + Jl6VU7/l2v6pz3SkZYhqJGPNRcw= + + hash2 + + C0yMy6R/5URTY5DJ37/MLpIsnvxvNA+1vE0NqC3c+QY= + + + tvos-arm64/GoogleAppMeasurementIdentitySupport.framework/Modules/module.modulemap + + hash + + ZCuUZzVZ47W3gsydCwK/7TEMjVw= + + hash2 + + UGhX/JwInh1Ja0+DYSnYvdaBKLCWcOy/3nH/ZRnTP7I= + + + tvos-arm64_x86_64-simulator/GoogleAppMeasurementIdentitySupport.framework/GoogleAppMeasurementIdentitySupport + + hash + + j4SiLbNEihH9vS8GCItJCL399nY= + + hash2 + + 01s7e0pB2rFyTN06CmhWDSW69MaE9irBxSTZqv6sXck= + + + tvos-arm64_x86_64-simulator/GoogleAppMeasurementIdentitySupport.framework/Info.plist + + hash + + t+v4K/VW+abKvBEArsI6A/D+ynk= + + hash2 + + mKJdPQXtGlG48kqgGPoQDgn3edW4rd5mA0o/X9Y/pUQ= + + + tvos-arm64_x86_64-simulator/GoogleAppMeasurementIdentitySupport.framework/Modules/module.modulemap + + hash + + ZCuUZzVZ47W3gsydCwK/7TEMjVw= + + hash2 + + UGhX/JwInh1Ja0+DYSnYvdaBKLCWcOy/3nH/ZRnTP7I= + + + + rules + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^version.plist$ + + + rules2 + + .*\.dSYM($|/) + + weight + 11 + + ^(.*/)?\.DS_Store$ + + omit + + weight + 2000 + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^Info\.plist$ + + omit + + weight + 20 + + ^PkgInfo$ + + omit + + weight + 20 + + ^embedded\.provisionprofile$ + + weight + 20 + + ^version\.plist$ + + weight + 20 + + + + diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/_CodeSignature/CodeSignature b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/_CodeSignature/CodeSignature new file mode 100644 index 0000000..f81dbeb Binary files /dev/null and b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/_CodeSignature/CodeSignature differ diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/ios-arm64/GoogleAppMeasurementIdentitySupport.framework/GoogleAppMeasurementIdentitySupport b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/ios-arm64/GoogleAppMeasurementIdentitySupport.framework/GoogleAppMeasurementIdentitySupport new file mode 100644 index 0000000..636748d Binary files /dev/null and b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/ios-arm64/GoogleAppMeasurementIdentitySupport.framework/GoogleAppMeasurementIdentitySupport differ diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/ios-arm64/GoogleAppMeasurementIdentitySupport.framework/Info.plist b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/ios-arm64/GoogleAppMeasurementIdentitySupport.framework/Info.plist new file mode 100644 index 0000000..44fd4c9 --- /dev/null +++ b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/ios-arm64/GoogleAppMeasurementIdentitySupport.framework/Info.plist @@ -0,0 +1,57 @@ + + + + + BuildMachineOSBuild + 24G231 + CFBundleDevelopmentRegion + en + CFBundleExecutable + GoogleAppMeasurementIdentitySupport + CFBundleIdentifier + org.cocoapods.GoogleAppMeasurementIdentitySupport + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + GoogleAppMeasurementIdentitySupport + CFBundlePackageType + FMWK + CFBundleShortVersionString + 12.5.0 + CFBundleSignature + ???? + CFBundleSupportedPlatforms + + iPhoneOS + + CFBundleVersion + 1 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + DTPlatformBuild + 22C146 + DTPlatformName + iphoneos + DTPlatformVersion + 18.2 + DTSDKBuild + 22C146 + DTSDKName + iphoneos18.2 + DTXcode + 1620 + DTXcodeBuild + 16C5032a + MinimumOSVersion + 100.0 + UIDeviceFamily + + 1 + 2 + + UIRequiredDeviceCapabilities + + arm64 + + + diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/ios-arm64/GoogleAppMeasurementIdentitySupport.framework/Modules/module.modulemap b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/ios-arm64/GoogleAppMeasurementIdentitySupport.framework/Modules/module.modulemap new file mode 100644 index 0000000..4a42c5d --- /dev/null +++ b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/ios-arm64/GoogleAppMeasurementIdentitySupport.framework/Modules/module.modulemap @@ -0,0 +1,5 @@ +framework module GoogleAppMeasurementIdentitySupport { +umbrella header "GoogleAppMeasurementIdentitySupport-umbrella.h" +export * +module * { export * } +} diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/ios-arm64_x86_64-maccatalyst/GoogleAppMeasurementIdentitySupport.framework/GoogleAppMeasurementIdentitySupport b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/ios-arm64_x86_64-maccatalyst/GoogleAppMeasurementIdentitySupport.framework/GoogleAppMeasurementIdentitySupport new file mode 120000 index 0000000..f029390 --- /dev/null +++ b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/ios-arm64_x86_64-maccatalyst/GoogleAppMeasurementIdentitySupport.framework/GoogleAppMeasurementIdentitySupport @@ -0,0 +1 @@ +Versions/Current/GoogleAppMeasurementIdentitySupport \ No newline at end of file diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/ios-arm64_x86_64-maccatalyst/GoogleAppMeasurementIdentitySupport.framework/Modules b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/ios-arm64_x86_64-maccatalyst/GoogleAppMeasurementIdentitySupport.framework/Modules new file mode 120000 index 0000000..5736f31 --- /dev/null +++ b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/ios-arm64_x86_64-maccatalyst/GoogleAppMeasurementIdentitySupport.framework/Modules @@ -0,0 +1 @@ +Versions/Current/Modules \ No newline at end of file diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/ios-arm64_x86_64-maccatalyst/GoogleAppMeasurementIdentitySupport.framework/Resources b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/ios-arm64_x86_64-maccatalyst/GoogleAppMeasurementIdentitySupport.framework/Resources new file mode 120000 index 0000000..953ee36 --- /dev/null +++ b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/ios-arm64_x86_64-maccatalyst/GoogleAppMeasurementIdentitySupport.framework/Resources @@ -0,0 +1 @@ +Versions/Current/Resources \ No newline at end of file diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/ios-arm64_x86_64-maccatalyst/GoogleAppMeasurementIdentitySupport.framework/Versions/A/GoogleAppMeasurementIdentitySupport b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/ios-arm64_x86_64-maccatalyst/GoogleAppMeasurementIdentitySupport.framework/Versions/A/GoogleAppMeasurementIdentitySupport new file mode 100644 index 0000000..aa72e74 Binary files /dev/null and b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/ios-arm64_x86_64-maccatalyst/GoogleAppMeasurementIdentitySupport.framework/Versions/A/GoogleAppMeasurementIdentitySupport differ diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/ios-arm64_x86_64-maccatalyst/GoogleAppMeasurementIdentitySupport.framework/Versions/A/Modules/module.modulemap b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/ios-arm64_x86_64-maccatalyst/GoogleAppMeasurementIdentitySupport.framework/Versions/A/Modules/module.modulemap new file mode 100644 index 0000000..4a42c5d --- /dev/null +++ b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/ios-arm64_x86_64-maccatalyst/GoogleAppMeasurementIdentitySupport.framework/Versions/A/Modules/module.modulemap @@ -0,0 +1,5 @@ +framework module GoogleAppMeasurementIdentitySupport { +umbrella header "GoogleAppMeasurementIdentitySupport-umbrella.h" +export * +module * { export * } +} diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/ios-arm64_x86_64-maccatalyst/GoogleAppMeasurementIdentitySupport.framework/Versions/A/Resources/Info.plist b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/ios-arm64_x86_64-maccatalyst/GoogleAppMeasurementIdentitySupport.framework/Versions/A/Resources/Info.plist new file mode 100644 index 0000000..c8a5e9f --- /dev/null +++ b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/ios-arm64_x86_64-maccatalyst/GoogleAppMeasurementIdentitySupport.framework/Versions/A/Resources/Info.plist @@ -0,0 +1,54 @@ + + + + + BuildMachineOSBuild + 24G231 + CFBundleDevelopmentRegion + en + CFBundleExecutable + GoogleAppMeasurementIdentitySupport + CFBundleIdentifier + org.cocoapods.GoogleAppMeasurementIdentitySupport + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + GoogleAppMeasurementIdentitySupport + CFBundlePackageType + FMWK + CFBundleShortVersionString + 12.5.0 + CFBundleSignature + ???? + CFBundleSupportedPlatforms + + MacOSX + + CFBundleVersion + 1 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + DTPlatformBuild + 24C94 + DTPlatformName + macosx + DTPlatformVersion + 15.2 + DTSDKBuild + 24C94 + DTSDKName + macosx15.2 + DTXcode + 1620 + DTXcodeBuild + 16C5032a + LSMinimumSystemVersion + 12.0 + MinimumOSVersion + 100.0 + UIDeviceFamily + + 2 + + + diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/ios-arm64_x86_64-maccatalyst/GoogleAppMeasurementIdentitySupport.framework/Versions/Current b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/ios-arm64_x86_64-maccatalyst/GoogleAppMeasurementIdentitySupport.framework/Versions/Current new file mode 120000 index 0000000..8c7e5a6 --- /dev/null +++ b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/ios-arm64_x86_64-maccatalyst/GoogleAppMeasurementIdentitySupport.framework/Versions/Current @@ -0,0 +1 @@ +A \ No newline at end of file diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/ios-arm64_x86_64-simulator/GoogleAppMeasurementIdentitySupport.framework/GoogleAppMeasurementIdentitySupport b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/ios-arm64_x86_64-simulator/GoogleAppMeasurementIdentitySupport.framework/GoogleAppMeasurementIdentitySupport new file mode 100644 index 0000000..f160ca4 Binary files /dev/null and b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/ios-arm64_x86_64-simulator/GoogleAppMeasurementIdentitySupport.framework/GoogleAppMeasurementIdentitySupport differ diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/ios-arm64_x86_64-simulator/GoogleAppMeasurementIdentitySupport.framework/Info.plist b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/ios-arm64_x86_64-simulator/GoogleAppMeasurementIdentitySupport.framework/Info.plist new file mode 100644 index 0000000..0619d67 --- /dev/null +++ b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/ios-arm64_x86_64-simulator/GoogleAppMeasurementIdentitySupport.framework/Info.plist @@ -0,0 +1,53 @@ + + + + + BuildMachineOSBuild + 24G231 + CFBundleDevelopmentRegion + en + CFBundleExecutable + GoogleAppMeasurementIdentitySupport + CFBundleIdentifier + org.cocoapods.GoogleAppMeasurementIdentitySupport + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + GoogleAppMeasurementIdentitySupport + CFBundlePackageType + FMWK + CFBundleShortVersionString + 12.5.0 + CFBundleSignature + ???? + CFBundleSupportedPlatforms + + iPhoneSimulator + + CFBundleVersion + 1 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + DTPlatformBuild + 22C146 + DTPlatformName + iphonesimulator + DTPlatformVersion + 18.2 + DTSDKBuild + 22C146 + DTSDKName + iphonesimulator18.2 + DTXcode + 1620 + DTXcodeBuild + 16C5032a + MinimumOSVersion + 100.0 + UIDeviceFamily + + 1 + 2 + + + diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/ios-arm64_x86_64-simulator/GoogleAppMeasurementIdentitySupport.framework/Modules/module.modulemap b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/ios-arm64_x86_64-simulator/GoogleAppMeasurementIdentitySupport.framework/Modules/module.modulemap new file mode 100644 index 0000000..4a42c5d --- /dev/null +++ b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/ios-arm64_x86_64-simulator/GoogleAppMeasurementIdentitySupport.framework/Modules/module.modulemap @@ -0,0 +1,5 @@ +framework module GoogleAppMeasurementIdentitySupport { +umbrella header "GoogleAppMeasurementIdentitySupport-umbrella.h" +export * +module * { export * } +} diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/macos-arm64_x86_64/GoogleAppMeasurementIdentitySupport.framework/GoogleAppMeasurementIdentitySupport b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/macos-arm64_x86_64/GoogleAppMeasurementIdentitySupport.framework/GoogleAppMeasurementIdentitySupport new file mode 120000 index 0000000..f029390 --- /dev/null +++ b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/macos-arm64_x86_64/GoogleAppMeasurementIdentitySupport.framework/GoogleAppMeasurementIdentitySupport @@ -0,0 +1 @@ +Versions/Current/GoogleAppMeasurementIdentitySupport \ No newline at end of file diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/macos-arm64_x86_64/GoogleAppMeasurementIdentitySupport.framework/Modules b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/macos-arm64_x86_64/GoogleAppMeasurementIdentitySupport.framework/Modules new file mode 120000 index 0000000..5736f31 --- /dev/null +++ b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/macos-arm64_x86_64/GoogleAppMeasurementIdentitySupport.framework/Modules @@ -0,0 +1 @@ +Versions/Current/Modules \ No newline at end of file diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/macos-arm64_x86_64/GoogleAppMeasurementIdentitySupport.framework/Resources b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/macos-arm64_x86_64/GoogleAppMeasurementIdentitySupport.framework/Resources new file mode 120000 index 0000000..953ee36 --- /dev/null +++ b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/macos-arm64_x86_64/GoogleAppMeasurementIdentitySupport.framework/Resources @@ -0,0 +1 @@ +Versions/Current/Resources \ No newline at end of file diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/macos-arm64_x86_64/GoogleAppMeasurementIdentitySupport.framework/Versions/A/GoogleAppMeasurementIdentitySupport b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/macos-arm64_x86_64/GoogleAppMeasurementIdentitySupport.framework/Versions/A/GoogleAppMeasurementIdentitySupport new file mode 100644 index 0000000..d737fc4 Binary files /dev/null and b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/macos-arm64_x86_64/GoogleAppMeasurementIdentitySupport.framework/Versions/A/GoogleAppMeasurementIdentitySupport differ diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/macos-arm64_x86_64/GoogleAppMeasurementIdentitySupport.framework/Versions/A/Modules/module.modulemap b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/macos-arm64_x86_64/GoogleAppMeasurementIdentitySupport.framework/Versions/A/Modules/module.modulemap new file mode 100644 index 0000000..4a42c5d --- /dev/null +++ b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/macos-arm64_x86_64/GoogleAppMeasurementIdentitySupport.framework/Versions/A/Modules/module.modulemap @@ -0,0 +1,5 @@ +framework module GoogleAppMeasurementIdentitySupport { +umbrella header "GoogleAppMeasurementIdentitySupport-umbrella.h" +export * +module * { export * } +} diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/macos-arm64_x86_64/GoogleAppMeasurementIdentitySupport.framework/Versions/A/Resources/Info.plist b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/macos-arm64_x86_64/GoogleAppMeasurementIdentitySupport.framework/Versions/A/Resources/Info.plist new file mode 100644 index 0000000..bc880fd --- /dev/null +++ b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/macos-arm64_x86_64/GoogleAppMeasurementIdentitySupport.framework/Versions/A/Resources/Info.plist @@ -0,0 +1,50 @@ + + + + + BuildMachineOSBuild + 24G231 + CFBundleDevelopmentRegion + en + CFBundleExecutable + GoogleAppMeasurementIdentitySupport + CFBundleIdentifier + org.cocoapods.GoogleAppMeasurementIdentitySupport + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + GoogleAppMeasurementIdentitySupport + CFBundlePackageType + FMWK + CFBundleShortVersionString + 12.5.0 + CFBundleSignature + ???? + CFBundleSupportedPlatforms + + MacOSX + + CFBundleVersion + 1 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + DTPlatformBuild + 24C94 + DTPlatformName + macosx + DTPlatformVersion + 15.2 + DTSDKBuild + 24C94 + DTSDKName + macosx15.2 + DTXcode + 1620 + DTXcodeBuild + 16C5032a + LSMinimumSystemVersion + 10.15 + MinimumOSVersion + 100.0 + + diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/macos-arm64_x86_64/GoogleAppMeasurementIdentitySupport.framework/Versions/Current b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/macos-arm64_x86_64/GoogleAppMeasurementIdentitySupport.framework/Versions/Current new file mode 120000 index 0000000..8c7e5a6 --- /dev/null +++ b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/macos-arm64_x86_64/GoogleAppMeasurementIdentitySupport.framework/Versions/Current @@ -0,0 +1 @@ +A \ No newline at end of file diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/tvos-arm64/GoogleAppMeasurementIdentitySupport.framework/GoogleAppMeasurementIdentitySupport b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/tvos-arm64/GoogleAppMeasurementIdentitySupport.framework/GoogleAppMeasurementIdentitySupport new file mode 100644 index 0000000..1afc06c Binary files /dev/null and b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/tvos-arm64/GoogleAppMeasurementIdentitySupport.framework/GoogleAppMeasurementIdentitySupport differ diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/tvos-arm64/GoogleAppMeasurementIdentitySupport.framework/Info.plist b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/tvos-arm64/GoogleAppMeasurementIdentitySupport.framework/Info.plist new file mode 100644 index 0000000..db7d47a --- /dev/null +++ b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/tvos-arm64/GoogleAppMeasurementIdentitySupport.framework/Info.plist @@ -0,0 +1,52 @@ + + + + + BuildMachineOSBuild + 24G231 + CFBundleDevelopmentRegion + en + CFBundleExecutable + GoogleAppMeasurementIdentitySupport + CFBundleIdentifier + org.cocoapods.GoogleAppMeasurementIdentitySupport + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + GoogleAppMeasurementIdentitySupport + CFBundlePackageType + FMWK + CFBundleShortVersionString + 12.5.0 + CFBundleSignature + ???? + CFBundleSupportedPlatforms + + AppleTVOS + + CFBundleVersion + 1 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + DTPlatformBuild + 22K152 + DTPlatformName + appletvos + DTPlatformVersion + 18.2 + DTSDKBuild + 22K152 + DTSDKName + appletvos18.2 + DTXcode + 1620 + DTXcodeBuild + 16C5032a + MinimumOSVersion + 100.0 + UIDeviceFamily + + 3 + + + diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/tvos-arm64/GoogleAppMeasurementIdentitySupport.framework/Modules/module.modulemap b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/tvos-arm64/GoogleAppMeasurementIdentitySupport.framework/Modules/module.modulemap new file mode 100644 index 0000000..4a42c5d --- /dev/null +++ b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/tvos-arm64/GoogleAppMeasurementIdentitySupport.framework/Modules/module.modulemap @@ -0,0 +1,5 @@ +framework module GoogleAppMeasurementIdentitySupport { +umbrella header "GoogleAppMeasurementIdentitySupport-umbrella.h" +export * +module * { export * } +} diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/tvos-arm64_x86_64-simulator/GoogleAppMeasurementIdentitySupport.framework/GoogleAppMeasurementIdentitySupport b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/tvos-arm64_x86_64-simulator/GoogleAppMeasurementIdentitySupport.framework/GoogleAppMeasurementIdentitySupport new file mode 100644 index 0000000..e983f01 Binary files /dev/null and b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/tvos-arm64_x86_64-simulator/GoogleAppMeasurementIdentitySupport.framework/GoogleAppMeasurementIdentitySupport differ diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/tvos-arm64_x86_64-simulator/GoogleAppMeasurementIdentitySupport.framework/Info.plist b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/tvos-arm64_x86_64-simulator/GoogleAppMeasurementIdentitySupport.framework/Info.plist new file mode 100644 index 0000000..ac62b04 --- /dev/null +++ b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/tvos-arm64_x86_64-simulator/GoogleAppMeasurementIdentitySupport.framework/Info.plist @@ -0,0 +1,52 @@ + + + + + BuildMachineOSBuild + 24G231 + CFBundleDevelopmentRegion + en + CFBundleExecutable + GoogleAppMeasurementIdentitySupport + CFBundleIdentifier + org.cocoapods.GoogleAppMeasurementIdentitySupport + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + GoogleAppMeasurementIdentitySupport + CFBundlePackageType + FMWK + CFBundleShortVersionString + 12.5.0 + CFBundleSignature + ???? + CFBundleSupportedPlatforms + + AppleTVSimulator + + CFBundleVersion + 1 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + DTPlatformBuild + 22K152 + DTPlatformName + appletvsimulator + DTPlatformVersion + 18.2 + DTSDKBuild + 22K152 + DTSDKName + appletvsimulator18.2 + DTXcode + 1620 + DTXcodeBuild + 16C5032a + MinimumOSVersion + 100.0 + UIDeviceFamily + + 3 + + + diff --git a/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/tvos-arm64_x86_64-simulator/GoogleAppMeasurementIdentitySupport.framework/Modules/module.modulemap b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/tvos-arm64_x86_64-simulator/GoogleAppMeasurementIdentitySupport.framework/Modules/module.modulemap new file mode 100644 index 0000000..4a42c5d --- /dev/null +++ b/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework/tvos-arm64_x86_64-simulator/GoogleAppMeasurementIdentitySupport.framework/Modules/module.modulemap @@ -0,0 +1,5 @@ +framework module GoogleAppMeasurementIdentitySupport { +umbrella header "GoogleAppMeasurementIdentitySupport-umbrella.h" +export * +module * { export * } +} diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/GDTCCTCompressionHelper.m b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/GDTCCTCompressionHelper.m new file mode 100644 index 0000000..11d849e --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/GDTCCTCompressionHelper.m @@ -0,0 +1,95 @@ +/* + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "GoogleDataTransport/GDTCCTLibrary/Private/GDTCCTCompressionHelper.h" + +#import + +@implementation GDTCCTCompressionHelper + ++ (nullable NSData *)gzippedData:(NSData *)data { +#if defined(__LP64__) && __LP64__ + // Don't support > 32bit length for 64 bit, see note in header. + if (data.length > UINT_MAX) { + return nil; + } +#endif + + enum { kChunkSize = 1024 }; + + const void *bytes = [data bytes]; + NSUInteger length = [data length]; + + int level = Z_DEFAULT_COMPRESSION; + if (!bytes || !length) { + return nil; + } + + z_stream strm; + bzero(&strm, sizeof(z_stream)); + + int memLevel = 8; // Default. + int windowBits = 15 + 16; // Enable gzip header instead of zlib header. + + int retCode; + if (deflateInit2(&strm, level, Z_DEFLATED, windowBits, memLevel, Z_DEFAULT_STRATEGY) != Z_OK) { + return nil; + } + + // Hint the size at 1/4 the input size. + NSMutableData *result = [NSMutableData dataWithCapacity:(length / 4)]; + unsigned char output[kChunkSize]; + + // Setup the input. + strm.avail_in = (unsigned int)length; + strm.next_in = (unsigned char *)bytes; + + // Collect the data. + do { + // update what we're passing in + strm.avail_out = kChunkSize; + strm.next_out = output; + retCode = deflate(&strm, Z_FINISH); + if ((retCode != Z_OK) && (retCode != Z_STREAM_END)) { + deflateEnd(&strm); + return nil; + } + // Collect what we got. + unsigned gotBack = kChunkSize - strm.avail_out; + if (gotBack > 0) { + [result appendBytes:output length:gotBack]; + } + + } while (retCode == Z_OK); + + // If the loop exits, it used all input and the stream ended. + NSAssert(strm.avail_in == 0, + @"Should have finished deflating without using all input, %u bytes left", strm.avail_in); + NSAssert(retCode == Z_STREAM_END, + @"thought we finished deflate w/o getting a result of stream end, code %d", retCode); + + // Clean up. + deflateEnd(&strm); + + return result; +} + ++ (BOOL)isGzipped:(NSData *)data { + const UInt8 *bytes = (const UInt8 *)data.bytes; + return (data.length >= 2 && bytes[0] == 0x1f && bytes[1] == 0x8b); +} + +@end diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/GDTCCTNanopbHelpers.m b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/GDTCCTNanopbHelpers.m new file mode 100644 index 0000000..450fda8 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/GDTCCTNanopbHelpers.m @@ -0,0 +1,322 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "GoogleDataTransport/GDTCCTLibrary/Private/GDTCCTNanopbHelpers.h" + +#if TARGET_OS_IOS || TARGET_OS_TV +#import +#elif TARGET_OS_OSX +#import +#endif // TARGET_OS_IOS || TARGET_OS_TV + +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORPlatform.h" +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORClock.h" +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORConsoleLogger.h" +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCOREvent.h" + +#import +#import +#import + +#import "GoogleDataTransport/GDTCCTLibrary/Public/GDTCOREvent+GDTCCTSupport.h" + +#pragma mark - General purpose encoders + +pb_bytes_array_t *GDTCCTEncodeString(NSString *string) { + NSData *stringBytes = [string dataUsingEncoding:NSUTF8StringEncoding]; + return GDTCCTEncodeData(stringBytes); +} + +pb_bytes_array_t *GDTCCTEncodeData(NSData *data) { + pb_bytes_array_t *pbBytesArray = calloc(1, PB_BYTES_ARRAY_T_ALLOCSIZE(data.length)); + if (pbBytesArray != NULL) { + [data getBytes:pbBytesArray->bytes length:data.length]; + pbBytesArray->size = (pb_size_t)data.length; + } + return pbBytesArray; +} + +#pragma mark - CCT object constructors + +NSData *_Nullable GDTCCTEncodeBatchedLogRequest(gdt_cct_BatchedLogRequest *batchedLogRequest) { + pb_ostream_t sizestream = PB_OSTREAM_SIZING; + // Encode 1 time to determine the size. + if (!pb_encode(&sizestream, gdt_cct_BatchedLogRequest_fields, batchedLogRequest)) { + GDTCORLogError(GDTCORMCEGeneralError, @"Error in nanopb encoding for size: %s", + PB_GET_ERROR(&sizestream)); + } + + // Encode a 2nd time to actually get the bytes from it. + size_t bufferSize = sizestream.bytes_written; + CFMutableDataRef dataRef = CFDataCreateMutable(CFAllocatorGetDefault(), bufferSize); + CFDataSetLength(dataRef, bufferSize); + pb_ostream_t ostream = pb_ostream_from_buffer((void *)CFDataGetBytePtr(dataRef), bufferSize); + if (!pb_encode(&ostream, gdt_cct_BatchedLogRequest_fields, batchedLogRequest)) { + GDTCORLogError(GDTCORMCEGeneralError, @"Error in nanopb encoding for bytes: %s", + PB_GET_ERROR(&ostream)); + } + + return CFBridgingRelease(dataRef); +} + +gdt_cct_BatchedLogRequest GDTCCTConstructBatchedLogRequest( + NSDictionary *> *logMappingIDToLogSet) { + gdt_cct_BatchedLogRequest batchedLogRequest = gdt_cct_BatchedLogRequest_init_default; + NSUInteger numberOfLogRequests = logMappingIDToLogSet.count; + gdt_cct_LogRequest *logRequests = calloc(numberOfLogRequests, sizeof(gdt_cct_LogRequest)); + if (logRequests == NULL) { + return batchedLogRequest; + } + + __block int i = 0; + [logMappingIDToLogSet enumerateKeysAndObjectsUsingBlock:^(NSString *_Nonnull logMappingID, + NSSet *_Nonnull logSet, + BOOL *_Nonnull stop) { + int32_t logSource = [logMappingID intValue]; + gdt_cct_LogRequest logRequest = GDTCCTConstructLogRequest(logSource, logSet); + logRequests[i] = logRequest; + i++; + }]; + + batchedLogRequest.log_request = logRequests; + batchedLogRequest.log_request_count = (pb_size_t)numberOfLogRequests; + return batchedLogRequest; +} + +gdt_cct_LogRequest GDTCCTConstructLogRequest(int32_t logSource, + NSSet *_Nonnull logSet) { + if (logSet.count == 0) { + GDTCORLogError(GDTCORMCEGeneralError, @"%@", + @"An empty event set can't be serialized to proto."); + gdt_cct_LogRequest logRequest = gdt_cct_LogRequest_init_default; + return logRequest; + } + gdt_cct_LogRequest logRequest = gdt_cct_LogRequest_init_default; + logRequest.log_source = logSource; + logRequest.has_log_source = 1; + logRequest.client_info = GDTCCTConstructClientInfo(); + logRequest.has_client_info = 1; + logRequest.log_event = calloc(logSet.count, sizeof(gdt_cct_LogEvent)); + if (logRequest.log_event == NULL) { + return logRequest; + } + int i = 0; + for (GDTCOREvent *log in logSet) { + gdt_cct_LogEvent logEvent = GDTCCTConstructLogEvent(log); + logRequest.log_event[i] = logEvent; + i++; + } + logRequest.log_event_count = (pb_size_t)logSet.count; + + GDTCORClock *currentTime = [GDTCORClock snapshot]; + logRequest.request_time_ms = currentTime.timeMillis; + logRequest.has_request_time_ms = 1; + logRequest.request_uptime_ms = [currentTime uptimeMilliseconds]; + logRequest.has_request_uptime_ms = 1; + + return logRequest; +} + +gdt_cct_LogEvent GDTCCTConstructLogEvent(GDTCOREvent *event) { + gdt_cct_LogEvent logEvent = gdt_cct_LogEvent_init_default; + logEvent.event_time_ms = event.clockSnapshot.timeMillis; + logEvent.has_event_time_ms = 1; + logEvent.event_uptime_ms = [event.clockSnapshot uptimeMilliseconds]; + logEvent.has_event_uptime_ms = 1; + logEvent.timezone_offset_seconds = event.clockSnapshot.timezoneOffsetSeconds; + logEvent.has_timezone_offset_seconds = 1; + if (event.customBytes) { + NSData *networkConnectionInfoData = event.networkConnectionInfoData; + if (networkConnectionInfoData) { + [networkConnectionInfoData getBytes:&logEvent.network_connection_info + length:networkConnectionInfoData.length]; + logEvent.has_network_connection_info = 1; + } + NSNumber *eventCode = event.eventCode; + if (eventCode != nil) { + logEvent.has_event_code = 1; + logEvent.event_code = [eventCode intValue]; + } + } + NSError *error; + NSData *extensionBytes; + extensionBytes = event.serializedDataObjectBytes; + if (error) { + GDTCORLogWarning(GDTCORMCWFileReadError, + @"There was an error reading extension bytes from disk: %@", error); + return logEvent; + } + logEvent.source_extension = GDTCCTEncodeData(extensionBytes); // read bytes from the file. + if (event.productData) { + logEvent.compliance_data = GDTCCTConstructComplianceData(event.productData); + logEvent.has_compliance_data = 1; + } + return logEvent; +} + +gdt_cct_ComplianceData GDTCCTConstructComplianceData(GDTCORProductData *productData) { + privacy_context_external_ExternalPRequestContext prequest = + privacy_context_external_ExternalPRequestContext_init_default; + prequest.origin_associated_product_id = productData.productID; + prequest.has_origin_associated_product_id = 1; + + privacy_context_external_ExternalPrivacyContext privacy_context = + privacy_context_external_ExternalPrivacyContext_init_default; + privacy_context.prequest = prequest; + privacy_context.has_prequest = 1; + + gdt_cct_ComplianceData complianceData = gdt_cct_ComplianceData_init_default; + complianceData.privacy_context = privacy_context; + complianceData.has_privacy_context = 1; + complianceData.product_id_origin = gdt_cct_ComplianceData_ProductIdOrigin_EVENT_OVERRIDE; + complianceData.has_product_id_origin = 1; + return complianceData; +} + +gdt_cct_ClientInfo GDTCCTConstructClientInfo(void) { + gdt_cct_ClientInfo clientInfo = gdt_cct_ClientInfo_init_default; + clientInfo.client_type = gdt_cct_ClientInfo_ClientType_IOS_FIREBASE; + clientInfo.has_client_type = 1; +#if TARGET_OS_IOS || TARGET_OS_TV + clientInfo.ios_client_info = GDTCCTConstructiOSClientInfo(); + clientInfo.has_ios_client_info = 1; +#elif TARGET_OS_OSX + clientInfo.mac_client_info = GDTCCTConstructMacClientInfo(); + clientInfo.has_mac_client_info = 1; +#endif + return clientInfo; +} + +gdt_cct_IosClientInfo GDTCCTConstructiOSClientInfo(void) { + gdt_cct_IosClientInfo iOSClientInfo = gdt_cct_IosClientInfo_init_default; +#if TARGET_OS_IOS || TARGET_OS_TV + UIDevice *device = [UIDevice currentDevice]; + NSBundle *bundle = [NSBundle mainBundle]; + NSLocale *locale = [NSLocale currentLocale]; + iOSClientInfo.os_full_version = GDTCCTEncodeString(device.systemVersion); + NSArray *versionComponents = [device.systemVersion componentsSeparatedByString:@"."]; + iOSClientInfo.os_major_version = GDTCCTEncodeString(versionComponents[0]); + NSString *version = [bundle objectForInfoDictionaryKey:(NSString *)kCFBundleVersionKey]; + if (version) { + iOSClientInfo.application_build = GDTCCTEncodeString(version); + } + NSString *countryCode = [locale objectForKey:NSLocaleCountryCode]; + if (countryCode) { + iOSClientInfo.country = GDTCCTEncodeString([locale objectForKey:NSLocaleCountryCode]); + } + iOSClientInfo.model = GDTCCTEncodeString(GDTCORDeviceModel()); + NSString *languageCode = bundle.preferredLocalizations.firstObject; + iOSClientInfo.language_code = + languageCode ? GDTCCTEncodeString(languageCode) : GDTCCTEncodeString(@"en"); + iOSClientInfo.application_bundle_id = GDTCCTEncodeString(bundle.bundleIdentifier); +#endif + return iOSClientInfo; +} + +gdt_cct_MacClientInfo GDTCCTConstructMacClientInfo(void) { + gdt_cct_MacClientInfo macOSClientInfo = gdt_cct_MacClientInfo_init_default; + + NSOperatingSystemVersion osVersion = [NSProcessInfo processInfo].operatingSystemVersion; + NSString *majorVersion = [@(osVersion.majorVersion) stringValue]; + NSString *minorVersion = [@(osVersion.minorVersion) stringValue]; + NSString *majorAndMinorString = [NSString stringWithFormat:@"%@.%@", majorVersion, minorVersion]; + macOSClientInfo.os_major_version = GDTCCTEncodeString(majorAndMinorString); + + NSString *patchVersion = [@(osVersion.patchVersion) stringValue]; + NSString *majorMinorPatchString = + [NSString stringWithFormat:@"%@.%@", majorAndMinorString, patchVersion]; + macOSClientInfo.os_full_version = GDTCCTEncodeString(majorMinorPatchString); + + NSBundle *bundle = [NSBundle mainBundle]; + NSString *version = [bundle objectForInfoDictionaryKey:(NSString *)kCFBundleVersionKey]; + if (version) { + macOSClientInfo.application_build = GDTCCTEncodeString(version); + } + + NSString *bundleID = bundle.bundleIdentifier; + if (bundleID) { + macOSClientInfo.application_bundle_id = GDTCCTEncodeString(bundleID); + } + + return macOSClientInfo; +} + +NSData *GDTCCTConstructNetworkConnectionInfoData(void) { + gdt_cct_NetworkConnectionInfo networkConnectionInfo = gdt_cct_NetworkConnectionInfo_init_default; + NSInteger currentNetworkType = GDTCORNetworkTypeMessage(); + if (currentNetworkType) { + networkConnectionInfo.has_network_type = 1; + if (currentNetworkType == GDTCORNetworkTypeMobile) { + networkConnectionInfo.network_type = gdt_cct_NetworkConnectionInfo_NetworkType_MOBILE; + networkConnectionInfo.mobile_subtype = GDTCCTNetworkConnectionInfoNetworkMobileSubtype(); + if (networkConnectionInfo.mobile_subtype != + gdt_cct_NetworkConnectionInfo_MobileSubtype_UNKNOWN_MOBILE_SUBTYPE) { + networkConnectionInfo.has_mobile_subtype = 1; + } + } else { + networkConnectionInfo.network_type = gdt_cct_NetworkConnectionInfo_NetworkType_WIFI; + } + } + NSData *networkConnectionInfoData = [NSData dataWithBytes:&networkConnectionInfo + length:sizeof(networkConnectionInfo)]; + return networkConnectionInfoData; +} + +gdt_cct_NetworkConnectionInfo_MobileSubtype GDTCCTNetworkConnectionInfoNetworkMobileSubtype(void) { + NSNumber *networkMobileSubtypeMessage = @(GDTCORNetworkMobileSubTypeMessage()); + if (!networkMobileSubtypeMessage.intValue) { + return gdt_cct_NetworkConnectionInfo_MobileSubtype_UNKNOWN_MOBILE_SUBTYPE; + } + static NSDictionary *MessageToNetworkSubTypeMessage; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + MessageToNetworkSubTypeMessage = @{ + @(GDTCORNetworkMobileSubtypeGPRS) : @(gdt_cct_NetworkConnectionInfo_MobileSubtype_GPRS), + @(GDTCORNetworkMobileSubtypeEdge) : @(gdt_cct_NetworkConnectionInfo_MobileSubtype_EDGE), + @(GDTCORNetworkMobileSubtypeWCDMA) : + @(gdt_cct_NetworkConnectionInfo_MobileSubtype_UNKNOWN_MOBILE_SUBTYPE), + @(GDTCORNetworkMobileSubtypeHSDPA) : @(gdt_cct_NetworkConnectionInfo_MobileSubtype_HSDPA), + @(GDTCORNetworkMobileSubtypeHSUPA) : @(gdt_cct_NetworkConnectionInfo_MobileSubtype_HSUPA), + @(GDTCORNetworkMobileSubtypeCDMA1x) : @(gdt_cct_NetworkConnectionInfo_MobileSubtype_CDMA), + @(GDTCORNetworkMobileSubtypeCDMAEVDORev0) : + @(gdt_cct_NetworkConnectionInfo_MobileSubtype_EVDO_0), + @(GDTCORNetworkMobileSubtypeCDMAEVDORevA) : + @(gdt_cct_NetworkConnectionInfo_MobileSubtype_EVDO_A), + @(GDTCORNetworkMobileSubtypeCDMAEVDORevB) : + @(gdt_cct_NetworkConnectionInfo_MobileSubtype_EVDO_B), + @(GDTCORNetworkMobileSubtypeHRPD) : @(gdt_cct_NetworkConnectionInfo_MobileSubtype_EHRPD), + @(GDTCORNetworkMobileSubtypeLTE) : @(gdt_cct_NetworkConnectionInfo_MobileSubtype_LTE), + }; + }); + NSNumber *networkMobileSubtype = MessageToNetworkSubTypeMessage[networkMobileSubtypeMessage]; + return networkMobileSubtype.intValue; +} + +#pragma mark - CCT Object decoders + +gdt_cct_LogResponse GDTCCTDecodeLogResponse(NSData *data, NSError **error) { + gdt_cct_LogResponse response = gdt_cct_LogResponse_init_default; + pb_istream_t istream = pb_istream_from_buffer([data bytes], [data length]); + if (!pb_decode(&istream, gdt_cct_LogResponse_fields, &response)) { + NSString *nanopb_error = [NSString stringWithFormat:@"%s", PB_GET_ERROR(&istream)]; + NSDictionary *userInfo = @{@"nanopb error:" : nanopb_error}; + if (error != NULL) { + *error = [NSError errorWithDomain:NSURLErrorDomain code:-1 userInfo:userInfo]; + } + response = (gdt_cct_LogResponse)gdt_cct_LogResponse_init_default; + } + return response; +} diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/GDTCCTURLSessionDataResponse.m b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/GDTCCTURLSessionDataResponse.m new file mode 100644 index 0000000..669e93f --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/GDTCCTURLSessionDataResponse.m @@ -0,0 +1,28 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "GoogleDataTransport/GDTCCTLibrary/Private/GDTCCTURLSessionDataResponse.h" + +@implementation GDTCCTURLSessionDataResponse + +- (instancetype)initWithResponse:(NSHTTPURLResponse *)response HTTPBody:(NSData *)body { + self = [super init]; + if (self) { + _HTTPResponse = response; + _HTTPBody = body; + } + return self; +} + +@end diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/GDTCCTUploadOperation.m b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/GDTCCTUploadOperation.m new file mode 100644 index 0000000..354d14c --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/GDTCCTUploadOperation.m @@ -0,0 +1,668 @@ +/* + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "GoogleDataTransport/GDTCCTLibrary/Private/GDTCCTUploadOperation.h" + +#if __has_include() +#import +#else +#import "FBLPromises.h" +#endif + +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORPlatform.h" +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORRegistrar.h" +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORStorageProtocol.h" +#import "GoogleDataTransport/GDTCORLibrary/Private/GDTCORMetrics.h" +#import "GoogleDataTransport/GDTCORLibrary/Private/GDTCORUploadBatch.h" +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORConsoleLogger.h" +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCOREvent.h" + +#import +#import +#import + +#import "GoogleDataTransport/GDTCCTLibrary/Private/GDTCCTCompressionHelper.h" +#import "GoogleDataTransport/GDTCCTLibrary/Private/GDTCCTNanopbHelpers.h" +#import "GoogleDataTransport/GDTCCTLibrary/Private/GDTCCTURLSessionDataResponse.h" +#import "GoogleDataTransport/GDTCCTLibrary/Private/GDTCOREvent+GDTMetricsSupport.h" + +#import "GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/cct.nanopb.h" + +NS_ASSUME_NONNULL_BEGIN + +#ifdef GDTCOR_VERSION +#define STR(x) STR_EXPAND(x) +#define STR_EXPAND(x) #x +static NSString *const kGDTCCTSupportSDKVersion = @STR(GDTCOR_VERSION); +#else +static NSString *const kGDTCCTSupportSDKVersion = @"UNKNOWN"; +#endif // GDTCOR_VERSION + +typedef void (^GDTCCTUploaderURLTaskCompletion)(NSNumber *batchID, + NSSet *_Nullable events, + NSData *_Nullable data, + NSURLResponse *_Nullable response, + NSError *_Nullable error); + +typedef void (^GDTCCTUploaderEventBatchBlock)(NSNumber *_Nullable batchID, + NSSet *_Nullable events); + +@interface GDTCCTUploadOperation () + +/// The properties to store parameters passed in the initializer. See the initialized docs for +/// details. +@property(nonatomic, readonly) GDTCORTarget target; +@property(nonatomic, readonly) GDTCORUploadConditions conditions; +@property(nonatomic, readonly) NSURL *uploadURL; +@property(nonatomic, readonly) id storage; +@property(nonatomic, readonly) id metadataProvider; +@property(nonatomic, readonly, nullable) id metricsController; + +/** The URL session that will attempt upload. */ +@property(nonatomic, nullable) NSURLSession *uploaderSession; + +/// The metrics being uploaded by the operation. These metrics are fetched and included as an event +/// in the upload batch as part of the upload process. +/// +/// Metrics being uploaded are retained so they can be re-stored if upload is not successful. +@property(nonatomic, nullable) GDTCORMetrics *currentMetrics; + +/// NSOperation state properties implementation. +@property(nonatomic, readwrite, getter=isExecuting) BOOL executing; +@property(nonatomic, readwrite, getter=isFinished) BOOL finished; + +@property(nonatomic, readwrite) BOOL uploadAttempted; + +@end + +@implementation GDTCCTUploadOperation + +- (instancetype)initWithTarget:(GDTCORTarget)target + conditions:(GDTCORUploadConditions)conditions + uploadURL:(NSURL *)uploadURL + queue:(dispatch_queue_t)queue + storage:(id)storage + metadataProvider:(id)metadataProvider + metricsController:(nullable id)metricsController { + self = [super init]; + if (self) { + _uploaderQueue = queue; + _target = target; + _conditions = conditions; + _uploadURL = uploadURL; + _storage = storage; + _metadataProvider = metadataProvider; + _metricsController = metricsController; + } + return self; +} + +- (NSURLSession *)uploaderSessionCreateIfNeeded { + if (_uploaderSession == nil) { + NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; + _uploaderSession = [NSURLSession sessionWithConfiguration:config + delegate:self + delegateQueue:nil]; + } + return _uploaderSession; +} + +- (void)uploadTarget:(GDTCORTarget)target withConditions:(GDTCORUploadConditions)conditions { + __block GDTCORBackgroundIdentifier backgroundTaskID = GDTCORBackgroundIdentifierInvalid; + + dispatch_block_t backgroundTaskCompletion = ^{ + // End the background task if there was one. + if (backgroundTaskID != GDTCORBackgroundIdentifierInvalid) { + [[GDTCORApplication sharedApplication] endBackgroundTask:backgroundTaskID]; + backgroundTaskID = GDTCORBackgroundIdentifierInvalid; + } + }; + + backgroundTaskID = [[GDTCORApplication sharedApplication] + beginBackgroundTaskWithName:@"GDTCCTUploader-upload" + expirationHandler:^{ + if (backgroundTaskID != GDTCORBackgroundIdentifierInvalid) { + // Cancel the upload and complete delivery. + [self.currentTask cancel]; + + // End the background task. + backgroundTaskCompletion(); + } else { + GDTCORLog(GDTCORMCDDebugLog, GDTCORLoggingLevelWarnings, + @"Attempted to cancel invalid background task in " + "GDTCCTUploadOperation."); + } + }]; + + id storage = self.storage; + + // 1. Check if the conditions for the target are suitable. + [self isReadyToUploadTarget:target conditions:conditions] + .validateOn(self.uploaderQueue, + ^BOOL(NSNull *__unused _) { + // 2. Stop the operation if it has been cancelled. + return !self.isCancelled; + }) + .thenOn(self.uploaderQueue, + ^FBLPromise *(NSNull *result) { + // 3. Remove previously attempted batches. + return [storage removeAllBatchesForTarget:target deleteEvents:NO]; + }) + .thenOn(self.uploaderQueue, + ^FBLPromise *(NSNull *__unused _) { + // There may be a big amount of events stored, so creating a batch may be an + // expensive operation. + + // 4. Do a lightweight check if there are any events for the target first to + // finish early if there are none. + return [storage hasEventsForTarget:target]; + }) + .validateOn(self.uploaderQueue, + ^BOOL(NSNumber *hasEvents) { + // 5. Stop operation if there are no events to upload. + return hasEvents.boolValue; + }) + .thenOn(self.uploaderQueue, + ^FBLPromise *(NSNumber *__unused _) { + // 6. Fetch events to upload. + GDTCORStorageEventSelector *eventSelector = [self eventSelectorTarget:target + withConditions:conditions]; + return [storage batchWithEventSelector:eventSelector + batchExpiration:[NSDate dateWithTimeIntervalSinceNow:600]]; + }) + .thenOn(self.uploaderQueue, + ^FBLPromise *(GDTCORUploadBatch *batch) { + // 7. Add metrics to the batch if the target has a + // corresponding metrics controller. + if (!self.metricsController) { + return [FBLPromise resolvedWith:batch]; + } + + return [self batchByAddingMetricsEventToBatch:batch forTarget:target]; + }) + .validateOn(self.uploaderQueue, + ^BOOL(GDTCORUploadBatch *__unused _) { + // 8. Stop the operation if it has been cancelled. + return !self.isCancelled; + }) + .thenOn(self.uploaderQueue, + ^FBLPromise *(GDTCORUploadBatch *batch) { + // A non-empty batch has been created, consider it as an upload attempt. + self.uploadAttempted = YES; + + // 9. Perform upload. + return [self uploadBatch:batch toTarget:target storage:storage]; + }) + .catchOn(self.uploaderQueue, + ^(NSError *error){ + // TODO: Consider reporting the error to the client. + }) + .alwaysOn(self.uploaderQueue, ^{ + // 10. Finish operation. + [self finishOperation]; + backgroundTaskCompletion(); + }); +} + +#pragma mark - Upload implementation details + +/** Uploads a given batch from storage to a target. */ +- (FBLPromise *)uploadBatch:(GDTCORUploadBatch *)batch + toTarget:(GDTCORTarget)target + storage:(id)storage { + // 1. Send URL request. + return [self sendURLRequestWithBatch:batch target:target] + .thenOn(self.uploaderQueue, + ^FBLPromise *(GDTCCTURLSessionDataResponse *response) { + // 2. Update the next upload time and process response. + [self updateNextUploadTimeWithResponse:response forTarget:target]; + + return [self processResponse:response forBatch:batch storage:storage]; + }) + .recoverOn(self.uploaderQueue, ^id(NSError *error) { + // If a network error occurred, move the events back to the main + // storage so they can attempt to be uploaded in the next attempt. + // Additionally, if metrics were added to the batch, place them back + // in storage. + if (self.currentMetrics) { + [self.metricsController offerMetrics:self.currentMetrics]; + } + return [storage removeBatchWithID:batch.batchID deleteEvents:NO]; + }); +} + +/** Processes a URL session response for a given batch from storage. */ +- (FBLPromise *)processResponse:(GDTCCTURLSessionDataResponse *)response + forBatch:(GDTCORUploadBatch *)batch + storage:(id)storage { + // Cleanup batch based on the response's status code. + NSInteger statusCode = response.HTTPResponse.statusCode; + BOOL isSuccess = statusCode >= 200 && statusCode < 300; + // Transient errors include "too many requests" (429) and server errors (5xx). + BOOL isTransientError = + statusCode == 429 || statusCode == 404 || (statusCode >= 500 && statusCode < 600); + + BOOL shouldDeleteEvents = isSuccess || !isTransientError; + + // If the batch included metrics and the upload failed, place metrics back + // in storage. + GDTCORMetrics *uploadedMetrics = [self currentMetrics]; + if (uploadedMetrics && !isSuccess) { + [self.metricsController offerMetrics:uploadedMetrics]; + } + + if (isSuccess) { + GDTCORLogDebug(@"CCT: batch %@ uploaded. Batch will be deleted.", batch.batchID); + + } else if (isTransientError) { + GDTCORLogDebug(@"CCT: batch %@ upload failed. Batch will attempt to be uploaded later.", + batch.batchID); + + } else { + GDTCORLogDebug(@"CCT: batch %@ upload failed. Batch will be deleted.", batch.batchID); + + if (/* isInvalidPayloadError */ statusCode == 400) { + // Log events that will be dropped due to the upload error. + [self.metricsController logEventsDroppedForReason:GDTCOREventDropReasonInvalidPayload + events:batch.events]; + } + } + + return [storage removeBatchWithID:batch.batchID deleteEvents:shouldDeleteEvents]; +} + +/** Composes and sends URL request. */ +- (FBLPromise *)sendURLRequestWithBatch:(GDTCORUploadBatch *)batch + target:(GDTCORTarget)target { + return [FBLPromise + onQueue:self.uploaderQueue + do:^NSURLRequest * { + // 1. Prepare URL request. + NSData *requestProtoData = [self constructRequestProtoWithEvents:batch.events]; + NSData *gzippedData = [GDTCCTCompressionHelper gzippedData:requestProtoData]; + BOOL usingGzipData = + gzippedData != nil && gzippedData.length < requestProtoData.length; + NSData *dataToSend = usingGzipData ? gzippedData : requestProtoData; + NSURLRequest *request = [self constructRequestWithURL:self.uploadURL + forTarget:target + data:dataToSend]; + GDTCORLogDebug(@"CTT: request containing %lu events for batch: %@ for target: " + @"%ld created: %@", + (unsigned long)batch.events.count, batch.batchID, (long)target, + request); + return request; + }] + .thenOn(self.uploaderQueue, + ^FBLPromise *(NSURLRequest *request) { + // 2. Send URL request. + NSURLSession *session = [self uploaderSessionCreateIfNeeded]; + return [FBLPromise wrapObjectOrErrorCompletion:^( + FBLPromiseObjectOrErrorCompletion _Nonnull handler) { + [[session dataTaskWithRequest:request + completionHandler:^(NSData *_Nullable data, + NSURLResponse *_Nullable response, + NSError *_Nullable error) { + if (error) { + handler(nil, error); + } else { + handler([[GDTCCTURLSessionDataResponse alloc] + initWithResponse:(NSHTTPURLResponse *)response + HTTPBody:data], + nil); + } + }] resume]; + }]; + }) + .thenOn(self.uploaderQueue, + ^GDTCCTURLSessionDataResponse *(GDTCCTURLSessionDataResponse *response) { + // Invalidate session to release the delegate (which is `self`) to break the retain + // cycle. + [self.uploaderSession finishTasksAndInvalidate]; + return response; + }) + .recoverOn(self.uploaderQueue, ^id(NSError *error) { + // Invalidate session to release the delegate (which is `self`) to break the retain cycle. + [self.uploaderSession finishTasksAndInvalidate]; + // Re-throw the error. + return error; + }); +} + +/** Parses server response and update next upload time for the specified target based on it. */ +- (void)updateNextUploadTimeWithResponse:(GDTCCTURLSessionDataResponse *)response + forTarget:(GDTCORTarget)target { + GDTCORClock *futureUploadTime; + if (response.HTTPBody) { + NSError *decodingError; + gdt_cct_LogResponse logResponse = GDTCCTDecodeLogResponse(response.HTTPBody, &decodingError); + if (!decodingError && logResponse.has_next_request_wait_millis) { + GDTCORLogDebug(@"CCT: The backend responded asking to not upload for %lld millis from now.", + logResponse.next_request_wait_millis); + futureUploadTime = + [GDTCORClock clockSnapshotInTheFuture:logResponse.next_request_wait_millis]; + } else if (decodingError) { + GDTCORLogDebug(@"There was a response decoding error: %@", decodingError); + } + pb_release(gdt_cct_LogResponse_fields, &logResponse); + } + + // If no futureUploadTime was parsed from the response body, then check + // [Retry-After](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Retry-After) header. + if (!futureUploadTime) { + NSString *retryAfterHeader = response.HTTPResponse.allHeaderFields[@"Retry-After"]; + if (retryAfterHeader.length > 0) { + NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; + formatter.numberStyle = NSNumberFormatterDecimalStyle; + NSNumber *retryAfterSeconds = [formatter numberFromString:retryAfterHeader]; + if (retryAfterSeconds != nil) { + uint64_t retryAfterMillis = retryAfterSeconds.unsignedIntegerValue * 1000u; + futureUploadTime = [GDTCORClock clockSnapshotInTheFuture:retryAfterMillis]; + } + } + } + + if (!futureUploadTime) { + GDTCORLogDebug(@"%@", @"CCT: The backend response failed to parse, so the next request " + @"won't occur until 15 minutes from now"); + // 15 minutes from now. + futureUploadTime = [GDTCORClock clockSnapshotInTheFuture:15 * 60 * 1000]; + } + + [self.metadataProvider setNextUploadTime:futureUploadTime forTarget:target]; +} + +#pragma mark - Private helper methods + +/** @return A resolved promise if is ready and a rejected promise if not. */ +- (FBLPromise *)isReadyToUploadTarget:(GDTCORTarget)target + conditions:(GDTCORUploadConditions)conditions { + FBLPromise *promise = [FBLPromise pendingPromise]; + if ([self readyToUploadTarget:target conditions:conditions]) { + [promise fulfill:[NSNull null]]; + } else { + NSString *reason = + [NSString stringWithFormat:@"Target %ld is not ready to upload with condition: %ld", + (long)target, (long)conditions]; + [promise reject:[self genericRejectedPromiseErrorWithReason:reason]]; + } + return promise; +} + +// TODO: Move to a separate class/extension/file when needed in other files. +/** Returns an error object with the specified failure reason. */ +- (NSError *)genericRejectedPromiseErrorWithReason:(NSString *)reason { + return [NSError errorWithDomain:@"GDTCCTUploader" + code:-1 + userInfo:@{NSLocalizedFailureReasonErrorKey : reason}]; +} + +/** Returns if the specified target is ready to be uploaded based on the specified conditions. */ +- (BOOL)readyToUploadTarget:(GDTCORTarget)target conditions:(GDTCORUploadConditions)conditions { + // Not ready to upload with no network connection. + // TODO: Reconsider using reachability to prevent an upload attempt. + // See https://developer.apple.com/videos/play/wwdc2019/712/ (49:40) for more details. + if (conditions & GDTCORUploadConditionNoNetwork) { + GDTCORLogDebug(@"%@", @"CCT: Not ready to upload without a network connection."); + return NO; + } + + // Upload events with no additional conditions if high priority. + if ((conditions & GDTCORUploadConditionHighPriority) == GDTCORUploadConditionHighPriority) { + GDTCORLogDebug(@"%@", @"CCT: a high priority event is allowing an upload"); + return YES; + } + + // Check next upload time for the target. + BOOL isAfterNextUploadTime = YES; + GDTCORClock *nextUploadTime = [self.metadataProvider nextUploadTimeForTarget:target]; + if (nextUploadTime) { + isAfterNextUploadTime = [[GDTCORClock snapshot] isAfter:nextUploadTime]; + } + + if (isAfterNextUploadTime) { + GDTCORLogDebug(@"CCT: can upload to target %ld because the request wait time has transpired", + (long)target); + } else { + GDTCORLogDebug(@"CCT: can't upload to target %ld because the backend asked to wait", + (long)target); + } + + return isAfterNextUploadTime; +} + +/** Constructs data given an upload package. + * + * @param events The events used to construct the request proto bytes. + * @return Proto bytes representing a gdt_cct_LogRequest object. + */ +- (nonnull NSData *)constructRequestProtoWithEvents:(NSSet *)events { + // Segment the log events by log type. + NSMutableDictionary *> *logMappingIDToLogSet = + [[NSMutableDictionary alloc] init]; + [events enumerateObjectsUsingBlock:^(GDTCOREvent *_Nonnull event, BOOL *_Nonnull stop) { + NSMutableSet *logSet = logMappingIDToLogSet[event.mappingID]; + logSet = logSet ? logSet : [[NSMutableSet alloc] init]; + [logSet addObject:event]; + logMappingIDToLogSet[event.mappingID] = logSet; + }]; + + gdt_cct_BatchedLogRequest batchedLogRequest = + GDTCCTConstructBatchedLogRequest(logMappingIDToLogSet); + + NSData *data = GDTCCTEncodeBatchedLogRequest(&batchedLogRequest); + pb_release(gdt_cct_BatchedLogRequest_fields, &batchedLogRequest); + return data ? data : [[NSData alloc] init]; +} + +/** Constructs a request to the given URL and target with the specified request body data. + * + * @param target The target backend to send the request to. + * @param data The request body data. + * @return A new NSURLRequest ready to be sent to FLL. + */ +- (nullable NSURLRequest *)constructRequestWithURL:(NSURL *)URL + forTarget:(GDTCORTarget)target + data:(NSData *)data { + if (data == nil || data.length == 0) { + GDTCORLogDebug(@"There was no data to construct a request for target %ld.", (long)target); + return nil; + } + + NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL]; + NSString *targetString; + switch (target) { + case kGDTCORTargetCCT: + targetString = @"cct"; + break; + + case kGDTCORTargetFLL: + targetString = @"fll"; + break; + + case kGDTCORTargetCSH: + targetString = @"csh"; + break; + case kGDTCORTargetINT: + targetString = @"int"; + break; + + default: + targetString = @"unknown"; + break; + } + NSString *userAgent = + [NSString stringWithFormat:@"datatransport/%@ %@support/%@ apple/", kGDTCORVersion, + targetString, kGDTCCTSupportSDKVersion]; + + [request setValue:[self.metadataProvider APIKeyForTarget:target] + forHTTPHeaderField:@"X-Goog-Api-Key"]; + + if ([GDTCCTCompressionHelper isGzipped:data]) { + [request setValue:@"gzip" forHTTPHeaderField:@"Content-Encoding"]; + } + [request setValue:@"application/x-protobuf" forHTTPHeaderField:@"Content-Type"]; + [request setValue:@"gzip" forHTTPHeaderField:@"Accept-Encoding"]; + [request setValue:userAgent forHTTPHeaderField:@"User-Agent"]; + request.HTTPMethod = @"POST"; + [request setHTTPBody:data]; + return request; +} + +/** Creates and returns a storage event selector for the specified target and conditions. */ +- (GDTCORStorageEventSelector *)eventSelectorTarget:(GDTCORTarget)target + withConditions:(GDTCORUploadConditions)conditions { + if ((conditions & GDTCORUploadConditionHighPriority) == GDTCORUploadConditionHighPriority) { + return [GDTCORStorageEventSelector eventSelectorForTarget:target]; + } + NSMutableSet *qosTiers = [[NSMutableSet alloc] init]; + if (conditions & GDTCORUploadConditionWifiData) { + [qosTiers addObjectsFromArray:@[ + @(GDTCOREventQoSFast), @(GDTCOREventQoSWifiOnly), @(GDTCOREventQosDefault), + @(GDTCOREventQoSTelemetry), @(GDTCOREventQoSUnknown) + ]]; + } + if (conditions & GDTCORUploadConditionMobileData) { + [qosTiers addObjectsFromArray:@[ @(GDTCOREventQoSFast), @(GDTCOREventQosDefault) ]]; + } + + return [[GDTCORStorageEventSelector alloc] initWithTarget:target + eventIDs:nil + mappingIDs:nil + qosTiers:qosTiers]; +} + +- (FBLPromise *)batchByAddingMetricsEventToBatch:(GDTCORUploadBatch *)batch + forTarget:(GDTCORTarget)target { + return [self.metricsController getAndResetMetrics] + .thenOn(self.uploaderQueue, + ^GDTCORUploadBatch *(GDTCORMetrics *metrics) { + // Save the metrics so they can be re-stored if upload fails. + [self setCurrentMetrics:metrics]; + + GDTCOREvent *metricsEvent = [GDTCOREvent eventWithMetrics:metrics forTarget:target]; + GDTCORUploadBatch *batchWithMetricEvent = [[GDTCORUploadBatch alloc] + initWithBatchID:batch.batchID + events:[batch.events setByAddingObject:metricsEvent]]; + + return batchWithMetricEvent; + }) + .recoverOn(self.uploaderQueue, ^GDTCORUploadBatch *(NSError *error) { + // Return given batch if an error occurs (i.e. no metrics were fetched). + return batch; + }); +} + +#pragma mark - NSURLSessionDelegate + +- (void)URLSession:(NSURLSession *)session + task:(NSURLSessionTask *)task + willPerformHTTPRedirection:(NSHTTPURLResponse *)response + newRequest:(NSURLRequest *)request + completionHandler:(void (^)(NSURLRequest *_Nullable))completionHandler { + if (!completionHandler) { + return; + } + if (response.statusCode == 302 || response.statusCode == 301) { + NSURLRequest *newRequest = [self constructRequestWithURL:request.URL + forTarget:kGDTCORTargetCCT + data:task.originalRequest.HTTPBody]; + completionHandler(newRequest); + } else { + completionHandler(request); + } +} + +#pragma mark - NSOperation methods + +@synthesize executing = _executing; +@synthesize finished = _finished; + +- (BOOL)isFinished { + @synchronized(self) { + return _finished; + } +} + +- (BOOL)isExecuting { + @synchronized(self) { + return _executing; + } +} + +- (BOOL)isAsynchronous { + return YES; +} + +- (void)startOperation { + @synchronized(self) { + [self willChangeValueForKey:@"isExecuting"]; + [self willChangeValueForKey:@"isFinished"]; + self->_executing = YES; + self->_finished = NO; + [self didChangeValueForKey:@"isExecuting"]; + [self didChangeValueForKey:@"isFinished"]; + } +} + +- (void)finishOperation { + @synchronized(self) { + [self willChangeValueForKey:@"isExecuting"]; + [self willChangeValueForKey:@"isFinished"]; + self->_executing = NO; + self->_finished = YES; + [self didChangeValueForKey:@"isExecuting"]; + [self didChangeValueForKey:@"isFinished"]; + } +} + +- (void)start { + [self startOperation]; + + GDTCORLogDebug(@"Upload operation started: %@", self); + [self uploadTarget:self.target withConditions:self.conditions]; +} + +- (void)cancel { + @synchronized(self) { + [super cancel]; + + // If the operation hasn't been started we can set `isFinished = YES` straight away. + if (!_executing) { + _executing = NO; + _finished = YES; + } + } +} + +#pragma mark - Force Category Linking + +extern void GDTCCTInclude_GDTCOREvent_GDTCCTSupport_Category(void); +extern void GDTCCTInclude_GDTCOREvent_GDTMetricsSupport_Category(void); +extern void GDTCCTInclude_GDTCORLogSourceMetrics_Internal_Category(void); + +/// Does nothing when called, and not meant to be called. +/// +/// This method forces the linker to include categories even if +/// users do not include the '-ObjC' linker flag in their project. ++ (void)noop { + GDTCCTInclude_GDTCOREvent_GDTCCTSupport_Category(); + GDTCCTInclude_GDTCOREvent_GDTMetricsSupport_Category(); + GDTCCTInclude_GDTCORLogSourceMetrics_Internal_Category(); +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/GDTCCTUploader.m b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/GDTCCTUploader.m new file mode 100644 index 0000000..c436ed3 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/GDTCCTUploader.m @@ -0,0 +1,215 @@ +/* + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "GoogleDataTransport/GDTCCTLibrary/Private/GDTCCTUploader.h" + +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORPlatform.h" +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORRegistrar.h" +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORConsoleLogger.h" +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCOREndpoints.h" +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCOREvent.h" + +#import "GoogleDataTransport/GDTCCTLibrary/Private/GDTCCTUploadOperation.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface GDTCCTUploader () + +@property(nonatomic, readonly) NSOperationQueue *uploadOperationQueue; +@property(nonatomic, readonly) dispatch_queue_t uploadQueue; + +@property(nonatomic, readonly) + NSMutableDictionary *nextUploadTimeByTarget; + +@end + +@implementation GDTCCTUploader + +static NSURL *_testServerURL = nil; + ++ (void)load { + GDTCCTUploader *uploader = [GDTCCTUploader sharedInstance]; +#if GDT_TEST + [[GDTCORRegistrar sharedInstance] registerUploader:uploader target:kGDTCORTargetTest]; +#endif // GDT_TEST + [[GDTCORRegistrar sharedInstance] registerUploader:uploader target:kGDTCORTargetCCT]; + [[GDTCORRegistrar sharedInstance] registerUploader:uploader target:kGDTCORTargetFLL]; + [[GDTCORRegistrar sharedInstance] registerUploader:uploader target:kGDTCORTargetCSH]; + [[GDTCORRegistrar sharedInstance] registerUploader:uploader target:kGDTCORTargetINT]; +} + ++ (instancetype)sharedInstance { + static GDTCCTUploader *sharedInstance; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + sharedInstance = [[GDTCCTUploader alloc] init]; + }); + return sharedInstance; +} + +- (instancetype)init { + self = [super init]; + if (self) { + _uploadQueue = dispatch_queue_create("com.google.GDTCCTUploader", DISPATCH_QUEUE_SERIAL); + _uploadOperationQueue = [[NSOperationQueue alloc] init]; + _uploadOperationQueue.maxConcurrentOperationCount = 1; + _nextUploadTimeByTarget = [[NSMutableDictionary alloc] init]; + } + return self; +} + +- (void)uploadTarget:(GDTCORTarget)target withConditions:(GDTCORUploadConditions)conditions { + // Current GDTCCTUploader expected behaviour: + // 1. Accept multiple upload request + // 2. Verify if there are events eligible for upload and start upload for the first suitable + // target + // 3. Ignore other requests while an upload is in-progress. + + // TODO: Revisit expected behaviour. + // Potentially better option: + // 1. Accept and enqueue all upload requests + // 2. Notify the client of upload stages + // 3. Allow the client cancelling upload requests as needed. + + id storage = GDTCORStoragePromiseInstanceForTarget(target); + if (storage == nil) { + GDTCORLogError(GDTCORMCEGeneralError, + @"Failed to upload target: %ld - could not find corresponding storage instance.", + (long)target); + return; + } + + id metricsController = + GDTCORMetricsControllerInstanceForTarget(target); + + GDTCCTUploadOperation *uploadOperation = + [[GDTCCTUploadOperation alloc] initWithTarget:target + conditions:conditions + uploadURL:[[self class] serverURLForTarget:target] + queue:self.uploadQueue + storage:storage + metadataProvider:self + metricsController:metricsController]; + + GDTCORLogDebug(@"Upload operation created: %@, target: %@", uploadOperation, @(target)); + + __weak __auto_type weakSelf = self; + __weak GDTCCTUploadOperation *weakOperation = uploadOperation; + uploadOperation.completionBlock = ^{ + __auto_type strongSelf = weakSelf; + GDTCCTUploadOperation *strongOperation = weakOperation; + if (strongSelf == nil || strongOperation == nil) { + GDTCORLogDebug(@"Internal inconsistency: GDTCCTUploader was deallocated during upload.", nil); + return; + } + + GDTCORLogDebug(@"Upload operation finished: %@, uploadAttempted: %@", strongOperation, + @(strongOperation.uploadAttempted)); + + if (strongOperation.uploadAttempted) { + // Ignore all upload requests received when the upload was in progress. + [strongSelf.uploadOperationQueue cancelAllOperations]; + } + }; + + [self.uploadOperationQueue addOperation:uploadOperation]; + GDTCORLogDebug(@"Upload operation scheduled: %@, operation count: %@", uploadOperation, + @(self.uploadOperationQueue.operationCount)); +} + +#pragma mark - URLs + ++ (void)setTestServerURL:(NSURL *_Nullable)serverURL { + _testServerURL = serverURL; +} + ++ (NSURL *_Nullable)testServerURL { + return _testServerURL; +} + ++ (nullable NSURL *)serverURLForTarget:(GDTCORTarget)target { +#if GDT_TEST + if (_testServerURL) { + return _testServerURL; + } +#endif // GDT_TEST + + return [GDTCOREndpoints uploadURLForTarget:target]; +} + +- (NSString *)FLLAndCSHAndINTAPIKey { + static NSString *defaultServerKey; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + // These strings should be interleaved to construct the real key. + const char *p1 = "AzSBG0honD6A-PxV5nBc"; + const char *p2 = "Iay44Iwtu2vV0AOrz1C"; + const char defaultKey[40] = {p1[0], p2[0], p1[1], p2[1], p1[2], p2[2], p1[3], p2[3], + p1[4], p2[4], p1[5], p2[5], p1[6], p2[6], p1[7], p2[7], + p1[8], p2[8], p1[9], p2[9], p1[10], p2[10], p1[11], p2[11], + p1[12], p2[12], p1[13], p2[13], p1[14], p2[14], p1[15], p2[15], + p1[16], p2[16], p1[17], p2[17], p1[18], p2[18], p1[19], '\0'}; + defaultServerKey = [NSString stringWithUTF8String:defaultKey]; + }); + return defaultServerKey; +} + +#pragma mark - GDTCCTUploadMetadataProvider + +- (nullable GDTCORClock *)nextUploadTimeForTarget:(GDTCORTarget)target { + @synchronized(self.nextUploadTimeByTarget) { + return self.nextUploadTimeByTarget[@(target)]; + } +} + +- (void)setNextUploadTime:(nullable GDTCORClock *)time forTarget:(GDTCORTarget)target { + @synchronized(self.nextUploadTimeByTarget) { + self.nextUploadTimeByTarget[@(target)] = time; + } +} + +- (nullable NSString *)APIKeyForTarget:(GDTCORTarget)target { + if (target == kGDTCORTargetFLL || target == kGDTCORTargetCSH) { + return [self FLLAndCSHAndINTAPIKey]; + } + + if (target == kGDTCORTargetINT) { + return [self FLLAndCSHAndINTAPIKey]; + } + + return nil; +} + +#if GDT_TEST +- (BOOL)waitForUploadFinishedWithTimeout:(NSTimeInterval)timeout { + NSDate *expirationDate = [NSDate dateWithTimeIntervalSinceNow:timeout]; + while ([expirationDate compare:[NSDate date]] == NSOrderedDescending) { + if (self.uploadOperationQueue.operationCount == 0) { + return YES; + } else { + [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; + } + } + + GDTCORLogDebug(@"Uploader wait for finish timeout exceeded. Operations still in queue: %@", + self.uploadOperationQueue.operations); + return NO; +} +#endif // GDT_TEST + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/GDTCOREvent+GDTCCTSupport.m b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/GDTCOREvent+GDTCCTSupport.m new file mode 100644 index 0000000..f102c81 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/GDTCOREvent+GDTCCTSupport.m @@ -0,0 +1,244 @@ +/* + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "GoogleDataTransport/GDTCCTLibrary/Public/GDTCOREvent+GDTCCTSupport.h" + +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORConsoleLogger.h" + +NSString *const GDTCCTNeedsNetworkConnectionInfo = @"needs_network_connection_info"; + +NSString *const GDTCCTNetworkConnectionInfo = @"network_connection_info"; + +NSString *const GDTCCTEventCodeInfo = @"event_code_info"; + +@implementation GDTCOREvent (GDTCCTSupport) + +- (void)setNeedsNetworkConnectionInfoPopulated:(BOOL)needsNetworkConnectionInfoPopulated { + if (!needsNetworkConnectionInfoPopulated) { + if (!self.customBytes) { + return; + } + + // Make sure we don't destroy the eventCode data, if any is present. + @try { + NSError *error; + NSMutableDictionary *bytesDict = + [[NSJSONSerialization JSONObjectWithData:self.customBytes options:0 + error:&error] mutableCopy]; + if (error) { + GDTCORLogDebug(@"Error when setting an event's event_code: %@", error); + return; + } + NSNumber *eventCode = bytesDict[GDTCCTEventCodeInfo]; + if (eventCode != nil) { + self.customBytes = + [NSJSONSerialization dataWithJSONObject:@{GDTCCTEventCodeInfo : eventCode} + options:0 + error:&error]; + } + } @catch (NSException *exception) { + GDTCORLogDebug(@"Error when setting the event for needs_network_connection_info: %@", + exception); + } + } else { + @try { + NSError *error; + NSMutableDictionary *bytesDict; + if (self.customBytes) { + bytesDict = [[NSJSONSerialization JSONObjectWithData:self.customBytes + options:0 + error:&error] mutableCopy]; + if (error) { + GDTCORLogDebug(@"Error when setting an even'ts event_code: %@", error); + return; + } + } else { + bytesDict = [[NSMutableDictionary alloc] init]; + } + [bytesDict setObject:@YES forKey:GDTCCTNeedsNetworkConnectionInfo]; + self.customBytes = [NSJSONSerialization dataWithJSONObject:bytesDict options:0 error:&error]; + } @catch (NSException *exception) { + GDTCORLogDebug(@"Error when setting the event for needs_network_connection_info: %@", + exception); + } + } +} + +- (BOOL)needsNetworkConnectionInfoPopulated { + if (self.customBytes) { + @try { + NSError *error; + NSDictionary *bytesDict = [NSJSONSerialization JSONObjectWithData:self.customBytes + options:0 + error:&error]; + return bytesDict && !error && [bytesDict[GDTCCTNeedsNetworkConnectionInfo] boolValue]; + } @catch (NSException *exception) { + GDTCORLogDebug(@"Error when checking the event for needs_network_connection_info: %@", + exception); + } + } + return NO; +} + +- (void)setNetworkConnectionInfoData:(NSData *)networkConnectionInfoData { + @try { + NSError *error; + NSString *dataString = [networkConnectionInfoData base64EncodedStringWithOptions:0]; + if (dataString != nil) { + NSMutableDictionary *bytesDict; + if (self.customBytes) { + bytesDict = [[NSJSONSerialization JSONObjectWithData:self.customBytes + options:0 + error:&error] mutableCopy]; + if (error) { + GDTCORLogDebug(@"Error when setting an even'ts event_code: %@", error); + return; + } + } else { + bytesDict = [[NSMutableDictionary alloc] init]; + } + [bytesDict setObject:dataString forKey:GDTCCTNetworkConnectionInfo]; + self.customBytes = [NSJSONSerialization dataWithJSONObject:bytesDict options:0 error:&error]; + if (error) { + self.customBytes = nil; + GDTCORLogDebug(@"Error when setting an event's network_connection_info: %@", error); + } + } + } @catch (NSException *exception) { + GDTCORLogDebug(@"Error when setting an event's network_connection_info: %@", exception); + } +} + +- (nullable NSData *)networkConnectionInfoData { + if (self.customBytes) { + @try { + NSError *error; + NSDictionary *bytesDict = [NSJSONSerialization JSONObjectWithData:self.customBytes + options:0 + error:&error]; + NSString *base64Data = bytesDict[GDTCCTNetworkConnectionInfo]; + if (base64Data == nil) { + return nil; + } + + NSData *networkConnectionInfoData = [[NSData alloc] initWithBase64EncodedString:base64Data + options:0]; + if (error) { + GDTCORLogDebug(@"Error when getting an event's network_connection_info: %@", error); + return nil; + } else { + return networkConnectionInfoData; + } + } @catch (NSException *exception) { + GDTCORLogDebug(@"Error when getting an event's network_connection_info: %@", exception); + } + } + return nil; +} + +- (NSNumber *)eventCode { + if (self.customBytes) { + @try { + NSError *error; + NSDictionary *bytesDict = [NSJSONSerialization JSONObjectWithData:self.customBytes + options:0 + error:&error]; + NSString *eventCodeString = bytesDict[GDTCCTEventCodeInfo]; + + if (!eventCodeString) { + return nil; + } + + NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; + formatter.numberStyle = NSNumberFormatterDecimalStyle; + NSNumber *eventCode = [formatter numberFromString:eventCodeString]; + + if (error) { + GDTCORLogDebug(@"Error when getting an event's network_connection_info: %@", error); + return nil; + } else { + return eventCode; + } + } @catch (NSException *exception) { + GDTCORLogDebug(@"Error when getting an event's event_code: %@", exception); + } + } + return nil; +} + +- (void)setEventCode:(NSNumber *)eventCode { + if (eventCode == nil) { + if (!self.customBytes) { + return; + } + + NSError *error; + NSMutableDictionary *bytesDict = [[NSJSONSerialization JSONObjectWithData:self.customBytes + options:0 + error:&error] mutableCopy]; + if (error) { + GDTCORLogDebug(@"Error when setting an event's event_code: %@", error); + return; + } + + [bytesDict removeObjectForKey:GDTCCTEventCodeInfo]; + self.customBytes = [NSJSONSerialization dataWithJSONObject:bytesDict options:0 error:&error]; + if (error) { + self.customBytes = nil; + GDTCORLogDebug(@"Error when setting an event's event_code: %@", error); + return; + } + return; + } + + @try { + NSMutableDictionary *bytesDict; + NSError *error; + if (self.customBytes) { + bytesDict = [[NSJSONSerialization JSONObjectWithData:self.customBytes options:0 + error:&error] mutableCopy]; + if (error) { + GDTCORLogDebug(@"Error when setting an event's event_code: %@", error); + return; + } + } else { + bytesDict = [[NSMutableDictionary alloc] init]; + } + + NSString *eventCodeString = [eventCode stringValue]; + if (eventCodeString == nil) { + return; + } + + [bytesDict setObject:eventCodeString forKey:GDTCCTEventCodeInfo]; + + self.customBytes = [NSJSONSerialization dataWithJSONObject:bytesDict options:0 error:&error]; + if (error) { + self.customBytes = nil; + GDTCORLogDebug(@"Error when setting an event's network_connection_info: %@", error); + return; + } + + } @catch (NSException *exception) { + GDTCORLogDebug(@"Error when getting an event's network_connection_info: %@", exception); + } +} + +@end + +/// Stub used to force the linker to include the categories in this file. +void GDTCCTInclude_GDTCOREvent_GDTCCTSupport_Category(void) { +} diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/GDTCOREvent+GDTMetricsSupport.m b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/GDTCOREvent+GDTMetricsSupport.m new file mode 100644 index 0000000..6386835 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/GDTCOREvent+GDTMetricsSupport.m @@ -0,0 +1,37 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "GoogleDataTransport/GDTCCTLibrary/Private/GDTCOREvent+GDTMetricsSupport.h" + +#import "GoogleDataTransport/GDTCCTLibrary/Private/GDTCORMetrics+GDTCCTSupport.h" +#import "GoogleDataTransport/GDTCORLibrary/Private/GDTCORMetrics.h" + +/// The mapping ID that represents the `LogSource` for GDT metrics. +static NSString *const kMetricEventMappingID = @"1710"; + +@implementation GDTCOREvent (GDTMetricsSupport) + ++ (GDTCOREvent *)eventWithMetrics:(GDTCORMetrics *)metrics forTarget:(GDTCORTarget)target { + GDTCOREvent *metricsEvent = [[GDTCOREvent alloc] initWithMappingID:kMetricEventMappingID + target:target]; + metricsEvent.dataObject = metrics; + + return metricsEvent; +} + +@end + +/// Stub used to force the linker to include the categories in this file. +void GDTCCTInclude_GDTCOREvent_GDTMetricsSupport_Category(void) { +} diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/GDTCORMetrics+GDTCCTSupport.m b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/GDTCORMetrics+GDTCCTSupport.m new file mode 100644 index 0000000..044b85a --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/GDTCORMetrics+GDTCCTSupport.m @@ -0,0 +1,211 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "GoogleDataTransport/GDTCCTLibrary/Private/GDTCORMetrics+GDTCCTSupport.h" + +#import +#import +#import + +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORConsoleLogger.h" + +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCOREventDropReason.h" +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORStorageSizeBytes.h" + +#import "GoogleDataTransport/GDTCCTLibrary/Private/GDTCCTNanopbHelpers.h" +#import "GoogleDataTransport/GDTCORLibrary/Private/GDTCORLogSourceMetrics.h" + +#import "GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/client_metrics.nanopb.h" + +typedef NSDictionary GDTCORDroppedEventCounter; + +@interface GDTCORLogSourceMetrics (Internal) + +/// A dictionary of log sources that map to counters that reflect the number of events dropped for a +/// given set of reasons (``GDTCOREventDropReason``). +@property(nonatomic, readonly) + NSDictionary *droppedEventCounterByLogSource; + +@end + +@implementation GDTCORMetrics (GDTCCTSupport) + +- (NSData *)transportBytes { + // Create and populate proto. + gdt_client_metrics_ClientMetrics clientMetricsProto = + gdt_client_metrics_ClientMetrics_init_default; + + clientMetricsProto.window = + GDTCCTConstructTimeWindow(self.collectionStartDate, self.collectionEndDate); + + clientMetricsProto.log_source_metrics = GDTCCTConstructLogSourceMetrics(self.logSourceMetrics); + clientMetricsProto.log_source_metrics_count = + GDTCCTGetLogSourceMetricsCount(self.logSourceMetrics); + + clientMetricsProto.global_metrics = + GDTCCTConstructGlobalMetrics(self.currentCacheSize, self.maxCacheSize); + + clientMetricsProto.app_namespace = GDTCCTEncodeString(self.bundleID); + + // Encode proto into a data buffer. + pb_ostream_t sizeStream = PB_OSTREAM_SIZING; + + // - Encode 1 time to determine the expected size of the buffer. + if (!pb_encode(&sizeStream, gdt_client_metrics_ClientMetrics_fields, &clientMetricsProto)) { + GDTCORLogError(GDTCORMCETransportBytesError, @"Error in nanopb encoding for size: %s", + PB_GET_ERROR(&sizeStream)); + } + + // - Encode a 2nd time to actually copy the proto's bytes into the buffer. + size_t bufferSize = sizeStream.bytes_written; + CFMutableDataRef dataRef = CFDataCreateMutable(CFAllocatorGetDefault(), bufferSize); + CFDataSetLength(dataRef, bufferSize); + pb_ostream_t ostream = pb_ostream_from_buffer((void *)CFDataGetBytePtr(dataRef), bufferSize); + if (!pb_encode(&ostream, gdt_client_metrics_ClientMetrics_fields, &clientMetricsProto)) { + GDTCORLogError(GDTCORMCETransportBytesError, @"Error in nanopb encoding for size: %s", + PB_GET_ERROR(&ostream)); + } + CFDataSetLength(dataRef, ostream.bytes_written); + + // Release the allocated proto. + pb_release(gdt_client_metrics_ClientMetrics_fields, &clientMetricsProto); + + return CFBridgingRelease(dataRef); +} + +/// Constructs and returns a ``gdt_client_metrics_LogSourceMetrics`` from the given log source +/// metrics. +/// @param logSourceMetrics The given log source metrics. +gdt_client_metrics_LogSourceMetrics *GDTCCTConstructLogSourceMetrics( + GDTCORLogSourceMetrics *logSourceMetrics) { + // The metrics proto is a repeating field where each element represents the + // dropped event data for a log source (mapping ID). + NSUInteger logMetricsCount = logSourceMetrics.droppedEventCounterByLogSource.count; + gdt_client_metrics_LogSourceMetrics *repeatedLogSourceMetrics = + calloc(logMetricsCount, sizeof(gdt_client_metrics_LogSourceMetrics)); + + // Each log source (mapping ID) has a corresponding dropped event counter. + // Enumerate over the dictionary of log source and, for each log source, + // (mapping ID) create a proto representation of the number of events dropped + // for each given reason. + __block NSUInteger logSourceIndex = 0; + [logSourceMetrics.droppedEventCounterByLogSource + enumerateKeysAndObjectsUsingBlock:^(NSString *logSource, + GDTCORDroppedEventCounter *eventCounterForLogSource, + BOOL *__unused _) { + // Create the log source proto for the given mapping ID. It contains a + // repeating field to encapsulate the number of events dropped for each + // given drop reason. + __block gdt_client_metrics_LogSourceMetrics logSourceMetrics = + gdt_client_metrics_LogSourceMetrics_init_zero; + logSourceMetrics.log_source = GDTCCTEncodeString(logSource); + logSourceMetrics.log_event_dropped_count = (pb_size_t)eventCounterForLogSource.count; + logSourceMetrics.log_event_dropped = + calloc(eventCounterForLogSource.count, sizeof(gdt_client_metrics_LogEventDropped)); + + // Each dropped event counter counts the number of events dropped for + // each drop reason. Enumerate over all of these counters to populate + // the log source proto's repeating field of event drop data. + __block NSUInteger eventCounterIndex = 0; + [eventCounterForLogSource + enumerateKeysAndObjectsUsingBlock:^(NSNumber *eventDropReason, + NSNumber *droppedEventCount, BOOL *__unused _) { + gdt_client_metrics_LogEventDropped droppedEvents = + gdt_client_metrics_LogEventDropped_init_zero; + droppedEvents.events_dropped_count = droppedEventCount.integerValue; + droppedEvents.reason = + GDTCCTConvertEventDropReasonToProtoReason(eventDropReason.integerValue); + + // Append the dropped events proto to the repeated field and + // increment the index used for appending. + logSourceMetrics.log_event_dropped[eventCounterIndex] = droppedEvents; + eventCounterIndex += 1; + }]; + + // Append the metrics for the given log source (mappingID) to the + // repeated field and increment the index used for appending. + repeatedLogSourceMetrics[logSourceIndex] = logSourceMetrics; + logSourceIndex += 1; + }]; + + return repeatedLogSourceMetrics; +} + +/// Returns the count of log sources that have event drop metrics. +/// @param logSourceMetrics The given log source metrics. +pb_size_t GDTCCTGetLogSourceMetricsCount(GDTCORLogSourceMetrics *logSourceMetrics) { + return (pb_size_t)logSourceMetrics.droppedEventCounterByLogSource.count; +} + +/// Constructs and returns a ``gdt_client_metrics_TimeWindow`` proto from the given parameters. +/// @param collectionStartDate The start of the time window. +/// @param collectionEndDate The end of the time window. +gdt_client_metrics_TimeWindow GDTCCTConstructTimeWindow(NSDate *collectionStartDate, + NSDate *collectionEndDate) { + gdt_client_metrics_TimeWindow timeWindow = gdt_client_metrics_TimeWindow_init_zero; + // `- [NSDate timeIntervalSince1970]` returns a time interval in seconds so + // multiply by 1000 to convert to milliseconds. + timeWindow.start_ms = (int64_t)collectionStartDate.timeIntervalSince1970 * 1000; + timeWindow.end_ms = (int64_t)collectionEndDate.timeIntervalSince1970 * 1000; + return timeWindow; +} + +/// Constructs and returns a ``gdt_client_metrics_GlobalMetrics`` proto from the given parameters. +/// @param currentCacheSize The current cache size. +/// @param maxCacheSize The max cache size. +gdt_client_metrics_GlobalMetrics GDTCCTConstructGlobalMetrics(uint64_t currentCacheSize, + uint64_t maxCacheSize) { + gdt_client_metrics_StorageMetrics storageMetrics = gdt_client_metrics_StorageMetrics_init_zero; + storageMetrics.current_cache_size_bytes = currentCacheSize; + storageMetrics.max_cache_size_bytes = maxCacheSize; + + gdt_client_metrics_GlobalMetrics globalMetrics = gdt_client_metrics_GlobalMetrics_init_zero; + globalMetrics.storage_metrics = storageMetrics; + + return globalMetrics; +} + +/// Returns the corresponding ``gdt_client_metrics_LogEventDropped_Reason`` for the given +/// ``GDTCOREventDropReason``. +/// +/// To represent ``GDTCOREventDropReason`` in a proto, the reason must be mapped to a +/// ``gdt_client_metrics_LogEventDropped_Reason``. +/// +/// @param reason The ``GDTCOREventDropReason`` to represent in a proto. +gdt_client_metrics_LogEventDropped_Reason GDTCCTConvertEventDropReasonToProtoReason( + GDTCOREventDropReason reason) { + switch (reason) { + case GDTCOREventDropReasonUnknown: + return gdt_client_metrics_LogEventDropped_Reason_REASON_UNKNOWN; + case GDTCOREventDropReasonMessageTooOld: + return gdt_client_metrics_LogEventDropped_Reason_MESSAGE_TOO_OLD; + case GDTCOREventDropReasonStorageFull: + return gdt_client_metrics_LogEventDropped_Reason_CACHE_FULL; + case GDTCOREventDropReasonPayloadTooBig: + return gdt_client_metrics_LogEventDropped_Reason_PAYLOAD_TOO_BIG; + case GDTCOREventDropReasonMaxRetriesReached: + return gdt_client_metrics_LogEventDropped_Reason_MAX_RETRIES_REACHED; + case GDTCOREventDropReasonInvalidPayload: + // The below typo (`PAYLOD`) is currently checked in to g3. + return gdt_client_metrics_LogEventDropped_Reason_INVALID_PAYLOD; + case GDTCOREventDropReasonServerError: + return gdt_client_metrics_LogEventDropped_Reason_SERVER_ERROR; + } +} + +@end + +/// Stub used to force the linker to include the categories in this file. +void GDTCCTInclude_GDTCORLogSourceMetrics_Internal_Category(void) { +} diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Private/GDTCCTCompressionHelper.h b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Private/GDTCCTCompressionHelper.h new file mode 100644 index 0000000..b53dd5f --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Private/GDTCCTCompressionHelper.h @@ -0,0 +1,40 @@ +/* + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** A class with methods to help with gzipped data. */ +@interface GDTCCTCompressionHelper : NSObject + +/** Compresses the given data and returns a new data object. + * + * @note Reduced version from GULNSData+zlib.m of GoogleUtilities. + * @return Compressed data, or nil if there was an error. + */ ++ (nullable NSData *)gzippedData:(NSData *)data; + +/** Returns YES if the data looks like it was gzip compressed by checking for the gzip magic number. + * + * @note: From https://en.wikipedia.org/wiki/Gzip, gzip's magic number is 1f 8b. + * @return YES if the data appears gzipped, NO otherwise. + */ ++ (BOOL)isGzipped:(NSData *)data; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Private/GDTCCTNanopbHelpers.h b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Private/GDTCCTNanopbHelpers.h new file mode 100644 index 0000000..2f0ccd0 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Private/GDTCCTNanopbHelpers.h @@ -0,0 +1,144 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORReachability.h" +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCOREvent.h" +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORProductData.h" + +#import "GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/cct.nanopb.h" +#import "GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/compliance.nanopb.h" + +NS_ASSUME_NONNULL_BEGIN + +#pragma mark - General purpose encoders + +/** Converts an NSString* to a pb_bytes_array_t*. + * + * @note calloc is called in this method. Ensure that pb_release is called on this or the parent. + * + * @param string The string to convert. + * @return A newly allocated array of bytes representing the UTF8 encoding of the string. + */ +pb_bytes_array_t *GDTCCTEncodeString(NSString *string); + +/** Converts an NSData to a pb_bytes_array_t*. + * + * @note calloc is called in this method. Ensure that pb_release is called on this or the parent. + * + * @param data The data to convert. + * @return A newly allocated array of bytes with [data bytes] copied into it. + */ +pb_bytes_array_t *GDTCCTEncodeData(NSData *data); + +#pragma mark - CCT object constructors + +/** Encodes a batched log request. + * + * @note Ensure that pb_release is called on the batchedLogRequest param. + * + * @param batchedLogRequest A pointer to the log batch to encode to bytes. + * @return An NSData object representing the bytes of the log request batch. + */ +FOUNDATION_EXPORT +NSData *GDTCCTEncodeBatchedLogRequest(gdt_cct_BatchedLogRequest *batchedLogRequest); + +/** Constructs a gdt_cct_BatchedLogRequest given sets of events segemented by mapping ID. + * + * @note calloc is called in this method. Ensure that pb_release is called on this or the parent. + * + * @param logMappingIDToLogSet A map of mapping IDs to sets of events to convert into a batch. + * @return A newly created gdt_cct_BatchedLogRequest. + */ +FOUNDATION_EXPORT +gdt_cct_BatchedLogRequest GDTCCTConstructBatchedLogRequest( + NSDictionary *> *logMappingIDToLogSet); + +/** Constructs a log request given a log source and a set of events. + * + * @note calloc is called in this method. Ensure that pb_release is called on this or the parent. + * @param logSource The CCT log source to put into the log request. + * @param logSet The set of events to send in this log request. + */ +FOUNDATION_EXPORT +gdt_cct_LogRequest GDTCCTConstructLogRequest(int32_t logSource, NSSet *logSet); + +/** Constructs a gdt_cct_LogEvent given a GDTCOREvent*. + * + * @param event The GDTCOREvent to convert. + * @return The new gdt_cct_LogEvent object. + */ +FOUNDATION_EXPORT +gdt_cct_LogEvent GDTCCTConstructLogEvent(GDTCOREvent *event); + +/** Constructs a `gdt_cct_ComplianceData` given a `GDTCORProductData` instance. + * + * @param productData The product data to convert to compliance data. + */ +FOUNDATION_EXPORT +gdt_cct_ComplianceData GDTCCTConstructComplianceData(GDTCORProductData *productData); + +/** Constructs a gdt_cct_ClientInfo representing the client device. + * + * @return The new gdt_cct_ClientInfo object. + */ +FOUNDATION_EXPORT +gdt_cct_ClientInfo GDTCCTConstructClientInfo(void); + +/** Constructs a gdt_cct_IosClientInfo representing the client device. + * + * @return The new gdt_cct_IosClientInfo object. + */ +FOUNDATION_EXPORT +gdt_cct_IosClientInfo GDTCCTConstructiOSClientInfo(void); + +/** Constructs a gdt_cct_MacClientInfo representing the client device. + * + * @return The new gdt_cct_MacClientInfo object. + */ +FOUNDATION_EXPORT +gdt_cct_MacClientInfo GDTCCTConstructMacClientInfo(void); + +/** Constructs the data of a gdt_cct_NetworkConnectionInfo representing the client nework connection + * information. + * + * @return The data of a gdt_cct_NetworkConnectionInfo object. + */ +FOUNDATION_EXPORT +NSData *GDTCCTConstructNetworkConnectionInfoData(void); + +/** Return a gdt_cct_NetworkConnectionInfo_MobileSubtype representing the client + * + * @return The gdt_cct_NetworkConnectionInfo_MobileSubtype. + */ +FOUNDATION_EXPORT +gdt_cct_NetworkConnectionInfo_MobileSubtype GDTCCTNetworkConnectionInfoNetworkMobileSubtype(void); + +#pragma mark - CCT object decoders + +/** Decodes a gdt_cct_LogResponse given proto bytes. + * + * @note calloc is called in this method. Ensure that pb_release is called on the return value. + * + * @param data The proto bytes of the gdt_cct_LogResponse. + * @param error An error that will be populated if something went wrong during decoding. + * @return A newly allocated gdt_cct_LogResponse from the data, if the bytes decoded properly. + */ +FOUNDATION_EXPORT +gdt_cct_LogResponse GDTCCTDecodeLogResponse(NSData *data, NSError **error); + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Private/GDTCCTURLSessionDataResponse.h b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Private/GDTCCTURLSessionDataResponse.h new file mode 100644 index 0000000..30ec203 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Private/GDTCCTURLSessionDataResponse.h @@ -0,0 +1,29 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** The class represents HTTP response received from `NSURLSession`. */ +@interface GDTCCTURLSessionDataResponse : NSObject + +@property(nonatomic, readonly) NSHTTPURLResponse *HTTPResponse; +@property(nonatomic, nullable, readonly) NSData *HTTPBody; + +- (instancetype)initWithResponse:(NSHTTPURLResponse *)response HTTPBody:(nullable NSData *)body; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Private/GDTCCTUploadOperation.h b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Private/GDTCCTUploadOperation.h new file mode 100644 index 0000000..cfc2c48 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Private/GDTCCTUploadOperation.h @@ -0,0 +1,78 @@ +/* + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORUploader.h" + +@protocol GDTCORStoragePromiseProtocol; +@protocol GDTCORMetricsControllerProtocol; + +NS_ASSUME_NONNULL_BEGIN + +/// The protocol defines methods to retrieve/update data shared between different upload operations. +@protocol GDTCCTUploadMetadataProvider + +/** Returns a GDTCORClock object representing time after which a next upload attempt is allowed for + * the specified target. Upload is allowed now if `nil`. */ +- (nullable GDTCORClock *)nextUploadTimeForTarget:(GDTCORTarget)target; + +/** Stores or resets time after which a next upload attempt is allowed for the specified target. */ +- (void)setNextUploadTime:(nullable GDTCORClock *)time forTarget:(GDTCORTarget)target; + +/** Returns an API key for the specified target. */ +- (nullable NSString *)APIKeyForTarget:(GDTCORTarget)target; + +@end + +/** Class capable of uploading events to the CCT backend. */ +@interface GDTCCTUploadOperation : NSOperation + +- (instancetype)init NS_UNAVAILABLE; + +/// Designated initializer. +/// @param target The events target to upload. +/// @param conditions A set of upload conditions. The conditions affect the set of events to be +/// uploaded, e.g. events with some QoS are not uploaded on a cellular network, etc. +/// @param uploadURL The backend URL to upload the events. +/// @param queue A queue to dispatch async upload steps. +/// @param storage A storage object to fetch events for upload. +/// @param metadataProvider An object to retrieve/update data shared between upload operations. +/// @param metricsController The metrics controller corresponding to the given target. If the given +/// target does not support metrics controller, `nil` should be passed. +/// @return An individual operation that can be added to an operation queue. +- (instancetype)initWithTarget:(GDTCORTarget)target + conditions:(GDTCORUploadConditions)conditions + uploadURL:(NSURL *)uploadURL + queue:(dispatch_queue_t)queue + storage:(id)storage + metadataProvider:(id)metadataProvider + metricsController:(nullable id)metricsController + NS_DESIGNATED_INITIALIZER; + +/** YES if a batch upload attempt was performed. NO otherwise. If NO for the finished operation, + * then there were no events suitable for upload. */ +@property(nonatomic, readonly) BOOL uploadAttempted; + +/** The queue on which all CCT uploading will occur. */ +@property(nonatomic, readonly) dispatch_queue_t uploaderQueue; + +/** The current upload task. */ +@property(nullable, nonatomic, readonly) NSURLSessionUploadTask *currentTask; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Private/GDTCCTUploader.h b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Private/GDTCCTUploader.h new file mode 100644 index 0000000..36934c6 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Private/GDTCCTUploader.h @@ -0,0 +1,45 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORUploader.h" + +NS_ASSUME_NONNULL_BEGIN + +/** Class capable of uploading events to the CCT backend. */ +@interface GDTCCTUploader : NSObject + +/** Creates and/or returns the singleton instance of this class. + * + * @return The singleton instance of this class. + */ ++ (instancetype)sharedInstance; + +#if GDT_TEST +/** An upload URL used across all targets. For testing only. */ +@property(class, nullable, nonatomic) NSURL *testServerURL; + +/** Spins runloop until upload finishes or timeout. + * @return YES if upload finishes, NO in the case of timeout. + */ +- (BOOL)waitForUploadFinishedWithTimeout:(NSTimeInterval)timeout; + +#endif // GDT_TEST + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Private/GDTCOREvent+GDTMetricsSupport.h b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Private/GDTCOREvent+GDTMetricsSupport.h new file mode 100644 index 0000000..84d36ae --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Private/GDTCOREvent+GDTMetricsSupport.h @@ -0,0 +1,34 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCOREvent.h" + +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORTargets.h" + +@class GDTCORMetrics; + +NS_ASSUME_NONNULL_BEGIN + +@interface GDTCOREvent (GDTMetricsSupport) + +/// Creates and returns an event for the given target with the given metrics. +/// @param metrics The metrics to set at the event's data. +/// @param target The backend target that the event corresponds to. ++ (GDTCOREvent *)eventWithMetrics:(GDTCORMetrics *)metrics forTarget:(GDTCORTarget)target; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Private/GDTCORMetrics+GDTCCTSupport.h b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Private/GDTCORMetrics+GDTCCTSupport.h new file mode 100644 index 0000000..8d1e696 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Private/GDTCORMetrics+GDTCCTSupport.h @@ -0,0 +1,25 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "GoogleDataTransport/GDTCORLibrary/Private/GDTCORMetrics.h" + +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCOREventDataObject.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface GDTCORMetrics (GDTCCTSupport) + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/cct.nanopb.c b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/cct.nanopb.c new file mode 100644 index 0000000..8e5412e --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/cct.nanopb.c @@ -0,0 +1,138 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* Automatically generated nanopb constant definitions */ +/* Generated by nanopb-0.3.9.9 */ + +#include "GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/cct.nanopb.h" + +/* @@protoc_insertion_point(includes) */ +#if PB_PROTO_HEADER_VERSION != 30 +#error Regenerate this file with the current version of nanopb generator. +#endif + +const gdt_cct_NetworkConnectionInfo_NetworkType gdt_cct_NetworkConnectionInfo_network_type_default = gdt_cct_NetworkConnectionInfo_NetworkType_NONE; +const gdt_cct_NetworkConnectionInfo_MobileSubtype gdt_cct_NetworkConnectionInfo_mobile_subtype_default = gdt_cct_NetworkConnectionInfo_MobileSubtype_UNKNOWN_MOBILE_SUBTYPE; +const gdt_cct_QosTierConfiguration_QosTier gdt_cct_LogRequest_qos_tier_default = gdt_cct_QosTierConfiguration_QosTier_DEFAULT; +const int32_t gdt_cct_QosTierConfiguration_log_source_default = 0; + + +const pb_field_t gdt_cct_LogEvent_fields[8] = { + PB_FIELD( 1, INT64 , OPTIONAL, STATIC , FIRST, gdt_cct_LogEvent, event_time_ms, event_time_ms, 0), + PB_FIELD( 6, BYTES , OPTIONAL, POINTER , OTHER, gdt_cct_LogEvent, source_extension, event_time_ms, 0), + PB_FIELD( 11, INT32 , OPTIONAL, STATIC , OTHER, gdt_cct_LogEvent, event_code, source_extension, 0), + PB_FIELD( 15, SINT64 , OPTIONAL, STATIC , OTHER, gdt_cct_LogEvent, timezone_offset_seconds, event_code, 0), + PB_FIELD( 17, INT64 , OPTIONAL, STATIC , OTHER, gdt_cct_LogEvent, event_uptime_ms, timezone_offset_seconds, 0), + PB_FIELD( 23, MESSAGE , OPTIONAL, STATIC , OTHER, gdt_cct_LogEvent, network_connection_info, event_uptime_ms, &gdt_cct_NetworkConnectionInfo_fields), + PB_FIELD( 33, MESSAGE , OPTIONAL, STATIC , OTHER, gdt_cct_LogEvent, compliance_data, network_connection_info, &gdt_cct_ComplianceData_fields), + PB_LAST_FIELD +}; + +const pb_field_t gdt_cct_NetworkConnectionInfo_fields[3] = { + PB_FIELD( 1, ENUM , OPTIONAL, STATIC , FIRST, gdt_cct_NetworkConnectionInfo, network_type, network_type, &gdt_cct_NetworkConnectionInfo_network_type_default), + PB_FIELD( 2, UENUM , OPTIONAL, STATIC , OTHER, gdt_cct_NetworkConnectionInfo, mobile_subtype, network_type, &gdt_cct_NetworkConnectionInfo_mobile_subtype_default), + PB_LAST_FIELD +}; + +const pb_field_t gdt_cct_MacClientInfo_fields[5] = { + PB_FIELD( 1, BYTES , OPTIONAL, POINTER , FIRST, gdt_cct_MacClientInfo, os_major_version, os_major_version, 0), + PB_FIELD( 2, BYTES , OPTIONAL, POINTER , OTHER, gdt_cct_MacClientInfo, os_full_version, os_major_version, 0), + PB_FIELD( 3, BYTES , OPTIONAL, POINTER , OTHER, gdt_cct_MacClientInfo, application_build, os_full_version, 0), + PB_FIELD( 7, BYTES , OPTIONAL, POINTER , OTHER, gdt_cct_MacClientInfo, application_bundle_id, application_build, 0), + PB_LAST_FIELD +}; + +const pb_field_t gdt_cct_IosClientInfo_fields[8] = { + PB_FIELD( 3, BYTES , OPTIONAL, POINTER , FIRST, gdt_cct_IosClientInfo, os_major_version, os_major_version, 0), + PB_FIELD( 4, BYTES , OPTIONAL, POINTER , OTHER, gdt_cct_IosClientInfo, os_full_version, os_major_version, 0), + PB_FIELD( 5, BYTES , OPTIONAL, POINTER , OTHER, gdt_cct_IosClientInfo, application_build, os_full_version, 0), + PB_FIELD( 6, BYTES , OPTIONAL, POINTER , OTHER, gdt_cct_IosClientInfo, country, application_build, 0), + PB_FIELD( 7, BYTES , OPTIONAL, POINTER , OTHER, gdt_cct_IosClientInfo, model, country, 0), + PB_FIELD( 8, BYTES , OPTIONAL, POINTER , OTHER, gdt_cct_IosClientInfo, language_code, model, 0), + PB_FIELD( 11, BYTES , OPTIONAL, POINTER , OTHER, gdt_cct_IosClientInfo, application_bundle_id, language_code, 0), + PB_LAST_FIELD +}; + +const pb_field_t gdt_cct_ClientInfo_fields[4] = { + PB_FIELD( 1, UENUM , OPTIONAL, STATIC , FIRST, gdt_cct_ClientInfo, client_type, client_type, 0), + PB_FIELD( 4, MESSAGE , OPTIONAL, STATIC , OTHER, gdt_cct_ClientInfo, ios_client_info, client_type, &gdt_cct_IosClientInfo_fields), + PB_FIELD( 13, MESSAGE , OPTIONAL, STATIC , OTHER, gdt_cct_ClientInfo, mac_client_info, ios_client_info, &gdt_cct_MacClientInfo_fields), + PB_LAST_FIELD +}; + +const pb_field_t gdt_cct_BatchedLogRequest_fields[2] = { + PB_FIELD( 1, MESSAGE , REPEATED, POINTER , FIRST, gdt_cct_BatchedLogRequest, log_request, log_request, &gdt_cct_LogRequest_fields), + PB_LAST_FIELD +}; + +const pb_field_t gdt_cct_LogRequest_fields[7] = { + PB_FIELD( 1, MESSAGE , OPTIONAL, STATIC , FIRST, gdt_cct_LogRequest, client_info, client_info, &gdt_cct_ClientInfo_fields), + PB_FIELD( 2, INT32 , OPTIONAL, STATIC , OTHER, gdt_cct_LogRequest, log_source, client_info, 0), + PB_FIELD( 3, MESSAGE , REPEATED, POINTER , OTHER, gdt_cct_LogRequest, log_event, log_source, &gdt_cct_LogEvent_fields), + PB_FIELD( 4, INT64 , OPTIONAL, STATIC , OTHER, gdt_cct_LogRequest, request_time_ms, log_event, 0), + PB_FIELD( 8, INT64 , OPTIONAL, STATIC , OTHER, gdt_cct_LogRequest, request_uptime_ms, request_time_ms, 0), + PB_FIELD( 9, UENUM , OPTIONAL, STATIC , OTHER, gdt_cct_LogRequest, qos_tier, request_uptime_ms, &gdt_cct_LogRequest_qos_tier_default), + PB_LAST_FIELD +}; + +const pb_field_t gdt_cct_QosTierConfiguration_fields[3] = { + PB_FIELD( 2, UENUM , OPTIONAL, STATIC , FIRST, gdt_cct_QosTierConfiguration, qos_tier, qos_tier, 0), + PB_FIELD( 3, INT32 , OPTIONAL, STATIC , OTHER, gdt_cct_QosTierConfiguration, log_source, qos_tier, &gdt_cct_QosTierConfiguration_log_source_default), + PB_LAST_FIELD +}; + +const pb_field_t gdt_cct_QosTiersOverride_fields[3] = { + PB_FIELD( 1, MESSAGE , REPEATED, POINTER , FIRST, gdt_cct_QosTiersOverride, qos_tier_configuration, qos_tier_configuration, &gdt_cct_QosTierConfiguration_fields), + PB_FIELD( 2, INT64 , OPTIONAL, STATIC , OTHER, gdt_cct_QosTiersOverride, qos_tier_fingerprint, qos_tier_configuration, 0), + PB_LAST_FIELD +}; + +const pb_field_t gdt_cct_LogResponse_fields[3] = { + PB_FIELD( 1, INT64 , OPTIONAL, STATIC , FIRST, gdt_cct_LogResponse, next_request_wait_millis, next_request_wait_millis, 0), + PB_FIELD( 3, MESSAGE , OPTIONAL, STATIC , OTHER, gdt_cct_LogResponse, qos_tier, next_request_wait_millis, &gdt_cct_QosTiersOverride_fields), + PB_LAST_FIELD +}; + + + + + + +/* Check that field information fits in pb_field_t */ +#if !defined(PB_FIELD_32BIT) +/* If you get an error here, it means that you need to define PB_FIELD_32BIT + * compile-time option. You can do that in pb.h or on compiler command line. + * + * The reason you need to do this is that some of your messages contain tag + * numbers or field sizes that are larger than what can fit in 8 or 16 bit + * field descriptors. + */ +PB_STATIC_ASSERT((pb_membersize(gdt_cct_LogEvent, network_connection_info) < 65536 && pb_membersize(gdt_cct_LogEvent, compliance_data) < 65536 && pb_membersize(gdt_cct_ClientInfo, ios_client_info) < 65536 && pb_membersize(gdt_cct_ClientInfo, mac_client_info) < 65536 && pb_membersize(gdt_cct_LogRequest, client_info) < 65536 && pb_membersize(gdt_cct_LogResponse, qos_tier) < 65536), YOU_MUST_DEFINE_PB_FIELD_32BIT_FOR_MESSAGES_gdt_cct_LogEvent_gdt_cct_NetworkConnectionInfo_gdt_cct_MacClientInfo_gdt_cct_IosClientInfo_gdt_cct_ClientInfo_gdt_cct_BatchedLogRequest_gdt_cct_LogRequest_gdt_cct_QosTierConfiguration_gdt_cct_QosTiersOverride_gdt_cct_LogResponse) +#endif + +#if !defined(PB_FIELD_16BIT) && !defined(PB_FIELD_32BIT) +/* If you get an error here, it means that you need to define PB_FIELD_16BIT + * compile-time option. You can do that in pb.h or on compiler command line. + * + * The reason you need to do this is that some of your messages contain tag + * numbers or field sizes that are larger than what can fit in the default + * 8 bit descriptors. + */ +PB_STATIC_ASSERT((pb_membersize(gdt_cct_LogEvent, network_connection_info) < 256 && pb_membersize(gdt_cct_LogEvent, compliance_data) < 256 && pb_membersize(gdt_cct_ClientInfo, ios_client_info) < 256 && pb_membersize(gdt_cct_ClientInfo, mac_client_info) < 256 && pb_membersize(gdt_cct_LogRequest, client_info) < 256 && pb_membersize(gdt_cct_LogResponse, qos_tier) < 256), YOU_MUST_DEFINE_PB_FIELD_16BIT_FOR_MESSAGES_gdt_cct_LogEvent_gdt_cct_NetworkConnectionInfo_gdt_cct_MacClientInfo_gdt_cct_IosClientInfo_gdt_cct_ClientInfo_gdt_cct_BatchedLogRequest_gdt_cct_LogRequest_gdt_cct_QosTierConfiguration_gdt_cct_QosTiersOverride_gdt_cct_LogResponse) +#endif + + +/* @@protoc_insertion_point(eof) */ diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/cct.nanopb.h b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/cct.nanopb.h new file mode 100644 index 0000000..a13a16c --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/cct.nanopb.h @@ -0,0 +1,305 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* Automatically generated nanopb header */ +/* Generated by nanopb-0.3.9.9 */ + +#ifndef PB_GDT_CCT_CCT_NANOPB_H_INCLUDED +#define PB_GDT_CCT_CCT_NANOPB_H_INCLUDED +#include + +#include "GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/compliance.nanopb.h" + +/* @@protoc_insertion_point(includes) */ +#if PB_PROTO_HEADER_VERSION != 30 +#error Regenerate this file with the current version of nanopb generator. +#endif + + +/* Enum definitions */ +typedef enum _gdt_cct_NetworkConnectionInfo_NetworkType { + gdt_cct_NetworkConnectionInfo_NetworkType_NONE = -1, + gdt_cct_NetworkConnectionInfo_NetworkType_MOBILE = 0, + gdt_cct_NetworkConnectionInfo_NetworkType_WIFI = 1, + gdt_cct_NetworkConnectionInfo_NetworkType_MOBILE_MMS = 2, + gdt_cct_NetworkConnectionInfo_NetworkType_MOBILE_SUPL = 3, + gdt_cct_NetworkConnectionInfo_NetworkType_MOBILE_DUN = 4, + gdt_cct_NetworkConnectionInfo_NetworkType_MOBILE_HIPRI = 5, + gdt_cct_NetworkConnectionInfo_NetworkType_WIMAX = 6, + gdt_cct_NetworkConnectionInfo_NetworkType_BLUETOOTH = 7, + gdt_cct_NetworkConnectionInfo_NetworkType_DUMMY = 8, + gdt_cct_NetworkConnectionInfo_NetworkType_ETHERNET = 9, + gdt_cct_NetworkConnectionInfo_NetworkType_MOBILE_FOTA = 10, + gdt_cct_NetworkConnectionInfo_NetworkType_MOBILE_IMS = 11, + gdt_cct_NetworkConnectionInfo_NetworkType_MOBILE_CBS = 12, + gdt_cct_NetworkConnectionInfo_NetworkType_WIFI_P2P = 13, + gdt_cct_NetworkConnectionInfo_NetworkType_MOBILE_IA = 14, + gdt_cct_NetworkConnectionInfo_NetworkType_MOBILE_EMERGENCY = 15, + gdt_cct_NetworkConnectionInfo_NetworkType_PROXY = 16, + gdt_cct_NetworkConnectionInfo_NetworkType_VPN = 17 +} gdt_cct_NetworkConnectionInfo_NetworkType; +#define _gdt_cct_NetworkConnectionInfo_NetworkType_MIN gdt_cct_NetworkConnectionInfo_NetworkType_NONE +#define _gdt_cct_NetworkConnectionInfo_NetworkType_MAX gdt_cct_NetworkConnectionInfo_NetworkType_VPN +#define _gdt_cct_NetworkConnectionInfo_NetworkType_ARRAYSIZE ((gdt_cct_NetworkConnectionInfo_NetworkType)(gdt_cct_NetworkConnectionInfo_NetworkType_VPN+1)) + +typedef enum _gdt_cct_NetworkConnectionInfo_MobileSubtype { + gdt_cct_NetworkConnectionInfo_MobileSubtype_UNKNOWN_MOBILE_SUBTYPE = 0, + gdt_cct_NetworkConnectionInfo_MobileSubtype_GPRS = 1, + gdt_cct_NetworkConnectionInfo_MobileSubtype_EDGE = 2, + gdt_cct_NetworkConnectionInfo_MobileSubtype_UMTS = 3, + gdt_cct_NetworkConnectionInfo_MobileSubtype_CDMA = 4, + gdt_cct_NetworkConnectionInfo_MobileSubtype_EVDO_0 = 5, + gdt_cct_NetworkConnectionInfo_MobileSubtype_EVDO_A = 6, + gdt_cct_NetworkConnectionInfo_MobileSubtype_RTT = 7, + gdt_cct_NetworkConnectionInfo_MobileSubtype_HSDPA = 8, + gdt_cct_NetworkConnectionInfo_MobileSubtype_HSUPA = 9, + gdt_cct_NetworkConnectionInfo_MobileSubtype_HSPA = 10, + gdt_cct_NetworkConnectionInfo_MobileSubtype_IDEN = 11, + gdt_cct_NetworkConnectionInfo_MobileSubtype_EVDO_B = 12, + gdt_cct_NetworkConnectionInfo_MobileSubtype_LTE = 13, + gdt_cct_NetworkConnectionInfo_MobileSubtype_EHRPD = 14, + gdt_cct_NetworkConnectionInfo_MobileSubtype_HSPAP = 15, + gdt_cct_NetworkConnectionInfo_MobileSubtype_GSM = 16, + gdt_cct_NetworkConnectionInfo_MobileSubtype_TD_SCDMA = 17, + gdt_cct_NetworkConnectionInfo_MobileSubtype_IWLAN = 18, + gdt_cct_NetworkConnectionInfo_MobileSubtype_LTE_CA = 19, + gdt_cct_NetworkConnectionInfo_MobileSubtype_COMBINED = 100 +} gdt_cct_NetworkConnectionInfo_MobileSubtype; +#define _gdt_cct_NetworkConnectionInfo_MobileSubtype_MIN gdt_cct_NetworkConnectionInfo_MobileSubtype_UNKNOWN_MOBILE_SUBTYPE +#define _gdt_cct_NetworkConnectionInfo_MobileSubtype_MAX gdt_cct_NetworkConnectionInfo_MobileSubtype_COMBINED +#define _gdt_cct_NetworkConnectionInfo_MobileSubtype_ARRAYSIZE ((gdt_cct_NetworkConnectionInfo_MobileSubtype)(gdt_cct_NetworkConnectionInfo_MobileSubtype_COMBINED+1)) + +typedef enum _gdt_cct_ClientInfo_ClientType { + gdt_cct_ClientInfo_ClientType_CLIENT_UNKNOWN = 0, + gdt_cct_ClientInfo_ClientType_IOS_FIREBASE = 15 +} gdt_cct_ClientInfo_ClientType; +#define _gdt_cct_ClientInfo_ClientType_MIN gdt_cct_ClientInfo_ClientType_CLIENT_UNKNOWN +#define _gdt_cct_ClientInfo_ClientType_MAX gdt_cct_ClientInfo_ClientType_IOS_FIREBASE +#define _gdt_cct_ClientInfo_ClientType_ARRAYSIZE ((gdt_cct_ClientInfo_ClientType)(gdt_cct_ClientInfo_ClientType_IOS_FIREBASE+1)) + +typedef enum _gdt_cct_QosTierConfiguration_QosTier { + gdt_cct_QosTierConfiguration_QosTier_DEFAULT = 0, + gdt_cct_QosTierConfiguration_QosTier_UNMETERED_ONLY = 1, + gdt_cct_QosTierConfiguration_QosTier_UNMETERED_OR_DAILY = 2, + gdt_cct_QosTierConfiguration_QosTier_FAST_IF_RADIO_AWAKE = 3, + gdt_cct_QosTierConfiguration_QosTier_NEVER = 4 +} gdt_cct_QosTierConfiguration_QosTier; +#define _gdt_cct_QosTierConfiguration_QosTier_MIN gdt_cct_QosTierConfiguration_QosTier_DEFAULT +#define _gdt_cct_QosTierConfiguration_QosTier_MAX gdt_cct_QosTierConfiguration_QosTier_NEVER +#define _gdt_cct_QosTierConfiguration_QosTier_ARRAYSIZE ((gdt_cct_QosTierConfiguration_QosTier)(gdt_cct_QosTierConfiguration_QosTier_NEVER+1)) + +/* Struct definitions */ +typedef struct _gdt_cct_BatchedLogRequest { + pb_size_t log_request_count; + struct _gdt_cct_LogRequest *log_request; +/* @@protoc_insertion_point(struct:gdt_cct_BatchedLogRequest) */ +} gdt_cct_BatchedLogRequest; + +typedef struct _gdt_cct_IosClientInfo { + pb_bytes_array_t *os_major_version; + pb_bytes_array_t *os_full_version; + pb_bytes_array_t *application_build; + pb_bytes_array_t *country; + pb_bytes_array_t *model; + pb_bytes_array_t *language_code; + pb_bytes_array_t *application_bundle_id; +/* @@protoc_insertion_point(struct:gdt_cct_IosClientInfo) */ +} gdt_cct_IosClientInfo; + +typedef struct _gdt_cct_MacClientInfo { + pb_bytes_array_t *os_major_version; + pb_bytes_array_t *os_full_version; + pb_bytes_array_t *application_build; + pb_bytes_array_t *application_bundle_id; +/* @@protoc_insertion_point(struct:gdt_cct_MacClientInfo) */ +} gdt_cct_MacClientInfo; + +typedef struct _gdt_cct_ClientInfo { + bool has_client_type; + gdt_cct_ClientInfo_ClientType client_type; + bool has_ios_client_info; + gdt_cct_IosClientInfo ios_client_info; + bool has_mac_client_info; + gdt_cct_MacClientInfo mac_client_info; +/* @@protoc_insertion_point(struct:gdt_cct_ClientInfo) */ +} gdt_cct_ClientInfo; + +typedef struct _gdt_cct_NetworkConnectionInfo { + bool has_network_type; + gdt_cct_NetworkConnectionInfo_NetworkType network_type; + bool has_mobile_subtype; + gdt_cct_NetworkConnectionInfo_MobileSubtype mobile_subtype; +/* @@protoc_insertion_point(struct:gdt_cct_NetworkConnectionInfo) */ +} gdt_cct_NetworkConnectionInfo; + +typedef struct _gdt_cct_QosTierConfiguration { + bool has_qos_tier; + gdt_cct_QosTierConfiguration_QosTier qos_tier; + bool has_log_source; + int32_t log_source; +/* @@protoc_insertion_point(struct:gdt_cct_QosTierConfiguration) */ +} gdt_cct_QosTierConfiguration; + +typedef struct _gdt_cct_QosTiersOverride { + pb_size_t qos_tier_configuration_count; + struct _gdt_cct_QosTierConfiguration *qos_tier_configuration; + bool has_qos_tier_fingerprint; + int64_t qos_tier_fingerprint; +/* @@protoc_insertion_point(struct:gdt_cct_QosTiersOverride) */ +} gdt_cct_QosTiersOverride; + +typedef struct _gdt_cct_LogEvent { + bool has_event_time_ms; + int64_t event_time_ms; + pb_bytes_array_t *source_extension; + bool has_event_code; + int32_t event_code; + bool has_timezone_offset_seconds; + int64_t timezone_offset_seconds; + bool has_event_uptime_ms; + int64_t event_uptime_ms; + bool has_network_connection_info; + gdt_cct_NetworkConnectionInfo network_connection_info; + bool has_compliance_data; + gdt_cct_ComplianceData compliance_data; +/* @@protoc_insertion_point(struct:gdt_cct_LogEvent) */ +} gdt_cct_LogEvent; + +typedef struct _gdt_cct_LogRequest { + bool has_client_info; + gdt_cct_ClientInfo client_info; + bool has_log_source; + int32_t log_source; + pb_size_t log_event_count; + struct _gdt_cct_LogEvent *log_event; + bool has_request_time_ms; + int64_t request_time_ms; + bool has_request_uptime_ms; + int64_t request_uptime_ms; + bool has_qos_tier; + gdt_cct_QosTierConfiguration_QosTier qos_tier; +/* @@protoc_insertion_point(struct:gdt_cct_LogRequest) */ +} gdt_cct_LogRequest; + +typedef struct _gdt_cct_LogResponse { + bool has_next_request_wait_millis; + int64_t next_request_wait_millis; + bool has_qos_tier; + gdt_cct_QosTiersOverride qos_tier; +/* @@protoc_insertion_point(struct:gdt_cct_LogResponse) */ +} gdt_cct_LogResponse; + +/* Default values for struct fields */ +extern const gdt_cct_NetworkConnectionInfo_NetworkType gdt_cct_NetworkConnectionInfo_network_type_default; +extern const gdt_cct_NetworkConnectionInfo_MobileSubtype gdt_cct_NetworkConnectionInfo_mobile_subtype_default; +extern const gdt_cct_QosTierConfiguration_QosTier gdt_cct_LogRequest_qos_tier_default; +extern const int32_t gdt_cct_QosTierConfiguration_log_source_default; + +/* Initializer values for message structs */ +#define gdt_cct_LogEvent_init_default {false, 0, NULL, false, 0, false, 0, false, 0, false, gdt_cct_NetworkConnectionInfo_init_default, false, gdt_cct_ComplianceData_init_default} +#define gdt_cct_NetworkConnectionInfo_init_default {false, gdt_cct_NetworkConnectionInfo_NetworkType_NONE, false, gdt_cct_NetworkConnectionInfo_MobileSubtype_UNKNOWN_MOBILE_SUBTYPE} +#define gdt_cct_MacClientInfo_init_default {NULL, NULL, NULL, NULL} +#define gdt_cct_IosClientInfo_init_default {NULL, NULL, NULL, NULL, NULL, NULL, NULL} +#define gdt_cct_ClientInfo_init_default {false, _gdt_cct_ClientInfo_ClientType_MIN, false, gdt_cct_IosClientInfo_init_default, false, gdt_cct_MacClientInfo_init_default} +#define gdt_cct_BatchedLogRequest_init_default {0, NULL} +#define gdt_cct_LogRequest_init_default {false, gdt_cct_ClientInfo_init_default, false, 0, 0, NULL, false, 0, false, 0, false, gdt_cct_QosTierConfiguration_QosTier_DEFAULT} +#define gdt_cct_QosTierConfiguration_init_default {false, _gdt_cct_QosTierConfiguration_QosTier_MIN, false, 0} +#define gdt_cct_QosTiersOverride_init_default {0, NULL, false, 0} +#define gdt_cct_LogResponse_init_default {false, 0, false, gdt_cct_QosTiersOverride_init_default} +#define gdt_cct_LogEvent_init_zero {false, 0, NULL, false, 0, false, 0, false, 0, false, gdt_cct_NetworkConnectionInfo_init_zero, false, gdt_cct_ComplianceData_init_zero} +#define gdt_cct_NetworkConnectionInfo_init_zero {false, _gdt_cct_NetworkConnectionInfo_NetworkType_MIN, false, _gdt_cct_NetworkConnectionInfo_MobileSubtype_MIN} +#define gdt_cct_MacClientInfo_init_zero {NULL, NULL, NULL, NULL} +#define gdt_cct_IosClientInfo_init_zero {NULL, NULL, NULL, NULL, NULL, NULL, NULL} +#define gdt_cct_ClientInfo_init_zero {false, _gdt_cct_ClientInfo_ClientType_MIN, false, gdt_cct_IosClientInfo_init_zero, false, gdt_cct_MacClientInfo_init_zero} +#define gdt_cct_BatchedLogRequest_init_zero {0, NULL} +#define gdt_cct_LogRequest_init_zero {false, gdt_cct_ClientInfo_init_zero, false, 0, 0, NULL, false, 0, false, 0, false, _gdt_cct_QosTierConfiguration_QosTier_MIN} +#define gdt_cct_QosTierConfiguration_init_zero {false, _gdt_cct_QosTierConfiguration_QosTier_MIN, false, 0} +#define gdt_cct_QosTiersOverride_init_zero {0, NULL, false, 0} +#define gdt_cct_LogResponse_init_zero {false, 0, false, gdt_cct_QosTiersOverride_init_zero} + +/* Field tags (for use in manual encoding/decoding) */ +#define gdt_cct_BatchedLogRequest_log_request_tag 1 +#define gdt_cct_IosClientInfo_os_major_version_tag 3 +#define gdt_cct_IosClientInfo_os_full_version_tag 4 +#define gdt_cct_IosClientInfo_application_build_tag 5 +#define gdt_cct_IosClientInfo_country_tag 6 +#define gdt_cct_IosClientInfo_model_tag 7 +#define gdt_cct_IosClientInfo_language_code_tag 8 +#define gdt_cct_IosClientInfo_application_bundle_id_tag 11 +#define gdt_cct_MacClientInfo_os_major_version_tag 1 +#define gdt_cct_MacClientInfo_os_full_version_tag 2 +#define gdt_cct_MacClientInfo_application_build_tag 3 +#define gdt_cct_MacClientInfo_application_bundle_id_tag 7 +#define gdt_cct_ClientInfo_client_type_tag 1 +#define gdt_cct_ClientInfo_ios_client_info_tag 4 +#define gdt_cct_ClientInfo_mac_client_info_tag 13 +#define gdt_cct_NetworkConnectionInfo_network_type_tag 1 +#define gdt_cct_NetworkConnectionInfo_mobile_subtype_tag 2 +#define gdt_cct_QosTierConfiguration_qos_tier_tag 2 +#define gdt_cct_QosTierConfiguration_log_source_tag 3 +#define gdt_cct_QosTiersOverride_qos_tier_configuration_tag 1 +#define gdt_cct_QosTiersOverride_qos_tier_fingerprint_tag 2 +#define gdt_cct_LogEvent_event_time_ms_tag 1 +#define gdt_cct_LogEvent_event_code_tag 11 +#define gdt_cct_LogEvent_event_uptime_ms_tag 17 +#define gdt_cct_LogEvent_source_extension_tag 6 +#define gdt_cct_LogEvent_timezone_offset_seconds_tag 15 +#define gdt_cct_LogEvent_network_connection_info_tag 23 +#define gdt_cct_LogEvent_compliance_data_tag 33 +#define gdt_cct_LogRequest_request_time_ms_tag 4 +#define gdt_cct_LogRequest_request_uptime_ms_tag 8 +#define gdt_cct_LogRequest_client_info_tag 1 +#define gdt_cct_LogRequest_log_source_tag 2 +#define gdt_cct_LogRequest_log_event_tag 3 +#define gdt_cct_LogRequest_qos_tier_tag 9 +#define gdt_cct_LogResponse_next_request_wait_millis_tag 1 +#define gdt_cct_LogResponse_qos_tier_tag 3 + +/* Struct field encoding specification for nanopb */ +extern const pb_field_t gdt_cct_LogEvent_fields[8]; +extern const pb_field_t gdt_cct_NetworkConnectionInfo_fields[3]; +extern const pb_field_t gdt_cct_MacClientInfo_fields[5]; +extern const pb_field_t gdt_cct_IosClientInfo_fields[8]; +extern const pb_field_t gdt_cct_ClientInfo_fields[4]; +extern const pb_field_t gdt_cct_BatchedLogRequest_fields[2]; +extern const pb_field_t gdt_cct_LogRequest_fields[7]; +extern const pb_field_t gdt_cct_QosTierConfiguration_fields[3]; +extern const pb_field_t gdt_cct_QosTiersOverride_fields[3]; +extern const pb_field_t gdt_cct_LogResponse_fields[3]; + +/* Maximum encoded size of messages (where known) */ +/* gdt_cct_LogEvent_size depends on runtime parameters */ +#define gdt_cct_NetworkConnectionInfo_size 13 +/* gdt_cct_MacClientInfo_size depends on runtime parameters */ +/* gdt_cct_IosClientInfo_size depends on runtime parameters */ +/* gdt_cct_ClientInfo_size depends on runtime parameters */ +/* gdt_cct_BatchedLogRequest_size depends on runtime parameters */ +/* gdt_cct_LogRequest_size depends on runtime parameters */ +#define gdt_cct_QosTierConfiguration_size 13 +/* gdt_cct_QosTiersOverride_size depends on runtime parameters */ +/* gdt_cct_LogResponse_size depends on runtime parameters */ + +/* Message IDs (where set with "msgid" option) */ +#ifdef PB_MSGID + +#define CCT_MESSAGES \ + + +#endif + +/* @@protoc_insertion_point(eof) */ + +#endif diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/client_metrics.nanopb.c b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/client_metrics.nanopb.c new file mode 100644 index 0000000..1e95954 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/client_metrics.nanopb.c @@ -0,0 +1,92 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* Automatically generated nanopb constant definitions */ +/* Generated by nanopb-0.3.9.9 */ + +#include "GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/client_metrics.nanopb.h" + +/* @@protoc_insertion_point(includes) */ +#if PB_PROTO_HEADER_VERSION != 30 +#error Regenerate this file with the current version of nanopb generator. +#endif + + + +const pb_field_t gdt_client_metrics_ClientMetrics_fields[5] = { + PB_FIELD( 1, MESSAGE , SINGULAR, STATIC , FIRST, gdt_client_metrics_ClientMetrics, window, window, &gdt_client_metrics_TimeWindow_fields), + PB_FIELD( 2, MESSAGE , REPEATED, POINTER , OTHER, gdt_client_metrics_ClientMetrics, log_source_metrics, window, &gdt_client_metrics_LogSourceMetrics_fields), + PB_FIELD( 3, MESSAGE , SINGULAR, STATIC , OTHER, gdt_client_metrics_ClientMetrics, global_metrics, log_source_metrics, &gdt_client_metrics_GlobalMetrics_fields), + PB_FIELD( 4, BYTES , SINGULAR, POINTER , OTHER, gdt_client_metrics_ClientMetrics, app_namespace, global_metrics, 0), + PB_LAST_FIELD +}; + +const pb_field_t gdt_client_metrics_TimeWindow_fields[3] = { + PB_FIELD( 1, INT64 , SINGULAR, STATIC , FIRST, gdt_client_metrics_TimeWindow, start_ms, start_ms, 0), + PB_FIELD( 2, INT64 , SINGULAR, STATIC , OTHER, gdt_client_metrics_TimeWindow, end_ms, start_ms, 0), + PB_LAST_FIELD +}; + +const pb_field_t gdt_client_metrics_GlobalMetrics_fields[2] = { + PB_FIELD( 1, MESSAGE , SINGULAR, STATIC , FIRST, gdt_client_metrics_GlobalMetrics, storage_metrics, storage_metrics, &gdt_client_metrics_StorageMetrics_fields), + PB_LAST_FIELD +}; + +const pb_field_t gdt_client_metrics_StorageMetrics_fields[3] = { + PB_FIELD( 1, INT64 , SINGULAR, STATIC , FIRST, gdt_client_metrics_StorageMetrics, current_cache_size_bytes, current_cache_size_bytes, 0), + PB_FIELD( 2, INT64 , SINGULAR, STATIC , OTHER, gdt_client_metrics_StorageMetrics, max_cache_size_bytes, current_cache_size_bytes, 0), + PB_LAST_FIELD +}; + +const pb_field_t gdt_client_metrics_LogSourceMetrics_fields[3] = { + PB_FIELD( 1, BYTES , SINGULAR, POINTER , FIRST, gdt_client_metrics_LogSourceMetrics, log_source, log_source, 0), + PB_FIELD( 2, MESSAGE , REPEATED, POINTER , OTHER, gdt_client_metrics_LogSourceMetrics, log_event_dropped, log_source, &gdt_client_metrics_LogEventDropped_fields), + PB_LAST_FIELD +}; + +const pb_field_t gdt_client_metrics_LogEventDropped_fields[3] = { + PB_FIELD( 1, INT64 , SINGULAR, STATIC , FIRST, gdt_client_metrics_LogEventDropped, events_dropped_count, events_dropped_count, 0), + PB_FIELD( 3, UENUM , SINGULAR, STATIC , OTHER, gdt_client_metrics_LogEventDropped, reason, events_dropped_count, 0), + PB_LAST_FIELD +}; + + + +/* Check that field information fits in pb_field_t */ +#if !defined(PB_FIELD_32BIT) +/* If you get an error here, it means that you need to define PB_FIELD_32BIT + * compile-time option. You can do that in pb.h or on compiler command line. + * + * The reason you need to do this is that some of your messages contain tag + * numbers or field sizes that are larger than what can fit in 8 or 16 bit + * field descriptors. + */ +PB_STATIC_ASSERT((pb_membersize(gdt_client_metrics_ClientMetrics, window) < 65536 && pb_membersize(gdt_client_metrics_ClientMetrics, global_metrics) < 65536 && pb_membersize(gdt_client_metrics_GlobalMetrics, storage_metrics) < 65536), YOU_MUST_DEFINE_PB_FIELD_32BIT_FOR_MESSAGES_gdt_client_metrics_ClientMetrics_gdt_client_metrics_TimeWindow_gdt_client_metrics_GlobalMetrics_gdt_client_metrics_StorageMetrics_gdt_client_metrics_LogSourceMetrics_gdt_client_metrics_LogEventDropped) +#endif + +#if !defined(PB_FIELD_16BIT) && !defined(PB_FIELD_32BIT) +/* If you get an error here, it means that you need to define PB_FIELD_16BIT + * compile-time option. You can do that in pb.h or on compiler command line. + * + * The reason you need to do this is that some of your messages contain tag + * numbers or field sizes that are larger than what can fit in the default + * 8 bit descriptors. + */ +PB_STATIC_ASSERT((pb_membersize(gdt_client_metrics_ClientMetrics, window) < 256 && pb_membersize(gdt_client_metrics_ClientMetrics, global_metrics) < 256 && pb_membersize(gdt_client_metrics_GlobalMetrics, storage_metrics) < 256), YOU_MUST_DEFINE_PB_FIELD_16BIT_FOR_MESSAGES_gdt_client_metrics_ClientMetrics_gdt_client_metrics_TimeWindow_gdt_client_metrics_GlobalMetrics_gdt_client_metrics_StorageMetrics_gdt_client_metrics_LogSourceMetrics_gdt_client_metrics_LogEventDropped) +#endif + + +/* @@protoc_insertion_point(eof) */ diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/client_metrics.nanopb.h b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/client_metrics.nanopb.h new file mode 100644 index 0000000..c4d7686 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/client_metrics.nanopb.h @@ -0,0 +1,141 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* Automatically generated nanopb header */ +/* Generated by nanopb-0.3.9.9 */ + +#ifndef PB_GDT_CLIENT_METRICS_CLIENT_METRICS_NANOPB_H_INCLUDED +#define PB_GDT_CLIENT_METRICS_CLIENT_METRICS_NANOPB_H_INCLUDED +#include + +/* @@protoc_insertion_point(includes) */ +#if PB_PROTO_HEADER_VERSION != 30 +#error Regenerate this file with the current version of nanopb generator. +#endif + + +/* Enum definitions */ +typedef enum _gdt_client_metrics_LogEventDropped_Reason { + gdt_client_metrics_LogEventDropped_Reason_REASON_UNKNOWN = 0, + gdt_client_metrics_LogEventDropped_Reason_MESSAGE_TOO_OLD = 1, + gdt_client_metrics_LogEventDropped_Reason_CACHE_FULL = 2, + gdt_client_metrics_LogEventDropped_Reason_PAYLOAD_TOO_BIG = 3, + gdt_client_metrics_LogEventDropped_Reason_MAX_RETRIES_REACHED = 4, + gdt_client_metrics_LogEventDropped_Reason_INVALID_PAYLOD = 5, + gdt_client_metrics_LogEventDropped_Reason_SERVER_ERROR = 6 +} gdt_client_metrics_LogEventDropped_Reason; +#define _gdt_client_metrics_LogEventDropped_Reason_MIN gdt_client_metrics_LogEventDropped_Reason_REASON_UNKNOWN +#define _gdt_client_metrics_LogEventDropped_Reason_MAX gdt_client_metrics_LogEventDropped_Reason_SERVER_ERROR +#define _gdt_client_metrics_LogEventDropped_Reason_ARRAYSIZE ((gdt_client_metrics_LogEventDropped_Reason)(gdt_client_metrics_LogEventDropped_Reason_SERVER_ERROR+1)) + +/* Struct definitions */ +typedef struct _gdt_client_metrics_LogSourceMetrics { + pb_bytes_array_t *log_source; + pb_size_t log_event_dropped_count; + struct _gdt_client_metrics_LogEventDropped *log_event_dropped; +/* @@protoc_insertion_point(struct:gdt_client_metrics_LogSourceMetrics) */ +} gdt_client_metrics_LogSourceMetrics; + +typedef struct _gdt_client_metrics_LogEventDropped { + int64_t events_dropped_count; + gdt_client_metrics_LogEventDropped_Reason reason; +/* @@protoc_insertion_point(struct:gdt_client_metrics_LogEventDropped) */ +} gdt_client_metrics_LogEventDropped; + +typedef struct _gdt_client_metrics_StorageMetrics { + int64_t current_cache_size_bytes; + int64_t max_cache_size_bytes; +/* @@protoc_insertion_point(struct:gdt_client_metrics_StorageMetrics) */ +} gdt_client_metrics_StorageMetrics; + +typedef struct _gdt_client_metrics_TimeWindow { + int64_t start_ms; + int64_t end_ms; +/* @@protoc_insertion_point(struct:gdt_client_metrics_TimeWindow) */ +} gdt_client_metrics_TimeWindow; + +typedef struct _gdt_client_metrics_GlobalMetrics { + gdt_client_metrics_StorageMetrics storage_metrics; +/* @@protoc_insertion_point(struct:gdt_client_metrics_GlobalMetrics) */ +} gdt_client_metrics_GlobalMetrics; + +typedef struct _gdt_client_metrics_ClientMetrics { + gdt_client_metrics_TimeWindow window; + pb_size_t log_source_metrics_count; + struct _gdt_client_metrics_LogSourceMetrics *log_source_metrics; + gdt_client_metrics_GlobalMetrics global_metrics; + pb_bytes_array_t *app_namespace; +/* @@protoc_insertion_point(struct:gdt_client_metrics_ClientMetrics) */ +} gdt_client_metrics_ClientMetrics; + +/* Default values for struct fields */ + +/* Initializer values for message structs */ +#define gdt_client_metrics_ClientMetrics_init_default {gdt_client_metrics_TimeWindow_init_default, 0, NULL, gdt_client_metrics_GlobalMetrics_init_default, NULL} +#define gdt_client_metrics_TimeWindow_init_default {0, 0} +#define gdt_client_metrics_GlobalMetrics_init_default {gdt_client_metrics_StorageMetrics_init_default} +#define gdt_client_metrics_StorageMetrics_init_default {0, 0} +#define gdt_client_metrics_LogSourceMetrics_init_default {NULL, 0, NULL} +#define gdt_client_metrics_LogEventDropped_init_default {0, _gdt_client_metrics_LogEventDropped_Reason_MIN} +#define gdt_client_metrics_ClientMetrics_init_zero {gdt_client_metrics_TimeWindow_init_zero, 0, NULL, gdt_client_metrics_GlobalMetrics_init_zero, NULL} +#define gdt_client_metrics_TimeWindow_init_zero {0, 0} +#define gdt_client_metrics_GlobalMetrics_init_zero {gdt_client_metrics_StorageMetrics_init_zero} +#define gdt_client_metrics_StorageMetrics_init_zero {0, 0} +#define gdt_client_metrics_LogSourceMetrics_init_zero {NULL, 0, NULL} +#define gdt_client_metrics_LogEventDropped_init_zero {0, _gdt_client_metrics_LogEventDropped_Reason_MIN} + +/* Field tags (for use in manual encoding/decoding) */ +#define gdt_client_metrics_LogSourceMetrics_log_source_tag 1 +#define gdt_client_metrics_LogSourceMetrics_log_event_dropped_tag 2 +#define gdt_client_metrics_LogEventDropped_events_dropped_count_tag 1 +#define gdt_client_metrics_LogEventDropped_reason_tag 3 +#define gdt_client_metrics_StorageMetrics_current_cache_size_bytes_tag 1 +#define gdt_client_metrics_StorageMetrics_max_cache_size_bytes_tag 2 +#define gdt_client_metrics_TimeWindow_start_ms_tag 1 +#define gdt_client_metrics_TimeWindow_end_ms_tag 2 +#define gdt_client_metrics_GlobalMetrics_storage_metrics_tag 1 +#define gdt_client_metrics_ClientMetrics_window_tag 1 +#define gdt_client_metrics_ClientMetrics_log_source_metrics_tag 2 +#define gdt_client_metrics_ClientMetrics_global_metrics_tag 3 +#define gdt_client_metrics_ClientMetrics_app_namespace_tag 4 + +/* Struct field encoding specification for nanopb */ +extern const pb_field_t gdt_client_metrics_ClientMetrics_fields[5]; +extern const pb_field_t gdt_client_metrics_TimeWindow_fields[3]; +extern const pb_field_t gdt_client_metrics_GlobalMetrics_fields[2]; +extern const pb_field_t gdt_client_metrics_StorageMetrics_fields[3]; +extern const pb_field_t gdt_client_metrics_LogSourceMetrics_fields[3]; +extern const pb_field_t gdt_client_metrics_LogEventDropped_fields[3]; + +/* Maximum encoded size of messages (where known) */ +/* gdt_client_metrics_ClientMetrics_size depends on runtime parameters */ +#define gdt_client_metrics_TimeWindow_size 22 +#define gdt_client_metrics_GlobalMetrics_size 24 +#define gdt_client_metrics_StorageMetrics_size 22 +/* gdt_client_metrics_LogSourceMetrics_size depends on runtime parameters */ +#define gdt_client_metrics_LogEventDropped_size 13 + +/* Message IDs (where set with "msgid" option) */ +#ifdef PB_MSGID + +#define CLIENT_METRICS_MESSAGES \ + + +#endif + +/* @@protoc_insertion_point(eof) */ + +#endif diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/compliance.nanopb.c b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/compliance.nanopb.c new file mode 100644 index 0000000..f3552f7 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/compliance.nanopb.c @@ -0,0 +1,62 @@ +/* + * Copyright 2023 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* Automatically generated nanopb constant definitions */ +/* Generated by nanopb-0.3.9.9 */ + +#include "GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/compliance.nanopb.h" + +/* @@protoc_insertion_point(includes) */ +#if PB_PROTO_HEADER_VERSION != 30 +#error Regenerate this file with the current version of nanopb generator. +#endif + +const gdt_cct_ComplianceData_ProductIdOrigin gdt_cct_ComplianceData_product_id_origin_default = gdt_cct_ComplianceData_ProductIdOrigin_NOT_SET; + + +const pb_field_t gdt_cct_ComplianceData_fields[3] = { + PB_FIELD( 1, MESSAGE , OPTIONAL, STATIC , FIRST, gdt_cct_ComplianceData, privacy_context, privacy_context, &privacy_context_external_ExternalPrivacyContext_fields), + PB_FIELD( 2, UENUM , OPTIONAL, STATIC , OTHER, gdt_cct_ComplianceData, product_id_origin, privacy_context, &gdt_cct_ComplianceData_product_id_origin_default), + PB_LAST_FIELD +}; + + + +/* Check that field information fits in pb_field_t */ +#if !defined(PB_FIELD_32BIT) +/* If you get an error here, it means that you need to define PB_FIELD_32BIT + * compile-time option. You can do that in pb.h or on compiler command line. + * + * The reason you need to do this is that some of your messages contain tag + * numbers or field sizes that are larger than what can fit in 8 or 16 bit + * field descriptors. + */ +PB_STATIC_ASSERT((pb_membersize(gdt_cct_ComplianceData, privacy_context) < 65536), YOU_MUST_DEFINE_PB_FIELD_32BIT_FOR_MESSAGES_gdt_cct_ComplianceData) +#endif + +#if !defined(PB_FIELD_16BIT) && !defined(PB_FIELD_32BIT) +/* If you get an error here, it means that you need to define PB_FIELD_16BIT + * compile-time option. You can do that in pb.h or on compiler command line. + * + * The reason you need to do this is that some of your messages contain tag + * numbers or field sizes that are larger than what can fit in the default + * 8 bit descriptors. + */ +PB_STATIC_ASSERT((pb_membersize(gdt_cct_ComplianceData, privacy_context) < 256), YOU_MUST_DEFINE_PB_FIELD_16BIT_FOR_MESSAGES_gdt_cct_ComplianceData) +#endif + + +/* @@protoc_insertion_point(eof) */ diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/compliance.nanopb.h b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/compliance.nanopb.h new file mode 100644 index 0000000..a143c76 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/compliance.nanopb.h @@ -0,0 +1,77 @@ +/* + * Copyright 2023 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* Automatically generated nanopb header */ +/* Generated by nanopb-0.3.9.9 */ + +#ifndef PB_GDT_CCT_COMPLIANCE_NANOPB_H_INCLUDED +#define PB_GDT_CCT_COMPLIANCE_NANOPB_H_INCLUDED +#include + +#include "GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/external_privacy_context.nanopb.h" + +/* @@protoc_insertion_point(includes) */ +#if PB_PROTO_HEADER_VERSION != 30 +#error Regenerate this file with the current version of nanopb generator. +#endif + + +/* Enum definitions */ +typedef enum _gdt_cct_ComplianceData_ProductIdOrigin { + gdt_cct_ComplianceData_ProductIdOrigin_NOT_SET = 0, + gdt_cct_ComplianceData_ProductIdOrigin_EVENT_OVERRIDE = 5 +} gdt_cct_ComplianceData_ProductIdOrigin; +#define _gdt_cct_ComplianceData_ProductIdOrigin_MIN gdt_cct_ComplianceData_ProductIdOrigin_NOT_SET +#define _gdt_cct_ComplianceData_ProductIdOrigin_MAX gdt_cct_ComplianceData_ProductIdOrigin_EVENT_OVERRIDE +#define _gdt_cct_ComplianceData_ProductIdOrigin_ARRAYSIZE ((gdt_cct_ComplianceData_ProductIdOrigin)(gdt_cct_ComplianceData_ProductIdOrigin_EVENT_OVERRIDE+1)) + +/* Struct definitions */ +typedef struct _gdt_cct_ComplianceData { + bool has_privacy_context; + privacy_context_external_ExternalPrivacyContext privacy_context; + bool has_product_id_origin; + gdt_cct_ComplianceData_ProductIdOrigin product_id_origin; +/* @@protoc_insertion_point(struct:gdt_cct_ComplianceData) */ +} gdt_cct_ComplianceData; + +/* Default values for struct fields */ +extern const gdt_cct_ComplianceData_ProductIdOrigin gdt_cct_ComplianceData_product_id_origin_default; + +/* Initializer values for message structs */ +#define gdt_cct_ComplianceData_init_default {false, privacy_context_external_ExternalPrivacyContext_init_default, false, gdt_cct_ComplianceData_ProductIdOrigin_NOT_SET} +#define gdt_cct_ComplianceData_init_zero {false, privacy_context_external_ExternalPrivacyContext_init_zero, false, _gdt_cct_ComplianceData_ProductIdOrigin_MIN} + +/* Field tags (for use in manual encoding/decoding) */ +#define gdt_cct_ComplianceData_privacy_context_tag 1 +#define gdt_cct_ComplianceData_product_id_origin_tag 2 + +/* Struct field encoding specification for nanopb */ +extern const pb_field_t gdt_cct_ComplianceData_fields[3]; + +/* Maximum encoded size of messages (where known) */ +#define gdt_cct_ComplianceData_size (14 + privacy_context_external_ExternalPRequestContext_size) + +/* Message IDs (where set with "msgid" option) */ +#ifdef PB_MSGID + +#define COMPLIANCE_MESSAGES \ + + +#endif + +/* @@protoc_insertion_point(eof) */ + +#endif diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/external_prequest_context.nanopb.c b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/external_prequest_context.nanopb.c new file mode 100644 index 0000000..9eb1d16 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/external_prequest_context.nanopb.c @@ -0,0 +1,35 @@ +/* + * Copyright 2023 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* Automatically generated nanopb constant definitions */ +/* Generated by nanopb-0.3.9.9 */ + +#include "GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/external_prequest_context.nanopb.h" + +/* @@protoc_insertion_point(includes) */ +#if PB_PROTO_HEADER_VERSION != 30 +#error Regenerate this file with the current version of nanopb generator. +#endif + + + +const pb_field_t privacy_context_external_ExternalPRequestContext_fields[2] = { + PB_FIELD( 13, INT32 , OPTIONAL, STATIC , FIRST, privacy_context_external_ExternalPRequestContext, origin_associated_product_id, origin_associated_product_id, 0), + PB_LAST_FIELD +}; + + +/* @@protoc_insertion_point(eof) */ diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/external_prequest_context.nanopb.h b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/external_prequest_context.nanopb.h new file mode 100644 index 0000000..03f0f12 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/external_prequest_context.nanopb.h @@ -0,0 +1,62 @@ +/* + * Copyright 2023 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* Automatically generated nanopb header */ +/* Generated by nanopb-0.3.9.9 */ + +#ifndef PB_PRIVACY_CONTEXT_EXTERNAL_EXTERNAL_PREQUEST_CONTEXT_NANOPB_H_INCLUDED +#define PB_PRIVACY_CONTEXT_EXTERNAL_EXTERNAL_PREQUEST_CONTEXT_NANOPB_H_INCLUDED +#include + +/* @@protoc_insertion_point(includes) */ +#if PB_PROTO_HEADER_VERSION != 30 +#error Regenerate this file with the current version of nanopb generator. +#endif + + +/* Struct definitions */ +typedef struct _privacy_context_external_ExternalPRequestContext { + bool has_origin_associated_product_id; + int32_t origin_associated_product_id; +/* @@protoc_insertion_point(struct:privacy_context_external_ExternalPRequestContext) */ +} privacy_context_external_ExternalPRequestContext; + +/* Default values for struct fields */ + +/* Initializer values for message structs */ +#define privacy_context_external_ExternalPRequestContext_init_default {false, 0} +#define privacy_context_external_ExternalPRequestContext_init_zero {false, 0} + +/* Field tags (for use in manual encoding/decoding) */ +#define privacy_context_external_ExternalPRequestContext_origin_associated_product_id_tag 13 + +/* Struct field encoding specification for nanopb */ +extern const pb_field_t privacy_context_external_ExternalPRequestContext_fields[2]; + +/* Maximum encoded size of messages (where known) */ +#define privacy_context_external_ExternalPRequestContext_size 11 + +/* Message IDs (where set with "msgid" option) */ +#ifdef PB_MSGID + +#define EXTERNAL_PREQUEST_CONTEXT_MESSAGES \ + + +#endif + +/* @@protoc_insertion_point(eof) */ + +#endif diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/external_privacy_context.nanopb.c b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/external_privacy_context.nanopb.c new file mode 100644 index 0000000..8b81605 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/external_privacy_context.nanopb.c @@ -0,0 +1,59 @@ +/* + * Copyright 2023 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* Automatically generated nanopb constant definitions */ +/* Generated by nanopb-0.3.9.9 */ + +#include "GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/external_privacy_context.nanopb.h" + +/* @@protoc_insertion_point(includes) */ +#if PB_PROTO_HEADER_VERSION != 30 +#error Regenerate this file with the current version of nanopb generator. +#endif + + + +const pb_field_t privacy_context_external_ExternalPrivacyContext_fields[2] = { + PB_FIELD( 2, MESSAGE , OPTIONAL, STATIC , FIRST, privacy_context_external_ExternalPrivacyContext, prequest, prequest, &privacy_context_external_ExternalPRequestContext_fields), + PB_LAST_FIELD +}; + + +/* Check that field information fits in pb_field_t */ +#if !defined(PB_FIELD_32BIT) +/* If you get an error here, it means that you need to define PB_FIELD_32BIT + * compile-time option. You can do that in pb.h or on compiler command line. + * + * The reason you need to do this is that some of your messages contain tag + * numbers or field sizes that are larger than what can fit in 8 or 16 bit + * field descriptors. + */ +PB_STATIC_ASSERT((pb_membersize(privacy_context_external_ExternalPrivacyContext, prequest) < 65536), YOU_MUST_DEFINE_PB_FIELD_32BIT_FOR_MESSAGES_privacy_context_external_ExternalPrivacyContext) +#endif + +#if !defined(PB_FIELD_16BIT) && !defined(PB_FIELD_32BIT) +/* If you get an error here, it means that you need to define PB_FIELD_16BIT + * compile-time option. You can do that in pb.h or on compiler command line. + * + * The reason you need to do this is that some of your messages contain tag + * numbers or field sizes that are larger than what can fit in the default + * 8 bit descriptors. + */ +PB_STATIC_ASSERT((pb_membersize(privacy_context_external_ExternalPrivacyContext, prequest) < 256), YOU_MUST_DEFINE_PB_FIELD_16BIT_FOR_MESSAGES_privacy_context_external_ExternalPrivacyContext) +#endif + + +/* @@protoc_insertion_point(eof) */ diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/external_privacy_context.nanopb.h b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/external_privacy_context.nanopb.h new file mode 100644 index 0000000..dc6981a --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/external_privacy_context.nanopb.h @@ -0,0 +1,64 @@ +/* + * Copyright 2023 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* Automatically generated nanopb header */ +/* Generated by nanopb-0.3.9.9 */ + +#ifndef PB_PRIVACY_CONTEXT_EXTERNAL_EXTERNAL_PRIVACY_CONTEXT_NANOPB_H_INCLUDED +#define PB_PRIVACY_CONTEXT_EXTERNAL_EXTERNAL_PRIVACY_CONTEXT_NANOPB_H_INCLUDED +#include + +#include "GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/external_prequest_context.nanopb.h" + +/* @@protoc_insertion_point(includes) */ +#if PB_PROTO_HEADER_VERSION != 30 +#error Regenerate this file with the current version of nanopb generator. +#endif + + +/* Struct definitions */ +typedef struct _privacy_context_external_ExternalPrivacyContext { + bool has_prequest; + privacy_context_external_ExternalPRequestContext prequest; +/* @@protoc_insertion_point(struct:privacy_context_external_ExternalPrivacyContext) */ +} privacy_context_external_ExternalPrivacyContext; + +/* Default values for struct fields */ + +/* Initializer values for message structs */ +#define privacy_context_external_ExternalPrivacyContext_init_default {false, privacy_context_external_ExternalPRequestContext_init_default} +#define privacy_context_external_ExternalPrivacyContext_init_zero {false, privacy_context_external_ExternalPRequestContext_init_zero} + +/* Field tags (for use in manual encoding/decoding) */ +#define privacy_context_external_ExternalPrivacyContext_prequest_tag 2 + +/* Struct field encoding specification for nanopb */ +extern const pb_field_t privacy_context_external_ExternalPrivacyContext_fields[2]; + +/* Maximum encoded size of messages (where known) */ +#define privacy_context_external_ExternalPrivacyContext_size 13 + +/* Message IDs (where set with "msgid" option) */ +#ifdef PB_MSGID + +#define EXTERNAL_PRIVACY_CONTEXT_MESSAGES \ + + +#endif + +/* @@protoc_insertion_point(eof) */ + +#endif diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Public/GDTCOREvent+GDTCCTSupport.h b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Public/GDTCOREvent+GDTCCTSupport.h new file mode 100644 index 0000000..295e6f8 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Public/GDTCOREvent+GDTCCTSupport.h @@ -0,0 +1,51 @@ +/* + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCOREvent.h" + +NS_ASSUME_NONNULL_BEGIN + +/** A string sets in customBytes as a key paired to @YES if current event needs to + * populate network connection info data, @NO otherwise. + */ +FOUNDATION_EXPORT NSString *const GDTCCTNeedsNetworkConnectionInfo; + +/** A string sets in customBytes as a key paired to the network connection info data + * of current event. + */ +FOUNDATION_EXPORT NSString *const GDTCCTNetworkConnectionInfo; + +/** A category that uses the customBytes property of a GDTCOREvent to store network connection info. + */ +@interface GDTCOREvent (GDTCCTSupport) + +/** If YES, needs the network connection info field set during prioritization. + * @note Uses the GDTCOREvent customBytes property. + */ +@property(nonatomic) BOOL needsNetworkConnectionInfoPopulated; + +/** The network connection info as collected at the time of the event. + * @note Uses the GDTCOREvent customBytes property. + */ +@property(nullable, nonatomic) NSData *networkConnectionInfoData; + +/** Code that identifies the event to be sent to the CCT backend. + */ +@property(nullable, nonatomic) NSNumber *eventCode; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORAssert.m b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORAssert.m new file mode 100644 index 0000000..14462ae --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORAssert.m @@ -0,0 +1,36 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORAssert.h" + +GDTCORAssertionBlock GDTCORAssertionBlockToRunInstead(void) { + // This class is only compiled in by unit tests, and this should fail quickly in optimized builds. + Class GDTCORAssertClass = NSClassFromString(@"GDTCORAssertHelper"); + if (__builtin_expect(!!GDTCORAssertClass, 0)) { + SEL assertionBlockSEL = NSSelectorFromString(@"assertionBlock"); + if (assertionBlockSEL) { + IMP assertionBlockIMP = [GDTCORAssertClass methodForSelector:assertionBlockSEL]; + if (assertionBlockIMP) { + GDTCORAssertionBlock assertionBlock = ((GDTCORAssertionBlock(*)(id, SEL))assertionBlockIMP)( + GDTCORAssertClass, assertionBlockSEL); + if (assertionBlock) { + return assertionBlock; + } + } + } + } + return NULL; +} diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORClock.m b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORClock.m new file mode 100644 index 0000000..97f96fa --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORClock.m @@ -0,0 +1,174 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORClock.h" + +#import + +// Using a monotonic clock is necessary because CFAbsoluteTimeGetCurrent(), NSDate, and related all +// are subject to drift. That it to say, multiple consecutive calls do not always result in a +// time that is in the future. Clocks may be adjusted by the user, NTP, or any number of external +// factors. This class attempts to determine the wall-clock time at the time of the event by +// capturing the kernel start and time since boot to determine a wallclock time in UTC. +// +// Timezone offsets at the time of a snapshot are also captured in order to provide local-time +// details. Other classes in this library depend on comparing times at some time in the future to +// a time captured in the past, and this class needs to provide a mechanism to do that. +// +// TL;DR: This class attempts to accomplish two things: 1. Provide accurate event times. 2. Provide +// a monotonic clock mechanism to accurately check if some clock snapshot was before or after +// by using a shared reference point (kernel boot time). +// +// Note: Much of the mach time stuff doesn't work properly in the simulator. So this class can be +// difficult to unit test. + +/** Returns the kernel boottime property from sysctl. + * + * @return The KERN_BOOTTIME property from sysctl, in nanoseconds. + */ +static int64_t KernelBootTimeInNanoseconds(void) { + // Caching the result is not possible because clock drift would not be accounted for. + struct timeval boottime; + int mib[2] = {CTL_KERN, KERN_BOOTTIME}; + size_t size = sizeof(boottime); + int rc = sysctl(mib, 2, &boottime, &size, NULL, 0); + if (rc != 0) { + return 0; + } + return (int64_t)boottime.tv_sec * NSEC_PER_SEC + (int64_t)boottime.tv_usec * NSEC_PER_USEC; +} + +/** Returns value of gettimeofday, in nanoseconds. + * + * @return The value of gettimeofday, in nanoseconds. + */ +static int64_t UptimeInNanoseconds(void) { + int64_t before_now_nsec; + int64_t after_now_nsec; + struct timeval now; + + before_now_nsec = KernelBootTimeInNanoseconds(); + // Addresses a race condition in which the system time has updated, but the boottime has not. + do { + gettimeofday(&now, NULL); + after_now_nsec = KernelBootTimeInNanoseconds(); + } while (after_now_nsec != before_now_nsec); + return (int64_t)now.tv_sec * NSEC_PER_SEC + (int64_t)now.tv_usec * NSEC_PER_USEC - + before_now_nsec; +} + +// TODO: Consider adding a 'trustedTime' property that can be populated by the response from a BE. +@implementation GDTCORClock + +- (instancetype)init { + self = [super init]; + if (self) { + _kernelBootTimeNanoseconds = KernelBootTimeInNanoseconds(); + _uptimeNanoseconds = UptimeInNanoseconds(); + _timeMillis = + (int64_t)((CFAbsoluteTimeGetCurrent() + kCFAbsoluteTimeIntervalSince1970) * NSEC_PER_USEC); + _timezoneOffsetSeconds = [[NSTimeZone systemTimeZone] secondsFromGMT]; + } + return self; +} + ++ (GDTCORClock *)snapshot { + return [[GDTCORClock alloc] init]; +} + ++ (instancetype)clockSnapshotInTheFuture:(uint64_t)millisInTheFuture { + GDTCORClock *snapshot = [self snapshot]; + snapshot->_timeMillis += millisInTheFuture; + return snapshot; +} + +- (BOOL)isAfter:(GDTCORClock *)otherClock { + // These clocks are trivially comparable when they share a kernel boot time. + if (_kernelBootTimeNanoseconds == otherClock->_kernelBootTimeNanoseconds) { + int64_t timeDiff = (_timeMillis + _timezoneOffsetSeconds) - + (otherClock->_timeMillis + otherClock->_timezoneOffsetSeconds); + return timeDiff > 0; + } else { + int64_t kernelBootTimeDiff = + otherClock->_kernelBootTimeNanoseconds - _kernelBootTimeNanoseconds; + // This isn't a great solution, but essentially, if the other clock's boot time is 'later', NO + // is returned. This can be altered by changing the system time and rebooting. + return kernelBootTimeDiff < 0 ? YES : NO; + } +} + +- (int64_t)uptimeMilliseconds { + return self.uptimeNanoseconds / NSEC_PER_MSEC; +} + +- (NSUInteger)hash { + return [@(_kernelBootTimeNanoseconds) hash] ^ [@(_uptimeNanoseconds) hash] ^ + [@(_timeMillis) hash] ^ [@(_timezoneOffsetSeconds) hash]; +} + +- (BOOL)isEqual:(id)object { + return [self hash] == [object hash]; +} + +#pragma mark - NSSecureCoding + +/** NSKeyedCoder key for timeMillis property. */ +static NSString *const kGDTCORClockTimeMillisKey = @"GDTCORClockTimeMillis"; + +/** NSKeyedCoder key for timezoneOffsetMillis property. */ +static NSString *const kGDTCORClockTimezoneOffsetSeconds = @"GDTCORClockTimezoneOffsetSeconds"; + +/** NSKeyedCoder key for _kernelBootTime ivar. */ +static NSString *const kGDTCORClockKernelBootTime = @"GDTCORClockKernelBootTime"; + +/** NSKeyedCoder key for _uptimeNanoseconds ivar. */ +static NSString *const kGDTCORClockUptime = @"GDTCORClockUptime"; + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder { + self = [super init]; + if (self) { + // TODO: If the kernelBootTimeNanoseconds is more recent, we need to change the kernel boot time + // and uptimeMillis ivars + _timeMillis = [aDecoder decodeInt64ForKey:kGDTCORClockTimeMillisKey]; + _timezoneOffsetSeconds = [aDecoder decodeInt64ForKey:kGDTCORClockTimezoneOffsetSeconds]; + _kernelBootTimeNanoseconds = [aDecoder decodeInt64ForKey:kGDTCORClockKernelBootTime]; + _uptimeNanoseconds = [aDecoder decodeInt64ForKey:kGDTCORClockUptime]; + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeInt64:_timeMillis forKey:kGDTCORClockTimeMillisKey]; + [aCoder encodeInt64:_timezoneOffsetSeconds forKey:kGDTCORClockTimezoneOffsetSeconds]; + [aCoder encodeInt64:_kernelBootTimeNanoseconds forKey:kGDTCORClockKernelBootTime]; + [aCoder encodeInt64:_uptimeNanoseconds forKey:kGDTCORClockUptime]; +} + +#pragma mark - Deprecated properties + +- (int64_t)kernelBootTime { + return self.kernelBootTimeNanoseconds; +} + +- (int64_t)uptime { + return self.uptimeNanoseconds; +} + +@end diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORConsoleLogger.m b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORConsoleLogger.m new file mode 100644 index 0000000..5eaee92 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORConsoleLogger.m @@ -0,0 +1,55 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORConsoleLogger.h" + +volatile NSInteger GDTCORConsoleLoggerLoggingLevel = GDTCORLoggingLevelErrors; + +/** The console logger prefix. */ +static NSString *kGDTCORConsoleLogger = @"[GoogleDataTransport]"; + +NSString *GDTCORMessageCodeEnumToString(GDTCORMessageCode code) { + return [[NSString alloc] initWithFormat:@"I-GDTCOR%06ld", (long)code]; +} + +void GDTCORLog(GDTCORMessageCode code, GDTCORLoggingLevel logLevel, NSString *format, ...) { +// Don't log anything in not debug builds. +#if !NDEBUG + if (logLevel >= GDTCORConsoleLoggerLoggingLevel) { + NSString *logFormat = [NSString stringWithFormat:@"%@[%@] %@", kGDTCORConsoleLogger, + GDTCORMessageCodeEnumToString(code), format]; + va_list args; + va_start(args, format); + NSLogv(logFormat, args); + va_end(args); + } +#endif // !NDEBUG +} + +void GDTCORLogAssert( + BOOL wasFatal, NSString *_Nonnull file, NSInteger line, NSString *_Nullable format, ...) { +// Don't log anything in not debug builds. +#if !NDEBUG + GDTCORMessageCode code = wasFatal ? GDTCORMCEFatalAssertion : GDTCORMCEGeneralError; + NSString *logFormat = + [NSString stringWithFormat:@"%@[%@] (%@:%ld) : %@", kGDTCORConsoleLogger, + GDTCORMessageCodeEnumToString(code), file, (long)line, format]; + va_list args; + va_start(args, format); + NSLogv(logFormat, args); + va_end(args); +#endif // !NDEBUG +} diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORDirectorySizeTracker.m b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORDirectorySizeTracker.m new file mode 100644 index 0000000..0bc8515 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORDirectorySizeTracker.m @@ -0,0 +1,101 @@ +/* + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORDirectorySizeTracker.h" + +@interface GDTCORDirectorySizeTracker () + +/** The observed directory path. */ +@property(nonatomic, readonly) NSString *directoryPath; + +/** The cached content size of the observed directory. */ +@property(nonatomic, nullable) NSNumber *cachedSizeBytes; + +@end + +@implementation GDTCORDirectorySizeTracker + +- (instancetype)initWithDirectoryPath:(NSString *)path { + self = [super init]; + if (self) { + _directoryPath = path; + } + return self; +} + +- (GDTCORStorageSizeBytes)directoryContentSize { + if (self.cachedSizeBytes == nil) { + self.cachedSizeBytes = @([self calculateDirectoryContentSize]); + } + + return self.cachedSizeBytes.unsignedLongLongValue; +} + +- (void)fileWasAddedAtPath:(NSString *)path withSize:(GDTCORStorageSizeBytes)fileSize { + if (![path hasPrefix:self.directoryPath]) { + // Ignore because the file is not inside the directory. + return; + } + + self.cachedSizeBytes = @([self directoryContentSize] + fileSize); +} + +- (void)fileWasRemovedAtPath:(NSString *)path withSize:(GDTCORStorageSizeBytes)fileSize { + if (![path hasPrefix:self.directoryPath]) { + // Ignore because the file is not inside the directory. + return; + } + + self.cachedSizeBytes = @([self directoryContentSize] - fileSize); +} + +- (void)resetCachedSize { + self.cachedSizeBytes = nil; +} + +- (GDTCORStorageSizeBytes)calculateDirectoryContentSize { + NSArray *prefetchedProperties = @[ NSURLIsRegularFileKey, NSURLFileSizeKey ]; + uint64_t totalBytes = 0; + NSURL *directoryURL = [NSURL fileURLWithPath:self.directoryPath]; + + NSDirectoryEnumerator *enumerator = [[NSFileManager defaultManager] + enumeratorAtURL:directoryURL + includingPropertiesForKeys:prefetchedProperties + options:NSDirectoryEnumerationSkipsHiddenFiles + errorHandler:^BOOL(NSURL *_Nonnull url, NSError *_Nonnull error) { + return YES; + }]; + + for (NSURL *fileURL in enumerator) { + @autoreleasepool { + NSNumber *isRegularFile; + [fileURL getResourceValue:&isRegularFile forKey:NSURLIsRegularFileKey error:nil]; + if (isRegularFile.boolValue) { + totalBytes += [self fileSizeAtURL:fileURL]; + } + } + } + + return totalBytes; +} + +- (GDTCORStorageSizeBytes)fileSizeAtURL:(NSURL *)fileURL { + NSNumber *fileSize; + [fileURL getResourceValue:&fileSize forKey:NSURLFileSizeKey error:nil]; + return fileSize.unsignedLongLongValue; +} + +@end diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCOREndpoints.m b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCOREndpoints.m new file mode 100644 index 0000000..f16db13 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCOREndpoints.m @@ -0,0 +1,92 @@ +/* + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCOREndpoints.h" + +static NSString *const kINTServerURL = + @"https://dummyapiverylong-dummy.google.com/dummy/api/very/long"; + +@implementation GDTCOREndpoints + ++ (NSDictionary *)uploadURLs { + // These strings should be interleaved to construct the real URL. This is just to (hopefully) + // fool github URL scanning bots. + static NSURL *CCTServerURL; + static dispatch_once_t CCTOnceToken; + dispatch_once(&CCTOnceToken, ^{ + const char *p1 = "hts/frbslgiggolai.o/0clgbth"; + const char *p2 = "tp:/ieaeogn.ogepscmvc/o/ac"; + const char URL[54] = {p1[0], p2[0], p1[1], p2[1], p1[2], p2[2], p1[3], p2[3], p1[4], + p2[4], p1[5], p2[5], p1[6], p2[6], p1[7], p2[7], p1[8], p2[8], + p1[9], p2[9], p1[10], p2[10], p1[11], p2[11], p1[12], p2[12], p1[13], + p2[13], p1[14], p2[14], p1[15], p2[15], p1[16], p2[16], p1[17], p2[17], + p1[18], p2[18], p1[19], p2[19], p1[20], p2[20], p1[21], p2[21], p1[22], + p2[22], p1[23], p2[23], p1[24], p2[24], p1[25], p2[25], p1[26], '\0'}; + CCTServerURL = [NSURL URLWithString:[NSString stringWithUTF8String:URL]]; + }); + + static NSURL *FLLServerURL; + static dispatch_once_t FLLOnceToken; + dispatch_once(&FLLOnceToken, ^{ + const char *p1 = "hts/frbslgigp.ogepscmv/ieo/eaybtho"; + const char *p2 = "tp:/ieaeogn-agolai.o/1frlglgc/aclg"; + const char URL[69] = {p1[0], p2[0], p1[1], p2[1], p1[2], p2[2], p1[3], p2[3], p1[4], + p2[4], p1[5], p2[5], p1[6], p2[6], p1[7], p2[7], p1[8], p2[8], + p1[9], p2[9], p1[10], p2[10], p1[11], p2[11], p1[12], p2[12], p1[13], + p2[13], p1[14], p2[14], p1[15], p2[15], p1[16], p2[16], p1[17], p2[17], + p1[18], p2[18], p1[19], p2[19], p1[20], p2[20], p1[21], p2[21], p1[22], + p2[22], p1[23], p2[23], p1[24], p2[24], p1[25], p2[25], p1[26], p2[26], + p1[27], p2[27], p1[28], p2[28], p1[29], p2[29], p1[30], p2[30], p1[31], + p2[31], p1[32], p2[32], p1[33], p2[33], '\0'}; + FLLServerURL = [NSURL URLWithString:[NSString stringWithUTF8String:URL]]; + }); + + static NSURL *CSHServerURL; + static dispatch_once_t CSHOnceToken; + dispatch_once(&CSHOnceToken, ^{ + // These strings should be interleaved to construct the real URL. This is just to (hopefully) + // fool github URL scanning bots. + const char *p1 = "hts/cahyiseot-agolai.o/1frlglgc/aclg"; + const char *p2 = "tp:/rsltcrprsp.ogepscmv/ieo/eaybtho"; + const char URL[72] = {p1[0], p2[0], p1[1], p2[1], p1[2], p2[2], p1[3], p2[3], p1[4], + p2[4], p1[5], p2[5], p1[6], p2[6], p1[7], p2[7], p1[8], p2[8], + p1[9], p2[9], p1[10], p2[10], p1[11], p2[11], p1[12], p2[12], p1[13], + p2[13], p1[14], p2[14], p1[15], p2[15], p1[16], p2[16], p1[17], p2[17], + p1[18], p2[18], p1[19], p2[19], p1[20], p2[20], p1[21], p2[21], p1[22], + p2[22], p1[23], p2[23], p1[24], p2[24], p1[25], p2[25], p1[26], p2[26], + p1[27], p2[27], p1[28], p2[28], p1[29], p2[29], p1[30], p2[30], p1[31], + p2[31], p1[32], p2[32], p1[33], p2[33], p1[34], p2[34], p1[35], '\0'}; + CSHServerURL = [NSURL URLWithString:[NSString stringWithUTF8String:URL]]; + }); + static NSDictionary *uploadURLs; + static dispatch_once_t URLOnceToken; + dispatch_once(&URLOnceToken, ^{ + uploadURLs = @{ + @(kGDTCORTargetCCT) : CCTServerURL, + @(kGDTCORTargetFLL) : FLLServerURL, + @(kGDTCORTargetCSH) : CSHServerURL, + @(kGDTCORTargetINT) : [NSURL URLWithString:kINTServerURL] + }; + }); + return uploadURLs; +} + ++ (nullable NSURL *)uploadURLForTarget:(GDTCORTarget)target { + NSDictionary *URLs = [self uploadURLs]; + return [URLs objectForKey:@(target)]; +} + +@end diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCOREvent.m b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCOREvent.m new file mode 100644 index 0000000..98db41a --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCOREvent.m @@ -0,0 +1,170 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCOREvent.h" + +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORAssert.h" +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORPlatform.h" +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORStorageProtocol.h" +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORClock.h" +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORConsoleLogger.h" +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORProductData.h" + +#import "GoogleDataTransport/GDTCORLibrary/Private/GDTCOREvent_Private.h" + +@implementation GDTCOREvent + ++ (NSString *)nextEventID { + // Replace special non-alphanumeric characters to avoid potential conflicts with storage logic. + return [[NSUUID UUID].UUIDString stringByReplacingOccurrencesOfString:@"-" withString:@""]; +} + +- (nullable instancetype)initWithMappingID:(NSString *)mappingID + productData:(nullable GDTCORProductData *)productData + target:(GDTCORTarget)target { + GDTCORAssert(mappingID.length > 0, @"Please give a valid mapping ID"); + GDTCORAssert(target > 0, @"A target cannot be negative or 0"); + if (mappingID.length == 0 || target <= 0) { + return nil; + } + self = [super init]; + if (self) { + _eventID = [GDTCOREvent nextEventID]; + _mappingID = mappingID; + _productData = productData; + _target = target; + _qosTier = GDTCOREventQosDefault; + _expirationDate = [NSDate dateWithTimeIntervalSinceNow:604800]; // 7 days. + + GDTCORLogDebug(@"Event %@ created. ID:%@ mappingID: %@ target:%ld", self, _eventID, mappingID, + (long)target); + } + + return self; +} + +- (nullable instancetype)initWithMappingID:(NSString *)mappingID target:(GDTCORTarget)target { + return [self initWithMappingID:mappingID productData:nil target:target]; +} + +- (instancetype)copy { + GDTCOREvent *copy = [[GDTCOREvent alloc] initWithMappingID:_mappingID + productData:_productData + target:_target]; + copy->_eventID = _eventID; + copy.dataObject = _dataObject; + copy.qosTier = _qosTier; + copy.clockSnapshot = _clockSnapshot; + copy.customBytes = _customBytes; + GDTCORLogDebug(@"Copying event %@ to event %@", self, copy); + return copy; +} + +- (NSUInteger)hash { + // This loses some precision, but it's probably fine. + NSUInteger eventIDHash = [_eventID hash]; + NSUInteger mappingIDHash = [_mappingID hash]; + NSUInteger productDataHash = [_productData hash]; + NSUInteger timeHash = [_clockSnapshot hash]; + NSInteger serializedBytesHash = [_serializedDataObjectBytes hash]; + + return eventIDHash ^ mappingIDHash ^ productDataHash ^ _target ^ _qosTier ^ timeHash ^ + serializedBytesHash; +} + +- (BOOL)isEqual:(id)object { + return [self hash] == [object hash]; +} + +#pragma mark - Property overrides + +- (void)setDataObject:(id)dataObject { + // If you're looking here because of a performance issue in -transportBytes slowing the assignment + // of -dataObject, one way to address this is to add a queue to this class, + // dispatch_(barrier_ if concurrent)async here, and implement the getter with a dispatch_sync. + if (dataObject != _dataObject) { + _dataObject = dataObject; + } + self->_serializedDataObjectBytes = [dataObject transportBytes]; +} + +#pragma mark - NSSecureCoding and NSCoding Protocols + +/** NSCoding key for eventID property. */ +static NSString *kEventIDKey = @"GDTCOREventEventIDKey"; + +/** NSCoding key for mappingID property. */ +static NSString *kMappingIDKey = @"GDTCOREventMappingIDKey"; + +/** NSCoding key for target property. */ +static NSString *kTargetKey = @"GDTCOREventTargetKey"; + +/** NSCoding key for qosTier property. */ +static NSString *kQoSTierKey = @"GDTCOREventQoSTierKey"; + +/** NSCoding key for clockSnapshot property. */ +static NSString *kClockSnapshotKey = @"GDTCOREventClockSnapshotKey"; + +/** NSCoding key for expirationDate property. */ +static NSString *kExpirationDateKey = @"GDTCOREventExpirationDateKey"; + +/** NSCoding key for serializedDataObjectBytes property. */ +static NSString *kSerializedDataObjectBytes = @"GDTCOREventSerializedDataObjectBytesKey"; + +/** NSCoding key for customData property. */ +static NSString *kCustomDataKey = @"GDTCOREventCustomDataKey"; + +/** NSCoding key for productData property. */ +static NSString *kProductDataKey = @"GDTCOREventProductDataKey"; + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (id)initWithCoder:(NSCoder *)aDecoder { + self = [self init]; + if (self) { + _mappingID = [aDecoder decodeObjectOfClass:[NSString class] forKey:kMappingIDKey]; + _productData = [aDecoder decodeObjectOfClass:[GDTCORProductData class] forKey:kProductDataKey]; + _target = [aDecoder decodeIntegerForKey:kTargetKey]; + _eventID = [aDecoder decodeObjectOfClass:[NSString class] forKey:kEventIDKey] + ?: [GDTCOREvent nextEventID]; + _qosTier = [aDecoder decodeIntegerForKey:kQoSTierKey]; + _clockSnapshot = [aDecoder decodeObjectOfClass:[GDTCORClock class] forKey:kClockSnapshotKey]; + _customBytes = [aDecoder decodeObjectOfClass:[NSData class] forKey:kCustomDataKey]; + _expirationDate = [aDecoder decodeObjectOfClass:[NSDate class] forKey:kExpirationDateKey]; + _serializedDataObjectBytes = [aDecoder decodeObjectOfClass:[NSData class] + forKey:kSerializedDataObjectBytes]; + if (!_serializedDataObjectBytes) { + return nil; + } + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:_eventID forKey:kEventIDKey]; + [aCoder encodeObject:_mappingID forKey:kMappingIDKey]; + [aCoder encodeObject:_productData forKey:kProductDataKey]; + [aCoder encodeInteger:_target forKey:kTargetKey]; + [aCoder encodeInteger:_qosTier forKey:kQoSTierKey]; + [aCoder encodeObject:_clockSnapshot forKey:kClockSnapshotKey]; + [aCoder encodeObject:_customBytes forKey:kCustomDataKey]; + [aCoder encodeObject:_expirationDate forKey:kExpirationDateKey]; + [aCoder encodeObject:self.serializedDataObjectBytes forKey:kSerializedDataObjectBytes]; +} + +@end diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORFlatFileStorage+Promises.m b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORFlatFileStorage+Promises.m new file mode 100644 index 0000000..4ff937c --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORFlatFileStorage+Promises.m @@ -0,0 +1,161 @@ +/* + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "GoogleDataTransport/GDTCORLibrary/Private/GDTCORFlatFileStorage+Promises.h" + +#if __has_include() +#import +#else +#import "FBLPromises.h" +#endif + +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORPlatform.h" + +#import "GoogleDataTransport/GDTCORLibrary/Private/GDTCORMetricsMetadata.h" +#import "GoogleDataTransport/GDTCORLibrary/Private/GDTCORStorageMetadata.h" +#import "GoogleDataTransport/GDTCORLibrary/Private/GDTCORUploadBatch.h" + +@implementation GDTCORFlatFileStorage (Promises) + +- (FBLPromise *> *)batchIDsForTarget:(GDTCORTarget)target { + return [FBLPromise onQueue:self.storageQueue + wrapObjectCompletion:^(FBLPromiseObjectCompletion _Nonnull handler) { + [self batchIDsForTarget:target onComplete:handler]; + }]; +} + +- (FBLPromise *)removeBatchWithID:(NSNumber *)batchID deleteEvents:(BOOL)deleteEvents { + return [FBLPromise onQueue:self.storageQueue + wrapCompletion:^(FBLPromiseCompletion _Nonnull handler) { + [self removeBatchWithID:batchID deleteEvents:deleteEvents onComplete:handler]; + }]; +} + +- (FBLPromise *)removeBatchesWithIDs:(NSSet *)batchIDs + deleteEvents:(BOOL)deleteEvents { + NSMutableArray *removeBatchPromises = + [NSMutableArray arrayWithCapacity:batchIDs.count]; + for (NSNumber *batchID in batchIDs) { + [removeBatchPromises addObject:[self removeBatchWithID:batchID deleteEvents:deleteEvents]]; + } + + return [FBLPromise onQueue:self.storageQueue all:[removeBatchPromises copy]].thenOn( + self.storageQueue, ^id(id result) { + return [FBLPromise resolvedWith:[NSNull null]]; + }); +} + +- (FBLPromise *)removeAllBatchesForTarget:(GDTCORTarget)target + deleteEvents:(BOOL)deleteEvents { + return + [self batchIDsForTarget:target].thenOn(self.storageQueue, ^id(NSSet *batchIDs) { + if (batchIDs.count == 0) { + return [FBLPromise resolvedWith:[NSNull null]]; + } else { + return [self removeBatchesWithIDs:batchIDs deleteEvents:NO]; + } + }); +} + +- (FBLPromise *)hasEventsForTarget:(GDTCORTarget)target { + return [FBLPromise onQueue:self.storageQueue + wrapBoolCompletion:^(FBLPromiseBoolCompletion _Nonnull handler) { + [self hasEventsForTarget:target onComplete:handler]; + }]; +} + +- (FBLPromise *)batchWithEventSelector: + (GDTCORStorageEventSelector *)eventSelector + batchExpiration:(NSDate *)expiration { + return [FBLPromise + onQueue:self.storageQueue + async:^(FBLPromiseFulfillBlock _Nonnull fulfill, FBLPromiseRejectBlock _Nonnull reject) { + [self batchWithEventSelector:eventSelector + batchExpiration:expiration + onComplete:^(NSNumber *_Nullable newBatchID, + NSSet *_Nullable batchEvents) { + if (newBatchID == nil || batchEvents == nil) { + reject([self genericRejectedPromiseErrorWithReason: + @"There are no events for the selector."]); + } else { + fulfill([[GDTCORUploadBatch alloc] initWithBatchID:newBatchID + events:batchEvents]); + } + }]; + }]; +} + +- (FBLPromise *)fetchAndUpdateMetricsWithHandler: + (GDTCORMetricsMetadata * (^)(GDTCORMetricsMetadata *_Nullable fetchedMetadata, + NSError *_Nullable fetchError))handler { + return FBLPromise.doOn(self.storageQueue, ^id { + // Fetch the stored metrics metadata. + NSError *decodeError; + NSString *metricsMetadataPath = + [[[self class] libraryDataStoragePath] stringByAppendingPathComponent:@"metrics_metadata"]; + GDTCORMetricsMetadata *decodedMetadata = (GDTCORMetricsMetadata *)GDTCORDecodeArchiveAtPath( + GDTCORMetricsMetadata.class, metricsMetadataPath, &decodeError); + + // Update the metadata using the retrieved metadata. + GDTCORMetricsMetadata *updatedMetadata = handler(decodedMetadata, decodeError); + if (updatedMetadata == nil) { + // `nil` metadata is not expected and will be a no-op. + return nil; + } + + if (![updatedMetadata isEqual:decodedMetadata]) { + // The metadata was updated so it needs to be saved. + // - Encode the updated metadata. + NSError *encodeError; + NSData *encodedMetadata = GDTCOREncodeArchive(updatedMetadata, nil, &encodeError); + if (encodeError) { + return encodeError; + } + + // - Write the encoded metadata to disk. + NSError *writeError; + BOOL writeResult = GDTCORWriteDataToFile(encodedMetadata, metricsMetadataPath, &writeError); + if (writeResult == NO || writeError) { + return writeError; + } + } + + return nil; + }); +} + +- (FBLPromise *)fetchStorageMetadata { + return FBLPromise.asyncOn(self.storageQueue, ^(FBLPromiseFulfillBlock _Nonnull fulfill, + FBLPromiseRejectBlock _Nonnull reject) { + [self storageSizeWithCallback:^(GDTCORStorageSizeBytes storageSize) { + fulfill([GDTCORStorageMetadata metadataWithCurrentCacheSize:storageSize + maxCacheSize:kGDTCORFlatFileStorageSizeLimit]); + }]; + }); +} + +// TODO: Move to a separate class/extension when needed in more places. +- (NSError *)genericRejectedPromiseErrorWithReason:(NSString *)reason { + return [NSError errorWithDomain:@"GDTCORFlatFileStorage" + code:-1 + userInfo:@{NSLocalizedFailureReasonErrorKey : reason}]; +} + +@end + +/// Stub used to force the linker to include the categories in this file. +void GDTCORInclude_GDTCORLogSourceMetrics_Internal_Category(void) { +} diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORFlatFileStorage.m b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORFlatFileStorage.m new file mode 100644 index 0000000..fe36a19 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORFlatFileStorage.m @@ -0,0 +1,849 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "GoogleDataTransport/GDTCORLibrary/Private/GDTCORFlatFileStorage.h" + +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORAssert.h" +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORLifecycle.h" +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORPlatform.h" +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORStorageEventSelector.h" +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORConsoleLogger.h" +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCOREvent.h" + +#import "GoogleDataTransport/GDTCORLibrary/Private/GDTCOREvent_Private.h" +#import "GoogleDataTransport/GDTCORLibrary/Private/GDTCORRegistrar_Private.h" +#import "GoogleDataTransport/GDTCORLibrary/Private/GDTCORUploadCoordinator.h" + +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORDirectorySizeTracker.h" + +NS_ASSUME_NONNULL_BEGIN + +/** A library data key this class uses to track batchIDs. */ +static NSString *const gBatchIDCounterKey = @"GDTCORFlatFileStorageBatchIDCounter"; + +/** The separator used between metadata elements in filenames. */ +static NSString *const kMetadataSeparator = @"-"; + +NSString *const kGDTCOREventComponentsEventIDKey = @"GDTCOREventComponentsEventIDKey"; + +NSString *const kGDTCOREventComponentsQoSTierKey = @"GDTCOREventComponentsQoSTierKey"; + +NSString *const kGDTCOREventComponentsMappingIDKey = @"GDTCOREventComponentsMappingIDKey"; + +NSString *const kGDTCOREventComponentsExpirationKey = @"GDTCOREventComponentsExpirationKey"; + +NSString *const kGDTCORBatchComponentsTargetKey = @"GDTCORBatchComponentsTargetKey"; + +NSString *const kGDTCORBatchComponentsBatchIDKey = @"GDTCORBatchComponentsBatchIDKey"; + +NSString *const kGDTCORBatchComponentsExpirationKey = @"GDTCORBatchComponentsExpirationKey"; + +NSString *const GDTCORFlatFileStorageErrorDomain = @"GDTCORFlatFileStorage"; + +const uint64_t kGDTCORFlatFileStorageSizeLimit = 20 * 1000 * 1000; // 20 MB. + +@interface GDTCORFlatFileStorage () + +/** An instance of the size tracker to keep track of the disk space consumed by the storage. */ +@property(nonatomic, readonly) GDTCORDirectorySizeTracker *sizeTracker; + +@end + +@implementation GDTCORFlatFileStorage + +@synthesize sizeTracker = _sizeTracker; +@synthesize delegate = _delegate; + ++ (void)load { +#if !NDEBUG + [[GDTCORRegistrar sharedInstance] registerStorage:[self sharedInstance] target:kGDTCORTargetTest]; +#endif // !NDEBUG + [[GDTCORRegistrar sharedInstance] registerStorage:[self sharedInstance] target:kGDTCORTargetCCT]; + [[GDTCORRegistrar sharedInstance] registerStorage:[self sharedInstance] target:kGDTCORTargetFLL]; + [[GDTCORRegistrar sharedInstance] registerStorage:[self sharedInstance] target:kGDTCORTargetCSH]; + [[GDTCORRegistrar sharedInstance] registerStorage:[self sharedInstance] target:kGDTCORTargetINT]; +} + ++ (instancetype)sharedInstance { + static GDTCORFlatFileStorage *sharedStorage; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + sharedStorage = [[GDTCORFlatFileStorage alloc] init]; + }); + return sharedStorage; +} + +- (instancetype)init { + self = [super init]; + if (self) { + _storageQueue = + dispatch_queue_create("com.google.GDTCORFlatFileStorage", DISPATCH_QUEUE_SERIAL); + _uploadCoordinator = [GDTCORUploadCoordinator sharedInstance]; + } + return self; +} + +- (GDTCORDirectorySizeTracker *)sizeTracker { + if (_sizeTracker == nil) { + _sizeTracker = + [[GDTCORDirectorySizeTracker alloc] initWithDirectoryPath:GDTCORRootDirectory().path]; + } + return _sizeTracker; +} + +#pragma mark - GDTCORStorageProtocol + +- (void)storeEvent:(GDTCOREvent *)event + onComplete:(void (^_Nullable)(BOOL wasWritten, NSError *_Nullable error))completion { + GDTCORLogDebug(@"Saving event: %@", event); + if (event == nil || event.serializedDataObjectBytes == nil) { + GDTCORLogDebug(@"%@", @"The event was nil, so it was not saved."); + if (completion) { + completion(NO, [NSError errorWithDomain:NSInternalInconsistencyException + code:-1 + userInfo:nil]); + } + return; + } + if (!completion) { + completion = ^(BOOL wasWritten, NSError *_Nullable error) { + GDTCORLogDebug(@"event %@ stored. success:%@ error:%@", event, wasWritten ? @"YES" : @"NO", + error); + }; + } + + __block GDTCORBackgroundIdentifier bgID = GDTCORBackgroundIdentifierInvalid; + bgID = [[GDTCORApplication sharedApplication] + beginBackgroundTaskWithName:@"GDTStorage" + expirationHandler:^{ + // End the background task if it's still valid. + [[GDTCORApplication sharedApplication] endBackgroundTask:bgID]; + bgID = GDTCORBackgroundIdentifierInvalid; + }]; + + dispatch_async(_storageQueue, ^{ + // Check that a backend implementation is available for this target. + GDTCORTarget target = event.target; + NSString *filePath = [GDTCORFlatFileStorage pathForTarget:target + eventID:event.eventID + qosTier:@(event.qosTier) + expirationDate:event.expirationDate + mappingID:event.mappingID]; + NSError *error; + NSData *encodedEvent = GDTCOREncodeArchive(event, nil, &error); + if (error) { + completion(NO, error); + return; + } + + // Check storage size limit before storing the event. + uint64_t resultingStorageSize = self.sizeTracker.directoryContentSize + encodedEvent.length; + if (resultingStorageSize > kGDTCORFlatFileStorageSizeLimit) { + NSError *error = [NSError + errorWithDomain:GDTCORFlatFileStorageErrorDomain + code:GDTCORFlatFileStorageErrorSizeLimitReached + userInfo:@{ + NSLocalizedFailureReasonErrorKey : @"Storage size limit has been reached." + }]; + if (self.delegate != nil) { + GDTCORLogDebug(@"Delegate notified that event with mapping ID %@ was dropped.", + event.mappingID); + [self.delegate storage:self didDropEvent:event]; + } + completion(NO, error); + return; + } + + // Write the encoded event to the file. + BOOL writeResult = GDTCORWriteDataToFile(encodedEvent, filePath, &error); + if (writeResult == NO || error) { + GDTCORLogDebug(@"Attempt to write archive failed: path:%@ error:%@", filePath, error); + completion(NO, error); + return; + } else { + GDTCORLogDebug(@"Writing archive succeeded: %@", filePath); + completion(YES, nil); + } + + // Notify size tracker. + [self.sizeTracker fileWasAddedAtPath:filePath withSize:encodedEvent.length]; + + // Check the QoS, if it's high priority, notify the target that it has a high priority event. + if (event.qosTier == GDTCOREventQoSFast) { + // TODO: Remove a direct dependency on the upload coordinator. + [self.uploadCoordinator forceUploadForTarget:target]; + } + + // Cancel or end the associated background task if it's still valid. + [[GDTCORApplication sharedApplication] endBackgroundTask:bgID]; + bgID = GDTCORBackgroundIdentifierInvalid; + }); +} + +- (void)batchWithEventSelector:(nonnull GDTCORStorageEventSelector *)eventSelector + batchExpiration:(nonnull NSDate *)expiration + onComplete: + (nonnull void (^)(NSNumber *_Nullable batchID, + NSSet *_Nullable events))onComplete { + dispatch_queue_t queue = _storageQueue; + void (^onPathsForTargetComplete)(NSNumber *, NSSet *_Nonnull) = ^( + NSNumber *batchID, NSSet *_Nonnull paths) { + dispatch_async(queue, ^{ + NSMutableSet *events = [[NSMutableSet alloc] init]; + for (NSString *eventPath in paths) { + NSError *error; + GDTCOREvent *event = + (GDTCOREvent *)GDTCORDecodeArchiveAtPath([GDTCOREvent class], eventPath, &error); + if (event == nil || error) { + GDTCORLogDebug(@"Error deserializing event: %@", error); + [[NSFileManager defaultManager] removeItemAtPath:eventPath error:nil]; + continue; + } else { + NSString *fileName = [eventPath lastPathComponent]; + NSString *batchPath = + [GDTCORFlatFileStorage batchPathForTarget:eventSelector.selectedTarget + batchID:batchID + expirationDate:expiration]; + [[NSFileManager defaultManager] createDirectoryAtPath:batchPath + withIntermediateDirectories:YES + attributes:nil + error:nil]; + NSString *destinationPath = [batchPath stringByAppendingPathComponent:fileName]; + error = nil; + [[NSFileManager defaultManager] moveItemAtPath:eventPath + toPath:destinationPath + error:&error]; + if (error) { + GDTCORLogDebug(@"An event file wasn't moveable into the batch directory: %@", error); + } + [events addObject:event]; + } + } + if (onComplete) { + if (events.count == 0) { + onComplete(nil, nil); + } else { + onComplete(batchID, events); + } + } + }); + }; + + void (^onBatchIDFetchComplete)(NSNumber *) = ^(NSNumber *batchID) { + dispatch_async(queue, ^{ + if (batchID == nil) { + if (onComplete) { + onComplete(nil, nil); + return; + } + } + [self pathsForTarget:eventSelector.selectedTarget + eventIDs:eventSelector.selectedEventIDs + qosTiers:eventSelector.selectedQosTiers + mappingIDs:eventSelector.selectedMappingIDs + onComplete:^(NSSet *_Nonnull paths) { + onPathsForTargetComplete(batchID, paths); + }]; + }); + }; + + [self nextBatchID:^(NSNumber *_Nullable batchID) { + if (batchID == nil) { + if (onComplete) { + onComplete(nil, nil); + } + } else { + onBatchIDFetchComplete(batchID); + } + }]; +} + +- (void)removeBatchWithID:(nonnull NSNumber *)batchID + deleteEvents:(BOOL)deleteEvents + onComplete:(void (^_Nullable)(void))onComplete { + dispatch_async(_storageQueue, ^{ + [self syncThreadUnsafeRemoveBatchWithID:batchID deleteEvents:deleteEvents]; + + if (onComplete) { + onComplete(); + } + }); +} + +- (void)batchIDsForTarget:(GDTCORTarget)target + onComplete:(nonnull void (^)(NSSet *_Nullable))onComplete { + dispatch_async(_storageQueue, ^{ + NSFileManager *fileManager = [NSFileManager defaultManager]; + NSError *error; + NSArray *batchPaths = + [fileManager contentsOfDirectoryAtPath:[GDTCORFlatFileStorage batchDataStoragePath] + error:&error]; + if (error || batchPaths.count == 0) { + if (onComplete) { + onComplete(nil); + } + return; + } + NSMutableSet *batchIDs = [[NSMutableSet alloc] init]; + for (NSString *path in batchPaths) { + NSDictionary *components = [self batchComponentsFromFilename:path]; + NSNumber *targetNumber = components[kGDTCORBatchComponentsTargetKey]; + NSNumber *batchID = components[kGDTCORBatchComponentsBatchIDKey]; + if (batchID != nil && targetNumber.intValue == target) { + [batchIDs addObject:batchID]; + } + } + if (onComplete) { + onComplete(batchIDs); + } + }); +} + +- (void)libraryDataForKey:(nonnull NSString *)key + onFetchComplete:(nonnull void (^)(NSData *_Nullable, NSError *_Nullable))onFetchComplete + setNewValue:(NSData *_Nullable (^_Nullable)(void))setValueBlock { + dispatch_async(_storageQueue, ^{ + NSString *dataPath = [[[self class] libraryDataStoragePath] stringByAppendingPathComponent:key]; + NSError *error; + NSData *data = [NSData dataWithContentsOfFile:dataPath options:0 error:&error]; + if (onFetchComplete) { + onFetchComplete(data, error); + } + if (setValueBlock) { + NSData *newValue = setValueBlock(); + // The -isKindOfClass check is necessary because without an explicit 'return nil' in the block + // the implicit return value will be the block itself. The compiler doesn't detect this. + if (newValue != nil && [newValue isKindOfClass:[NSData class]] && newValue.length) { + NSError *newValueError; + if ([newValue writeToFile:dataPath options:NSDataWritingAtomic error:&newValueError]) { + // Update storage size. + [self.sizeTracker fileWasRemovedAtPath:dataPath withSize:data.length]; + [self.sizeTracker fileWasAddedAtPath:dataPath withSize:newValue.length]; + } else { + GDTCORLogDebug(@"Error writing new value in libraryDataForKey: %@", newValueError); + } + } + } + }); +} + +- (void)storeLibraryData:(NSData *)data + forKey:(nonnull NSString *)key + onComplete:(nullable void (^)(NSError *_Nullable error))onComplete { + if (!data || data.length <= 0) { + if (onComplete) { + onComplete([NSError errorWithDomain:NSInternalInconsistencyException code:-1 userInfo:nil]); + } + return; + } + dispatch_async(_storageQueue, ^{ + NSError *error; + NSString *dataPath = [[[self class] libraryDataStoragePath] stringByAppendingPathComponent:key]; + if ([data writeToFile:dataPath options:NSDataWritingAtomic error:&error]) { + [self.sizeTracker fileWasAddedAtPath:dataPath withSize:data.length]; + } + if (onComplete) { + onComplete(error); + } + }); +} + +- (void)removeLibraryDataForKey:(nonnull NSString *)key + onComplete:(nonnull void (^)(NSError *_Nullable error))onComplete { + dispatch_async(_storageQueue, ^{ + NSError *error; + NSString *dataPath = [[[self class] libraryDataStoragePath] stringByAppendingPathComponent:key]; + GDTCORStorageSizeBytes fileSize = + [self.sizeTracker fileSizeAtURL:[NSURL fileURLWithPath:dataPath]]; + + if ([[NSFileManager defaultManager] fileExistsAtPath:dataPath]) { + if ([[NSFileManager defaultManager] removeItemAtPath:dataPath error:&error]) { + [self.sizeTracker fileWasRemovedAtPath:dataPath withSize:fileSize]; + } + if (onComplete) { + onComplete(error); + } + } + }); +} + +- (void)hasEventsForTarget:(GDTCORTarget)target onComplete:(void (^)(BOOL hasEvents))onComplete { + dispatch_async(_storageQueue, ^{ + NSFileManager *fileManager = [NSFileManager defaultManager]; + NSString *targetPath = [NSString + stringWithFormat:@"%@/%ld", [GDTCORFlatFileStorage eventDataStoragePath], (long)target]; + [fileManager createDirectoryAtPath:targetPath + withIntermediateDirectories:YES + attributes:nil + error:nil]; + NSDirectoryEnumerator *enumerator = [fileManager enumeratorAtPath:targetPath]; + BOOL hasEventAtLeastOneEvent = [enumerator nextObject] != nil; + if (onComplete) { + onComplete(hasEventAtLeastOneEvent); + } + }); +} + +- (void)checkForExpirations { + dispatch_async(_storageQueue, ^{ + GDTCORLogDebug(@"%@", @"Checking for expired events and batches"); + NSTimeInterval now = [NSDate date].timeIntervalSince1970; + NSFileManager *fileManager = [NSFileManager defaultManager]; + + // TODO: Storage may not have enough context to remove batches because a batch may be being + // uploaded but the storage has not context of it. + + // Find expired batches and move their events back to the main storage. + // If a batch contains expired events they are expected to be removed further in the method + // together with other expired events in the main storage. + NSString *batchDataPath = [GDTCORFlatFileStorage batchDataStoragePath]; + NSArray *batchDataPaths = [fileManager contentsOfDirectoryAtPath:batchDataPath + error:nil]; + for (NSString *path in batchDataPaths) { + @autoreleasepool { + NSString *fileName = [path lastPathComponent]; + NSDictionary *batchComponents = [self batchComponentsFromFilename:fileName]; + NSDate *expirationDate = batchComponents[kGDTCORBatchComponentsExpirationKey]; + NSNumber *batchID = batchComponents[kGDTCORBatchComponentsBatchIDKey]; + if (expirationDate != nil && expirationDate.timeIntervalSince1970 < now && batchID != nil) { + NSNumber *batchID = batchComponents[kGDTCORBatchComponentsBatchIDKey]; + // Move all events from the expired batch back to the main storage. + [self syncThreadUnsafeRemoveBatchWithID:batchID deleteEvents:NO]; + } + } + } + + // Find expired events and remove them from the storage. + NSMutableSet *expiredEvents = [NSMutableSet set]; + NSString *eventDataPath = [GDTCORFlatFileStorage eventDataStoragePath]; + NSDirectoryEnumerator *enumerator = [fileManager enumeratorAtPath:eventDataPath]; + NSString *path; + + while (YES) { + @autoreleasepool { + // Call `[enumerator nextObject]` under autorelease pool to make sure all autoreleased + // objects created under the hood are released on each iteration end to avoid unnecessary + // memory growth. + path = [enumerator nextObject]; + if (path == nil) { + break; + } + + NSString *fileName = [path lastPathComponent]; + NSDictionary *eventComponents = [self eventComponentsFromFilename:fileName]; + NSDate *expirationDate = eventComponents[kGDTCOREventComponentsExpirationKey]; + if (expirationDate != nil && expirationDate.timeIntervalSince1970 < now) { + NSString *pathToDelete = [eventDataPath stringByAppendingPathComponent:path]; + + // Decode the expired event from the path to be deleted. + NSError *decodeError; + GDTCOREvent *event = (GDTCOREvent *)GDTCORDecodeArchiveAtPath([GDTCOREvent class], + pathToDelete, &decodeError); + if (event == nil || decodeError) { + GDTCORLogDebug(@"Error deserializing event while checking for expired events: %@", + decodeError); + event = nil; + } + + // Remove the path to be deleted, adding the decoded event to the + // event set if the removal was successful. + NSError *removeError; + [fileManager removeItemAtPath:pathToDelete error:&removeError]; + if (removeError != nil) { + GDTCORLogDebug(@"There was an error deleting an expired item: %@", removeError); + } else { + GDTCORLogDebug(@"Item deleted because it expired: %@", pathToDelete); + if (event) { + [expiredEvents addObject:event]; + } + } + } + } + } + + if (self.delegate != nil && [expiredEvents count] > 0) { + GDTCORLogDebug(@"Delegate notified that %@ events were dropped.", @(expiredEvents.count)); + [self.delegate storage:self didRemoveExpiredEvents:[expiredEvents copy]]; + } + + [self.sizeTracker resetCachedSize]; + }); +} + +- (void)storageSizeWithCallback:(void (^)(uint64_t storageSize))onComplete { + if (!onComplete) { + return; + } + + dispatch_async(_storageQueue, ^{ + onComplete([self.sizeTracker directoryContentSize]); + }); +} + +#pragma mark - Private not thread safe methods +/** Looks for directory paths containing events for a batch with the specified ID. + * @param batchID A batch ID. + * @param outError A pointer to `NSError *` to assign as possible error to. + * @return An array of an array of paths to directories for event batches with a specified batch ID + * or `nil` in the case of an error. Usually returns a single path but potentially return more in + * cases when the app is terminated while uploading a batch. + */ +- (nullable NSArray *)batchDirPathsForBatchID:(NSNumber *)batchID + error:(NSError **_Nonnull)outError { + NSFileManager *fileManager = [NSFileManager defaultManager]; + NSError *error; + NSArray *batches = + [fileManager contentsOfDirectoryAtPath:[GDTCORFlatFileStorage batchDataStoragePath] + error:&error]; + if (batches == nil) { + *outError = error; + GDTCORLogDebug(@"Failed to find event file paths for batchID: %@, error: %@", batchID, error); + return nil; + } + + NSMutableArray *batchDirPaths = [NSMutableArray array]; + for (NSString *path in batches) { + NSDictionary *components = [self batchComponentsFromFilename:path]; + NSNumber *pathBatchID = components[kGDTCORBatchComponentsBatchIDKey]; + if ([pathBatchID isEqual:batchID]) { + NSString *batchDirPath = + [[GDTCORFlatFileStorage batchDataStoragePath] stringByAppendingPathComponent:path]; + [batchDirPaths addObject:batchDirPath]; + } + } + + return [batchDirPaths copy]; +} + +/** Makes a copy of the contents of a directory to a directory at the specified path.*/ +- (BOOL)moveContentsOfDirectoryAtPath:(NSString *)sourcePath + to:(NSString *)destinationPath + error:(NSError **_Nonnull)outError { + NSFileManager *fileManager = [NSFileManager defaultManager]; + + NSError *error; + NSArray *contentsPaths = [fileManager contentsOfDirectoryAtPath:sourcePath + error:&error]; + if (contentsPaths == nil) { + *outError = error; + return NO; + } + + NSMutableArray *errors = [NSMutableArray array]; + for (NSString *path in contentsPaths) { + NSString *contentDestinationPath = [destinationPath stringByAppendingPathComponent:path]; + NSString *contentSourcePath = [sourcePath stringByAppendingPathComponent:path]; + + NSError *moveError; + if (![fileManager moveItemAtPath:contentSourcePath + toPath:contentDestinationPath + error:&moveError] && + moveError) { + [errors addObject:moveError]; + } + } + + if (errors.count == 0) { + return YES; + } else { + NSError *combinedError = [NSError errorWithDomain:@"GDTCORFlatFileStorage" + code:-1 + userInfo:@{NSUnderlyingErrorKey : errors}]; + *outError = combinedError; + return NO; + } +} + +- (void)syncThreadUnsafeRemoveBatchWithID:(nonnull NSNumber *)batchID + deleteEvents:(BOOL)deleteEvents { + NSError *error; + NSArray *batchDirPaths = [self batchDirPathsForBatchID:batchID error:&error]; + + if (batchDirPaths == nil) { + return; + } + + NSFileManager *fileManager = [NSFileManager defaultManager]; + + void (^removeBatchDir)(NSString *batchDirPath) = ^(NSString *batchDirPath) { + NSError *error; + if ([fileManager removeItemAtPath:batchDirPath error:&error]) { + GDTCORLogDebug(@"Batch removed at path: %@", batchDirPath); + } else { + GDTCORLogDebug(@"Failed to remove batch at path: %@", batchDirPath); + } + }; + + for (NSString *batchDirPath in batchDirPaths) { + @autoreleasepool { + if (deleteEvents) { + removeBatchDir(batchDirPath); + } else { + NSString *batchDirName = [batchDirPath lastPathComponent]; + NSDictionary *components = [self batchComponentsFromFilename:batchDirName]; + NSString *targetValue = [components[kGDTCORBatchComponentsTargetKey] stringValue]; + NSString *destinationPath; + if (targetValue) { + destinationPath = [[GDTCORFlatFileStorage eventDataStoragePath] + stringByAppendingPathComponent:targetValue]; + } + + // `- [NSFileManager moveItemAtPath:toPath:error:]` method fails if an item by the + // destination path already exists (which usually is the case for the current method). Move + // the events one by one instead. + if (destinationPath && [self moveContentsOfDirectoryAtPath:batchDirPath + to:destinationPath + error:&error]) { + GDTCORLogDebug(@"Batched events at path: %@ moved back to the storage: %@", batchDirPath, + destinationPath); + } else { + GDTCORLogDebug(@"Error encountered whilst moving events back: %@", error); + } + + // Even if not all events where moved back to the storage, there is not much can be done at + // this point, so cleanup batch directory now to avoid cluttering. + removeBatchDir(batchDirPath); + } + } + } + + [self.sizeTracker resetCachedSize]; +} + +#pragma mark - Private helper methods + ++ (NSString *)eventDataStoragePath { + static NSString *eventDataPath; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + eventDataPath = [NSString stringWithFormat:@"%@/%@/gdt_event_data", GDTCORRootDirectory().path, + NSStringFromClass([self class])]; + }); + NSError *error; + [[NSFileManager defaultManager] createDirectoryAtPath:eventDataPath + withIntermediateDirectories:YES + attributes:0 + error:&error]; + GDTCORAssert(error == nil, @"Creating the library data path failed: %@", error); + return eventDataPath; +} + ++ (NSString *)batchDataStoragePath { + static NSString *batchDataPath; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + batchDataPath = [NSString stringWithFormat:@"%@/%@/gdt_batch_data", GDTCORRootDirectory().path, + NSStringFromClass([self class])]; + }); + NSError *error; + [[NSFileManager defaultManager] createDirectoryAtPath:batchDataPath + withIntermediateDirectories:YES + attributes:0 + error:&error]; + GDTCORAssert(error == nil, @"Creating the batch data path failed: %@", error); + return batchDataPath; +} + ++ (NSString *)libraryDataStoragePath { + static NSString *libraryDataPath; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + libraryDataPath = + [NSString stringWithFormat:@"%@/%@/gdt_library_data", GDTCORRootDirectory().path, + NSStringFromClass([self class])]; + }); + NSError *error; + [[NSFileManager defaultManager] createDirectoryAtPath:libraryDataPath + withIntermediateDirectories:YES + attributes:0 + error:&error]; + GDTCORAssert(error == nil, @"Creating the library data path failed: %@", error); + return libraryDataPath; +} + ++ (NSString *)batchPathForTarget:(GDTCORTarget)target + batchID:(NSNumber *)batchID + expirationDate:(NSDate *)expirationDate { + return + [NSString stringWithFormat:@"%@/%ld%@%@%@%llu", [GDTCORFlatFileStorage batchDataStoragePath], + (long)target, kMetadataSeparator, batchID, kMetadataSeparator, + ((uint64_t)expirationDate.timeIntervalSince1970)]; +} + ++ (NSString *)pathForTarget:(GDTCORTarget)target + eventID:(NSString *)eventID + qosTier:(NSNumber *)qosTier + expirationDate:(NSDate *)expirationDate + mappingID:(NSString *)mappingID { + NSMutableCharacterSet *allowedChars = [[NSCharacterSet alphanumericCharacterSet] mutableCopy]; + [allowedChars addCharactersInString:kMetadataSeparator]; + mappingID = [mappingID stringByAddingPercentEncodingWithAllowedCharacters:allowedChars]; + return [NSString stringWithFormat:@"%@/%ld/%@%@%@%@%llu%@%@", + [GDTCORFlatFileStorage eventDataStoragePath], (long)target, + eventID, kMetadataSeparator, qosTier, kMetadataSeparator, + ((uint64_t)expirationDate.timeIntervalSince1970), + kMetadataSeparator, mappingID]; +} + +- (void)pathsForTarget:(GDTCORTarget)target + eventIDs:(nullable NSSet *)eventIDs + qosTiers:(nullable NSSet *)qosTiers + mappingIDs:(nullable NSSet *)mappingIDs + onComplete:(void (^)(NSSet *paths))onComplete { + void (^completion)(NSSet *) = onComplete == nil ? ^(NSSet *paths){} : onComplete; + dispatch_async(_storageQueue, ^{ + NSMutableSet *paths = [[NSMutableSet alloc] init]; + NSFileManager *fileManager = [NSFileManager defaultManager]; + NSString *targetPath = [NSString + stringWithFormat:@"%@/%ld", [GDTCORFlatFileStorage eventDataStoragePath], (long)target]; + [fileManager createDirectoryAtPath:targetPath + withIntermediateDirectories:YES + attributes:nil + error:nil]; + NSError *error; + NSArray *dirPaths = [fileManager contentsOfDirectoryAtPath:targetPath error:&error]; + if (error) { + GDTCORLogDebug(@"There was an error reading the contents of the target path: %@", error); + completion(paths); + return; + } + BOOL checkingIDs = eventIDs.count > 0; + BOOL checkingQosTiers = qosTiers.count > 0; + BOOL checkingMappingIDs = mappingIDs.count > 0; + BOOL checkingAnything = checkingIDs == NO && checkingQosTiers == NO && checkingMappingIDs == NO; + for (NSString *path in dirPaths) { + // Skip hidden files that are created as part of atomic file creation. + if ([path hasPrefix:@"."]) { + continue; + } + NSString *filePath = [targetPath stringByAppendingPathComponent:path]; + if (checkingAnything) { + [paths addObject:filePath]; + continue; + } + NSString *filename = [path lastPathComponent]; + NSDictionary *eventComponents = [self eventComponentsFromFilename:filename]; + if (!eventComponents) { + GDTCORLogDebug(@"There was an error reading the filename components: %@", eventComponents); + continue; + } + NSString *eventID = eventComponents[kGDTCOREventComponentsEventIDKey]; + NSNumber *qosTier = eventComponents[kGDTCOREventComponentsQoSTierKey]; + NSString *mappingID = eventComponents[kGDTCOREventComponentsMappingIDKey]; + + NSNumber *eventIDMatch = checkingIDs ? @([eventIDs containsObject:eventID]) : nil; + NSNumber *qosTierMatch = checkingQosTiers ? @([qosTiers containsObject:qosTier]) : nil; + NSNumber *mappingIDMatch = + checkingMappingIDs + ? @([mappingIDs containsObject:[mappingID stringByRemovingPercentEncoding]]) + : nil; + if ((eventIDMatch == nil || eventIDMatch.boolValue) && + (qosTierMatch == nil || qosTierMatch.boolValue) && + (mappingIDMatch == nil || mappingIDMatch.boolValue)) { + [paths addObject:filePath]; + } + } + completion(paths); + }); +} + +- (void)nextBatchID:(void (^)(NSNumber *_Nullable batchID))nextBatchID { + __block int32_t lastBatchID = -1; + [self libraryDataForKey:gBatchIDCounterKey + onFetchComplete:^(NSData *_Nullable data, NSError *_Nullable getValueError) { + if (!getValueError) { + [data getBytes:(void *)&lastBatchID length:sizeof(int32_t)]; + } + if (data == nil) { + lastBatchID = 0; + } + if (nextBatchID) { + nextBatchID(@(lastBatchID)); + } + } + setNewValue:^NSData *_Nullable(void) { + if (lastBatchID != -1) { + int32_t incrementedValue = lastBatchID + 1; + return [NSData dataWithBytes:&incrementedValue length:sizeof(int32_t)]; + } + return nil; + }]; +} + +- (nullable NSDictionary *)eventComponentsFromFilename:(NSString *)fileName { + NSArray *components = [fileName componentsSeparatedByString:kMetadataSeparator]; + if (components.count >= 4) { + NSString *eventID = components[0]; + NSNumber *qosTier = @(components[1].integerValue); + NSDate *expirationDate = [NSDate dateWithTimeIntervalSince1970:components[2].longLongValue]; + NSString *mappingID = [[components subarrayWithRange:NSMakeRange(3, components.count - 3)] + componentsJoinedByString:kMetadataSeparator]; + if (eventID == nil || qosTier == nil || mappingID == nil || expirationDate == nil) { + GDTCORLogDebug(@"There was an error parsing the event filename components: %@", components); + return nil; + } + return @{ + kGDTCOREventComponentsEventIDKey : eventID, + kGDTCOREventComponentsQoSTierKey : qosTier, + kGDTCOREventComponentsExpirationKey : expirationDate, + kGDTCOREventComponentsMappingIDKey : mappingID + }; + } + GDTCORLogDebug(@"The event filename could not be split: %@", fileName); + return nil; +} + +- (nullable NSDictionary *)batchComponentsFromFilename:(NSString *)fileName { + NSArray *components = [fileName componentsSeparatedByString:kMetadataSeparator]; + if (components.count == 3) { + NSNumber *target = @(components[0].integerValue); + NSNumber *batchID = @(components[1].integerValue); + NSDate *expirationDate = [NSDate dateWithTimeIntervalSince1970:components[2].doubleValue]; + if (target == nil || batchID == nil || expirationDate == nil) { + GDTCORLogDebug(@"There was an error parsing the batch filename components: %@", components); + return nil; + } + return @{ + kGDTCORBatchComponentsTargetKey : target, + kGDTCORBatchComponentsBatchIDKey : batchID, + kGDTCORBatchComponentsExpirationKey : expirationDate + }; + } + GDTCORLogDebug(@"The batch filename could not be split: %@", fileName); + return nil; +} + +#pragma mark - GDTCORLifecycleProtocol + +- (void)appWillBackground:(GDTCORApplication *)app { + dispatch_async(_storageQueue, ^{ + // Immediately request a background task to run until the end of the current queue of work, + // and cancel it once the work is done. + __block GDTCORBackgroundIdentifier bgID = + [app beginBackgroundTaskWithName:@"GDTStorage" + expirationHandler:^{ + [app endBackgroundTask:bgID]; + bgID = GDTCORBackgroundIdentifierInvalid; + }]; + // End the background task if it's still valid. + [app endBackgroundTask:bgID]; + bgID = GDTCORBackgroundIdentifierInvalid; + }); +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORLifecycle.m b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORLifecycle.m new file mode 100644 index 0000000..7e53456 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORLifecycle.m @@ -0,0 +1,118 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORLifecycle.h" + +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORConsoleLogger.h" +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCOREvent.h" + +#import "GoogleDataTransport/GDTCORLibrary/Private/GDTCORRegistrar_Private.h" +#import "GoogleDataTransport/GDTCORLibrary/Private/GDTCORTransformer_Private.h" +#import "GoogleDataTransport/GDTCORLibrary/Private/GDTCORUploadCoordinator.h" + +@implementation GDTCORLifecycle + ++ (void)load { + [self sharedInstance]; +} + +/** Creates/returns the singleton instance of this class. + * + * @return The singleton instance of this class. + */ ++ (instancetype)sharedInstance { + static GDTCORLifecycle *sharedInstance; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + sharedInstance = [[GDTCORLifecycle alloc] init]; + }); + return sharedInstance; +} + +- (instancetype)init { + self = [super init]; + if (self) { + NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; + [notificationCenter addObserver:self + selector:@selector(applicationDidEnterBackgroundNotification:) + name:kGDTCORApplicationDidEnterBackgroundNotification + object:nil]; + [notificationCenter addObserver:self + selector:@selector(applicationWillEnterForegroundNotification:) + name:kGDTCORApplicationWillEnterForegroundNotification + object:nil]; + + [notificationCenter addObserver:self + selector:@selector(applicationWillTerminateNotification:) + name:kGDTCORApplicationWillTerminateNotification + object:nil]; + } + return self; +} + +- (void)dealloc { + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +- (void)applicationDidEnterBackgroundNotification:(NSNotification *)notification { + GDTCORApplication *application = [GDTCORApplication sharedApplication]; + if ([[GDTCORTransformer sharedInstance] respondsToSelector:@selector(appWillBackground:)]) { + GDTCORLogDebug(@"%@", @"Signaling GDTCORTransformer that the app is backgrounding."); + [[GDTCORTransformer sharedInstance] appWillBackground:application]; + } + if ([[GDTCORUploadCoordinator sharedInstance] respondsToSelector:@selector(appWillBackground:)]) { + GDTCORLogDebug(@"%@", @"Signaling GDTCORUploadCoordinator that the app is backgrounding."); + [[GDTCORUploadCoordinator sharedInstance] appWillBackground:application]; + } + if ([[GDTCORRegistrar sharedInstance] respondsToSelector:@selector(appWillBackground:)]) { + GDTCORLogDebug(@"%@", @"Signaling GDTCORRegistrar that the app is backgrounding."); + [[GDTCORRegistrar sharedInstance] appWillBackground:application]; + } +} + +- (void)applicationWillEnterForegroundNotification:(NSNotification *)notification { + GDTCORApplication *application = [GDTCORApplication sharedApplication]; + if ([[GDTCORTransformer sharedInstance] respondsToSelector:@selector(appWillForeground:)]) { + GDTCORLogDebug(@"%@", @"Signaling GDTCORTransformer that the app is foregrounding."); + [[GDTCORTransformer sharedInstance] appWillForeground:application]; + } + if ([[GDTCORUploadCoordinator sharedInstance] respondsToSelector:@selector(appWillForeground:)]) { + GDTCORLogDebug(@"%@", @"Signaling GDTCORUploadCoordinator that the app is foregrounding."); + [[GDTCORUploadCoordinator sharedInstance] appWillForeground:application]; + } + if ([[GDTCORRegistrar sharedInstance] respondsToSelector:@selector(appWillForeground:)]) { + GDTCORLogDebug(@"%@", @"Signaling GDTCORRegistrar that the app is foregrounding."); + [[GDTCORRegistrar sharedInstance] appWillForeground:application]; + } +} + +- (void)applicationWillTerminateNotification:(NSNotification *)notification { + GDTCORApplication *application = [GDTCORApplication sharedApplication]; + if ([[GDTCORTransformer sharedInstance] respondsToSelector:@selector(appWillTerminate:)]) { + GDTCORLogDebug(@"%@", @"Signaling GDTCORTransformer that the app is terminating."); + [[GDTCORTransformer sharedInstance] appWillTerminate:application]; + } + if ([[GDTCORUploadCoordinator sharedInstance] respondsToSelector:@selector(appWillTerminate:)]) { + GDTCORLogDebug(@"%@", @"Signaling GDTCORUploadCoordinator that the app is terminating."); + [[GDTCORUploadCoordinator sharedInstance] appWillTerminate:application]; + } + if ([[GDTCORRegistrar sharedInstance] respondsToSelector:@selector(appWillTerminate:)]) { + GDTCORLogDebug(@"%@", @"Signaling GDTCORRegistrar that the app is terminating."); + [[GDTCORRegistrar sharedInstance] appWillTerminate:application]; + } +} + +@end diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORLogSourceMetrics.m b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORLogSourceMetrics.m new file mode 100644 index 0000000..9da40db --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORLogSourceMetrics.m @@ -0,0 +1,184 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +#import "GoogleDataTransport/GDTCORLibrary/Private/GDTCORLogSourceMetrics.h" + +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCOREvent.h" + +static NSString *const kDroppedEventCounterByLogSource = @"droppedEventCounterByLogSource"; + +typedef NSDictionary GDTCORDroppedEventCounter; + +@interface GDTCORLogSourceMetrics () + +/// A dictionary of log sources that map to counters that reflect the number of events dropped for a +/// given set of reasons (``GDTCOREventDropReason``). +@property(nonatomic, readonly) + NSDictionary *droppedEventCounterByLogSource; + +@end + +@implementation GDTCORLogSourceMetrics + ++ (instancetype)metrics { + return [[self alloc] initWithDroppedEventCounterByLogSource:@{}]; +} + ++ (instancetype)metricsWithEvents:(NSArray *)events + droppedForReason:(GDTCOREventDropReason)reason { + NSMutableDictionary *eventCounterByLogSource = + [NSMutableDictionary dictionary]; + + for (GDTCOREvent *event in [events copy]) { + // Dropped events with a `nil` or empty mapping ID (log source) are not recorded. + if (event.mappingID.length == 0) { + continue; + } + + // Get the dropped event counter for the event's mapping ID (log source). + // If the dropped event counter for this event's mapping ID is `nil`, + // an empty mutable counter is returned. + NSMutableDictionary *eventCounter = [NSMutableDictionary + dictionaryWithDictionary:eventCounterByLogSource[event.mappingID] ?: @{}]; + + // Increment the log source metrics for the given reason. + NSInteger currentEventCountForReason = [eventCounter[@(reason)] integerValue]; + NSInteger updatedEventCountForReason = currentEventCountForReason + 1; + + eventCounter[@(reason)] = @(updatedEventCountForReason); + + // Update the mapping ID's (log source's) event counter with an immutable + // copy of the updated counter. + eventCounterByLogSource[event.mappingID] = [eventCounter copy]; + } + + return [[self alloc] initWithDroppedEventCounterByLogSource:[eventCounterByLogSource copy]]; +} + +- (instancetype)initWithDroppedEventCounterByLogSource: + (NSDictionary *)droppedEventCounterByLogSource { + self = [super init]; + if (self) { + _droppedEventCounterByLogSource = [droppedEventCounterByLogSource copy]; + } + return self; +} + +- (GDTCORLogSourceMetrics *)logSourceMetricsByMergingWithLogSourceMetrics: + (GDTCORLogSourceMetrics *)metrics { + // Create new log source metrics by merging the current metrics with the given metrics. + NSDictionary *mergedEventCounterByLogSource = [[self + class] dictionaryByMergingDictionary:self.droppedEventCounterByLogSource + withOtherDictionary:metrics.droppedEventCounterByLogSource + uniquingKeysWithBlock:^NSDictionary *(NSDictionary *eventCounter1, + NSDictionary *eventCounter2) { + return [[self class] + dictionaryByMergingDictionary:eventCounter1 + withOtherDictionary:eventCounter2 + uniquingKeysWithBlock:^NSNumber *(NSNumber *eventCount1, + NSNumber *eventCount2) { + return @(eventCount1.integerValue + eventCount2.integerValue); + }]; + }]; + + return + [[[self class] alloc] initWithDroppedEventCounterByLogSource:mergedEventCounterByLogSource]; +} + +/// Creates a new dictionary by merging together two given dictionaries. +/// @param dictionary A dictionary for merging. +/// @param otherDictionary Another dictionary for merging. +/// @param block A block that is called with the values for any duplicate keys that are encountered. +/// The block returns the desired value for the merged dictionary. ++ (NSDictionary *)dictionaryByMergingDictionary:(NSDictionary *)dictionary + withOtherDictionary:(NSDictionary *)otherDictionary + uniquingKeysWithBlock:(id (^)(id value1, id value2))block { + NSMutableDictionary *mergedDictionary = [NSMutableDictionary dictionaryWithDictionary:dictionary]; + + [otherDictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { + if (mergedDictionary[key] != nil) { + // The key exists in both given dictionaries so combine the corresponding values with the + // given block. + id newValue = block(mergedDictionary[key], obj); + mergedDictionary[key] = newValue; + } else { + mergedDictionary[key] = obj; + } + }]; + + return [mergedDictionary copy]; +} + +#pragma mark - Equality + +- (BOOL)isEqualToLogSourceMetrics:(GDTCORLogSourceMetrics *)otherMetrics { + return [_droppedEventCounterByLogSource + isEqualToDictionary:otherMetrics.droppedEventCounterByLogSource]; +} + +- (BOOL)isEqual:(nullable id)object { + if (object == nil) { + return NO; + } + + if (self == object) { + return YES; + } + + if (![object isKindOfClass:[self class]]) { + return NO; + } + + return [self isEqualToLogSourceMetrics:(GDTCORLogSourceMetrics *)object]; +} + +- (NSUInteger)hash { + return [_droppedEventCounterByLogSource hash]; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { + NSDictionary *droppedEventCounterByLogSource = + [coder decodeObjectOfClasses: + [NSSet setWithArray:@[ NSDictionary.class, NSString.class, NSNumber.class ]] + forKey:kDroppedEventCounterByLogSource]; + + if (!droppedEventCounterByLogSource || + ![droppedEventCounterByLogSource isKindOfClass:[NSDictionary class]]) { + // If any of the fields are corrupted, the initializer should fail. + return nil; + } + + return [self initWithDroppedEventCounterByLogSource:droppedEventCounterByLogSource]; +} + +- (void)encodeWithCoder:(nonnull NSCoder *)coder { + [coder encodeObject:self.droppedEventCounterByLogSource forKey:kDroppedEventCounterByLogSource]; +} + +#pragma mark - Description + +- (NSString *)description { + return [NSString + stringWithFormat:@"%@ %@", [super description], self.droppedEventCounterByLogSource]; +} + +@end diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORMetrics.m b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORMetrics.m new file mode 100644 index 0000000..ffbf0e1 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORMetrics.m @@ -0,0 +1,100 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "GoogleDataTransport/GDTCORLibrary/Private/GDTCORMetrics.h" + +#import "GoogleDataTransport/GDTCORLibrary/Private/GDTCORLogSourceMetrics.h" +#import "GoogleDataTransport/GDTCORLibrary/Private/GDTCORMetricsMetadata.h" +#import "GoogleDataTransport/GDTCORLibrary/Private/GDTCORStorageMetadata.h" + +@implementation GDTCORMetrics + +- (instancetype)initWithCollectionStartDate:(NSDate *)collectionStartDate + collectionEndDate:(NSDate *)collectionEndDate + logSourceMetrics:(GDTCORLogSourceMetrics *)logSourceMetrics + currentCacheSize:(GDTCORStorageSizeBytes)currentCacheSize + maxCacheSize:(GDTCORStorageSizeBytes)maxCacheSize + bundleID:(NSString *)bundleID { + self = [super init]; + if (self) { + _collectionStartDate = [collectionStartDate copy]; + _collectionEndDate = [collectionEndDate copy]; + _logSourceMetrics = logSourceMetrics; + _currentCacheSize = currentCacheSize; + _maxCacheSize = maxCacheSize; + _bundleID = [bundleID copy]; + } + return self; +} + ++ (instancetype)metricsWithMetricsMetadata:(GDTCORMetricsMetadata *)metricsMetadata + storageMetadata:(GDTCORStorageMetadata *)storageMetadata { + // The window of collection ends at the time of creating the metrics object. + NSDate *collectionEndDate = [NSDate date]; + // The main bundle ID is associated with the created metrics. + NSString *bundleID = [[NSBundle mainBundle] bundleIdentifier] ?: @""; + + return [[GDTCORMetrics alloc] initWithCollectionStartDate:metricsMetadata.collectionStartDate + collectionEndDate:collectionEndDate + logSourceMetrics:metricsMetadata.logSourceMetrics + currentCacheSize:storageMetadata.currentCacheSize + maxCacheSize:storageMetadata.maxCacheSize + bundleID:bundleID]; +} + +#pragma mark - Equality + +- (BOOL)isEqualToMetrics:(GDTCORMetrics *)otherMetrics { + return [self.collectionStartDate isEqualToDate:otherMetrics.collectionStartDate] && + [self.collectionEndDate isEqualToDate:otherMetrics.collectionEndDate] && + [self.logSourceMetrics isEqualToLogSourceMetrics:otherMetrics.logSourceMetrics] && + [self.bundleID isEqualToString:otherMetrics.bundleID] && + self.currentCacheSize == otherMetrics.currentCacheSize && + self.maxCacheSize == otherMetrics.maxCacheSize; +} + +- (BOOL)isEqual:(nullable id)object { + if (object == nil) { + return NO; + } + + if (self == object) { + return YES; + } + + if (![object isKindOfClass:[self class]]) { + return NO; + } + + return [self isEqualToMetrics:(GDTCORMetrics *)object]; +} + +- (NSUInteger)hash { + return [self.collectionStartDate hash] ^ [self.collectionEndDate hash] ^ + [self.logSourceMetrics hash] ^ [self.bundleID hash] ^ [@(self.currentCacheSize) hash] ^ + [@(self.maxCacheSize) hash]; +} + +#pragma mark - Description + +- (NSString *)description { + return [NSString + stringWithFormat: + @"%@ {\n\tcollectionStartDate: %@,\n\tcollectionEndDate: %@,\n\tcurrentCacheSize: " + @"%llu,\n\tmaxCacheSize: %llu,\n\tbundleID: %@,\n\tlogSourceMetrics: %@}\n", + [super description], self.collectionStartDate, self.collectionEndDate, + self.currentCacheSize, self.maxCacheSize, self.bundleID, self.logSourceMetrics]; +} + +@end diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORMetricsController.m b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORMetricsController.m new file mode 100644 index 0000000..2978da7 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORMetricsController.m @@ -0,0 +1,201 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +#import "GoogleDataTransport/GDTCORLibrary/Private/GDTCORMetricsController.h" + +#if __has_include() +#import +#else +#import "FBLPromises.h" +#endif + +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORConsoleLogger.h" +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCOREvent.h" + +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORRegistrar.h" +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORStorageProtocol.h" + +#import "GoogleDataTransport/GDTCORLibrary/Private/GDTCORFlatFileStorage+Promises.h" +#import "GoogleDataTransport/GDTCORLibrary/Private/GDTCORLogSourceMetrics.h" +#import "GoogleDataTransport/GDTCORLibrary/Private/GDTCORMetrics.h" +#import "GoogleDataTransport/GDTCORLibrary/Private/GDTCORMetricsMetadata.h" +#import "GoogleDataTransport/GDTCORLibrary/Private/GDTCORStorageMetadata.h" + +@interface GDTCORMetricsController () +/// The underlying storage object where metrics are stored. +@property(nonatomic) id storage; + +@end + +@implementation GDTCORMetricsController + ++ (void)load { +#if GDT_TEST + [[GDTCORRegistrar sharedInstance] registerMetricsController:[self sharedInstance] + target:kGDTCORTargetTest]; +#endif // GDT_TEST + // Only the Firelog backend supports metrics collection. + [[GDTCORRegistrar sharedInstance] registerMetricsController:[self sharedInstance] + target:kGDTCORTargetCSH]; + [[GDTCORRegistrar sharedInstance] registerMetricsController:[self sharedInstance] + target:kGDTCORTargetFLL]; +} + ++ (instancetype)sharedInstance { + static id sharedInstance; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + sharedInstance = [[self alloc] initWithStorage:[GDTCORFlatFileStorage sharedInstance]]; + }); + return sharedInstance; +} + +- (instancetype)initWithStorage:(id)storage { + self = [super init]; + if (self) { + _storage = storage; + } + return self; +} + +- (nonnull FBLPromise *)logEventsDroppedForReason:(GDTCOREventDropReason)reason + events:(nonnull NSSet *)events { + // No-op if there are no events to log. + if ([events count] == 0) { + return [FBLPromise resolvedWith:nil]; + } + + __auto_type handler = ^GDTCORMetricsMetadata *(GDTCORMetricsMetadata *_Nullable metricsMetadata, + NSError *_Nullable fetchError) { + GDTCORLogSourceMetrics *logSourceMetrics = + [GDTCORLogSourceMetrics metricsWithEvents:[events allObjects] droppedForReason:reason]; + + if (metricsMetadata) { + GDTCORLogSourceMetrics *updatedLogSourceMetrics = [metricsMetadata.logSourceMetrics + logSourceMetricsByMergingWithLogSourceMetrics:logSourceMetrics]; + + return [GDTCORMetricsMetadata + metadataWithCollectionStartDate:[metricsMetadata collectionStartDate] + logSourceMetrics:updatedLogSourceMetrics]; + } else { + // There was an error (e.g. empty storage); `metricsMetadata` is nil. + GDTCORLogDebug(@"Error fetching metrics metadata: %@", fetchError); + return [GDTCORMetricsMetadata metadataWithCollectionStartDate:[NSDate date] + logSourceMetrics:logSourceMetrics]; + } + }; + + return [_storage fetchAndUpdateMetricsWithHandler:handler]; +} + +- (nonnull FBLPromise *)getAndResetMetrics { + __block GDTCORMetricsMetadata *_Nullable snapshottedMetricsMetadata = nil; + + __auto_type handler = ^GDTCORMetricsMetadata *(GDTCORMetricsMetadata *_Nullable metricsMetadata, + NSError *_Nullable fetchError) { + if (metricsMetadata) { + snapshottedMetricsMetadata = metricsMetadata; + } else { + GDTCORLogDebug(@"Error fetching metrics metadata: %@", fetchError); + } + return [GDTCORMetricsMetadata metadataWithCollectionStartDate:[NSDate date] + logSourceMetrics:[GDTCORLogSourceMetrics metrics]]; + }; + + return [_storage fetchAndUpdateMetricsWithHandler:handler] + .validate(^BOOL(NSNull *__unused _) { + // Break and reject the promise chain when storage contains no metrics + // metadata. + return snapshottedMetricsMetadata != nil; + }) + .then(^FBLPromise *(NSNull *__unused _) { + // Fetch and return storage metadata (needed for metrics). + return [self.storage fetchStorageMetadata]; + }) + .then(^GDTCORMetrics *(GDTCORStorageMetadata *storageMetadata) { + // Use the fetched metrics & storage metadata to create and return a + // complete metrics object. + return [GDTCORMetrics metricsWithMetricsMetadata:snapshottedMetricsMetadata + storageMetadata:storageMetadata]; + }); +} + +- (nonnull FBLPromise *)offerMetrics:(nonnull GDTCORMetrics *)metrics { + // No-op if there are no metrics to offer. + if (metrics == nil) { + return [FBLPromise resolvedWith:nil]; + } + + __auto_type handler = ^GDTCORMetricsMetadata *(GDTCORMetricsMetadata *_Nullable metricsMetadata, + NSError *_Nullable fetchError) { + if (metricsMetadata) { + if (metrics.collectionStartDate.timeIntervalSince1970 <= + metricsMetadata.collectionStartDate.timeIntervalSince1970) { + // If the metrics to append are older than the metrics represented by + // the currently stored metrics, then return a new metadata object that + // incorporates the data from the given metrics. + return [GDTCORMetricsMetadata + metadataWithCollectionStartDate:[metrics collectionStartDate] + logSourceMetrics:[metricsMetadata.logSourceMetrics + logSourceMetricsByMergingWithLogSourceMetrics: + metrics.logSourceMetrics]]; + } else { + // This catches an edge case where the given metrics to append are + // newer than metrics represented by the currently stored metrics + // metadata. In this case, return the existing metadata object as the + // given metrics are assumed to already be accounted for by the + // currently stored metadata. + return metricsMetadata; + } + } else { + // There was an error (e.g. empty storage); `metricsMetadata` is nil. + GDTCORLogDebug(@"Error fetching metrics metadata: %@", fetchError); + + NSDate *now = [NSDate date]; + if (metrics.collectionStartDate.timeIntervalSince1970 <= now.timeIntervalSince1970) { + // The given metrics are were recorded up until now. They wouldn't + // be offered if they were successfully uploaded so their + // corresponding metadata can be safely placed back in storage. + return [GDTCORMetricsMetadata metadataWithCollectionStartDate:metrics.collectionStartDate + logSourceMetrics:metrics.logSourceMetrics]; + } else { + // This catches an edge case where the given metrics are from the + // future. If this occurs, ignore them and store an empty metadata + // object intended to track metrics metadata from this time forward. + return [GDTCORMetricsMetadata + metadataWithCollectionStartDate:[NSDate date] + logSourceMetrics:[GDTCORLogSourceMetrics metrics]]; + } + } + }; + + return [_storage fetchAndUpdateMetricsWithHandler:handler]; +} + +#pragma mark - GDTCORStorageDelegate + +- (void)storage:(id)storage + didRemoveExpiredEvents:(nonnull NSSet *)events { + [self logEventsDroppedForReason:GDTCOREventDropReasonMessageTooOld events:events]; +} + +- (void)storage:(nonnull id)storage + didDropEvent:(nonnull GDTCOREvent *)event { + [self logEventsDroppedForReason:GDTCOREventDropReasonStorageFull + events:[NSSet setWithObject:event]]; +} + +@end diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORMetricsMetadata.m b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORMetricsMetadata.m new file mode 100644 index 0000000..624c8c5 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORMetricsMetadata.m @@ -0,0 +1,96 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +#import "GoogleDataTransport/GDTCORLibrary/Private/GDTCORMetricsMetadata.h" + +#import "GoogleDataTransport/GDTCORLibrary/Private/GDTCORLogSourceMetrics.h" + +static NSString *const kCollectionStartDate = @"collectionStartDate"; +static NSString *const kLogSourceMetrics = @"logSourceMetrics"; + +@implementation GDTCORMetricsMetadata + ++ (instancetype)metadataWithCollectionStartDate:(NSDate *)collectedSinceDate + logSourceMetrics:(GDTCORLogSourceMetrics *)logSourceMetrics { + return [[self alloc] initWithCollectionStartDate:collectedSinceDate + logSourceMetrics:logSourceMetrics]; +} + +- (instancetype)initWithCollectionStartDate:(NSDate *)collectionStartDate + logSourceMetrics:(GDTCORLogSourceMetrics *)logSourceMetrics { + self = [super init]; + if (self) { + _collectionStartDate = [collectionStartDate copy]; + _logSourceMetrics = logSourceMetrics; + } + return self; +} + +#pragma mark - Equality + +- (BOOL)isEqualToMetricsMetadata:(GDTCORMetricsMetadata *)otherMetricsMetadata { + return [self.collectionStartDate isEqualToDate:otherMetricsMetadata.collectionStartDate] && + [self.logSourceMetrics isEqualToLogSourceMetrics:otherMetricsMetadata.logSourceMetrics]; +} + +- (BOOL)isEqual:(nullable id)object { + if (object == nil) { + return NO; + } + + if (self == object) { + return YES; + } + + if (![object isKindOfClass:[self class]]) { + return NO; + } + + return [self isEqualToMetricsMetadata:(GDTCORMetricsMetadata *)object]; +} + +- (NSUInteger)hash { + return [self.collectionStartDate hash] ^ [self.logSourceMetrics hash]; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { + NSDate *collectionStartDate = [coder decodeObjectOfClass:[NSDate class] + forKey:kCollectionStartDate]; + GDTCORLogSourceMetrics *logSourceMetrics = + [coder decodeObjectOfClass:[GDTCORLogSourceMetrics class] forKey:kLogSourceMetrics]; + + if (!collectionStartDate || !logSourceMetrics || + ![collectionStartDate isKindOfClass:[NSDate class]] || + ![logSourceMetrics isKindOfClass:[GDTCORLogSourceMetrics class]]) { + // If any of the fields are corrupted, the initializer should fail. + return nil; + } + + return [self initWithCollectionStartDate:collectionStartDate logSourceMetrics:logSourceMetrics]; +} + +- (void)encodeWithCoder:(nonnull NSCoder *)coder { + [coder encodeObject:self.collectionStartDate forKey:kCollectionStartDate]; + [coder encodeObject:self.logSourceMetrics forKey:kLogSourceMetrics]; +} + +@end diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORPlatform.m b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORPlatform.m new file mode 100644 index 0000000..0729bde --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORPlatform.m @@ -0,0 +1,566 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORPlatform.h" + +#import + +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORAssert.h" +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORReachability.h" +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORConsoleLogger.h" + +#import "GoogleDataTransport/GDTCORLibrary/Private/GDTCORRegistrar_Private.h" + +#ifdef GDTCOR_VERSION +#define STR(x) STR_EXPAND(x) +#define STR_EXPAND(x) #x +NSString *const kGDTCORVersion = @STR(GDTCOR_VERSION); +#else +NSString *const kGDTCORVersion = @"Unknown"; +#endif // GDTCOR_VERSION + +const GDTCORBackgroundIdentifier GDTCORBackgroundIdentifierInvalid = 0; + +NSString *const kGDTCORApplicationDidEnterBackgroundNotification = + @"GDTCORApplicationDidEnterBackgroundNotification"; + +NSString *const kGDTCORApplicationWillEnterForegroundNotification = + @"GDTCORApplicationWillEnterForegroundNotification"; + +NSString *const kGDTCORApplicationWillTerminateNotification = + @"GDTCORApplicationWillTerminateNotification"; + +NSURL *GDTCORRootDirectory(void) { + static NSURL *GDTPath; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSString *cachePath = + NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0]; + GDTPath = + [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/google-sdks-events", cachePath]]; + GDTCORLogDebug(@"GDT's state will be saved to: %@", GDTPath); + }); + NSError *error; + [[NSFileManager defaultManager] createDirectoryAtPath:GDTPath.path + withIntermediateDirectories:YES + attributes:nil + error:&error]; + GDTCORAssert(error == nil, @"There was an error creating GDT's path"); + return GDTPath; +} + +BOOL GDTCORReachabilityFlagsReachable(GDTCORNetworkReachabilityFlags flags) { +#if !TARGET_OS_WATCH + BOOL reachable = + (flags & kSCNetworkReachabilityFlagsReachable) == kSCNetworkReachabilityFlagsReachable; + BOOL connectionRequired = (flags & kSCNetworkReachabilityFlagsConnectionRequired) == + kSCNetworkReachabilityFlagsConnectionRequired; + return reachable && !connectionRequired; +#else + return (flags & kGDTCORNetworkReachabilityFlagsReachable) == + kGDTCORNetworkReachabilityFlagsReachable; +#endif +} + +BOOL GDTCORReachabilityFlagsContainWWAN(GDTCORNetworkReachabilityFlags flags) { +#if TARGET_OS_IOS + return (flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN; +#else + // Assume network connection not WWAN on macOS, tvOS, watchOS. + return NO; +#endif // TARGET_OS_IOS +} + +GDTCORNetworkType GDTCORNetworkTypeMessage(void) { +#if !TARGET_OS_WATCH + SCNetworkReachabilityFlags reachabilityFlags = [GDTCORReachability currentFlags]; + if ((reachabilityFlags & kSCNetworkReachabilityFlagsReachable) == + kSCNetworkReachabilityFlagsReachable) { + if (GDTCORReachabilityFlagsContainWWAN(reachabilityFlags)) { + return GDTCORNetworkTypeMobile; + } else { + return GDTCORNetworkTypeWIFI; + } + } +#endif + return GDTCORNetworkTypeUNKNOWN; +} + +GDTCORNetworkMobileSubtype GDTCORNetworkMobileSubTypeMessage(void) { +// TODO(Xcode 15): When Xcode 15 is the minimum supported Xcode version, +// it will be unnecessary to check if `TARGET_OS_VISION` is defined. +#if TARGET_OS_IOS && (!defined(TARGET_OS_VISION) || !TARGET_OS_VISION) + static NSDictionary *CTRadioAccessTechnologyToNetworkSubTypeMessage; + static CTTelephonyNetworkInfo *networkInfo; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + CTRadioAccessTechnologyToNetworkSubTypeMessage = @{ + CTRadioAccessTechnologyGPRS : @(GDTCORNetworkMobileSubtypeGPRS), + CTRadioAccessTechnologyEdge : @(GDTCORNetworkMobileSubtypeEdge), + CTRadioAccessTechnologyWCDMA : @(GDTCORNetworkMobileSubtypeWCDMA), + CTRadioAccessTechnologyHSDPA : @(GDTCORNetworkMobileSubtypeHSDPA), + CTRadioAccessTechnologyHSUPA : @(GDTCORNetworkMobileSubtypeHSUPA), + CTRadioAccessTechnologyCDMA1x : @(GDTCORNetworkMobileSubtypeCDMA1x), + CTRadioAccessTechnologyCDMAEVDORev0 : @(GDTCORNetworkMobileSubtypeCDMAEVDORev0), + CTRadioAccessTechnologyCDMAEVDORevA : @(GDTCORNetworkMobileSubtypeCDMAEVDORevA), + CTRadioAccessTechnologyCDMAEVDORevB : @(GDTCORNetworkMobileSubtypeCDMAEVDORevB), + CTRadioAccessTechnologyeHRPD : @(GDTCORNetworkMobileSubtypeHRPD), + CTRadioAccessTechnologyLTE : @(GDTCORNetworkMobileSubtypeLTE), + }; + networkInfo = [[CTTelephonyNetworkInfo alloc] init]; + }); + NSString *networkCurrentRadioAccessTechnology; +#if TARGET_OS_MACCATALYST + NSDictionary *networkCurrentRadioAccessTechnologyDict = + networkInfo.serviceCurrentRadioAccessTechnology; + if (networkCurrentRadioAccessTechnologyDict.count) { + networkCurrentRadioAccessTechnology = networkCurrentRadioAccessTechnologyDict.allValues[0]; + } +#else // TARGET_OS_MACCATALYST + NSDictionary *networkCurrentRadioAccessTechnologyDict = + networkInfo.serviceCurrentRadioAccessTechnology; + if (networkCurrentRadioAccessTechnologyDict.count) { + // In iOS 12, multiple radio technologies can be captured. We prefer not particular radio + // tech to another, so we'll just return the first value in the dictionary. + networkCurrentRadioAccessTechnology = networkCurrentRadioAccessTechnologyDict.allValues[0]; + } +#endif // TARGET_OS_MACCATALYST + if (networkCurrentRadioAccessTechnology) { + NSNumber *networkMobileSubtype = + CTRadioAccessTechnologyToNetworkSubTypeMessage[networkCurrentRadioAccessTechnology]; + return networkMobileSubtype.intValue; + } else { + return GDTCORNetworkMobileSubtypeUNKNOWN; + } +#else // TARGET_OS_IOS && (!defined(TARGET_OS_VISION) || !TARGET_OS_VISION) + return GDTCORNetworkMobileSubtypeUNKNOWN; +#endif // TARGET_OS_IOS && (!defined(TARGET_OS_VISION) || !TARGET_OS_VISION) +} + +NSString *_Nonnull GDTCORDeviceModel(void) { + static NSString *deviceModel = @"Unknown"; + +#if TARGET_OS_IOS || TARGET_OS_TV + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + size_t size; + char *keyToExtract = "hw.machine"; + sysctlbyname(keyToExtract, NULL, &size, NULL, 0); + if (size > 0) { + char *machine = calloc(1, size); + sysctlbyname(keyToExtract, machine, &size, NULL, 0); + deviceModel = [NSString stringWithCString:machine encoding:NSUTF8StringEncoding]; + free(machine); + } else { + deviceModel = [UIDevice currentDevice].model; + } + }); +#endif + + return deviceModel; +} + +NSData *_Nullable GDTCOREncodeArchive(id obj, + NSString *filePath, + NSError *_Nullable *error) { + BOOL result = NO; + if (filePath.length > 0) { + // TODO(ncooke3): For future cleanup– this API shouldn't touch the file + // system unless it successfully encoded the given object. + result = [[NSFileManager defaultManager] + createDirectoryAtPath:[filePath stringByDeletingLastPathComponent] + withIntermediateDirectories:YES + attributes:nil + error:error]; + if (result == NO || *error) { + GDTCORLogDebug(@"Attempt to create directory failed: path:%@ error:%@", filePath, *error); + return nil; + } + } + NSData *resultData; + resultData = [NSKeyedArchiver archivedDataWithRootObject:obj + requiringSecureCoding:YES + error:error]; + if (resultData == nil || (error != NULL && *error != nil)) { + GDTCORLogDebug(@"Encoding an object failed: %@", *error); + return nil; + } + if (filePath.length > 0) { + result = [resultData writeToFile:filePath options:NSDataWritingAtomic error:error]; + if (result == NO || (error != NULL && *error != nil)) { + if (error != NULL && *error != nil) { + GDTCORLogDebug(@"Attempt to write archive failed: path:%@ error:%@", filePath, *error); + } else { + GDTCORLogDebug(@"Attempt to write archive failed: path:%@", filePath); + } + } else { + GDTCORLogDebug(@"Writing archive succeeded: %@", filePath); + } + } + return resultData; +} + +id _Nullable GDTCORDecodeArchiveAtPath(Class archiveClass, + NSString *_Nonnull archivePath, + NSError **_Nonnull error) { + NSData *data = [NSData dataWithContentsOfFile:archivePath options:0 error:error]; + if (data == nil) { + // Reading the file failed and `error` will be populated. + return nil; + } + + return GDTCORDecodeArchive(archiveClass, data, error); +} + +id _Nullable GDTCORDecodeArchive(Class archiveClass, + NSData *_Nonnull archiveData, + NSError **_Nonnull error) { + return [NSKeyedUnarchiver unarchivedObjectOfClass:archiveClass fromData:archiveData error:error]; +} + +BOOL GDTCORWriteDataToFile(NSData *data, NSString *filePath, NSError *_Nullable *outError) { + BOOL result = NO; + if (filePath.length > 0) { + result = [[NSFileManager defaultManager] + createDirectoryAtPath:[filePath stringByDeletingLastPathComponent] + withIntermediateDirectories:YES + attributes:nil + error:outError]; + if (result == NO || *outError) { + GDTCORLogDebug(@"Attempt to create directory failed: path:%@ error:%@", filePath, *outError); + return result; + } + } + + if (filePath.length > 0) { + result = [data writeToFile:filePath options:NSDataWritingAtomic error:outError]; + if (result == NO || *outError) { + GDTCORLogDebug(@"Attempt to write archive failed: path:%@ error:%@", filePath, *outError); + } else { + GDTCORLogDebug(@"Writing archive succeeded: %@", filePath); + } + } + + return result; +} + +@interface GDTCORApplication () +/** + Private flag to match the existing `readonly` public flag. This will be accurate for all platforms, + since we handle each platform's lifecycle notifications separately. + */ +@property(atomic, readwrite) BOOL isRunningInBackground; + +@end + +@implementation GDTCORApplication + +#if TARGET_OS_WATCH +/** A dispatch queue on which all task semaphores will populate and remove from + * gBackgroundIdentifierToSemaphoreMap. + */ +static dispatch_queue_t gSemaphoreQueue; + +/** For mapping backgroundIdentifier to task semaphore. */ +static NSMutableDictionary *gBackgroundIdentifierToSemaphoreMap; +#endif + ++ (void)load { + GDTCORLogDebug( + @"%@", @"GDT is initializing. Please note that if you quit the app via the " + "debugger and not through a lifecycle event, event data will remain on disk but " + "storage won't have a reference to them since the singleton wasn't saved to disk."); +#if TARGET_OS_IOS || TARGET_OS_TV + // If this asserts, please file a bug at https://github.com/firebase/firebase-ios-sdk/issues. + GDTCORFatalAssert( + GDTCORBackgroundIdentifierInvalid == UIBackgroundTaskInvalid, + @"GDTCORBackgroundIdentifierInvalid and UIBackgroundTaskInvalid should be the same."); +#endif + [self sharedApplication]; +} + ++ (void)initialize { +#if TARGET_OS_WATCH + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + gSemaphoreQueue = dispatch_queue_create("com.google.GDTCORApplication", DISPATCH_QUEUE_SERIAL); + GDTCORLogDebug( + @"%@", + @"GDTCORApplication is initializing on watchOS, gSemaphoreQueue has been initialized."); + gBackgroundIdentifierToSemaphoreMap = [[NSMutableDictionary alloc] init]; + GDTCORLogDebug(@"%@", @"GDTCORApplication is initializing on watchOS, " + @"gBackgroundIdentifierToSemaphoreMap has been initialized."); + }); +#endif +} + ++ (nullable GDTCORApplication *)sharedApplication { + static GDTCORApplication *application; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + application = [[GDTCORApplication alloc] init]; + }); + return application; +} + +- (instancetype)init { + self = [super init]; + if (self) { + // This class will be instantiated in the foreground. + _isRunningInBackground = NO; + +#if TARGET_OS_IOS || TARGET_OS_TV + NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; + [notificationCenter addObserver:self + selector:@selector(iOSApplicationDidEnterBackground:) + name:UIApplicationDidEnterBackgroundNotification + object:nil]; + [notificationCenter addObserver:self + selector:@selector(iOSApplicationWillEnterForeground:) + name:UIApplicationWillEnterForegroundNotification + object:nil]; + + NSString *name = UIApplicationWillTerminateNotification; + [notificationCenter addObserver:self + selector:@selector(iOSApplicationWillTerminate:) + name:name + object:nil]; + +#if defined(__IPHONE_13_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 130000 + if (@available(iOS 13, tvOS 13.0, *)) { + [notificationCenter addObserver:self + selector:@selector(iOSApplicationWillEnterForeground:) + name:UISceneWillEnterForegroundNotification + object:nil]; + [notificationCenter addObserver:self + selector:@selector(iOSApplicationDidEnterBackground:) + name:UISceneWillDeactivateNotification + object:nil]; + } +#endif // defined(__IPHONE_13_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 130000 + +#elif TARGET_OS_OSX + NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; + [notificationCenter addObserver:self + selector:@selector(macOSApplicationWillTerminate:) + name:NSApplicationWillTerminateNotification + object:nil]; + +#elif TARGET_OS_WATCH + // TODO: Notification on watchOS platform is currently posted by strings which are frangible. + // TODO: Needs improvements here. + NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; + [notificationCenter addObserver:self + selector:@selector(iOSApplicationDidEnterBackground:) + name:@"UIApplicationDidEnterBackgroundNotification" + object:nil]; + [notificationCenter addObserver:self + selector:@selector(iOSApplicationWillEnterForeground:) + name:@"UIApplicationWillEnterForegroundNotification" + object:nil]; + + // Adds observers for app extension on watchOS platform + [notificationCenter addObserver:self + selector:@selector(iOSApplicationDidEnterBackground:) + name:NSExtensionHostDidEnterBackgroundNotification + object:nil]; + [notificationCenter addObserver:self + selector:@selector(iOSApplicationWillEnterForeground:) + name:NSExtensionHostWillEnterForegroundNotification + object:nil]; +#endif + } + return self; +} + +#if TARGET_OS_WATCH +/** Generates and maps a unique background identifier to the given semaphore. + * + * @param semaphore The semaphore to map. + * @return A unique GDTCORBackgroundIdentifier mapped to the given semaphore. + */ ++ (GDTCORBackgroundIdentifier)createAndMapBackgroundIdentifierToSemaphore: + (dispatch_semaphore_t)semaphore { + __block GDTCORBackgroundIdentifier bgID = GDTCORBackgroundIdentifierInvalid; + dispatch_queue_t queue = gSemaphoreQueue; + NSMutableDictionary *map = gBackgroundIdentifierToSemaphoreMap; + if (queue && map) { + dispatch_sync(queue, ^{ + bgID = arc4random(); + NSNumber *bgIDNumber = @(bgID); + while (bgID == GDTCORBackgroundIdentifierInvalid || map[bgIDNumber]) { + bgID = arc4random(); + bgIDNumber = @(bgID); + } + map[bgIDNumber] = semaphore; + }); + } + return bgID; +} + +/** Returns the semaphore mapped to given bgID and removes the value from the map. + * + * @param bgID The unique NSUInteger as GDTCORBackgroundIdentifier. + * @return The semaphore mapped by given bgID. + */ ++ (dispatch_semaphore_t)semaphoreForBackgroundIdentifier:(GDTCORBackgroundIdentifier)bgID { + __block dispatch_semaphore_t semaphore; + dispatch_queue_t queue = gSemaphoreQueue; + NSMutableDictionary *map = gBackgroundIdentifierToSemaphoreMap; + NSNumber *bgIDNumber = @(bgID); + if (queue && map) { + dispatch_sync(queue, ^{ + semaphore = map[bgIDNumber]; + [map removeObjectForKey:bgIDNumber]; + }); + } + return semaphore; +} +#endif + +- (GDTCORBackgroundIdentifier)beginBackgroundTaskWithName:(NSString *)name + expirationHandler:(void (^)(void))handler { + __block GDTCORBackgroundIdentifier bgID = GDTCORBackgroundIdentifierInvalid; +#if !TARGET_OS_WATCH + bgID = [[self sharedApplicationForBackgroundTask] beginBackgroundTaskWithName:name + expirationHandler:handler]; +#if !NDEBUG + if (bgID != GDTCORBackgroundIdentifierInvalid) { + GDTCORLogDebug(@"Creating background task with name:%@ bgID:%ld", name, (long)bgID); + } +#endif // !NDEBUG +#elif TARGET_OS_WATCH + dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); + bgID = [GDTCORApplication createAndMapBackgroundIdentifierToSemaphore:semaphore]; + if (bgID != GDTCORBackgroundIdentifierInvalid) { + GDTCORLogDebug(@"Creating activity with name:%@ bgID:%ld on watchOS.", name, (long)bgID); + } + [[self sharedNSProcessInfoForBackgroundTask] + performExpiringActivityWithReason:name + usingBlock:^(BOOL expired) { + if (expired) { + if (handler) { + handler(); + } + dispatch_semaphore_signal(semaphore); + GDTCORLogDebug( + @"Activity with name:%@ bgID:%ld on watchOS is expiring.", + name, (long)bgID); + } else { + dispatch_semaphore_wait( + semaphore, + dispatch_time(DISPATCH_TIME_NOW, 30 * NSEC_PER_SEC)); + } + }]; +#endif + return bgID; +} + +- (void)endBackgroundTask:(GDTCORBackgroundIdentifier)bgID { +#if !TARGET_OS_WATCH + if (bgID != GDTCORBackgroundIdentifierInvalid) { + GDTCORLogDebug(@"Ending background task with ID:%ld was successful", (long)bgID); + [[self sharedApplicationForBackgroundTask] endBackgroundTask:bgID]; + return; + } +#elif TARGET_OS_WATCH + if (bgID != GDTCORBackgroundIdentifierInvalid) { + dispatch_semaphore_t semaphore = [GDTCORApplication semaphoreForBackgroundIdentifier:bgID]; + GDTCORLogDebug(@"Ending activity with bgID:%ld on watchOS.", (long)bgID); + if (semaphore) { + dispatch_semaphore_signal(semaphore); + GDTCORLogDebug(@"Signaling semaphore with bgID:%ld on watchOS.", (long)bgID); + } else { + GDTCORLogDebug(@"Semaphore with bgID:%ld is nil on watchOS.", (long)bgID); + } + } +#endif // !TARGET_OS_WATCH +} + +#pragma mark - App environment helpers + +- (BOOL)isAppExtension { + BOOL appExtension = [[[NSBundle mainBundle] bundlePath] hasSuffix:@".appex"]; + return appExtension; +} + +/** Returns a UIApplication or NSProcessInfo instance if on the appropriate platform. + * + * @return The shared UIApplication or NSProcessInfo if on the appropriate platform. + */ +#if TARGET_OS_IOS || TARGET_OS_TV +- (nullable UIApplication *)sharedApplicationForBackgroundTask { +#elif TARGET_OS_WATCH +- (nullable NSProcessInfo *)sharedNSProcessInfoForBackgroundTask { +#else +- (nullable id)sharedApplicationForBackgroundTask { +#endif + id sharedInstance = nil; +#if TARGET_OS_IOS || TARGET_OS_TV + if (![self isAppExtension]) { + Class uiApplicationClass = NSClassFromString(@"UIApplication"); + if (uiApplicationClass && + [uiApplicationClass respondsToSelector:(NSSelectorFromString(@"sharedApplication"))]) { + sharedInstance = [uiApplicationClass sharedApplication]; + } + } +#elif TARGET_OS_WATCH + sharedInstance = [NSProcessInfo processInfo]; +#endif + return sharedInstance; +} + +#pragma mark - UIApplicationDelegate and WKExtensionDelegate + +#if TARGET_OS_IOS || TARGET_OS_TV || TARGET_OS_WATCH +- (void)iOSApplicationDidEnterBackground:(NSNotification *)notif { + _isRunningInBackground = YES; + + NSNotificationCenter *notifCenter = [NSNotificationCenter defaultCenter]; + GDTCORLogDebug(@"%@", @"GDTCORPlatform is sending a notif that the app is backgrounding."); + [notifCenter postNotificationName:kGDTCORApplicationDidEnterBackgroundNotification object:nil]; +} + +- (void)iOSApplicationWillEnterForeground:(NSNotification *)notif { + _isRunningInBackground = NO; + + NSNotificationCenter *notifCenter = [NSNotificationCenter defaultCenter]; + GDTCORLogDebug(@"%@", @"GDTCORPlatform is sending a notif that the app is foregrounding."); + [notifCenter postNotificationName:kGDTCORApplicationWillEnterForegroundNotification object:nil]; +} +#endif // TARGET_OS_IOS || TARGET_OS_TV || TARGET_OS_WATCH + +#pragma mark - UIApplicationDelegate + +#if TARGET_OS_IOS || TARGET_OS_TV +- (void)iOSApplicationWillTerminate:(NSNotification *)notif { + NSNotificationCenter *notifCenter = [NSNotificationCenter defaultCenter]; + GDTCORLogDebug(@"%@", @"GDTCORPlatform is sending a notif that the app is terminating."); + [notifCenter postNotificationName:kGDTCORApplicationWillTerminateNotification object:nil]; +} +#endif // TARGET_OS_IOS || TARGET_OS_TV + +#pragma mark - NSApplicationDelegate + +#if TARGET_OS_OSX +- (void)macOSApplicationWillTerminate:(NSNotification *)notif { + NSNotificationCenter *notifCenter = [NSNotificationCenter defaultCenter]; + GDTCORLogDebug(@"%@", @"GDTCORPlatform is sending a notif that the app is terminating."); + [notifCenter postNotificationName:kGDTCORApplicationWillTerminateNotification object:nil]; +} +#endif // TARGET_OS_OSX + +@end diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORProductData.m b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORProductData.m new file mode 100644 index 0000000..5e15e8f --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORProductData.m @@ -0,0 +1,77 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORProductData.h" + +@implementation GDTCORProductData + +- (instancetype)initWithProductID:(int32_t)productID { + self = [super init]; + if (self) { + _productID = productID; + } + return self; +} + +- (nonnull id)copyWithZone:(nullable NSZone *)zone { + return [[[self class] alloc] initWithProductID:self.productID]; +} + +#pragma mark - Equality + +- (BOOL)isEqualToProductData:(GDTCORProductData *)otherProductData { + return self.productID == otherProductData.productID; +} + +- (BOOL)isEqual:(nullable id)object { + if (object == nil) { + return NO; + } + + if (self == object) { + return YES; + } + + if (![object isKindOfClass:[self class]]) { + return NO; + } + + return [self isEqualToProductData:(GDTCORProductData *)object]; +} + +- (NSUInteger)hash { + return self.productID; +} + +#pragma mark - NSSecureCoding + +/// NSCoding key for `productID` property. +static NSString *kProductIDKey = @"GDTCORProductDataProductIDKey"; + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { + int32_t productID = [coder decodeInt32ForKey:kProductIDKey]; + return [self initWithProductID:productID]; +} + +- (void)encodeWithCoder:(nonnull NSCoder *)coder { + [coder encodeInt32:self.productID forKey:kProductIDKey]; +} + +@end diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORReachability.m b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORReachability.m new file mode 100644 index 0000000..43811e6 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORReachability.m @@ -0,0 +1,125 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORReachability.h" +#import "GoogleDataTransport/GDTCORLibrary/Private/GDTCORReachability_Private.h" + +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORConsoleLogger.h" + +#import + +/** Sets the _callbackFlag ivar whenever the network changes. + * + * @param reachability The reachability object calling back. + * @param flags The new flag values. + * @param info Any data that might be passed in by the callback. + */ +static void GDTCORReachabilityCallback(GDTCORNetworkReachabilityRef reachability, + GDTCORNetworkReachabilityFlags flags, + void *info); + +@implementation GDTCORReachability { + /** The reachability object. */ + GDTCORNetworkReachabilityRef _reachabilityRef; + + /** The queue on which callbacks and all work will occur. */ + dispatch_queue_t _reachabilityQueue; + + /** Flags specified by reachability callbacks. */ + GDTCORNetworkReachabilityFlags _callbackFlags; +} + ++ (void)initialize { + [self sharedInstance]; +} + ++ (instancetype)sharedInstance { + static GDTCORReachability *sharedInstance; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + sharedInstance = [[GDTCORReachability alloc] init]; + }); + return sharedInstance; +} + ++ (GDTCORNetworkReachabilityFlags)currentFlags { + __block GDTCORNetworkReachabilityFlags currentFlags; +#if !TARGET_OS_WATCH + dispatch_sync([GDTCORReachability sharedInstance] -> _reachabilityQueue, ^{ + GDTCORReachability *reachability = [GDTCORReachability sharedInstance]; + currentFlags = + reachability->_callbackFlags ? reachability->_callbackFlags : reachability->_flags; + GDTCORLogDebug(@"Initial reachability flags determined: %d", currentFlags); + }); +#else + currentFlags = kGDTCORNetworkReachabilityFlagsReachable; +#endif + return currentFlags; +} + +- (instancetype)init { + self = [super init]; +#if !TARGET_OS_WATCH + if (self) { + struct sockaddr_in zeroAddress; + bzero(&zeroAddress, sizeof(zeroAddress)); + zeroAddress.sin_len = sizeof(zeroAddress); + zeroAddress.sin_family = AF_INET; + + _reachabilityQueue = + dispatch_queue_create("com.google.GDTCORReachability", DISPATCH_QUEUE_SERIAL); + _reachabilityRef = SCNetworkReachabilityCreateWithAddress( + kCFAllocatorDefault, (const struct sockaddr *)&zeroAddress); + Boolean success = SCNetworkReachabilitySetDispatchQueue(_reachabilityRef, _reachabilityQueue); + if (!success) { + GDTCORLogWarning(GDTCORMCWReachabilityFailed, @"%@", @"The reachability queue wasn't set."); + } + success = SCNetworkReachabilitySetCallback(_reachabilityRef, GDTCORReachabilityCallback, NULL); + if (!success) { + GDTCORLogWarning(GDTCORMCWReachabilityFailed, @"%@", + @"The reachability callback wasn't set."); + } + + // Get the initial set of flags. + dispatch_async(_reachabilityQueue, ^{ + Boolean valid = SCNetworkReachabilityGetFlags(self->_reachabilityRef, &self->_flags); + if (!valid) { + GDTCORLogDebug(@"%@", @"Determining reachability failed."); + self->_flags = 0; + } + }); + } +#endif + return self; +} + +- (void)setCallbackFlags:(GDTCORNetworkReachabilityFlags)flags { + if (_callbackFlags != flags) { + self->_callbackFlags = flags; + } +} + +@end + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunused-function" +static void GDTCORReachabilityCallback(GDTCORNetworkReachabilityRef reachability, + GDTCORNetworkReachabilityFlags flags, + void *info) { +#pragma clang diagnostic pop + GDTCORLogDebug(@"Reachability changed, new flags: %d", flags); + [[GDTCORReachability sharedInstance] setCallbackFlags:flags]; +} diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORRegistrar.m b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORRegistrar.m new file mode 100644 index 0000000..5aefd6c --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORRegistrar.m @@ -0,0 +1,194 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORRegistrar.h" +#import "GoogleDataTransport/GDTCORLibrary/Private/GDTCORRegistrar_Private.h" + +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORConsoleLogger.h" + +id _Nullable GDTCORStorageInstanceForTarget(GDTCORTarget target) { + return [GDTCORRegistrar sharedInstance].targetToStorage[@(target)]; +} + +id _Nullable GDTCORStoragePromiseInstanceForTarget( + GDTCORTarget target) { + id storage = [GDTCORRegistrar sharedInstance].targetToStorage[@(target)]; + if ([storage conformsToProtocol:@protocol(GDTCORStoragePromiseProtocol)]) { + return storage; + } else { + return nil; + } +} + +id _Nullable GDTCORMetricsControllerInstanceForTarget( + GDTCORTarget target) { + return [GDTCORRegistrar sharedInstance].targetToMetricsController[@(target)]; +} + +@implementation GDTCORRegistrar + +// Manaully synthesize properties declared in `GDTCORRegistrar_Private.h` category. +@synthesize targetToUploader = _targetToUploader; +@synthesize targetToStorage = _targetToStorage; +@synthesize targetToMetricsController = _targetToMetricsController; + ++ (instancetype)sharedInstance { + static GDTCORRegistrar *sharedInstance; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + sharedInstance = [[GDTCORRegistrar alloc] init]; + }); + return sharedInstance; +} + +- (instancetype)init { + self = [super init]; + if (self) { + _registrarQueue = dispatch_queue_create("com.google.GDTCORRegistrar", DISPATCH_QUEUE_SERIAL); + _targetToUploader = [NSMutableDictionary dictionary]; + _targetToStorage = [NSMutableDictionary dictionary]; + _targetToMetricsController = [NSMutableDictionary dictionary]; + } + return self; +} + +- (void)registerUploader:(id)backend target:(GDTCORTarget)target { + __weak GDTCORRegistrar *weakSelf = self; + dispatch_async(_registrarQueue, ^{ + GDTCORRegistrar *strongSelf = weakSelf; + if (strongSelf) { + GDTCORLogDebug(@"Registered an uploader: %@ for target:%ld", backend, (long)target); + strongSelf->_targetToUploader[@(target)] = backend; + } + }); +} + +- (void)registerStorage:(id)storage target:(GDTCORTarget)target { + __weak GDTCORRegistrar *weakSelf = self; + dispatch_async(_registrarQueue, ^{ + GDTCORRegistrar *strongSelf = weakSelf; + if (strongSelf) { + GDTCORLogDebug(@"Registered storage: %@ for target:%ld", storage, (long)target); + strongSelf->_targetToStorage[@(target)] = storage; + [self setMetricsControllerAsStorageDelegateForTarget:target]; + } + }); +} + +- (void)registerMetricsController:(id)metricsController + target:(GDTCORTarget)target { + __weak GDTCORRegistrar *weakSelf = self; + dispatch_async(_registrarQueue, ^{ + GDTCORRegistrar *strongSelf = weakSelf; + if (strongSelf) { + GDTCORLogDebug(@"Registered metrics controller: %@ for target:%ld", metricsController, + (long)target); + strongSelf->_targetToMetricsController[@(target)] = metricsController; + [self setMetricsControllerAsStorageDelegateForTarget:target]; + } + }); +} + +- (NSMutableDictionary> *)targetToUploader { + __block NSMutableDictionary> *targetToUploader; + __weak GDTCORRegistrar *weakSelf = self; + dispatch_sync(_registrarQueue, ^{ + GDTCORRegistrar *strongSelf = weakSelf; + if (strongSelf) { + targetToUploader = strongSelf->_targetToUploader; + } + }); + return targetToUploader; +} + +- (NSMutableDictionary> *)targetToStorage { + __block NSMutableDictionary> *targetToStorage; + __weak GDTCORRegistrar *weakSelf = self; + dispatch_sync(_registrarQueue, ^{ + GDTCORRegistrar *strongSelf = weakSelf; + if (strongSelf) { + targetToStorage = strongSelf->_targetToStorage; + } + }); + return targetToStorage; +} + +- (NSMutableDictionary> *) + targetToMetricsController { + __block NSMutableDictionary> + *targetToMetricsController; + __weak GDTCORRegistrar *weakSelf = self; + dispatch_sync(_registrarQueue, ^{ + GDTCORRegistrar *strongSelf = weakSelf; + if (strongSelf) { + targetToMetricsController = strongSelf->_targetToMetricsController; + } + }); + return targetToMetricsController; +} + +- (void)setMetricsControllerAsStorageDelegateForTarget:(GDTCORTarget)target { + _targetToStorage[@(target)].delegate = _targetToMetricsController[@(target)]; +} + +#pragma mark - GDTCORLifecycleProtocol + +- (void)appWillBackground:(nonnull GDTCORApplication *)app { + NSArray> *uploaders = [self.targetToUploader allValues]; + for (id uploader in uploaders) { + if ([uploader respondsToSelector:@selector(appWillBackground:)]) { + [uploader appWillBackground:app]; + } + } + NSArray> *storages = [self.targetToStorage allValues]; + for (id storage in storages) { + if ([storage respondsToSelector:@selector(appWillBackground:)]) { + [storage appWillBackground:app]; + } + } +} + +- (void)appWillForeground:(nonnull GDTCORApplication *)app { + NSArray> *uploaders = [self.targetToUploader allValues]; + for (id uploader in uploaders) { + if ([uploader respondsToSelector:@selector(appWillForeground:)]) { + [uploader appWillForeground:app]; + } + } + NSArray> *storages = [self.targetToStorage allValues]; + for (id storage in storages) { + if ([storage respondsToSelector:@selector(appWillForeground:)]) { + [storage appWillForeground:app]; + } + } +} + +- (void)appWillTerminate:(nonnull GDTCORApplication *)app { + NSArray> *uploaders = [self.targetToUploader allValues]; + for (id uploader in uploaders) { + if ([uploader respondsToSelector:@selector(appWillTerminate:)]) { + [uploader appWillTerminate:app]; + } + } + NSArray> *storages = [self.targetToStorage allValues]; + for (id storage in storages) { + if ([storage respondsToSelector:@selector(appWillTerminate:)]) { + [storage appWillTerminate:app]; + } + } +} + +@end diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORStorageEventSelector.m b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORStorageEventSelector.m new file mode 100644 index 0000000..30915da --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORStorageEventSelector.m @@ -0,0 +1,39 @@ +/* + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORStorageEventSelector.h" + +@implementation GDTCORStorageEventSelector + ++ (instancetype)eventSelectorForTarget:(GDTCORTarget)target { + return [[self alloc] initWithTarget:target eventIDs:nil mappingIDs:nil qosTiers:nil]; +} + +- (instancetype)initWithTarget:(GDTCORTarget)target + eventIDs:(nullable NSSet *)eventIDs + mappingIDs:(nullable NSSet *)mappingIDs + qosTiers:(nullable NSSet *)qosTiers { + self = [super init]; + if (self) { + _selectedTarget = target; + _selectedEventIDs = eventIDs; + _selectedMappingIDs = mappingIDs; + _selectedQosTiers = qosTiers; + } + return self; +} + +@end diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORStorageMetadata.m b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORStorageMetadata.m new file mode 100644 index 0000000..de3b466 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORStorageMetadata.m @@ -0,0 +1,36 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +#import "GoogleDataTransport/GDTCORLibrary/Private/GDTCORStorageMetadata.h" + +@implementation GDTCORStorageMetadata + +- (instancetype)initWithCurrentCacheSize:(GDTCORStorageSizeBytes)currentCacheSize + maxCacheSize:(GDTCORStorageSizeBytes)maxCacheSize { + self = [super init]; + if (self) { + _currentCacheSize = currentCacheSize; + _maxCacheSize = maxCacheSize; + } + return self; +} + ++ (instancetype)metadataWithCurrentCacheSize:(GDTCORStorageSizeBytes)currentCacheSize + maxCacheSize:(GDTCORStorageSizeBytes)maxCacheSize { + return [[self alloc] initWithCurrentCacheSize:currentCacheSize maxCacheSize:maxCacheSize]; +} + +@end diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORTransformer.m b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORTransformer.m new file mode 100644 index 0000000..ece9368 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORTransformer.m @@ -0,0 +1,108 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "GoogleDataTransport/GDTCORLibrary/Private/GDTCORTransformer.h" +#import "GoogleDataTransport/GDTCORLibrary/Private/GDTCORTransformer_Private.h" + +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORAssert.h" +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORLifecycle.h" +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORStorageProtocol.h" +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORConsoleLogger.h" +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCOREvent.h" +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCOREventTransformer.h" + +#import "GoogleDataTransport/GDTCORLibrary/Private/GDTCOREvent_Private.h" +#import "GoogleDataTransport/GDTCORLibrary/Private/GDTCORRegistrar_Private.h" + +@implementation GDTCORTransformer + ++ (instancetype)sharedInstance { + static GDTCORTransformer *eventTransformer; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + eventTransformer = [[self alloc] init]; + }); + return eventTransformer; +} + +- (instancetype)init { + return [self initWithApplication:[GDTCORApplication sharedApplication]]; +} + +- (instancetype)initWithApplication:(id)application { + self = [super init]; + if (self) { + _eventWritingQueue = + dispatch_queue_create("com.google.GDTCORTransformer", DISPATCH_QUEUE_SERIAL); + _application = application; + } + return self; +} + +- (void)transformEvent:(GDTCOREvent *)event + withTransformers:(NSArray> *)transformers + onComplete:(void (^_Nullable)(BOOL wasWritten, NSError *_Nullable error))completion { + GDTCORAssert(event, @"You can't write a nil event"); + + __block GDTCORBackgroundIdentifier bgID = GDTCORBackgroundIdentifierInvalid; + __auto_type __weak weakApplication = self.application; + bgID = [self.application beginBackgroundTaskWithName:@"GDTTransformer" + expirationHandler:^{ + [weakApplication endBackgroundTask:bgID]; + bgID = GDTCORBackgroundIdentifierInvalid; + }]; + + __auto_type completionWrapper = ^(BOOL wasWritten, NSError *_Nullable error) { + if (completion) { + completion(wasWritten, error); + } + + if (bgID != GDTCORBackgroundIdentifierInvalid) { + // The work is done, cancel the background task if it's valid. + [weakApplication endBackgroundTask:bgID]; + } else { + GDTCORLog(GDTCORMCDDebugLog, GDTCORLoggingLevelWarnings, + @"Attempted to cancel invalid background task in GDTCORTransformer."); + } + bgID = GDTCORBackgroundIdentifierInvalid; + }; + + dispatch_async(_eventWritingQueue, ^{ + GDTCOREvent *transformedEvent = event; + for (id transformer in transformers) { + if ([transformer respondsToSelector:@selector(transformGDTEvent:)]) { + GDTCORLogDebug(@"Applying a transformer to event %@", event); + transformedEvent = [transformer transformGDTEvent:event]; + if (!transformedEvent) { + completionWrapper(NO, nil); + return; + } + } else { + GDTCORLogError(GDTCORMCETransformerDoesntImplementTransform, + @"Transformer doesn't implement transformGDTEvent: %@", transformer); + completionWrapper(NO, nil); + return; + } + } + + id storage = + [GDTCORRegistrar sharedInstance].targetToStorage[@(event.target)]; + + [storage storeEvent:transformedEvent onComplete:completionWrapper]; + }); +} + +@end diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORTransport.m b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORTransport.m new file mode 100644 index 0000000..870ad71 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORTransport.m @@ -0,0 +1,108 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORTransport.h" +#import "GoogleDataTransport/GDTCORLibrary/Private/GDTCORTransport_Private.h" + +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORAssert.h" +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORClock.h" +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCOREvent.h" + +#import "GoogleDataTransport/GDTCORLibrary/Private/GDTCORTransformer.h" + +@implementation GDTCORTransport + +- (nullable instancetype)initWithMappingID:(NSString *)mappingID + transformers: + (nullable NSArray> *)transformers + target:(GDTCORTarget)target { + GDTCORAssert(mappingID.length > 0, @"A mapping ID cannot be nil or empty"); + GDTCORAssert(target > 0, @"A target cannot be negative or 0"); + if (mappingID == nil || mappingID.length == 0 || target <= 0) { + return nil; + } + self = [super init]; + if (self) { + _mappingID = mappingID; + _transformers = transformers; + _target = target; + _transformerInstance = [GDTCORTransformer sharedInstance]; + } + GDTCORLogDebug(@"Transport object created. mappingID:%@ transformers:%@ target:%ld", mappingID, + transformers, (long)target); + return self; +} + +- (void)sendTelemetryEvent:(GDTCOREvent *)event + onComplete: + (void (^_Nullable)(BOOL wasWritten, NSError *_Nullable error))completion { + event.qosTier = GDTCOREventQoSTelemetry; + [self sendEvent:event onComplete:completion]; +} + +- (void)sendDataEvent:(GDTCOREvent *)event + onComplete:(void (^_Nullable)(BOOL wasWritten, NSError *_Nullable error))completion { + GDTCORAssert(event.qosTier != GDTCOREventQoSTelemetry, @"Use -sendTelemetryEvent, please."); + [self sendEvent:event onComplete:completion]; +} + +- (void)sendTelemetryEvent:(GDTCOREvent *)event { + [self sendTelemetryEvent:event onComplete:nil]; +} + +- (void)sendDataEvent:(GDTCOREvent *)event { + [self sendDataEvent:event onComplete:nil]; +} + +- (GDTCOREvent *)eventForTransport { + return [[GDTCOREvent alloc] initWithMappingID:_mappingID target:_target]; +} + +- (GDTCOREvent *)eventForTransportWithProductData:(GDTCORProductData *)productData { + return [[GDTCOREvent alloc] initWithMappingID:_mappingID productData:productData target:_target]; +} + +#pragma mark - Private helper methods + +/** Sends the given event through the transport pipeline. + * + * @param event The event to send. + * @param completion A block that will be called when the event has been written or dropped. + */ +- (void)sendEvent:(GDTCOREvent *)event + onComplete:(void (^_Nullable)(BOOL wasWritten, NSError *_Nullable error))completion { + // TODO: Determine if sending an event before registration is allowed. + GDTCORAssert(event, @"You can't send a nil event"); + GDTCOREvent *copiedEvent = [event copy]; + copiedEvent.clockSnapshot = [GDTCORClock snapshot]; + [self.transformerInstance transformEvent:copiedEvent + withTransformers:_transformers + onComplete:completion]; +} + +#pragma mark - Force Category Linking + +extern void GDTCORInclude_GDTCORLogSourceMetrics_Internal_Category(void); + +/// Does nothing when called, and not meant to be called. +/// +/// This method forces the linker to include categories even if +/// users do not include the '-ObjC' linker flag in their project. ++ (void)noop { + GDTCORInclude_GDTCORLogSourceMetrics_Internal_Category(); +} + +@end diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORUploadBatch.m b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORUploadBatch.m new file mode 100644 index 0000000..7d2abe2 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORUploadBatch.m @@ -0,0 +1,30 @@ +/* + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "GoogleDataTransport/GDTCORLibrary/Private/GDTCORUploadBatch.h" + +@implementation GDTCORUploadBatch + +- (instancetype)initWithBatchID:(NSNumber *)batchID events:(NSSet *)events { + self = [super init]; + if (self) { + _batchID = batchID; + _events = events; + } + return self; +} + +@end diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORUploadCoordinator.m b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORUploadCoordinator.m new file mode 100644 index 0000000..cdc108a --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORUploadCoordinator.m @@ -0,0 +1,176 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "GoogleDataTransport/GDTCORLibrary/Private/GDTCORUploadCoordinator.h" + +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORAssert.h" +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORReachability.h" +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORClock.h" +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORConsoleLogger.h" + +#import "GoogleDataTransport/GDTCORLibrary/Private/GDTCORRegistrar_Private.h" + +@implementation GDTCORUploadCoordinator + ++ (instancetype)sharedInstance { + static GDTCORUploadCoordinator *sharedUploader; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + sharedUploader = [[GDTCORUploadCoordinator alloc] init]; + [sharedUploader startTimer]; + }); + return sharedUploader; +} + +- (instancetype)init { + self = [super init]; + if (self) { + _coordinationQueue = + dispatch_queue_create("com.google.GDTCORUploadCoordinator", DISPATCH_QUEUE_SERIAL); + _registrar = [GDTCORRegistrar sharedInstance]; + _timerInterval = 30 * NSEC_PER_SEC; + _timerLeeway = 5 * NSEC_PER_SEC; + } + return self; +} + +- (void)forceUploadForTarget:(GDTCORTarget)target { + dispatch_async(_coordinationQueue, ^{ + GDTCORLogDebug(@"Forcing an upload of target %ld", (long)target); + GDTCORUploadConditions conditions = [self uploadConditions]; + conditions |= GDTCORUploadConditionHighPriority; + [self uploadTargets:@[ @(target) ] conditions:conditions]; + }); +} + +#pragma mark - Private helper methods + +/** Starts a timer that checks whether or not events can be uploaded at regular intervals. It will + * check the next-upload clocks of all targets to determine if an upload attempt can be made. + */ +- (void)startTimer { + dispatch_async(_coordinationQueue, ^{ + if (self->_timer) { + // The timer has been already started. + return; + } + + // Delay the timer slightly so it doesn't run while +load calls are still running. + dispatch_time_t deadline = dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC / 2); + + self->_timer = + dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, self->_coordinationQueue); + dispatch_source_set_timer(self->_timer, deadline, self->_timerInterval, self->_timerLeeway); + + dispatch_source_set_event_handler(self->_timer, ^{ + if (![[GDTCORApplication sharedApplication] isRunningInBackground]) { + GDTCORUploadConditions conditions = [self uploadConditions]; + GDTCORLogDebug(@"%@", @"Upload timer fired"); + [self uploadTargets:[self.registrar.targetToUploader allKeys] conditions:conditions]; + } + }); + GDTCORLogDebug(@"%@", @"Upload timer started"); + dispatch_resume(self->_timer); + }); +} + +/** Stops the currently running timer. */ +- (void)stopTimer { + if (_timer) { + dispatch_source_cancel(_timer); + _timer = nil; + } +} + +/** Triggers the uploader implementations for the given targets to upload. + * + * @param targets An array of targets to trigger. + * @param conditions The set of upload conditions. + */ +- (void)uploadTargets:(NSArray *)targets conditions:(GDTCORUploadConditions)conditions { + dispatch_async(_coordinationQueue, ^{ + // TODO: The reachability signal may be not reliable enough to prevent an upload attempt. + // See https://developer.apple.com/videos/play/wwdc2019/712/ (49:40) for more details. + if ((conditions & GDTCORUploadConditionNoNetwork) == GDTCORUploadConditionNoNetwork) { + return; + } + for (NSNumber *target in targets) { + id uploader = self->_registrar.targetToUploader[target]; + [uploader uploadTarget:target.intValue withConditions:conditions]; + } + }); +} + +- (void)signalToStoragesToCheckExpirations { + // The same storage may be associated with several targets. Make sure to check for expirations + // only once per storage. + NSSet> *storages = + [NSSet setWithArray:[_registrar.targetToStorage allValues]]; + for (id storage in storages) { + [storage checkForExpirations]; + } +} + +/** Returns the registered storage for the given NSNumber wrapped GDTCORTarget. + * + * @param target The NSNumber wrapping of a GDTCORTarget to find the storage instance of. + * @return The storage instance for the given target. + */ +- (nullable id)storageForTarget:(NSNumber *)target { + id storage = [GDTCORRegistrar sharedInstance].targetToStorage[target]; + GDTCORAssert(storage, @"A storage must be registered for target %@", target); + return storage; +} + +/** Returns the current upload conditions after making determinations about the network connection. + * + * @return The current upload conditions. + */ +- (GDTCORUploadConditions)uploadConditions { + GDTCORNetworkReachabilityFlags currentFlags = [GDTCORReachability currentFlags]; + BOOL networkConnected = GDTCORReachabilityFlagsReachable(currentFlags); + if (!networkConnected) { + return GDTCORUploadConditionNoNetwork; + } + BOOL isWWAN = GDTCORReachabilityFlagsContainWWAN(currentFlags); + if (isWWAN) { + return GDTCORUploadConditionMobileData; + } else { + return GDTCORUploadConditionWifiData; + } +} + +#pragma mark - GDTCORLifecycleProtocol + +- (void)appWillForeground:(GDTCORApplication *)app { + // -startTimer is thread-safe. + [self startTimer]; + [self signalToStoragesToCheckExpirations]; +} + +- (void)appWillBackground:(GDTCORApplication *)app { + dispatch_async(_coordinationQueue, ^{ + [self stopTimer]; + }); +} + +- (void)appWillTerminate:(GDTCORApplication *)application { + dispatch_async(_coordinationQueue, ^{ + [self stopTimer]; + }); +} + +@end diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Internal/GDTCORAssert.h b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Internal/GDTCORAssert.h new file mode 100644 index 0000000..e158a5a --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Internal/GDTCORAssert.h @@ -0,0 +1,95 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORConsoleLogger.h" + +NS_ASSUME_NONNULL_BEGIN + +/** A block type that could be run instead of normal assertion logging. No return type, no params. + */ +typedef void (^GDTCORAssertionBlock)(void); + +/** Returns the result of executing a soft-linked method present in unit tests that allows a block + * to be run instead of normal assertion logging. This helps ameliorate issues with catching + * exceptions that occur on a dispatch_queue. + * + * @return A block that can be run instead of normal assert printing. + */ +FOUNDATION_EXPORT GDTCORAssertionBlock _Nullable GDTCORAssertionBlockToRunInstead(void); + +#if defined(NS_BLOCK_ASSERTIONS) + +#define GDTCORAssert(condition, ...) \ + do { \ + } while (0); + +#define GDTCORFatalAssert(condition, ...) \ + do { \ + } while (0); + +#else // defined(NS_BLOCK_ASSERTIONS) + +/** Asserts using a console log, unless a block was specified to be run instead. + * + * @param condition The condition you'd expect to be YES. + */ +#define GDTCORAssert(condition, format, ...) \ + do { \ + __PRAGMA_PUSH_NO_EXTRA_ARG_WARNINGS \ + if (__builtin_expect(!(condition), 0)) { \ + GDTCORAssertionBlock assertionBlock = GDTCORAssertionBlockToRunInstead(); \ + if (assertionBlock) { \ + assertionBlock(); \ + } else { \ + NSString *__assert_file__ = [NSString stringWithUTF8String:__FILE__]; \ + __assert_file__ = __assert_file__ ? __assert_file__ : @""; \ + GDTCORLogAssert(NO, __assert_file__, __LINE__, format, ##__VA_ARGS__); \ + __PRAGMA_POP_NO_EXTRA_ARG_WARNINGS \ + } \ + } \ + } while (0); + +/** Asserts by logging to the console and throwing an exception if NS_BLOCK_ASSERTIONS is not + * defined. + * + * @param condition The condition you'd expect to be YES. + */ +#define GDTCORFatalAssert(condition, format, ...) \ + do { \ + __PRAGMA_PUSH_NO_EXTRA_ARG_WARNINGS \ + if (__builtin_expect(!(condition), 0)) { \ + GDTCORAssertionBlock assertionBlock = GDTCORAssertionBlockToRunInstead(); \ + if (assertionBlock) { \ + assertionBlock(); \ + } else { \ + NSString *__assert_file__ = [NSString stringWithUTF8String:__FILE__]; \ + __assert_file__ = __assert_file__ ? __assert_file__ : @""; \ + GDTCORLogAssert(YES, __assert_file__, __LINE__, format, ##__VA_ARGS__); \ + [[NSAssertionHandler currentHandler] handleFailureInMethod:_cmd \ + object:self \ + file:__assert_file__ \ + lineNumber:__LINE__ \ + description:format, ##__VA_ARGS__]; \ + __PRAGMA_POP_NO_EXTRA_ARG_WARNINGS \ + } \ + } \ + } while (0); + +#endif // defined(NS_BLOCK_ASSERTIONS) + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Internal/GDTCORDirectorySizeTracker.h b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Internal/GDTCORDirectorySizeTracker.h new file mode 100644 index 0000000..a6fa8a3 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Internal/GDTCORDirectorySizeTracker.h @@ -0,0 +1,66 @@ +/* + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORStorageProtocol.h" + +NS_ASSUME_NONNULL_BEGIN + +/** The class calculates and caches the specified directory content size and uses add/remove signals + * from client the client to keep the size up to date without accessing file system. + * This is an internal class designed to be used by `GDTCORFlatFileStorage`. + * NOTE: The class is not thread-safe. The client must take care of synchronization. + */ +@interface GDTCORDirectorySizeTracker : NSObject + +- (instancetype)init NS_UNAVAILABLE; + +/** Initializes the object with a directory path. + * @param path The directory path to track content size. + */ +- (instancetype)initWithDirectoryPath:(NSString *)path; + +/** Returns a cached or calculates (if there is no cached) directory content size. + * @return The directory content size in bytes calculated based on `NSURLFileSizeKey`. + */ +- (GDTCORStorageSizeBytes)directoryContentSize; + +/** The client must call this method or `resetCachedSize` method each time a file or directory is + * added to the tracked directory. + * @param path The path to the added file. If the path is outside the tracked directory then the + * @param fileSize The size of the added file. + * method is no-op. + */ +- (void)fileWasAddedAtPath:(NSString *)path withSize:(GDTCORStorageSizeBytes)fileSize; + +/** The client must call this method or `resetCachedSize` method each time a file or directory is + * removed from the tracked directory. + * @param path The path to the removed file. If the path is outside the tracked directory then the + * @param fileSize The size of the removed file. + * method is no-op. + */ +- (void)fileWasRemovedAtPath:(NSString *)path withSize:(GDTCORStorageSizeBytes)fileSize; + +/** Invalidates cached directory size. */ +- (void)resetCachedSize; + +/** Returns URL resource value for `NSURLFileSizeKey` key for the specified URL. */ +- (GDTCORStorageSizeBytes)fileSizeAtURL:(NSURL *)fileURL; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Internal/GDTCOREventDropReason.h b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Internal/GDTCOREventDropReason.h new file mode 100644 index 0000000..791678b --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Internal/GDTCOREventDropReason.h @@ -0,0 +1,27 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +/// The reason the event was "dropped". An event is considered "dropped" when it is no longer +/// tracked by the SDK (i.e. deleted). +typedef NS_ENUM(NSInteger, GDTCOREventDropReason) { + GDTCOREventDropReasonUnknown = 0, + GDTCOREventDropReasonMessageTooOld, + GDTCOREventDropReasonStorageFull, + GDTCOREventDropReasonPayloadTooBig, + GDTCOREventDropReasonMaxRetriesReached, + GDTCOREventDropReasonInvalidPayload, + GDTCOREventDropReasonServerError +}; diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Internal/GDTCORLifecycle.h b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Internal/GDTCORLifecycle.h new file mode 100644 index 0000000..9316e5c --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Internal/GDTCORLifecycle.h @@ -0,0 +1,63 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORPlatform.h" + +@class GDTCOREvent; + +NS_ASSUME_NONNULL_BEGIN + +/** A protocol defining the lifecycle events objects in the library must respond to immediately. */ +@protocol GDTCORLifecycleProtocol + +@optional + +/** Indicates an imminent app termination in the rare occurrence when -applicationWillTerminate: has + * been called. + * + * @param app The GDTCORApplication instance. + */ +- (void)appWillTerminate:(GDTCORApplication *)app; + +/** Indicates that the app is moving to background and eventual suspension or the current UIScene is + * deactivating. + * + * @param app The GDTCORApplication instance. + */ +- (void)appWillBackground:(GDTCORApplication *)app; + +/** Indicates that the app is resuming operation or a UIScene is activating. + * + * @param app The GDTCORApplication instance. + */ +- (void)appWillForeground:(GDTCORApplication *)app; + +@end + +/** This class manages the library's response to app lifecycle events. + * + * When backgrounding, the library doesn't stop processing events, it's just that several background + * tasks will end up being created for every event that's sent, and the stateful objects of the + * library (GDTCORStorage and GDTCORUploadCoordinator instances) will deserialize themselves from + * and to disk before and after every operation, respectively. + */ +@interface GDTCORLifecycle : NSObject + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Internal/GDTCORMetricsControllerProtocol.h b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Internal/GDTCORMetricsControllerProtocol.h new file mode 100644 index 0000000..b4a9f86 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Internal/GDTCORMetricsControllerProtocol.h @@ -0,0 +1,57 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCOREventDropReason.h" +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORStorageProtocol.h" + +@class FBLPromise; +@class GDTCOREvent; +@class GDTCORMetrics; + +NS_ASSUME_NONNULL_BEGIN + +/// A storage delegate that can perform metrics related tasks. +@protocol GDTCORMetricsControllerProtocol + +/// Updates the corresponding log source metricss for the given events dropped for a given +/// reason. +/// @param reason The reason why the events are being dropped. +/// @param events The events that being dropped. +- (FBLPromise *)logEventsDroppedForReason:(GDTCOREventDropReason)reason + events:(NSSet *)events; + +/// Gets and resets the currently stored metrics. +/// @return A promise resolving with the metrics retrieved before the reset. +- (FBLPromise *)getAndResetMetrics; + +/// Offers metrics for re-storing in storage. +/// @note If the metrics are determined to be from the future, they will be ignored. +/// @param metrics The metrics to offer for storage. +- (FBLPromise *)offerMetrics:(GDTCORMetrics *)metrics; + +@end + +/// Returns a metrics controller instance for the given target. +/// @param target The target to retrieve a corresponding metrics controller from. +/// @return The given target's corresponding metrics controller instance, or `nil` if it does not +/// have one. +FOUNDATION_EXPORT +id _Nullable GDTCORMetricsControllerInstanceForTarget( + GDTCORTarget target); + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Internal/GDTCORPlatform.h b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Internal/GDTCORPlatform.h new file mode 100644 index 0000000..89df0bc --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Internal/GDTCORPlatform.h @@ -0,0 +1,232 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#if !TARGET_OS_WATCH +#import +#endif + +#if TARGET_OS_IOS || TARGET_OS_TV +#import +#elif TARGET_OS_OSX +#import +#elif TARGET_OS_WATCH +#import +#endif // TARGET_OS_IOS || TARGET_OS_TV + +// TODO(Xcode 15): When Xcode 15 is the minimum supported Xcode version, +// it will be unnecessary to check if `TARGET_OS_VISION` is defined. +#if TARGET_OS_IOS && (!defined(TARGET_OS_VISION) || !TARGET_OS_VISION) +#import +#endif + +NS_ASSUME_NONNULL_BEGIN + +/** The GoogleDataTransport library version. */ +FOUNDATION_EXPORT NSString *const kGDTCORVersion; + +/** A notification sent out if the app is backgrounding. */ +FOUNDATION_EXPORT NSString *const kGDTCORApplicationDidEnterBackgroundNotification; + +/** A notification sent out if the app is foregrounding. */ +FOUNDATION_EXPORT NSString *const kGDTCORApplicationWillEnterForegroundNotification; + +/** A notification sent out if the app is terminating. */ +FOUNDATION_EXPORT NSString *const kGDTCORApplicationWillTerminateNotification; + +/** The different possible network connection type. */ +typedef NS_ENUM(NSInteger, GDTCORNetworkType) { + GDTCORNetworkTypeUNKNOWN = 0, + GDTCORNetworkTypeWIFI = 1, + GDTCORNetworkTypeMobile = 2, +}; + +/** The different possible network connection mobile subtype. */ +typedef NS_ENUM(NSInteger, GDTCORNetworkMobileSubtype) { + GDTCORNetworkMobileSubtypeUNKNOWN = 0, + GDTCORNetworkMobileSubtypeGPRS = 1, + GDTCORNetworkMobileSubtypeEdge = 2, + GDTCORNetworkMobileSubtypeWCDMA = 3, + GDTCORNetworkMobileSubtypeHSDPA = 4, + GDTCORNetworkMobileSubtypeHSUPA = 5, + GDTCORNetworkMobileSubtypeCDMA1x = 6, + GDTCORNetworkMobileSubtypeCDMAEVDORev0 = 7, + GDTCORNetworkMobileSubtypeCDMAEVDORevA = 8, + GDTCORNetworkMobileSubtypeCDMAEVDORevB = 9, + GDTCORNetworkMobileSubtypeHRPD = 10, + GDTCORNetworkMobileSubtypeLTE = 11, +}; + +#if !TARGET_OS_WATCH +/** Define SCNetworkReachabilityFlags as GDTCORNetworkReachabilityFlags on non-watchOS. */ +typedef SCNetworkReachabilityFlags GDTCORNetworkReachabilityFlags; + +/** Define SCNetworkReachabilityRef as GDTCORNetworkReachabilityRef on non-watchOS. */ +typedef SCNetworkReachabilityRef GDTCORNetworkReachabilityRef; + +#else +/** The different possible reachabilityFlags option on watchOS. */ +typedef NS_OPTIONS(uint32_t, GDTCORNetworkReachabilityFlags) { + kGDTCORNetworkReachabilityFlagsReachable = 1 << 1, + // TODO(doudounan): Add more options on watchOS if watchOS network connection information relative + // APIs available in the future. +}; + +/** Define a struct as GDTCORNetworkReachabilityRef on watchOS to store network connection + * information. */ +typedef struct { + // TODO(doudounan): Store network connection information on watchOS if watchOS network connection + // information relative APIs available in the future. +} GDTCORNetworkReachabilityRef; +#endif + +/** Returns a URL to the root directory under which all GDT-associated data must be saved. + * + * @return A URL to the root directory under which all GDT-associated data must be saved. + */ +NSURL *GDTCORRootDirectory(void); + +/** Compares flags with the reachable flag (on non-watchos with both reachable and + * connectionRequired flags), if available, and returns YES if network reachable. + * + * @param flags The set of reachability flags. + * @return YES if the network is reachable, NO otherwise. + */ +BOOL GDTCORReachabilityFlagsReachable(GDTCORNetworkReachabilityFlags flags); + +/** Compares flags with the WWAN reachability flag, if available, and returns YES if present. + * + * @param flags The set of reachability flags. + * @return YES if the WWAN flag is set, NO otherwise. + */ +BOOL GDTCORReachabilityFlagsContainWWAN(GDTCORNetworkReachabilityFlags flags); + +/** Generates an enum message GDTCORNetworkType representing network connection type. + * + * @return A GDTCORNetworkType representing network connection type. + */ +GDTCORNetworkType GDTCORNetworkTypeMessage(void); + +/** Generates an enum message GDTCORNetworkMobileSubtype representing network connection mobile + * subtype. + * + * @return A GDTCORNetworkMobileSubtype representing network connection mobile subtype. + */ +GDTCORNetworkMobileSubtype GDTCORNetworkMobileSubTypeMessage(void); + +/** Identifies the model of the device on which the library is currently working on. + * + * @return A NSString representing the device model. + */ +NSString *_Nonnull GDTCORDeviceModel(void); + +/** Writes the given object to the given fileURL and populates the given error if it fails. + * + * @param obj The object to encode. + * @param filePath The path to write the object to. Can be nil if you just need the data. + * @param error The error to populate if something goes wrong. + * @return The data of the archive. If error is nil, it's been written to disk. + */ +NSData *_Nullable GDTCOREncodeArchive(id obj, + NSString *_Nullable filePath, + NSError *_Nullable *error); + +/// Decodes an object of the given class from the given archive path and populates the given error +/// if it fails. +/// @param archiveClass The class of the archive's root object. +/// @param archivePath The path to the archived data. +/// @param error The error to populate if something goes wrong. +id _Nullable GDTCORDecodeArchiveAtPath(Class archiveClass, + NSString *_Nonnull archivePath, + NSError **_Nonnull error); + +/// Decodes an object of the given class from the given data and populates the given error if it +/// fails. +/// @param archiveClass The class of the archive's root object. +/// @param archiveData The data to decode. +/// @param error The error to populate if something goes wrong. +id _Nullable GDTCORDecodeArchive(Class archiveClass, + NSData *_Nonnull archiveData, + NSError **_Nonnull error); + +/** Writes the provided data to a file at the provided path. Intermediate directories will be + * created as needed. + * @param data The file content. + * @param filePath The path to the file to write the provided data. + * @param outError The error to populate if something goes wrong. + * @return `YES` in the case of success, `NO` otherwise. + */ +BOOL GDTCORWriteDataToFile(NSData *data, NSString *filePath, NSError *_Nullable *outError); + +/** A typedef identify background identifiers. */ +typedef volatile NSUInteger GDTCORBackgroundIdentifier; + +/** A background task's invalid sentinel value. */ +FOUNDATION_EXPORT const GDTCORBackgroundIdentifier GDTCORBackgroundIdentifierInvalid; + +#if TARGET_OS_IOS || TARGET_OS_TV +/** A protocol that wraps UIApplicationDelegate, WKExtensionDelegate or NSObject protocol, depending + * on the platform. + */ +@protocol GDTCORApplicationDelegate +#elif TARGET_OS_OSX +@protocol GDTCORApplicationDelegate +#elif TARGET_OS_WATCH +@protocol GDTCORApplicationDelegate +#else +@protocol GDTCORApplicationDelegate +#endif // TARGET_OS_IOS || TARGET_OS_TV + +@end + +@protocol GDTCORApplicationProtocol + +@required + +/** Flag to determine if the application is running in the background. */ +@property(atomic, readonly) BOOL isRunningInBackground; + +/** Creates a background task with the returned identifier if on a suitable platform. + * + * @name name The name of the task, useful for debugging which background tasks are running. + * @param handler The handler block that is called if the background task expires. + * @return An identifier for the background task, or GDTCORBackgroundIdentifierInvalid if one + * couldn't be created. + */ +- (GDTCORBackgroundIdentifier)beginBackgroundTaskWithName:(NSString *)name + expirationHandler:(void (^__nullable)(void))handler; + +/** Ends the background task if the identifier is valid. + * + * @param bgID The background task to end. + */ +- (void)endBackgroundTask:(GDTCORBackgroundIdentifier)bgID; + +@end + +/** A cross-platform application class. */ +@interface GDTCORApplication : NSObject + +/** Creates and/or returns the shared application instance. + * + * @return The shared application instance. + */ ++ (nullable GDTCORApplication *)sharedApplication; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Internal/GDTCORReachability.h b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Internal/GDTCORReachability.h new file mode 100644 index 0000000..eb89832 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Internal/GDTCORReachability.h @@ -0,0 +1,31 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORPlatform.h" + +NS_ASSUME_NONNULL_BEGIN + +/** This class helps determine upload conditions by determining connectivity. */ +@interface GDTCORReachability : NSObject + +/** The current set flags indicating network conditions */ ++ (GDTCORNetworkReachabilityFlags)currentFlags; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Internal/GDTCORRegistrar.h b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Internal/GDTCORRegistrar.h new file mode 100644 index 0000000..d5e50bb --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Internal/GDTCORRegistrar.h @@ -0,0 +1,59 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORMetricsControllerProtocol.h" +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORStorageProtocol.h" +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORUploader.h" +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORTargets.h" + +NS_ASSUME_NONNULL_BEGIN + +/** Manages the registration of targets with the transport SDK. */ +@interface GDTCORRegistrar : NSObject + +/** Creates and/or returns the singleton instance. + * + * @return The singleton instance of this class. + */ ++ (instancetype)sharedInstance; + +/** Registers a backend implementation with the GoogleDataTransport infrastructure. + * + * @param backend The backend object to register with the given target. + * @param target The target this backend object will be responsible for. + */ +- (void)registerUploader:(id)backend target:(GDTCORTarget)target; + +/** Registers a storage implementation with the GoogleDataTransport infrastructure. + * + * @param storage The storage object to register with the given target. + * @param target The target this storage object will be responsible for. + */ +- (void)registerStorage:(id)storage target:(GDTCORTarget)target; + +/** Registers a metrics controller implementation with the GoogleDataTransport infrastructure. + * + * @param metricsController The metrics controller object to register with the given target. + * @param target The target this metrics controller object will be responsible for. + */ +- (void)registerMetricsController:(id)metricsController + target:(GDTCORTarget)target; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Internal/GDTCORStorageEventSelector.h b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Internal/GDTCORStorageEventSelector.h new file mode 100644 index 0000000..7662d8b --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Internal/GDTCORStorageEventSelector.h @@ -0,0 +1,61 @@ +/* + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORTargets.h" + +NS_ASSUME_NONNULL_BEGIN + +/** This class enables the finding of events by matching events with the properties of this class. + */ +@interface GDTCORStorageEventSelector : NSObject + +/** The target to find events for. Required. */ +@property(readonly, nonatomic) GDTCORTarget selectedTarget; + +/** Finds a specific event. */ +@property(nullable, readonly, nonatomic) NSSet *selectedEventIDs; + +/** Finds all events of a mappingID. */ +@property(nullable, readonly, nonatomic) NSSet *selectedMappingIDs; + +/** Finds all events matching the qosTiers in this list. */ +@property(nullable, readonly, nonatomic) NSSet *selectedQosTiers; + +/** Initializes an event selector that will find all events for the given target. + * + * @param target The selected target. + * @return An immutable event selector instance. + */ ++ (instancetype)eventSelectorForTarget:(GDTCORTarget)target; + +/** Instantiates an event selector. + * + * @param target The selected target. + * @param eventIDs Optional param to find an event matching this eventID. + * @param mappingIDs Optional param to find events matching this mappingID. + * @param qosTiers Optional param to find events matching the given QoS tiers. + * @return An immutable event selector instance. + */ +- (instancetype)initWithTarget:(GDTCORTarget)target + eventIDs:(nullable NSSet *)eventIDs + mappingIDs:(nullable NSSet *)mappingIDs + qosTiers:(nullable NSSet *)qosTiers; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Internal/GDTCORStorageProtocol.h b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Internal/GDTCORStorageProtocol.h new file mode 100644 index 0000000..2a3ae0e --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Internal/GDTCORStorageProtocol.h @@ -0,0 +1,210 @@ +/* + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORLifecycle.h" +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORStorageEventSelector.h" +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORStorageSizeBytes.h" +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORTargets.h" + +@class GDTCOREvent; +@class GDTCORClock; +@class GDTCORUploadBatch; + +@class FBLPromise; + +@protocol GDTCORStorageDelegate; + +NS_ASSUME_NONNULL_BEGIN + +typedef void (^GDTCORStorageBatchBlock)(NSNumber *_Nullable newBatchID, + NSSet *_Nullable batchEvents); + +#pragma mark - GDTCORStorageProtocol + +/** Defines the interface a storage subsystem is expected to implement. */ +@protocol GDTCORStorageProtocol + +/// The object that acts as the delegate of the storage instance. +@property(nonatomic, weak, nullable) id delegate; + +@required + +/** Stores an event and calls onComplete with a non-nil error if anything went wrong. + * + * @param event The event to store + * @param completion The completion block to call after an attempt to store the event has been made. + */ +- (void)storeEvent:(GDTCOREvent *)event + onComplete:(void (^_Nullable)(BOOL wasWritten, NSError *_Nullable error))completion; + +/** Returns YES if some events have been stored for the given target, NO otherwise. + * + * @param onComplete The completion block to invoke when determining if there are events is done. + */ +- (void)hasEventsForTarget:(GDTCORTarget)target onComplete:(void (^)(BOOL hasEvents))onComplete; + +/** Constructs an event batch with the given event selector. Events in this batch will not be + * returned in any queries or other batches until the batch is removed. + * + * @param eventSelector The event selector used to find the events. + * @param expiration The expiration time of the batch. If removeBatchWithID:deleteEvents:onComplete: + * is not called within this time frame, the batch will be removed with its events deleted. + * @param onComplete The completion handler to be called when the events have been fetched. + */ +- (void)batchWithEventSelector:(nonnull GDTCORStorageEventSelector *)eventSelector + batchExpiration:(nonnull NSDate *)expiration + onComplete:(nonnull GDTCORStorageBatchBlock)onComplete; + +/** Removes the event batch. + * + * @param batchID The batchID to remove. + * @param deleteEvents If YES, the events in this batch are deleted. + * @param onComplete The completion handler to call when the batch removal process has completed. + */ +- (void)removeBatchWithID:(NSNumber *)batchID + deleteEvents:(BOOL)deleteEvents + onComplete:(void (^_Nullable)(void))onComplete; + +/** Finds the batchIDs for the given target and calls the callback block. + * + * @param target The target. + * @param onComplete The block to invoke with the set of current batchIDs. + */ +- (void)batchIDsForTarget:(GDTCORTarget)target + onComplete:(void (^)(NSSet *_Nullable batchIDs))onComplete; + +/** Checks the storage for expired events and batches, deletes them if they're expired. */ +- (void)checkForExpirations; + +/** Persists the given data with the given key. + * + * @param data The data to store. + * @param key The unique key to store it to. + * @param onComplete An block to be run when storage of the data is complete. + */ +- (void)storeLibraryData:(NSData *)data + forKey:(NSString *)key + onComplete:(nullable void (^)(NSError *_Nullable error))onComplete; + +/** Retrieves the stored data for the given key and optionally sets a new value. + * + * @param key The key corresponding to the desired data. + * @param onFetchComplete The callback to invoke with the data once it's retrieved. + * @param setValueBlock This optional block can provide a new value to set. + */ +- (void)libraryDataForKey:(nonnull NSString *)key + onFetchComplete:(nonnull void (^)(NSData *_Nullable data, + NSError *_Nullable error))onFetchComplete + setNewValue:(NSData *_Nullable (^_Nullable)(void))setValueBlock; + +/** Removes data from storage and calls the callback when complete. + * + * @param key The key of the data to remove. + * @param onComplete The callback that will be invoked when removing the data is complete. + */ +- (void)removeLibraryDataForKey:(NSString *)key + onComplete:(void (^)(NSError *_Nullable error))onComplete; + +/** Calculates and returns the total disk size that this storage consumes. + * + * @param onComplete The callback that will be invoked once storage size calculation is complete. + */ +- (void)storageSizeWithCallback:(void (^)(GDTCORStorageSizeBytes storageSize))onComplete; + +@end + +#pragma mark - GDTCORStoragePromiseProtocol + +// TODO(ncooke3): Consider complete replacing block based API by promise API. + +@class GDTCORMetricsMetadata; +@class GDTCORStorageMetadata; + +/** Promise based version of API defined in GDTCORStorageProtocol. See API docs for corresponding + * methods in GDTCORStorageProtocol. */ +@protocol GDTCORStoragePromiseProtocol + +- (FBLPromise *> *)batchIDsForTarget:(GDTCORTarget)target; + +- (FBLPromise *)removeBatchWithID:(NSNumber *)batchID deleteEvents:(BOOL)deleteEvents; + +- (FBLPromise *)removeBatchesWithIDs:(NSSet *)batchIDs + deleteEvents:(BOOL)deleteEvents; + +- (FBLPromise *)removeAllBatchesForTarget:(GDTCORTarget)target + deleteEvents:(BOOL)deleteEvents; + +/// Fetches metrics metadata from storage, passes them to the given handler, and writes the +/// resulting metrics metadata from the given handler to storage. +/// @note This API is thread-safe. +/// @param handler A handler to process the fetch result and return an updated value to store. +/// @return A promise that is fulfilled if the update is successful, and rejected otherwise. +- (FBLPromise *)fetchAndUpdateMetricsWithHandler: + (GDTCORMetricsMetadata * (^)(GDTCORMetricsMetadata *_Nullable fetchedMetadata, + NSError *_Nullable fetchError))handler; + +/// Fetches and returns storage metadata. +- (FBLPromise *)fetchStorageMetadata; + +/** See `hasEventsForTarget:onComplete:`. + * @return A promise object that is resolved with @YES if there are events for the specified target + * and @NO otherwise. + */ +- (FBLPromise *)hasEventsForTarget:(GDTCORTarget)target; + +/** See `batchWithEventSelector:batchExpiration:onComplete:` + * The promise is rejected when there are no events for the specified selector. + */ +- (FBLPromise *)batchWithEventSelector: + (GDTCORStorageEventSelector *)eventSelector + batchExpiration:(NSDate *)expiration; + +@end + +/** Retrieves the storage instance for the given target. + * + * @param target The target. + * * @return The storage instance registered for the target, or nil if there is none. + */ +FOUNDATION_EXPORT +id _Nullable GDTCORStorageInstanceForTarget(GDTCORTarget target); + +FOUNDATION_EXPORT +id _Nullable GDTCORStoragePromiseInstanceForTarget( + GDTCORTarget target); + +#pragma mark - GDTCORStorageDelegate + +/// A type that can be delegated actions from a storage instance. +@protocol GDTCORStorageDelegate + +/// Tells the delegate that the storage instance has removed a set of expired events. +/// @param storage The storage instance informing the delegate of this impending event. +/// @param events A set of events that were removed from storage due to their expiration. +- (void)storage:(id)storage + didRemoveExpiredEvents:(NSSet *)events; + +/// Tells the delegate that the storage instance has dropped an event due to the event cache being +/// full. +/// @param storage The storage instance informing the delegate of this impending event. +/// @param event An event that was dropped due to the event cache being full. +- (void)storage:(id)storage didDropEvent:(GDTCOREvent *)event; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Internal/GDTCORStorageSizeBytes.h b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Internal/GDTCORStorageSizeBytes.h new file mode 100644 index 0000000..4b24f95 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Internal/GDTCORStorageSizeBytes.h @@ -0,0 +1,18 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +/// The data type to represent storage size. +typedef uint64_t GDTCORStorageSizeBytes; diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Internal/GDTCORUploader.h b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Internal/GDTCORUploader.h new file mode 100644 index 0000000..9b5343d --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Internal/GDTCORUploader.h @@ -0,0 +1,59 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORLifecycle.h" +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORClock.h" +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORTargets.h" + +NS_ASSUME_NONNULL_BEGIN + +/** Options that define a set of upload conditions. This is used to help minimize end user data + * consumption impact. + */ +typedef NS_OPTIONS(NSInteger, GDTCORUploadConditions) { + + /** An upload shouldn't be attempted, because there's no network. */ + GDTCORUploadConditionNoNetwork = 1 << 0, + + /** An upload would likely use mobile data. */ + GDTCORUploadConditionMobileData = 1 << 1, + + /** An upload would likely use wifi data. */ + GDTCORUploadConditionWifiData = 1 << 2, + + /** An upload uses some sort of network connection, but it's unclear which. */ + GDTCORUploadConditionUnclearConnection = 1 << 3, + + /** A high priority event has occurred. */ + GDTCORUploadConditionHighPriority = 1 << 4, +}; + +/** This protocol defines the common interface for uploader implementations. */ +@protocol GDTCORUploader + +@required + +/** Uploads events to the backend using this specific backend's chosen format. + * + * @param conditions The conditions that the upload attempt is likely to occur under. + */ +- (void)uploadTarget:(GDTCORTarget)target withConditions:(GDTCORUploadConditions)conditions; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCOREndpoints_Private.h b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCOREndpoints_Private.h new file mode 100644 index 0000000..4b1a903 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCOREndpoints_Private.h @@ -0,0 +1,27 @@ +/* + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCOREndpoints.h" + +@interface GDTCOREndpoints () + +/** Returns the list of all the upload URLs used by the transport library. + * + * @return Map of the transport target and the URL used for uploading the events for that target. + */ ++ (NSDictionary *)uploadURLs; + +@end diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCOREvent_Private.h b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCOREvent_Private.h new file mode 100644 index 0000000..e97eb31 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCOREvent_Private.h @@ -0,0 +1,33 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCOREvent.h" + +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORClock.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface GDTCOREvent () + +/** The unique ID of the event. This property is for testing only. */ +@property(nonatomic, readwrite) NSString *eventID; + +/** Generates a unique event ID. */ ++ (NSString *)nextEventID; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCORFlatFileStorage+Promises.h b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCORFlatFileStorage+Promises.h new file mode 100644 index 0000000..66ea857 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCORFlatFileStorage+Promises.h @@ -0,0 +1,28 @@ +/* + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "GoogleDataTransport/GDTCORLibrary/Private/GDTCORFlatFileStorage.h" + +@class FBLPromise; + +NS_ASSUME_NONNULL_BEGIN + +/// The category extends `GDTCORFlatFileStorage` API with `GDTCORStoragePromiseProtocol` methods. +@interface GDTCORFlatFileStorage (Promises) + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCORFlatFileStorage.h b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCORFlatFileStorage.h new file mode 100644 index 0000000..09f1dae --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCORFlatFileStorage.h @@ -0,0 +1,158 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORLifecycle.h" +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORStorageEventSelector.h" +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORStorageProtocol.h" + +@class GDTCOREvent; +@class GDTCORUploadCoordinator; + +NS_ASSUME_NONNULL_BEGIN + +/** The event components eventID dictionary key. */ +FOUNDATION_EXPORT NSString *const kGDTCOREventComponentsEventIDKey; + +/** The event components qosTier dictionary key. */ +FOUNDATION_EXPORT NSString *const kGDTCOREventComponentsQoSTierKey; + +/** The event components mappingID dictionary key. */ +FOUNDATION_EXPORT NSString *const kGDTCOREventComponentsMappingIDKey; + +/** The event components expirationDate dictionary key. */ +FOUNDATION_EXPORT NSString *const kGDTCOREventComponentsExpirationKey; + +/** The batch components target dictionary key. */ +FOUNDATION_EXPORT NSString *const kGDTCORBatchComponentsTargetKey; + +/** The batch components batchID dictionary key. */ +FOUNDATION_EXPORT NSString *const kGDTCORBatchComponentsBatchIDKey; + +/** The batch components expiration dictionary key. */ +FOUNDATION_EXPORT NSString *const kGDTCORBatchComponentsExpirationKey; + +/** The maximum allowed disk space taken by the stored data. */ +FOUNDATION_EXPORT const uint64_t kGDTCORFlatFileStorageSizeLimit; + +FOUNDATION_EXPORT NSString *const GDTCORFlatFileStorageErrorDomain; + +typedef NS_ENUM(NSInteger, GDTCORFlatFileStorageError) { + GDTCORFlatFileStorageErrorSizeLimitReached = 0 +}; + +/** Manages the storage of events. This class is thread-safe. + * + * Event files will be stored as follows: + * /google-sdk-events//gdt_event_data//.. + * + * Library data will be stored as follows: + * /google-sdk-events//gdt_library_data/ + * + * Batch data will be stored as follows: + * /google-sdk-events//gdt_batch_data/./.. + */ +@interface GDTCORFlatFileStorage : NSObject + +/** The queue on which all storage work will occur. */ +@property(nonatomic) dispatch_queue_t storageQueue; + +/** The upload coordinator instance used by this storage instance. */ +@property(nonatomic) GDTCORUploadCoordinator *uploadCoordinator; + +/** Creates and/or returns the storage singleton. + * + * @return The storage singleton. + */ ++ (instancetype)sharedInstance; + +/** Returns the base directory under which all events will be stored. + * + * @return The base directory under which all events will be stored. + */ ++ (NSString *)eventDataStoragePath; + +/** Returns the base directory under which all library data will be stored. + * + * @return The base directory under which all library data will be stored. + */ ++ (NSString *)libraryDataStoragePath; + +/** Returns the base directory under which all batch data will be stored. + * + * @return The base directory under which all batch data will be stored. + */ ++ (NSString *)batchDataStoragePath; + +/** */ ++ (NSString *)batchPathForTarget:(GDTCORTarget)target + batchID:(NSNumber *)batchID + expirationDate:(NSDate *)expirationDate; + +/** Returns a constructed storage path based on the given values. This path may not exist. + * + * @param target The target, which is necessary to be given a path. + * @param eventID The eventID. + * @param qosTier The qosTier. + * @param expirationDate The expirationDate as a 1970-relative time interval. + * @param mappingID The mappingID. + * @return The path representing the combination of the given parameters. + */ ++ (NSString *)pathForTarget:(GDTCORTarget)target + eventID:(NSString *)eventID + qosTier:(NSNumber *)qosTier + expirationDate:(NSDate *)expirationDate + mappingID:(NSString *)mappingID; + +/** Returns extant paths that match all of the given parameters. + * + * @param eventIDs The list of eventIDs to look for, or nil for any. + * @param qosTiers The list of qosTiers to look for, or nil for any. + * @param mappingIDs The list of mappingIDs to look for, or nil for any. + * @param onComplete The completion to call once the paths have been discovered. + */ +- (void)pathsForTarget:(GDTCORTarget)target + eventIDs:(nullable NSSet *)eventIDs + qosTiers:(nullable NSSet *)qosTiers + mappingIDs:(nullable NSSet *)mappingIDs + onComplete:(void (^)(NSSet *paths))onComplete; + +/** Fetches the current batchID counter value from library storage, increments it, and sets the new + * value. Returns nil if a batchID was not able to be created for some reason. + * + * @param onComplete A block to execute when creating the next batchID is complete. + */ +- (void)nextBatchID:(void (^)(NSNumber *_Nullable batchID))onComplete; + +/** Constructs a dictionary of event filename components. + * + * @param fileName The event filename to split. + * @return The dictionary of event component keys to their values. + */ +- (nullable NSDictionary *)eventComponentsFromFilename:(NSString *)fileName; + +/** Constructs a dictionary of batch filename components. + * + * @param fileName The batch folder name to split. + * @return The dictionary of batch component keys to their values. + */ +- (nullable NSDictionary *)batchComponentsFromFilename:(NSString *)fileName; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCORLogSourceMetrics.h b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCORLogSourceMetrics.h new file mode 100644 index 0000000..8722073 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCORLogSourceMetrics.h @@ -0,0 +1,53 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCOREventDropReason.h" + +@class GDTCOREvent; + +NS_ASSUME_NONNULL_BEGIN + +/// A model object that tracks, per log source, the number of events dropped for a variety of +/// reasons. An event is considered "dropped" when the event is no longer persisted by the SDK. +@interface GDTCORLogSourceMetrics : NSObject + +/// Creates an empty log source metrics instance. ++ (instancetype)metrics; + +/// Creates a log source metrics for a collection of events that were dropped for a given reason. +/// @param events The collection of events that were dropped. +/// @param reason The reason for which given events were dropped. ++ (instancetype)metricsWithEvents:(NSArray *)events + droppedForReason:(GDTCOREventDropReason)reason; + +/// This API is unavailable. +- (instancetype)init NS_UNAVAILABLE; + +/// Returns a log source metrics instance created by merging the receiving log +/// source metrics with the given log source metrics. +/// @param logSourceMetrics The given log source metrics to merge with. +- (GDTCORLogSourceMetrics *)logSourceMetricsByMergingWithLogSourceMetrics: + (GDTCORLogSourceMetrics *)logSourceMetrics; + +/// Returns a Boolean value that indicates whether the receiving log source metrics is equal to +/// the given log source metrics. +/// @param otherLogSourceMetrics The log source metrics with which to compare the +/// receiving log source metrics. +- (BOOL)isEqualToLogSourceMetrics:(GDTCORLogSourceMetrics *)otherLogSourceMetrics; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCORMetrics.h b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCORMetrics.h new file mode 100644 index 0000000..2f3c38f --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCORMetrics.h @@ -0,0 +1,61 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCOREventDataObject.h" + +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORStorageSizeBytes.h" + +@class GDTCORLogSourceMetrics; +@class GDTCORMetricsMetadata; +@class GDTCORStorageMetadata; + +NS_ASSUME_NONNULL_BEGIN + +/// An object representing metrics that represent a snapshot of the SDK's state and performance. +@interface GDTCORMetrics : NSObject + +/// The start of the time window over which the metrics were collected. +@property(nonatomic, readonly) NSDate *collectionStartDate; + +/// The log source metrics associated with the metrics. +@property(nonatomic, readonly) GDTCORLogSourceMetrics *logSourceMetrics; + +/// The end of the time window over which the metrics were collected. +@property(nonatomic, readonly) NSDate *collectionEndDate; + +/// The number of bytes the event cache was consuming in storage. +@property(nonatomic, readonly) GDTCORStorageSizeBytes currentCacheSize; + +/// The maximum number of bytes that the event cache is allowed to grow. +@property(nonatomic, readonly) GDTCORStorageSizeBytes maxCacheSize; + +/// The bundle ID associated with the metrics being collected. +@property(nonatomic, readonly) NSString *bundleID; + +/// Creates a metrics instance with the provided metadata. +/// @param metricsMetadata The provided metrics metadata. +/// @param storageMetadata The provided storage metadata. ++ (instancetype)metricsWithMetricsMetadata:(GDTCORMetricsMetadata *)metricsMetadata + storageMetadata:(GDTCORStorageMetadata *)storageMetadata; + +/// Returns a Boolean value that indicates whether the receiving metrics is equal to the given +/// metrics. +/// @param otherMetrics The metrics with which to compare the receiving metrics. +- (BOOL)isEqualToMetrics:(GDTCORMetrics *)otherMetrics; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCORMetricsController.h b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCORMetricsController.h new file mode 100644 index 0000000..a47da52 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCORMetricsController.h @@ -0,0 +1,37 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORMetricsControllerProtocol.h" + +@protocol GDTCORStoragePromiseProtocol; + +NS_ASSUME_NONNULL_BEGIN + +@interface GDTCORMetricsController : NSObject + +/// Returns the event metrics controller singleton. ++ (instancetype)sharedInstance; + +/// Designated initializer. +/// @param storage The storage object to read and write metrics data from. +- (instancetype)initWithStorage:(id)storage NS_DESIGNATED_INITIALIZER; + +/// This API is unavailable. +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCORMetricsMetadata.h b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCORMetricsMetadata.h new file mode 100644 index 0000000..8214c41 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCORMetricsMetadata.h @@ -0,0 +1,50 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCOREventDropReason.h" + +@class GDTCORLogSourceMetrics; + +NS_ASSUME_NONNULL_BEGIN + +/// An encodable model object that contains metadata that is persisted in storage until ready to be +/// used to create a ``GDTCORMetrics`` instance. +@interface GDTCORMetricsMetadata : NSObject + +/// The start of the time window over which the metrics were collected. +@property(nonatomic, copy, readonly) NSDate *collectionStartDate; + +/// The log source metrics associated with the metrics. +@property(nonatomic, copy, readonly) GDTCORLogSourceMetrics *logSourceMetrics; + +/// Creates a metrics metadata object with the provided information. +/// @param collectedSinceDate The start of the time window over which the metrics were collected. +/// @param logSourceMetrics The metrics object that tracks metrics for each log source. ++ (instancetype)metadataWithCollectionStartDate:(NSDate *)collectedSinceDate + logSourceMetrics:(GDTCORLogSourceMetrics *)logSourceMetrics; + +/// This API is unavailable. +- (instancetype)init NS_UNAVAILABLE; + +/// Returns a Boolean value that indicates whether the receiving metrics metadata is equal to +/// the given metrics metadata. +/// @param otherMetricsMetadata The metrics metadata with which to compare the +/// receiving metrics metadata. +- (BOOL)isEqualToMetricsMetadata:(GDTCORMetricsMetadata *)otherMetricsMetadata; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCORReachability_Private.h b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCORReachability_Private.h new file mode 100644 index 0000000..06b1f67 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCORReachability_Private.h @@ -0,0 +1,30 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORReachability.h" + +@interface GDTCORReachability () + +/** Allows manually setting the flags for testing purposes. */ +@property(nonatomic, readwrite) GDTCORNetworkReachabilityFlags flags; + +/** Creates/returns the singleton instance of this class. + * + * @return The singleton instance of this class. + */ ++ (instancetype)sharedInstance; + +@end diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCORRegistrar_Private.h b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCORRegistrar_Private.h new file mode 100644 index 0000000..9f45548 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCORRegistrar_Private.h @@ -0,0 +1,39 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORRegistrar.h" + +@interface GDTCORRegistrar () + +NS_ASSUME_NONNULL_BEGIN + +/** The concurrent queue on which all registration occurs. */ +@property(nonatomic, readonly) dispatch_queue_t registrarQueue; + +/** A map of targets to backend implementations. */ +@property(atomic, readonly) NSMutableDictionary> *targetToUploader; + +/** A map of targets to storage instances. */ +@property(atomic, readonly) + NSMutableDictionary> *targetToStorage; + +/** A map of targets to metrics controller instances. */ +@property(atomic, readonly) + NSMutableDictionary> *targetToMetricsController; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCORStorageMetadata.h b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCORStorageMetadata.h new file mode 100644 index 0000000..90b529e --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCORStorageMetadata.h @@ -0,0 +1,41 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORStorageSizeBytes.h" + +NS_ASSUME_NONNULL_BEGIN + +/// A model object that contains metadata about the current state of the SDK's storage container. +@interface GDTCORStorageMetadata : NSObject + +/// The number of bytes the event cache is consuming in storage. +@property(nonatomic, readonly) GDTCORStorageSizeBytes currentCacheSize; + +/// The maximum number of bytes that the event cache may consume in storage. +@property(nonatomic, readonly) GDTCORStorageSizeBytes maxCacheSize; + +/// Creates a storage metadata object with the provided information. +/// @param currentCacheSize The current number of bytes the event cache is consuming. +/// @param maxCacheSize The current maximum capacity (in bytes) that the event cache may consume. ++ (instancetype)metadataWithCurrentCacheSize:(GDTCORStorageSizeBytes)currentCacheSize + maxCacheSize:(GDTCORStorageSizeBytes)maxCacheSize; + +/// This API is unavailable. +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCORTransformer.h b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCORTransformer.h new file mode 100644 index 0000000..ccca628 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCORTransformer.h @@ -0,0 +1,57 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORLifecycle.h" + +@class GDTCOREvent; + +@protocol GDTCOREventTransformer; + +NS_ASSUME_NONNULL_BEGIN + +/** Manages the transforming of events. It's desirable for this to be its own class + * because running all events through a single instance ensures that transformers are thread-safe. + * Having a per-transport queue to run on isn't sufficient because transformer objects could + * maintain state (or at least, there's nothing to stop them from doing that) and the same instances + * may be used across multiple instances. + */ +@interface GDTCORTransformer : NSObject + +/** Instantiates or returns the event transformer singleton. + * + * @return The singleton instance of the event transformer. + */ ++ (instancetype)sharedInstance; + +/** Writes the result of applying the given transformers' `transformGDTEvent:` method on the given + * event. + * + * @note If the app is suspended, a background task will be created to complete work in-progress, + * but this method will not send any further events until the app is resumed. + * + * @param event The event to apply transformers on. + * @param transformers The list of transformers to apply. + * @param completion A block to run when an event was written to disk or dropped. + */ +- (void)transformEvent:(GDTCOREvent *)event + withTransformers:(nullable NSArray> *)transformers + onComplete:(void (^_Nullable)(BOOL wasWritten, NSError *_Nullable error))completion; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCORTransformer_Private.h b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCORTransformer_Private.h new file mode 100644 index 0000000..bb86407 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCORTransformer_Private.h @@ -0,0 +1,37 @@ +/* + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "GoogleDataTransport/GDTCORLibrary/Private/GDTCORTransformer.h" + +@protocol GDTCORApplicationProtocol; + +NS_ASSUME_NONNULL_BEGIN + +@interface GDTCORTransformer () + +/** The queue on which all work will occur. */ +@property(nonatomic) dispatch_queue_t eventWritingQueue; + +/** The application instance that is used to begin/end background tasks. */ +@property(nonatomic, readonly) id application; + +/** The internal initializer. Should be used in tests only to create an instance with a + * particular(fake) application instance. */ +- (instancetype)initWithApplication:(id)application; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCORTransport_Private.h b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCORTransport_Private.h new file mode 100644 index 0000000..41a1224 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCORTransport_Private.h @@ -0,0 +1,39 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORTransport.h" + +@class GDTCORTransformer; + +NS_ASSUME_NONNULL_BEGIN + +@interface GDTCORTransport () + +/** The mapping identifier that the target backend will use to map the transport bytes to proto. */ +@property(nonatomic) NSString *mappingID; + +/** The transformers that will operate on events sent by this transport. */ +@property(nonatomic) NSArray> *transformers; + +/** The target backend of this transport. */ +@property(nonatomic) NSInteger target; + +/** The transformer instance to used to transform events. Allows injecting a fake during testing. */ +@property(nonatomic) GDTCORTransformer *transformerInstance; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCORUploadBatch.h b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCORUploadBatch.h new file mode 100644 index 0000000..8d1fd11 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCORUploadBatch.h @@ -0,0 +1,37 @@ +/* + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class GDTCOREvent; + +NS_ASSUME_NONNULL_BEGIN + +/// A data object representing a batch of events scheduled for upload. +@interface GDTCORUploadBatch : NSObject + +/// An ID used to identify the batch in the storage. +@property(nonatomic, readonly) NSNumber *batchID; + +/// The collection of the events in the batch. +@property(nonatomic, readonly) NSSet *events; + +/// The default initializer. See also docs for the corresponding properties. +- (instancetype)initWithBatchID:(NSNumber *)batchID events:(NSSet *)events; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCORUploadCoordinator.h b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCORUploadCoordinator.h new file mode 100644 index 0000000..bdac3f3 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCORUploadCoordinator.h @@ -0,0 +1,68 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORLifecycle.h" +#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORRegistrar.h" + +@class GDTCORClock; + +NS_ASSUME_NONNULL_BEGIN + +/** This class connects storage and uploader implementations, providing events to an uploader + * and informing the storage what events were successfully uploaded or not. + */ +@interface GDTCORUploadCoordinator : NSObject + +/** The queue on which all upload coordination will occur. Also used by a dispatch timer. */ +/** Creates and/or returrns the singleton. + * + * @return The singleton instance of this class. + */ ++ (instancetype)sharedInstance; + +/** The queue on which all upload coordination will occur. */ +@property(nonatomic, readonly) dispatch_queue_t coordinationQueue; + +/** A timer that will causes regular checks for events to upload. */ +@property(nonatomic, readonly, nullable) dispatch_source_t timer; + +/** The interval the timer will fire. */ +@property(nonatomic, readonly) uint64_t timerInterval; + +/** Some leeway given to libdispatch for the timer interval event. */ +@property(nonatomic, readonly) uint64_t timerLeeway; + +/** The registrar object the coordinator will use. Generally used for testing. */ +@property(nonatomic) GDTCORRegistrar *registrar; + +/** Forces the backend specified by the target to upload the provided set of events. This should + * only ever happen when the QoS tier of an event requires it. + * + * @param target The target that should force an upload. + */ +- (void)forceUploadForTarget:(GDTCORTarget)target; + +/** Starts the upload timer. */ +- (void)startTimer; + +/** Stops the upload timer from running. */ +- (void)stopTimer; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORClock.h b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORClock.h new file mode 100644 index 0000000..8c75b50 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORClock.h @@ -0,0 +1,66 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** This class manages the device clock and produces snapshots of the current time. */ +@interface GDTCORClock : NSObject + +/** The wallclock time, UTC, in milliseconds. */ +@property(nonatomic, readonly) int64_t timeMillis; + +/** The offset from UTC in seconds. */ +@property(nonatomic, readonly) int64_t timezoneOffsetSeconds; + +/** The kernel boot time when this clock was created in nanoseconds. */ +@property(nonatomic, readonly) int64_t kernelBootTimeNanoseconds; + +/** The device uptime when this clock was created in nanoseconds. */ +@property(nonatomic, readonly) int64_t uptimeNanoseconds; + +@property(nonatomic, readonly) int64_t kernelBootTime DEPRECATED_MSG_ATTRIBUTE( + "Please use `kernelBootTimeNanoseconds` instead"); + +@property(nonatomic, readonly) + int64_t uptime DEPRECATED_MSG_ATTRIBUTE("Please use `uptimeNanoseconds` instead"); + +/** Creates a GDTCORClock object using the current time and offsets. + * + * @return A new GDTCORClock object representing the current time state. + */ ++ (instancetype)snapshot; + +/** Creates a GDTCORClock object representing a time in the future, relative to now. + * + * @param millisInTheFuture The millis in the future from now this clock should represent. + * @return An instance representing a future time. + */ ++ (instancetype)clockSnapshotInTheFuture:(uint64_t)millisInTheFuture; + +/** Compares one clock with another, returns YES if the caller is after the parameter. + * + * @return YES if the calling clock's time is after the given clock's time. + */ +- (BOOL)isAfter:(GDTCORClock *)otherClock; + +/** Returns value of `uptime` property in milliseconds. */ +- (int64_t)uptimeMilliseconds; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORConsoleLogger.h b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORConsoleLogger.h new file mode 100644 index 0000000..1fdf732 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORConsoleLogger.h @@ -0,0 +1,144 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +/** The current logging level. This value and higher will be printed. Declared as volatile to make + * getting and setting atomic. + */ +FOUNDATION_EXPORT volatile NSInteger GDTCORConsoleLoggerLoggingLevel; + +/** A list of logging levels that GDT supports. */ +typedef NS_ENUM(NSInteger, GDTCORLoggingLevel) { + + /** Causes all logs to be printed. */ + GDTCORLoggingLevelDebug = 1, + + /** Causes all non-debug logs to be printed. */ + GDTCORLoggingLevelVerbose = 2, + + /** Causes warnings and errors to be printed. */ + GDTCORLoggingLevelWarnings = 3, + + /** Causes errors to be printed. This is the default value. */ + GDTCORLoggingLevelErrors = 4 +}; + +/** A list of message codes to print in the logger that help to correspond printed messages with + * code locations. + * + * Prefixes: + * - MCD => MessageCodeDebug + * - MCW => MessageCodeWarning + * - MCE => MessageCodeError + */ +typedef NS_ENUM(NSInteger, GDTCORMessageCode) { + + /** For debug logs. */ + GDTCORMCDDebugLog = 0, + + /** For warning messages concerning transportBytes: not being implemented by a data object. */ + GDTCORMCWDataObjectMissingBytesImpl = 1, + + /** For warning messages concerning a failed event upload. */ + GDTCORMCWUploadFailed = 2, + + /** For warning messages concerning a forced event upload. */ + GDTCORMCWForcedUpload = 3, + + /** For warning messages concerning a failed reachability call. */ + GDTCORMCWReachabilityFailed = 4, + + /** For warning messages concerning a database warning. */ + GDTCORMCWDatabaseWarning = 5, + + /** For warning messages concerning the reading of a event file. */ + GDTCORMCWFileReadError = 6, + + /** For error messages concerning transformGDTEvent: not being implemented by an event + transformer. */ + GDTCORMCETransformerDoesntImplementTransform = 1000, + + /** For error messages concerning the creation of a directory failing. */ + GDTCORMCEDirectoryCreationError = 1001, + + /** For error messages concerning the writing of a event file. */ + GDTCORMCEFileWriteError = 1002, + + /** For error messages concerning the lack of a prioritizer for a given backend. */ + GDTCORMCEPrioritizerError = 1003, + + /** For error messages concerning a package delivery API violation. */ + GDTCORMCEDeliverTwice = 1004, + + /** For error messages concerning an error in an implementation of -transportBytes. */ + GDTCORMCETransportBytesError = 1005, + + /** For general purpose error messages in a dependency. */ + GDTCORMCEGeneralError = 1006, + + /** For fatal errors. Please go to https://github.com/firebase/firebase-ios-sdk/issues and open + * an issue if you encounter an error with this code. + */ + GDTCORMCEFatalAssertion = 1007, + + /** For error messages concerning the reading of a event file. */ + GDTCORMCEFileReadError = 1008, + + /** For errors related to running sqlite. */ + GDTCORMCEDatabaseError = 1009, +}; + +/** Prints the given code and format string to the console. + * + * @param code The message code describing the nature of the log. + * @param logLevel The log level of this log. + * @param format The format string. + */ +FOUNDATION_EXPORT +void GDTCORLog(GDTCORMessageCode code, GDTCORLoggingLevel logLevel, NSString *_Nonnull format, ...) + NS_FORMAT_FUNCTION(3, 4); + +/** Prints an assert log to the console. + * + * @param wasFatal Send YES if the assertion should be fatal, NO otherwise. + * @param file The file in which the failure occurred. + * @param line The line number of the failure. + * @param format The format string. + */ +FOUNDATION_EXPORT void GDTCORLogAssert(BOOL wasFatal, + NSString *_Nonnull file, + NSInteger line, + NSString *_Nullable format, + ...) NS_FORMAT_FUNCTION(4, 5); + +/** Returns the string that represents some message code. + * + * @param code The code to convert to a string. + * @return The string representing the message code. + */ +FOUNDATION_EXPORT NSString *_Nonnull GDTCORMessageCodeEnumToString(GDTCORMessageCode code); + +#define GDTCORLogDebug(MESSAGE_FORMAT, ...) \ + GDTCORLog(GDTCORMCDDebugLog, GDTCORLoggingLevelDebug, MESSAGE_FORMAT, __VA_ARGS__); + +// A define to wrap GULLogWarning with slightly more convenient usage. +#define GDTCORLogWarning(MESSAGE_CODE, MESSAGE_FORMAT, ...) \ + GDTCORLog(MESSAGE_CODE, GDTCORLoggingLevelWarnings, MESSAGE_FORMAT, __VA_ARGS__); + +// A define to wrap GULLogError with slightly more convenient usage and a failing assert. +#define GDTCORLogError(MESSAGE_CODE, MESSAGE_FORMAT, ...) \ + GDTCORLog(MESSAGE_CODE, GDTCORLoggingLevelErrors, MESSAGE_FORMAT, __VA_ARGS__); diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCOREndpoints.h b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCOREndpoints.h new file mode 100644 index 0000000..836a454 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCOREndpoints.h @@ -0,0 +1,36 @@ +/* + * Copyright 2018 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import +#import "GDTCORTargets.h" + +NS_ASSUME_NONNULL_BEGIN + +/* Class that manages the endpoints used by Google data transport library. */ +@interface GDTCOREndpoints : NSObject + +- (instancetype)init NS_UNAVAILABLE; + +/** Returns the upload URL for a target specified. If the target is not available, returns nil. + * + * @param target GoogleDataTransport target for which the upload URL is being looked up for. + * @return URL that will be used for uploading the events for the provided target. + */ ++ (nullable NSURL *)uploadURLForTarget:(GDTCORTarget)target; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCOREvent.h b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCOREvent.h new file mode 100644 index 0000000..8ab3601 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCOREvent.h @@ -0,0 +1,102 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "GDTCOREventDataObject.h" +#import "GDTCORTargets.h" + +@class GDTCORClock; +@class GDTCORProductData; + +NS_ASSUME_NONNULL_BEGIN + +/** The different possible quality of service specifiers. High values indicate high priority. */ +typedef NS_ENUM(NSInteger, GDTCOREventQoS) { + /** The QoS tier wasn't set, and won't ever be sent. */ + GDTCOREventQoSUnknown = 0, + + /** This event is internal telemetry data that should not be sent on its own if possible. */ + GDTCOREventQoSTelemetry = 1, + + /** This event should be sent, but in a batch only roughly once per day. */ + GDTCOREventQoSDaily = 2, + + /** This event should be sent when requested by the uploader. */ + GDTCOREventQosDefault = 3, + + /** This event should be sent immediately along with any other data that can be batched. */ + GDTCOREventQoSFast = 4, + + /** This event should only be uploaded on wifi. */ + GDTCOREventQoSWifiOnly = 5, +}; + +@interface GDTCOREvent : NSObject + +/** The unique ID of the event. */ +@property(readonly, nonatomic) NSString *eventID; + +/** The mapping identifier, to allow backends to map the transport bytes to a proto. */ +@property(nullable, readonly, nonatomic) NSString *mappingID; + +/** The identifier for the backend this event will eventually be sent to. */ +@property(readonly, nonatomic) GDTCORTarget target; + +/** The data object encapsulated in the transport of your choice, as long as it implements + * the GDTCOREventDataObject protocol. */ +@property(nullable, nonatomic) id dataObject; + +/** The serialized bytes from calling [dataObject transportBytes]. */ +@property(nullable, readonly, nonatomic) NSData *serializedDataObjectBytes; + +/** The quality of service tier this event belongs to. */ +@property(nonatomic) GDTCOREventQoS qosTier; + +/** The clock snapshot at the time of the event. */ +@property(nonatomic) GDTCORClock *clockSnapshot; + +/** The expiration date of the event. Default is 604800 seconds (7 days) from creation. */ +@property(nonatomic) NSDate *expirationDate; + +/** Bytes that can be used by an uploader later on. */ +@property(nullable, nonatomic) NSData *customBytes; + +/** The product data that the event is associated with, if any. */ +@property(nullable, readonly, nonatomic) GDTCORProductData *productData; + +/** Initializes an instance using the given mapping ID and target. + * + * @param mappingID The mapping identifier. + * @param target The event's target identifier. + * @return An instance of this class. + */ +- (nullable instancetype)initWithMappingID:(NSString *)mappingID target:(GDTCORTarget)target; + +/** Initializes an instance using the given mapping ID, product data, and target. + * + * @param mappingID The mapping identifier. + * @param productData The product data to associate this event with. + * @param target The event's target identifier. + * @return An instance of this class. + */ +- (nullable instancetype)initWithMappingID:(NSString *)mappingID + productData:(nullable GDTCORProductData *)productData + target:(GDTCORTarget)target; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCOREventDataObject.h b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCOREventDataObject.h new file mode 100644 index 0000000..34ef624 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCOREventDataObject.h @@ -0,0 +1,36 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** This protocol defines the common interface that event protos should implement regardless of the + * underlying transport technology (protobuf, nanopb, etc). + */ +@protocol GDTCOREventDataObject + +@required + +/** Returns the serialized proto bytes of the implementing event proto. + * + * @return the serialized proto bytes of the implementing event proto. + */ +- (NSData *)transportBytes; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCOREventTransformer.h b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCOREventTransformer.h new file mode 100644 index 0000000..80dee7d --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCOREventTransformer.h @@ -0,0 +1,38 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class GDTCOREvent; + +NS_ASSUME_NONNULL_BEGIN + +/** Defines the API that event transformers must adopt. */ +@protocol GDTCOREventTransformer + +@required + +/** Transforms an event by applying some logic to it. Events returned can be nil, for example, in + * instances where the event should be sampled. + * + * @param event The event to transform. + * @return A transformed event, or nil if the transformation dropped the event. + */ +- (nullable GDTCOREvent *)transformGDTEvent:(GDTCOREvent *)event; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORProductData.h b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORProductData.h new file mode 100644 index 0000000..ff99822 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORProductData.h @@ -0,0 +1,29 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +@interface GDTCORProductData : NSObject + +/// The product ID. +@property(nonatomic, readonly) int32_t productID; + +/// Initializes an instance using the given product ID. +/// - Parameter productID: A 32-bit integer. +- (instancetype)initWithProductID:(int32_t)productID; + +/// This API is unavailable. +- (instancetype)init NS_UNAVAILABLE; + +@end diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORTargets.h b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORTargets.h new file mode 100644 index 0000000..3163b55 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORTargets.h @@ -0,0 +1,39 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +/** The list of targets supported by the shared transport infrastructure. + * These targets map to a specific backend designed to accept GDT payloads. If + * adding a new target, please use the previous value +1. + */ +typedef NS_ENUM(NSInteger, GDTCORTarget) { + + /** Target used for testing purposes. */ + kGDTCORTargetTest = 999, + + /** Target used by internal clients. See go/firelog for more information. */ + kGDTCORTargetCCT = 1000, + + /** Target mapping to the Firelog backend. See go/firelog for more information. */ + kGDTCORTargetFLL = 1001, + + /** Special-purpose Crashlytics target. Please do not use it without permission. */ + kGDTCORTargetCSH = 1002, + + /** Target used for integration testing. */ + kGDTCORTargetINT = 1003, +}; diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORTransport.h b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORTransport.h new file mode 100644 index 0000000..33d1ba2 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORTransport.h @@ -0,0 +1,101 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "GDTCOREventTransformer.h" +#import "GDTCORTargets.h" + +@class GDTCOREvent; +@class GDTCORProductData; + +NS_ASSUME_NONNULL_BEGIN + +@interface GDTCORTransport : NSObject + +// Please use the designated initializer. +- (instancetype)init NS_UNAVAILABLE; + +/** Initializes a new transport that will send events to the given target backend. + * + * @param mappingID The mapping identifier used by the backend to map the data object transport + * bytes to a proto. + * @param transformers A list of transformers to be applied to events that are sent. + * @param target The target backend of this transport. + * @return A transport that will send events. + */ +- (nullable instancetype)initWithMappingID:(NSString *)mappingID + transformers: + (nullable NSArray> *)transformers + target:(GDTCORTarget)target NS_DESIGNATED_INITIALIZER; + +/** Copies and sends an internal telemetry event. Events sent using this API are lower in priority, + * and sometimes won't be sent on their own. + * + * @note This will convert the event's data object to data and release the original event. + * + * @param event The event to send. + * @param completion A block that will be called when the event has been written or dropped. + */ +- (void)sendTelemetryEvent:(GDTCOREvent *)event + onComplete:(void (^_Nullable)(BOOL wasWritten, NSError *_Nullable error))completion; + +/** Copies and sends an internal telemetry event. Events sent using this API are lower in priority, + * and sometimes won't be sent on their own. + * + * @note This will convert the event's data object to data and release the original event. + * + * @param event The event to send. + */ +- (void)sendTelemetryEvent:(GDTCOREvent *)event; + +/** Copies and sends an SDK service data event. Events send using this API are higher in priority, + * and will cause a network request at some point in the relative near future. + * + * @note This will convert the event's data object to data and release the original event. + * + * @param event The event to send. + * @param completion A block that will be called when the event has been written or dropped. + */ +- (void)sendDataEvent:(GDTCOREvent *)event + onComplete:(void (^_Nullable)(BOOL wasWritten, NSError *_Nullable error))completion; + +/** Copies and sends an SDK service data event. Events send using this API are higher in priority, + * and will cause a network request at some point in the relative near future. + * + * @note This will convert the event's data object to data and release the original event. + * + * @param event The event to send. + */ +- (void)sendDataEvent:(GDTCOREvent *)event; + +/** Creates an event for use by this transport. + * + * @return An event that is suited for use by this transport. + */ +- (GDTCOREvent *)eventForTransport; + +/** + * Creates an event with the given product data for use by this transport. + * + * @param productData The given product data to associate with the created event. + * @return An event that is suited for use by this transport. + */ +- (GDTCOREvent *)eventForTransportWithProductData:(nonnull GDTCORProductData *)productData; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GoogleDataTransport.h b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GoogleDataTransport.h new file mode 100644 index 0000000..b5e83d1 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GoogleDataTransport.h @@ -0,0 +1,25 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "GDTCORClock.h" +#import "GDTCORConsoleLogger.h" +#import "GDTCOREndpoints.h" +#import "GDTCOREvent.h" +#import "GDTCOREventDataObject.h" +#import "GDTCOREventTransformer.h" +#import "GDTCORProductData.h" +#import "GDTCORTargets.h" +#import "GDTCORTransport.h" diff --git a/Pods/GoogleDataTransport/GoogleDataTransport/Resources/PrivacyInfo.xcprivacy b/Pods/GoogleDataTransport/GoogleDataTransport/Resources/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..1e83fa6 --- /dev/null +++ b/Pods/GoogleDataTransport/GoogleDataTransport/Resources/PrivacyInfo.xcprivacy @@ -0,0 +1,30 @@ + + + + + NSPrivacyTracking + + NSPrivacyTrackingDomains + + + NSPrivacyCollectedDataTypes + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypeOtherDiagnosticData + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + NSPrivacyCollectedDataTypePurposeAnalytics + + + + NSPrivacyAccessedAPITypes + + + + + diff --git a/Pods/GoogleDataTransport/LICENSE b/Pods/GoogleDataTransport/LICENSE new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/Pods/GoogleDataTransport/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/Pods/GoogleDataTransport/README.md b/Pods/GoogleDataTransport/README.md new file mode 100644 index 0000000..084c2c0 --- /dev/null +++ b/Pods/GoogleDataTransport/README.md @@ -0,0 +1,236 @@ +[![Version](https://img.shields.io/cocoapods/v/GoogleDataTransport.svg?style=flat)](https://cocoapods.org/pods/GoogleDataTransport) +[![License](https://img.shields.io/cocoapods/l/GoogleDataTransport.svg?style=flat)](https://cocoapods.org/pods/GoogleDataTransport) +[![Platform](https://img.shields.io/cocoapods/p/GoogleDataTransport.svg?style=flat)](https://cocoapods.org/pods/GoogleDataTransport) + +[![Actions Status][gh-datatransport-badge]][gh-actions] + +# GoogleDataTransport + +This library is for internal Google use only. It allows the logging of data and +telemetry from Google SDKs. + +## Integration Testing +These instructions apply to minor and patch version updates. Major versions need +a customized adaptation. + +After the CI is green: +* Determine the next version for release by checking the + [tagged releases](https://github.com/google/GoogleDataTransport/tags). + Ensure that the next release version keeps the Swift PM and CocoaPods versions in sync. +* Verify that the releasing version is the latest entry in the [CHANGELOG.md](CHANGELOG.md), + updating it if necessary. +* Update the version in the podspec to match the latest entry in the [CHANGELOG.md](CHANGELOG.md) +* Checkout the `main` branch and ensure it is up to date. + ```console + git checkout main + git pull + ``` +* Add the CocoaPods tag (`{version}` will be the latest version in the [podspec](GoogleDataTransport.podspec#L3)) + ```console + git tag CocoaPods-{version} + git push origin CocoaPods-{version} + ``` +* Push the podspec to the designated repo + * If this version of GDT is intended to launch **before or with** the next Firebase release: +
+ Push to SpecsStaging + + ```console + pod repo push --skip-tests --use-json staging GoogleDataTransport.podspec + ``` + + If the command fails with `Unable to find the 'staging' repo.`, add the staging repo with: + ```console + pod repo add staging git@github.com:firebase/SpecsStaging.git + ``` +
+ * Otherwise: +
+ Push to SpecsDev + + ```console + pod repo push --skip-tests --use-json dev GoogleDataTransport.podspec + ``` + + If the command fails with `Unable to find the 'dev' repo.`, add the dev repo with: + ```console + pod repo add dev git@github.com:firebase/SpecsDev.git + ``` +
+* Run Firebase CI by waiting until next nightly or adding a PR that touches `Gemfile`. +* On google3, create a workspace and new CL. Then copybara and run a global TAP. +
+  /google/data/ro/teams/copybara/copybara third_party/firebase/ios/Releases/GoogleDataTransport/copy.bara.sky \
+  --piper-description-behavior=OVERWRITE \
+  --destination-cl=YOUR_CL gdt
+  
+ +## Publishing +The release process is as follows: +1. [Tag and release for Swift PM](#swift-package-manager) +2. [Publish to CocoaPods](#cocoapods) +3. [Create GitHub Release](#create-github-release) +4. [Perform post release cleanup](#post-release-cleanup) + +### Swift Package Manager + By creating and [pushing a tag](https://github.com/google/GoogleDataTransport/tags) + for Swift PM, the newly tagged version will be immediately released for public use. + Given this, please verify the intended time of release for Swift PM. + * Add a version tag for Swift PM + ```console + git tag {version} + git push origin {version} + ``` + *Note: Ensure that any inflight PRs that depend on the new `GoogleDataTransport` version are updated to point to the + newly tagged version rather than a checksum.* + +### CocoaPods +* Publish the newly versioned pod to CocoaPods + + It's recommended to point to the `GoogleDataTransport.podspec` in `staging` to make sure the correct spec is being published. + + > [!WARNING] + > Manually update your local SpecsStaging clone or run `pod repo update` + > before proceeding. + + ```console + pod trunk push ~/.cocoapods/repos/staging/GoogleDataTransport/{version}/GoogleDataTransport.podspec.json --skip-tests + ``` + + The pod push was successful if the above command logs: `🚀 GoogleDataTransport ({version}) successfully published`. + In addition, a new commit that publishes the new version (co-authored by [CocoaPodsAtGoogle](https://github.com/CocoaPodsAtGoogle)) + should appear in the [CocoaPods specs repo](https://github.com/CocoaPods/Specs). Last, the latest version should be displayed + on [GoogleDataTransport's CocoaPods page](https://cocoapods.org/pods/GoogleDataTransport). + +### [Create GitHub Release](https://github.com/google/GoogleDataTransport/releases/new/) + Update the [release template](https://github.com/google/GoogleDataTransport/releases/new/)'s **Tag version** and **Release title** + fields with the latest version. In addition, reference the [Release Notes](./CHANGELOG.md) in the release's description. + + See [this release](https://github.com/google/GoogleDataTransport/releases/edit/9.0.1) for an example. + + *Don't forget to perform the [post release cleanup](#post-release-cleanup)!* + +### Post Release Cleanup +
+ Clean up SpecsStaging + + ```console + pwd=$(pwd) + mkdir -p /tmp/release-cleanup && cd $_ + git clone git@github.com:firebase/SpecsStaging.git + cd SpecsStaging/ + git rm -rf GoogleDataTransport/ + git commit -m "Post publish cleanup" + git push origin master + rm -rf /tmp/release-cleanup + cd $pwd + ``` +
+ +## Set logging level + +### Swift + +- Import `GoogleDataTransport` module: + ```swift + import GoogleDataTransport + ``` +- Set logging level global variable to the desired value before calling `FirebaseApp.configure()`: + ```swift + GDTCORConsoleLoggerLoggingLevel = GDTCORLoggingLevel.debug.rawValue + ``` +### Objective-C + +- Import `GoogleDataTransport`: + ```objective-c + #import + ``` +- Set logging level global variable to the desired value before calling `-[FIRApp configure]`: + ```objective-c + GDTCORConsoleLoggerLoggingLevel = GDTCORLoggingLevelDebug; + ``` + +## Prereqs + +- `gem install --user cocoapods cocoapods-generate` +- `brew install protobuf nanopb-generator` +- `easy_install --user protobuf` + +## To develop + +- Run `./GoogleDataTransport/generate_project.sh` after installing the prereqs + +## When adding new logging endpoint + +- Use commands similar to: + - `python -c "line='https://www.firebase.com'; print line[0::2]" ` + - `python -c "line='https://www.firebase.com'; print line[1::2]" ` + +## When adding internal code that shouldn't be easily usable on github + +- Consider using go/copybara-library/scrubbing#cc_scrub + +## Development + +Ensure that you have at least the following software: + + * Xcode 12.0 (or later) + * CocoaPods 1.10.0 (or later) + * [CocoaPods generate](https://github.com/square/cocoapods-generate) + +For the pod that you want to develop: + +`pod gen GoogleDataTransport.podspec --local-sources=./ --auto-open --platforms=ios` + +Note: If the CocoaPods cache is out of date, you may need to run +`pod repo update` before the `pod gen` command. + +Note: Set the `--platforms` option to `macos` or `tvos` to develop/test for +those platforms. Since 10.2, Xcode does not properly handle multi-platform +CocoaPods workspaces. + +### Development for Catalyst +* `pod gen GoogleDataTransport.podspec --local-sources=./ --auto-open --platforms=ios` +* Check the Mac box in the App-iOS Build Settings +* Sign the App in the Settings Signing & Capabilities tab +* Click Pods in the Project Manager +* Add Signing to the iOS host app and unit test targets +* Select the Unit-unit scheme +* Run it to build and test + +Alternatively disable signing in each target: +* Go to Build Settings tab +* Click `+` +* Select `Add User-Defined Setting` +* Add `CODE_SIGNING_REQUIRED` setting with a value of `NO` + +### Code Formatting + +To ensure that the code is formatted consistently, run the script +[./scripts/check.sh](https://github.com/firebase/firebase-ios-sdk/blob/main/scripts/check.sh) +before creating a PR. + +GitHub Actions will verify that any code changes are done in a style compliant +way. Install `clang-format` and `mint`: + +```console +brew install clang-format@18 +brew install mint +``` + +### Running Unit Tests + +Select a scheme and press Command-u to build a component and run its unit tests. + +## Contributing + +See [Contributing](CONTRIBUTING.md) for more information on contributing to the Firebase +iOS SDK. + +## License + +The contents of this repository is licensed under the +[Apache License, version 2.0](http://www.apache.org/licenses/LICENSE-2.0). + +[gh-actions]: https://github.com/firebase/firebase-ios-sdk/actions +[gh-datatransport-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/datatransport/badge.svg diff --git a/Pods/GoogleUtilities/GoogleUtilities/AppDelegateSwizzler/GULAppDelegateSwizzler.m b/Pods/GoogleUtilities/GoogleUtilities/AppDelegateSwizzler/GULAppDelegateSwizzler.m new file mode 100644 index 0000000..3b7280e --- /dev/null +++ b/Pods/GoogleUtilities/GoogleUtilities/AppDelegateSwizzler/GULAppDelegateSwizzler.m @@ -0,0 +1,1023 @@ +// Copyright 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +#import "GoogleUtilities/AppDelegateSwizzler/Internal/GULAppDelegateSwizzler_Private.h" +#import "GoogleUtilities/AppDelegateSwizzler/Public/GoogleUtilities/GULAppDelegateSwizzler.h" +#import "GoogleUtilities/Common/GULLoggerCodes.h" +#import "GoogleUtilities/Environment/Public/GoogleUtilities/GULAppEnvironmentUtil.h" +#import "GoogleUtilities/Logger/Public/GoogleUtilities/GULLogger.h" +#import "GoogleUtilities/Network/Public/GoogleUtilities/GULMutableDictionary.h" + +#import +#import + +// Implementations need to be typed before calling the implementation directly to cast the +// arguments and the return types correctly. Otherwise, it will crash the app. +typedef BOOL (*GULRealOpenURLSourceApplicationAnnotationIMP)( + id, SEL, GULApplication *, NSURL *, NSString *, id); + +typedef BOOL (*GULRealOpenURLOptionsIMP)( + id, SEL, GULApplication *, NSURL *, NSDictionary *); + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wstrict-prototypes" +typedef void (*GULRealHandleEventsForBackgroundURLSessionIMP)( + id, SEL, GULApplication *, NSString *, void (^)()); +#pragma clang diagnostic pop + +typedef BOOL (*GULRealContinueUserActivityIMP)( + id, SEL, GULApplication *, NSUserActivity *, void (^)(NSArray *restorableObjects)); + +typedef void (*GULRealDidRegisterForRemoteNotificationsIMP)(id, SEL, GULApplication *, NSData *); + +typedef void (*GULRealDidFailToRegisterForRemoteNotificationsIMP)(id, + SEL, + GULApplication *, + NSError *); + +typedef void (*GULRealDidReceiveRemoteNotificationIMP)(id, SEL, GULApplication *, NSDictionary *); + +#if !TARGET_OS_WATCH && !TARGET_OS_OSX +typedef void (*GULRealDidReceiveRemoteNotificationWithCompletionIMP)( + id, SEL, GULApplication *, NSDictionary *, void (^)(UIBackgroundFetchResult)); +#endif // !TARGET_OS_WATCH && !TARGET_OS_OSX + +typedef void (^GULAppDelegateInterceptorCallback)(id); + +// The strings below are the keys for associated objects. +static char const *const kGULRealIMPBySelectorKey = "GUL_realIMPBySelector"; +static char const *const kGULRealClassKey = "GUL_realClass"; + +static NSString *const kGULAppDelegateKeyPath = @"delegate"; + +static GULLoggerService kGULLoggerSwizzler = @"[GoogleUtilities/AppDelegateSwizzler]"; + +// Since Firebase SDKs also use this for app delegate proxying, in order to not be a breaking change +// we disable App Delegate proxying when either of these two flags are set to NO. + +/** Plist key that allows Firebase developers to disable App and Scene Delegate Proxying. */ +static NSString *const kGULFirebaseAppDelegateProxyEnabledPlistKey = + @"FirebaseAppDelegateProxyEnabled"; + +/** Plist key that allows developers not using Firebase to disable App and Scene Delegate Proxying. + */ +static NSString *const kGULGoogleUtilitiesAppDelegateProxyEnabledPlistKey = + @"GoogleUtilitiesAppDelegateProxyEnabled"; + +/** The prefix of the App Delegate. */ +static NSString *const kGULAppDelegatePrefix = @"GUL_"; + +/** The original instance of App Delegate. */ +static id gOriginalAppDelegate; + +/** The original App Delegate class */ +static Class gOriginalAppDelegateClass; + +/** The subclass of the original App Delegate. */ +static Class gAppDelegateSubclass; + +/** Remote notification methods selectors + * + * We have to opt out of referencing APNS related App Delegate methods directly to prevent + * an Apple review warning email about missing Push Notification Entitlement + * (like here: https://github.com/firebase/firebase-ios-sdk/issues/2807). From our experience, the + * warning is triggered when any of the symbols is present in the application sent to review, even + * if the code is never executed. Because GULAppDelegateSwizzler may be used by applications that + * are not using APNS we have to refer to the methods indirectly using selector constructed from + * string. + * + * NOTE: None of the methods is proxied unless it is explicitly requested by calling the method + * +[GULAppDelegateSwizzler proxyOriginalDelegateIncludingAPNSMethods] + */ +static NSString *const kGULDidRegisterForRemoteNotificationsSEL = + @"application:didRegisterForRemoteNotificationsWithDeviceToken:"; +static NSString *const kGULDidFailToRegisterForRemoteNotificationsSEL = + @"application:didFailToRegisterForRemoteNotificationsWithError:"; +static NSString *const kGULDidReceiveRemoteNotificationWithCompletionSEL = + @"application:didReceiveRemoteNotification:fetchCompletionHandler:"; + +/** + * This class is necessary to store the delegates in an NSArray without retaining them. + * [NSValue valueWithNonRetainedObject] also provides this functionality, but does not provide a + * zeroing pointer. This will cause EXC_BAD_ACCESS when trying to access the object after it is + * dealloced. Instead, this container stores a weak, zeroing reference to the object, which + * automatically is set to nil by the runtime when the object is dealloced. + */ +@interface GULZeroingWeakContainer : NSObject + +/** Stores a weak object. */ +@property(nonatomic, weak) id object; + +@end + +@implementation GULZeroingWeakContainer +@end + +@interface GULAppDelegateObserver : NSObject +@end + +@implementation GULAppDelegateObserver { + BOOL _isObserving; +} + ++ (GULAppDelegateObserver *)sharedInstance { + static GULAppDelegateObserver *instance; + static dispatch_once_t once; + dispatch_once(&once, ^{ + instance = [[GULAppDelegateObserver alloc] init]; + }); + return instance; +} + +- (void)observeUIApplication { + if (_isObserving) { + return; + } + [[GULAppDelegateSwizzler sharedApplication] + addObserver:self + forKeyPath:kGULAppDelegateKeyPath + options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld + context:nil]; + _isObserving = YES; +} + +- (void)observeValueForKeyPath:(NSString *)keyPath + ofObject:(id)object + change:(NSDictionary *)change + context:(void *)context { + if ([keyPath isEqual:kGULAppDelegateKeyPath]) { + id newValue = change[NSKeyValueChangeNewKey]; + id oldValue = change[NSKeyValueChangeOldKey]; + if ([newValue isEqual:oldValue]) { + return; + } + // Free the stored app delegate instance because it has been changed to a different instance to + // avoid keeping it alive forever. + if ([oldValue isEqual:gOriginalAppDelegate]) { + gOriginalAppDelegate = nil; + // Remove the observer. Parse it to NSObject to avoid warning. + [[GULAppDelegateSwizzler sharedApplication] removeObserver:self + forKeyPath:kGULAppDelegateKeyPath]; + _isObserving = NO; + } + } +} + +@end + +@implementation GULAppDelegateSwizzler + +static dispatch_once_t sProxyAppDelegateOnceToken; +static dispatch_once_t sProxyAppDelegateRemoteNotificationOnceToken; + +#pragma mark - Public methods + ++ (BOOL)isAppDelegateProxyEnabled { + NSDictionary *infoDictionary = [NSBundle mainBundle].infoDictionary; + + id isFirebaseProxyEnabledPlistValue = infoDictionary[kGULFirebaseAppDelegateProxyEnabledPlistKey]; + id isGoogleProxyEnabledPlistValue = + infoDictionary[kGULGoogleUtilitiesAppDelegateProxyEnabledPlistKey]; + + // Enabled by default. + BOOL isFirebaseAppDelegateProxyEnabled = YES; + BOOL isGoogleUtilitiesAppDelegateProxyEnabled = YES; + + if ([isFirebaseProxyEnabledPlistValue isKindOfClass:[NSNumber class]]) { + isFirebaseAppDelegateProxyEnabled = [isFirebaseProxyEnabledPlistValue boolValue]; + } + + if ([isGoogleProxyEnabledPlistValue isKindOfClass:[NSNumber class]]) { + isGoogleUtilitiesAppDelegateProxyEnabled = [isGoogleProxyEnabledPlistValue boolValue]; + } + + // Only deactivate the proxy if it is explicitly disabled by app developers using either one of + // the plist flags. + return isFirebaseAppDelegateProxyEnabled && isGoogleUtilitiesAppDelegateProxyEnabled; +} + ++ (GULAppDelegateInterceptorID)registerAppDelegateInterceptor: + (id)interceptor { + NSAssert(interceptor, @"AppDelegateProxy cannot add nil interceptor"); + NSAssert([interceptor conformsToProtocol:@protocol(GULApplicationDelegate)], + @"AppDelegateProxy interceptor does not conform to UIApplicationDelegate"); + + if (!interceptor) { + GULOSLogError(kGULLogSubsystem, kGULLoggerSwizzler, NO, + [NSString stringWithFormat:@"I-SWZ%06ld", + (long)kGULSwizzlerMessageCodeAppDelegateSwizzling000], + @"AppDelegateProxy cannot add nil interceptor."); + return nil; + } + if (![interceptor conformsToProtocol:@protocol(GULApplicationDelegate)]) { + GULOSLogError(kGULLogSubsystem, kGULLoggerSwizzler, NO, + [NSString stringWithFormat:@"I-SWZ%06ld", + (long)kGULSwizzlerMessageCodeAppDelegateSwizzling001], + @"AppDelegateProxy interceptor does not conform to UIApplicationDelegate"); + return nil; + } + + // The ID should be the same given the same interceptor object. + NSString *interceptorID = [NSString stringWithFormat:@"%@%p", kGULAppDelegatePrefix, interceptor]; + if (!interceptorID.length) { + GULOSLogError(kGULLogSubsystem, kGULLoggerSwizzler, NO, + [NSString stringWithFormat:@"I-SWZ%06ld", + (long)kGULSwizzlerMessageCodeAppDelegateSwizzling002], + @"AppDelegateProxy cannot create Interceptor ID."); + return nil; + } + GULZeroingWeakContainer *weakObject = [[GULZeroingWeakContainer alloc] init]; + weakObject.object = interceptor; + [GULAppDelegateSwizzler interceptors][interceptorID] = weakObject; + return interceptorID; +} + ++ (void)unregisterAppDelegateInterceptorWithID:(GULAppDelegateInterceptorID)interceptorID { + NSAssert(interceptorID, @"AppDelegateProxy cannot unregister nil interceptor ID."); + NSAssert(((NSString *)interceptorID).length != 0, + @"AppDelegateProxy cannot unregister empty interceptor ID."); + + if (!interceptorID) { + GULOSLogError(kGULLogSubsystem, kGULLoggerSwizzler, NO, + [NSString stringWithFormat:@"I-SWZ%06ld", + (long)kGULSwizzlerMessageCodeAppDelegateSwizzling003], + @"AppDelegateProxy cannot unregister empty interceptor ID."); + return; + } + + GULZeroingWeakContainer *weakContainer = [GULAppDelegateSwizzler interceptors][interceptorID]; + if (!weakContainer.object) { + GULOSLogError(kGULLogSubsystem, kGULLoggerSwizzler, NO, + [NSString stringWithFormat:@"I-SWZ%06ld", + (long)kGULSwizzlerMessageCodeAppDelegateSwizzling004], + @"AppDelegateProxy cannot unregister interceptor that was not registered. " + "Interceptor ID %@", + interceptorID); + return; + } + + [[GULAppDelegateSwizzler interceptors] removeObjectForKey:interceptorID]; +} + ++ (void)proxyOriginalDelegate { + if ([GULAppEnvironmentUtil isAppExtension]) { + return; + } + + dispatch_once(&sProxyAppDelegateOnceToken, ^{ + id originalDelegate = + [GULAppDelegateSwizzler sharedApplication].delegate; + [GULAppDelegateSwizzler proxyAppDelegate:originalDelegate]; + }); +} + ++ (void)proxyOriginalDelegateIncludingAPNSMethods { + if ([GULAppEnvironmentUtil isAppExtension]) { + return; + } + + [self proxyOriginalDelegate]; + + dispatch_once(&sProxyAppDelegateRemoteNotificationOnceToken, ^{ + id appDelegate = [GULAppDelegateSwizzler sharedApplication].delegate; + + NSMutableDictionary *realImplementationsBySelector = + [objc_getAssociatedObject(appDelegate, &kGULRealIMPBySelectorKey) mutableCopy]; + + [self proxyRemoteNotificationsMethodsWithAppDelegateSubClass:gAppDelegateSubclass + realClass:gOriginalAppDelegateClass + appDelegate:appDelegate + realImplementationsBySelector:realImplementationsBySelector]; + + objc_setAssociatedObject(appDelegate, &kGULRealIMPBySelectorKey, + [realImplementationsBySelector copy], OBJC_ASSOCIATION_RETAIN); + [self reassignAppDelegate]; + }); +} + +#pragma mark - Create proxy + ++ (GULApplication *)sharedApplication { + if ([GULAppEnvironmentUtil isAppExtension]) { + return nil; + } + id sharedApplication = nil; + Class uiApplicationClass = NSClassFromString(kGULApplicationClassName); + if (uiApplicationClass && + [uiApplicationClass respondsToSelector:(NSSelectorFromString(@"sharedApplication"))]) { + sharedApplication = [uiApplicationClass sharedApplication]; + } + return sharedApplication; +} + +#pragma mark - Override default methods + +/** Creates a new subclass of the class of the given object and sets the isa value of the given + * object to the new subclass. Additionally this copies methods to that new subclass that allow us + * to intercept UIApplicationDelegate methods. This is better known as isa swizzling. + * + * @param appDelegate The object to which you want to isa swizzle. This has to conform to the + * UIApplicationDelegate subclass. + * @return Returns the new subclass. + */ ++ (nullable Class)createSubclassWithObject:(id)appDelegate { + Class realClass = [appDelegate class]; + + // Create GUL__ + NSString *classNameWithPrefix = + [kGULAppDelegatePrefix stringByAppendingString:NSStringFromClass(realClass)]; + NSString *newClassName = + [NSString stringWithFormat:@"%@-%@", classNameWithPrefix, [NSUUID UUID].UUIDString]; + + if (NSClassFromString(newClassName)) { + GULOSLogError( + kGULLogSubsystem, kGULLoggerSwizzler, NO, + [NSString + stringWithFormat:@"I-SWZ%06ld", (long)kGULSwizzlerMessageCodeAppDelegateSwizzling005], + @"Cannot create a proxy for App Delegate. Subclass already exists. Original Class: " + @"%@, subclass: %@", + NSStringFromClass(realClass), newClassName); + return nil; + } + + // Register the new class as subclass of the real one. Do not allocate more than the real class + // size. + Class appDelegateSubClass = objc_allocateClassPair(realClass, newClassName.UTF8String, 0); + if (appDelegateSubClass == Nil) { + GULOSLogError( + kGULLogSubsystem, kGULLoggerSwizzler, NO, + [NSString + stringWithFormat:@"I-SWZ%06ld", (long)kGULSwizzlerMessageCodeAppDelegateSwizzling006], + @"Cannot create a proxy for App Delegate. Subclass already exists. Original Class: " + @"%@, subclass: Nil", + NSStringFromClass(realClass)); + return nil; + } + + NSMutableDictionary *realImplementationsBySelector = + [[NSMutableDictionary alloc] init]; + + // For application:continueUserActivity:restorationHandler: + SEL continueUserActivitySEL = @selector(application:continueUserActivity:restorationHandler:); + [self proxyDestinationSelector:continueUserActivitySEL + implementationsFromSourceSelector:continueUserActivitySEL + fromClass:[GULAppDelegateSwizzler class] + toClass:appDelegateSubClass + realClass:realClass + storeDestinationImplementationTo:realImplementationsBySelector]; + +#if TARGET_OS_IOS || TARGET_OS_TV + // Add the following methods from GULAppDelegate class, and store the real implementation so it + // can forward to the real one. + // For application:openURL:options: + SEL applicationOpenURLOptionsSEL = @selector(application:openURL:options:); + if ([appDelegate respondsToSelector:applicationOpenURLOptionsSEL]) { + // Only add the application:openURL:options: method if the original AppDelegate implements it. + // This fixes a bug if an app only implements application:openURL:sourceApplication:annotation: + // (if we add the `options` method, iOS sees that one exists and does not call the + // `sourceApplication` method, which in this case is the only one the app implements). + + [self proxyDestinationSelector:applicationOpenURLOptionsSEL + implementationsFromSourceSelector:applicationOpenURLOptionsSEL + fromClass:[GULAppDelegateSwizzler class] + toClass:appDelegateSubClass + realClass:realClass + storeDestinationImplementationTo:realImplementationsBySelector]; + } + + // For application:handleEventsForBackgroundURLSession:completionHandler: + SEL handleEventsForBackgroundURLSessionSEL = @selector(application: + handleEventsForBackgroundURLSession:completionHandler:); + [self proxyDestinationSelector:handleEventsForBackgroundURLSessionSEL + implementationsFromSourceSelector:handleEventsForBackgroundURLSessionSEL + fromClass:[GULAppDelegateSwizzler class] + toClass:appDelegateSubClass + realClass:realClass + storeDestinationImplementationTo:realImplementationsBySelector]; +#endif // TARGET_OS_IOS || TARGET_OS_TV + +#if TARGET_OS_IOS + // For application:openURL:sourceApplication:annotation: + SEL openURLSourceApplicationAnnotationSEL = @selector(application: + openURL:sourceApplication:annotation:); + + [self proxyDestinationSelector:openURLSourceApplicationAnnotationSEL + implementationsFromSourceSelector:openURLSourceApplicationAnnotationSEL + fromClass:[GULAppDelegateSwizzler class] + toClass:appDelegateSubClass + realClass:realClass + storeDestinationImplementationTo:realImplementationsBySelector]; +#endif // TARGET_OS_IOS + + // Override the description too so the custom class name will not show up. + [GULAppDelegateSwizzler addInstanceMethodWithDestinationSelector:@selector(description) + withImplementationFromSourceSelector:@selector(fakeDescription) + fromClass:[self class] + toClass:appDelegateSubClass]; + + // Store original implementations to a fake property of the original delegate. + objc_setAssociatedObject(appDelegate, &kGULRealIMPBySelectorKey, + [realImplementationsBySelector copy], OBJC_ASSOCIATION_RETAIN_NONATOMIC); + objc_setAssociatedObject(appDelegate, &kGULRealClassKey, realClass, + OBJC_ASSOCIATION_RETAIN_NONATOMIC); + + // The subclass size has to be exactly the same size with the original class size. The subclass + // cannot have more ivars/properties than its superclass since it will cause an offset in memory + // that can lead to overwriting the isa of an object in the next frame. + if (class_getInstanceSize(realClass) != class_getInstanceSize(appDelegateSubClass)) { + GULOSLogError( + kGULLogSubsystem, kGULLoggerSwizzler, NO, + [NSString + stringWithFormat:@"I-SWZ%06ld", (long)kGULSwizzlerMessageCodeAppDelegateSwizzling007], + @"Cannot create subclass of App Delegate, because the created subclass is not the " + @"same size. %@", + NSStringFromClass(realClass)); + NSAssert(NO, @"Classes must be the same size to swizzle isa"); + return nil; + } + + // Make the newly created class to be the subclass of the real App Delegate class. + objc_registerClassPair(appDelegateSubClass); + if (object_setClass(appDelegate, appDelegateSubClass)) { + GULOSLogDebug(kGULLogSubsystem, kGULLoggerSwizzler, NO, + [NSString stringWithFormat:@"I-SWZ%06ld", + (long)kGULSwizzlerMessageCodeAppDelegateSwizzling008], + @"Successfully created App Delegate Proxy automatically. To disable the " + @"proxy, set the flag %@ to NO (Boolean) in the Info.plist", + [GULAppDelegateSwizzler correctAppDelegateProxyKey]); + } + + return appDelegateSubClass; +} + ++ (void)proxyRemoteNotificationsMethodsWithAppDelegateSubClass:(Class)appDelegateSubClass + realClass:(Class)realClass + appDelegate:(id)appDelegate + realImplementationsBySelector: + (NSMutableDictionary *)realImplementationsBySelector { + if (realClass == nil || appDelegateSubClass == nil || appDelegate == nil || + realImplementationsBySelector == nil) { + // The App Delegate has not been swizzled. + return; + } + + // For application:didRegisterForRemoteNotificationsWithDeviceToken: + SEL didRegisterForRemoteNotificationsSEL = + NSSelectorFromString(kGULDidRegisterForRemoteNotificationsSEL); + SEL didRegisterForRemoteNotificationsDonorSEL = @selector(application: + donor_didRegisterForRemoteNotificationsWithDeviceToken:); + + [self proxyDestinationSelector:didRegisterForRemoteNotificationsSEL + implementationsFromSourceSelector:didRegisterForRemoteNotificationsDonorSEL + fromClass:[GULAppDelegateSwizzler class] + toClass:appDelegateSubClass + realClass:realClass + storeDestinationImplementationTo:realImplementationsBySelector]; + + // For application:didFailToRegisterForRemoteNotificationsWithError: + SEL didFailToRegisterForRemoteNotificationsSEL = + NSSelectorFromString(kGULDidFailToRegisterForRemoteNotificationsSEL); + SEL didFailToRegisterForRemoteNotificationsDonorSEL = @selector(application: + donor_didFailToRegisterForRemoteNotificationsWithError:); + + [self proxyDestinationSelector:didFailToRegisterForRemoteNotificationsSEL + implementationsFromSourceSelector:didFailToRegisterForRemoteNotificationsDonorSEL + fromClass:[GULAppDelegateSwizzler class] + toClass:appDelegateSubClass + realClass:realClass + storeDestinationImplementationTo:realImplementationsBySelector]; + + // For application:didReceiveRemoteNotification:fetchCompletionHandler: +#if !TARGET_OS_WATCH && !TARGET_OS_OSX + SEL didReceiveRemoteNotificationWithCompletionSEL = + NSSelectorFromString(kGULDidReceiveRemoteNotificationWithCompletionSEL); + SEL didReceiveRemoteNotificationWithCompletionDonorSEL = + @selector(application:donor_didReceiveRemoteNotification:fetchCompletionHandler:); + [self proxyDestinationSelector:didReceiveRemoteNotificationWithCompletionSEL + implementationsFromSourceSelector:didReceiveRemoteNotificationWithCompletionDonorSEL + fromClass:[GULAppDelegateSwizzler class] + toClass:appDelegateSubClass + realClass:realClass + storeDestinationImplementationTo:realImplementationsBySelector]; +#endif // !TARGET_OS_WATCH && !TARGET_OS_OSX +} + +/// We have to do this to invalidate the cache that caches the original respondsToSelector of +/// openURL handlers. Without this, it won't call the default implementations because the system +/// checks and caches them. +/// Register KVO only once. Otherwise, the observing method will be called as many times as +/// being registered. ++ (void)reassignAppDelegate { +#if !TARGET_OS_WATCH + id delegate = [self sharedApplication].delegate; + [self sharedApplication].delegate = nil; + [self sharedApplication].delegate = delegate; + gOriginalAppDelegate = delegate; + [[GULAppDelegateObserver sharedInstance] observeUIApplication]; +#endif +} + +#pragma mark - Helper methods + ++ (GULMutableDictionary *)interceptors { + static dispatch_once_t onceToken; + static GULMutableDictionary *sInterceptors; + dispatch_once(&onceToken, ^{ + sInterceptors = [[GULMutableDictionary alloc] init]; + }); + return sInterceptors; +} + ++ (nullable NSValue *)originalImplementationForSelector:(SEL)selector object:(id)object { + NSDictionary *realImplementationBySelector = + objc_getAssociatedObject(object, &kGULRealIMPBySelectorKey); + return realImplementationBySelector[NSStringFromSelector(selector)]; +} + ++ (void)proxyDestinationSelector:(SEL)destinationSelector + implementationsFromSourceSelector:(SEL)sourceSelector + fromClass:(Class)sourceClass + toClass:(Class)destinationClass + realClass:(Class)realClass + storeDestinationImplementationTo: + (NSMutableDictionary *)destinationImplementationsBySelector { + [self addInstanceMethodWithDestinationSelector:destinationSelector + withImplementationFromSourceSelector:sourceSelector + fromClass:sourceClass + toClass:destinationClass]; + IMP sourceImplementation = + [GULAppDelegateSwizzler implementationOfMethodSelector:destinationSelector + fromClass:realClass]; + NSValue *sourceImplementationPointer = [NSValue valueWithPointer:sourceImplementation]; + + NSString *destinationSelectorString = NSStringFromSelector(destinationSelector); + destinationImplementationsBySelector[destinationSelectorString] = sourceImplementationPointer; +} + +/** Copies a method identified by the methodSelector from one class to the other. After this method + * is called, performing [toClassInstance methodSelector] will be similar to calling + * [fromClassInstance methodSelector]. This method does nothing if toClass already has a method + * identified by methodSelector. + * + * @param methodSelector The SEL that identifies both the method on the fromClass as well as the + * one on the toClass. + * @param fromClass The class from which a method is sourced. + * @param toClass The class to which the method is added. If the class already has a method with + * the same selector, this has no effect. + */ ++ (void)addInstanceMethodWithSelector:(SEL)methodSelector + fromClass:(Class)fromClass + toClass:(Class)toClass { + [self addInstanceMethodWithDestinationSelector:methodSelector + withImplementationFromSourceSelector:methodSelector + fromClass:fromClass + toClass:toClass]; +} + +/** Copies a method identified by the sourceSelector from the fromClass as a method for the + * destinationSelector on the toClass. After this method is called, performing + * [toClassInstance destinationSelector] will be similar to calling + * [fromClassInstance sourceSelector]. This method does nothing if toClass already has a method + * identified by destinationSelector. + * + * @param destinationSelector The SEL that identifies the method on the toClass. + * @param sourceSelector The SEL that identifies the method on the fromClass. + * @param fromClass The class from which a method is sourced. + * @param toClass The class to which the method is added. If the class already has a method with + * the same selector, this has no effect. + */ ++ (void)addInstanceMethodWithDestinationSelector:(SEL)destinationSelector + withImplementationFromSourceSelector:(SEL)sourceSelector + fromClass:(Class)fromClass + toClass:(Class)toClass { + Method method = class_getInstanceMethod(fromClass, sourceSelector); + IMP methodIMP = method_getImplementation(method); + const char *types = method_getTypeEncoding(method); + if (!class_addMethod(toClass, destinationSelector, methodIMP, types)) { + GULOSLogWarning( + kGULLogSubsystem, kGULLoggerSwizzler, NO, + [NSString + stringWithFormat:@"I-SWZ%06ld", (long)kGULSwizzlerMessageCodeAppDelegateSwizzling009], + @"Cannot copy method to destination selector %@ as it already exists", + NSStringFromSelector(destinationSelector)); + } +} + +/** Gets the IMP of the instance method on the class identified by the selector. + * + * @param selector The selector of which the IMP is to be fetched. + * @param aClass The class from which the IMP is to be fetched. + * @return The IMP of the instance method identified by selector and aClass. + */ ++ (IMP)implementationOfMethodSelector:(SEL)selector fromClass:(Class)aClass { + Method aMethod = class_getInstanceMethod(aClass, selector); + return method_getImplementation(aMethod); +} + +/** Enumerates through all the interceptors and if they respond to a given selector, executes a + * GULAppDelegateInterceptorCallback with the interceptor. + * + * @param methodSelector The SEL to check if an interceptor responds to. + * @param callback the GULAppDelegateInterceptorCallback. + */ ++ (void)notifyInterceptorsWithMethodSelector:(SEL)methodSelector + callback:(GULAppDelegateInterceptorCallback)callback { + if (!callback) { + return; + } + + NSDictionary *interceptors = [GULAppDelegateSwizzler interceptors].dictionary; + [interceptors enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { + GULZeroingWeakContainer *interceptorContainer = obj; + id interceptor = interceptorContainer.object; + if (!interceptor) { + GULOSLogWarning( + kGULLogSubsystem, kGULLoggerSwizzler, NO, + [NSString + stringWithFormat:@"I-SWZ%06ld", (long)kGULSwizzlerMessageCodeAppDelegateSwizzling010], + @"AppDelegateProxy cannot find interceptor with ID %@. Removing the interceptor.", key); + [[GULAppDelegateSwizzler interceptors] removeObjectForKey:key]; + return; + } + if ([interceptor respondsToSelector:methodSelector]) { + callback(interceptor); + } + }]; +} + +// The methods below are donor methods which are added to the dynamic subclass of the App Delegate. +// They are called within the scope of the real App Delegate so |self| does not refer to the +// GULAppDelegateSwizzler instance but the real App Delegate instance. + +#pragma mark - [Donor Methods] Overridden instance description method + +- (NSString *)fakeDescription { + Class realClass = objc_getAssociatedObject(self, &kGULRealClassKey); + return [NSString stringWithFormat:@"<%@: %p>", realClass, self]; +} + +#pragma mark - [Donor Methods] URL overridden handler methods +#if TARGET_OS_IOS || TARGET_OS_TV + +- (BOOL)application:(GULApplication *)application + openURL:(NSURL *)url + options:(NSDictionary *)options { + SEL methodSelector = @selector(application:openURL:options:); + // Call the real implementation if the real App Delegate has any. + NSValue *openURLIMPPointer = + [GULAppDelegateSwizzler originalImplementationForSelector:methodSelector object:self]; + GULRealOpenURLOptionsIMP openURLOptionsIMP = [openURLIMPPointer pointerValue]; + + __block BOOL returnedValue = NO; + +// This is needed to for the library to be warning free on iOS versions < 9. +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunguarded-availability" + [GULAppDelegateSwizzler + notifyInterceptorsWithMethodSelector:methodSelector + callback:^(id interceptor) { + returnedValue |= [interceptor application:application + openURL:url + options:options]; + }]; +#pragma clang diagnostic pop + if (openURLOptionsIMP) { + returnedValue |= openURLOptionsIMP(self, methodSelector, application, url, options); + } + return returnedValue; +} + +#endif // TARGET_OS_IOS || TARGET_OS_TV + +#if TARGET_OS_IOS + +- (BOOL)application:(GULApplication *)application + openURL:(NSURL *)url + sourceApplication:(NSString *)sourceApplication + annotation:(id)annotation { + SEL methodSelector = @selector(application:openURL:sourceApplication:annotation:); + + // Call the real implementation if the real App Delegate has any. + NSValue *openURLSourceAppAnnotationIMPPointer = + [GULAppDelegateSwizzler originalImplementationForSelector:methodSelector object:self]; + GULRealOpenURLSourceApplicationAnnotationIMP openURLSourceApplicationAnnotationIMP = + [openURLSourceAppAnnotationIMPPointer pointerValue]; + + __block BOOL returnedValue = NO; + [GULAppDelegateSwizzler + notifyInterceptorsWithMethodSelector:methodSelector + callback:^(id interceptor) { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + returnedValue |= [interceptor application:application + openURL:url + sourceApplication:sourceApplication + annotation:annotation]; +#pragma clang diagnostic pop + }]; + if (openURLSourceApplicationAnnotationIMP) { + returnedValue |= openURLSourceApplicationAnnotationIMP(self, methodSelector, application, url, + sourceApplication, annotation); + } + return returnedValue; +} + +#endif // TARGET_OS_IOS + +#pragma mark - [Donor Methods] Network overridden handler methods + +#if TARGET_OS_IOS || TARGET_OS_TV + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wstrict-prototypes" +- (void)application:(GULApplication *)application + handleEventsForBackgroundURLSession:(NSString *)identifier + completionHandler:(void (^)())completionHandler { +#pragma clang diagnostic pop + SEL methodSelector = @selector(application: + handleEventsForBackgroundURLSession:completionHandler:); + NSValue *handleBackgroundSessionPointer = + [GULAppDelegateSwizzler originalImplementationForSelector:methodSelector object:self]; + GULRealHandleEventsForBackgroundURLSessionIMP handleBackgroundSessionIMP = + [handleBackgroundSessionPointer pointerValue]; + + // Notify interceptors. + [GULAppDelegateSwizzler + notifyInterceptorsWithMethodSelector:methodSelector + callback:^(id interceptor) { + [interceptor application:application + handleEventsForBackgroundURLSession:identifier + completionHandler:completionHandler]; + }]; + // Call the real implementation if the real App Delegate has any. + if (handleBackgroundSessionIMP) { + handleBackgroundSessionIMP(self, methodSelector, application, identifier, completionHandler); + } +} + +#endif // TARGET_OS_IOS || TARGET_OS_TV + +#pragma mark - [Donor Methods] User Activities overridden handler methods + +- (BOOL)application:(GULApplication *)application + continueUserActivity:(NSUserActivity *)userActivity + restorationHandler:(void (^)(NSArray *restorableObjects))restorationHandler { + SEL methodSelector = @selector(application:continueUserActivity:restorationHandler:); + NSValue *continueUserActivityIMPPointer = + [GULAppDelegateSwizzler originalImplementationForSelector:methodSelector object:self]; + GULRealContinueUserActivityIMP continueUserActivityIMP = + continueUserActivityIMPPointer.pointerValue; + + __block BOOL returnedValue = NO; +#if !TARGET_OS_WATCH + [GULAppDelegateSwizzler + notifyInterceptorsWithMethodSelector:methodSelector + callback:^(id interceptor) { + returnedValue |= [interceptor application:application + continueUserActivity:userActivity + restorationHandler:restorationHandler]; + }]; +#endif + // Call the real implementation if the real App Delegate has any. + if (continueUserActivityIMP) { + returnedValue |= continueUserActivityIMP(self, methodSelector, application, userActivity, + restorationHandler); + } + return returnedValue; +} + +#pragma mark - [Donor Methods] Remote Notifications + +- (void)application:(GULApplication *)application + donor_didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { + SEL methodSelector = NSSelectorFromString(kGULDidRegisterForRemoteNotificationsSEL); + + NSValue *didRegisterForRemoteNotificationsIMPPointer = + [GULAppDelegateSwizzler originalImplementationForSelector:methodSelector object:self]; + GULRealDidRegisterForRemoteNotificationsIMP didRegisterForRemoteNotificationsIMP = + [didRegisterForRemoteNotificationsIMPPointer pointerValue]; + + // Notify interceptors. + [GULAppDelegateSwizzler + notifyInterceptorsWithMethodSelector:methodSelector + callback:^(id interceptor) { + NSInvocation *invocation = [GULAppDelegateSwizzler + appDelegateInvocationForSelector:methodSelector]; + [invocation setTarget:interceptor]; + [invocation setSelector:methodSelector]; + [invocation setArgument:(void *)(&application) atIndex:2]; + [invocation setArgument:(void *)(&deviceToken) atIndex:3]; + [invocation invoke]; + }]; + // Call the real implementation if the real App Delegate has any. + if (didRegisterForRemoteNotificationsIMP) { + didRegisterForRemoteNotificationsIMP(self, methodSelector, application, deviceToken); + } +} + +- (void)application:(GULApplication *)application + donor_didFailToRegisterForRemoteNotificationsWithError:(NSError *)error { + SEL methodSelector = NSSelectorFromString(kGULDidFailToRegisterForRemoteNotificationsSEL); + NSValue *didFailToRegisterForRemoteNotificationsIMPPointer = + [GULAppDelegateSwizzler originalImplementationForSelector:methodSelector object:self]; + GULRealDidFailToRegisterForRemoteNotificationsIMP didFailToRegisterForRemoteNotificationsIMP = + [didFailToRegisterForRemoteNotificationsIMPPointer pointerValue]; + + // Notify interceptors. + [GULAppDelegateSwizzler + notifyInterceptorsWithMethodSelector:methodSelector + callback:^(id interceptor) { + NSInvocation *invocation = [GULAppDelegateSwizzler + appDelegateInvocationForSelector:methodSelector]; + [invocation setTarget:interceptor]; + [invocation setSelector:methodSelector]; + [invocation setArgument:(void *)(&application) atIndex:2]; + [invocation setArgument:(void *)(&error) atIndex:3]; + [invocation invoke]; + }]; + // Call the real implementation if the real App Delegate has any. + if (didFailToRegisterForRemoteNotificationsIMP) { + didFailToRegisterForRemoteNotificationsIMP(self, methodSelector, application, error); + } +} + +#if !TARGET_OS_WATCH && !TARGET_OS_OSX +- (void)application:(GULApplication *)application + donor_didReceiveRemoteNotification:(NSDictionary *)userInfo + fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { + SEL methodSelector = NSSelectorFromString(kGULDidReceiveRemoteNotificationWithCompletionSEL); + NSValue *didReceiveRemoteNotificationWithCompletionIMPPointer = + [GULAppDelegateSwizzler originalImplementationForSelector:methodSelector object:self]; + GULRealDidReceiveRemoteNotificationWithCompletionIMP + didReceiveRemoteNotificationWithCompletionIMP = + [didReceiveRemoteNotificationWithCompletionIMPPointer pointerValue]; + + dispatch_group_t __block callbackGroup = dispatch_group_create(); + NSMutableArray *__block fetchResults = [NSMutableArray array]; + + void (^localCompletionHandler)(UIBackgroundFetchResult) = + ^void(UIBackgroundFetchResult fetchResult) { + [fetchResults addObject:[NSNumber numberWithInt:(int)fetchResult]]; + dispatch_group_leave(callbackGroup); + }; + + // Notify interceptors. + [GULAppDelegateSwizzler + notifyInterceptorsWithMethodSelector:methodSelector + callback:^(id interceptor) { + dispatch_group_enter(callbackGroup); + + NSInvocation *invocation = [GULAppDelegateSwizzler + appDelegateInvocationForSelector:methodSelector]; + [invocation setTarget:interceptor]; + [invocation setSelector:methodSelector]; + [invocation setArgument:(void *)(&application) atIndex:2]; + [invocation setArgument:(void *)(&userInfo) atIndex:3]; + [invocation setArgument:(void *)(&localCompletionHandler) + atIndex:4]; + [invocation invoke]; + }]; + // Call the real implementation if the real App Delegate has any. + if (didReceiveRemoteNotificationWithCompletionIMP) { + dispatch_group_enter(callbackGroup); + + didReceiveRemoteNotificationWithCompletionIMP(self, methodSelector, application, userInfo, + localCompletionHandler); + } + + dispatch_group_notify(callbackGroup, dispatch_get_main_queue(), ^() { + BOOL allFetchesFailed = YES; + BOOL anyFetchHasNewData = NO; + + for (NSNumber *oneResult in fetchResults) { + UIBackgroundFetchResult result = oneResult.intValue; + + switch (result) { + case UIBackgroundFetchResultNoData: + allFetchesFailed = NO; + break; + case UIBackgroundFetchResultNewData: + allFetchesFailed = NO; + anyFetchHasNewData = YES; + break; + case UIBackgroundFetchResultFailed: + + break; + } + } + + UIBackgroundFetchResult finalFetchResult = UIBackgroundFetchResultNoData; + + if (allFetchesFailed) { + finalFetchResult = UIBackgroundFetchResultFailed; + } else if (anyFetchHasNewData) { + finalFetchResult = UIBackgroundFetchResultNewData; + } else { + finalFetchResult = UIBackgroundFetchResultNoData; + } + + completionHandler(finalFetchResult); + }); +} +#endif // !TARGET_OS_WATCH && !TARGET_OS_OSX + ++ (nullable NSInvocation *)appDelegateInvocationForSelector:(SEL)selector { + struct objc_method_description methodDescription = + protocol_getMethodDescription(@protocol(GULApplicationDelegate), selector, NO, YES); + if (methodDescription.types == NULL) { + return nil; + } + + NSMethodSignature *signature = [NSMethodSignature signatureWithObjCTypes:methodDescription.types]; + return [NSInvocation invocationWithMethodSignature:signature]; +} + ++ (void)proxyAppDelegate:(id)appDelegate { + if (![appDelegate conformsToProtocol:@protocol(GULApplicationDelegate)]) { + GULOSLogNotice( + kGULLogSubsystem, kGULLoggerSwizzler, NO, + [NSString + stringWithFormat:@"I-SWZ%06ld", + (long)kGULSwizzlerMessageCodeAppDelegateSwizzlingInvalidAppDelegate], + @"App Delegate does not conform to UIApplicationDelegate protocol. %@", + [GULAppDelegateSwizzler correctAlternativeWhenAppDelegateProxyNotCreated]); + return; + } + + id originalDelegate = appDelegate; + // Do not create a subclass if it is not enabled. + if (![GULAppDelegateSwizzler isAppDelegateProxyEnabled]) { + GULOSLogNotice(kGULLogSubsystem, kGULLoggerSwizzler, NO, + [NSString stringWithFormat:@"I-SWZ%06ld", + (long)kGULSwizzlerMessageCodeAppDelegateSwizzling011], + @"App Delegate Proxy is disabled. %@", + [GULAppDelegateSwizzler correctAlternativeWhenAppDelegateProxyNotCreated]); + return; + } + // Do not accept nil delegate. + if (!originalDelegate) { + GULOSLogError(kGULLogSubsystem, kGULLoggerSwizzler, NO, + [NSString stringWithFormat:@"I-SWZ%06ld", + (long)kGULSwizzlerMessageCodeAppDelegateSwizzling012], + @"Cannot create App Delegate Proxy because App Delegate instance is nil. %@", + [GULAppDelegateSwizzler correctAlternativeWhenAppDelegateProxyNotCreated]); + return; + } + + @try { + gOriginalAppDelegateClass = [originalDelegate class]; + gAppDelegateSubclass = [self createSubclassWithObject:originalDelegate]; + [self reassignAppDelegate]; + } @catch (NSException *exception) { + GULOSLogError(kGULLogSubsystem, kGULLoggerSwizzler, NO, + [NSString stringWithFormat:@"I-SWZ%06ld", + (long)kGULSwizzlerMessageCodeAppDelegateSwizzling013], + @"Cannot create App Delegate Proxy. %@", + [GULAppDelegateSwizzler correctAlternativeWhenAppDelegateProxyNotCreated]); + return; + } +} + +#pragma mark - Methods to print correct debug logs + ++ (NSString *)correctAppDelegateProxyKey { + return NSClassFromString(@"FIRCore") ? kGULFirebaseAppDelegateProxyEnabledPlistKey + : kGULGoogleUtilitiesAppDelegateProxyEnabledPlistKey; +} + ++ (NSString *)correctAlternativeWhenAppDelegateProxyNotCreated { + return NSClassFromString(@"FIRCore") + ? @"To log deep link campaigns manually, call the methods in " + @"FIRAnalytics+AppDelegate.h." + : @""; +} + +#pragma mark - Private Methods for Testing + ++ (void)clearInterceptors { + [[self interceptors] removeAllObjects]; +} + ++ (void)resetProxyOriginalDelegateOnceToken { + sProxyAppDelegateOnceToken = 0; + sProxyAppDelegateRemoteNotificationOnceToken = 0; +} + ++ (id)originalDelegate { + return gOriginalAppDelegate; +} + +@end diff --git a/Pods/GoogleUtilities/GoogleUtilities/AppDelegateSwizzler/GULSceneDelegateSwizzler.m b/Pods/GoogleUtilities/GoogleUtilities/AppDelegateSwizzler/GULSceneDelegateSwizzler.m new file mode 100644 index 0000000..87adac4 --- /dev/null +++ b/Pods/GoogleUtilities/GoogleUtilities/AppDelegateSwizzler/GULSceneDelegateSwizzler.m @@ -0,0 +1,444 @@ +// Copyright 2019 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +#import "GoogleUtilities/AppDelegateSwizzler/Public/GoogleUtilities/GULSceneDelegateSwizzler.h" + +#import "GoogleUtilities/AppDelegateSwizzler/Internal/GULSceneDelegateSwizzler_Private.h" +#import "GoogleUtilities/AppDelegateSwizzler/Public/GoogleUtilities/GULAppDelegateSwizzler.h" +#import "GoogleUtilities/Common/GULLoggerCodes.h" +#import "GoogleUtilities/Environment/Public/GoogleUtilities/GULAppEnvironmentUtil.h" +#import "GoogleUtilities/Logger/Public/GoogleUtilities/GULLogger.h" +#import "GoogleUtilities/Network/Public/GoogleUtilities/GULMutableDictionary.h" + +#import + +#if UISCENE_SUPPORTED +API_AVAILABLE(ios(13.0), tvos(13.0)) +typedef void (*GULOpenURLContextsIMP)(id, SEL, UIScene *, NSSet *); + +API_AVAILABLE(ios(13.0), tvos(13.0)) +typedef void (^GULSceneDelegateInterceptorCallback)(id); + +// The strings below are the keys for associated objects. +static char const *const kGULRealIMPBySelectorKey = "GUL_realIMPBySelector"; +static char const *const kGULRealClassKey = "GUL_realClass"; +#endif // UISCENE_SUPPORTED + +static GULLoggerService kGULLoggerSwizzler = @"[GoogleUtilities/SceneDelegateSwizzler]"; + +// Since Firebase SDKs also use this for app delegate proxying, in order to not be a breaking change +// we disable App Delegate proxying when either of these two flags are set to NO. + +/** Plist key that allows Firebase developers to disable App and Scene Delegate Proxying. */ +static NSString *const kGULFirebaseSceneDelegateProxyEnabledPlistKey = + @"FirebaseAppDelegateProxyEnabled"; + +/** Plist key that allows developers not using Firebase to disable App and Scene Delegate Proxying. + */ +static NSString *const kGULGoogleUtilitiesSceneDelegateProxyEnabledPlistKey = + @"GoogleUtilitiesAppDelegateProxyEnabled"; + +/** The prefix of the Scene Delegate. */ +static NSString *const kGULSceneDelegatePrefix = @"GUL_"; + +/** + * This class is necessary to store the delegates in an NSArray without retaining them. + * [NSValue valueWithNonRetainedObject] also provides this functionality, but does not provide a + * zeroing pointer. This will cause EXC_BAD_ACCESS when trying to access the object after it is + * dealloced. Instead, this container stores a weak, zeroing reference to the object, which + * automatically is set to nil by the runtime when the object is dealloced. + */ +@interface GULSceneZeroingWeakContainer : NSObject + +/** Stores a weak object. */ +@property(nonatomic, weak) id object; + +@end + +@implementation GULSceneZeroingWeakContainer +@end + +@implementation GULSceneDelegateSwizzler + +#pragma mark - Public methods + ++ (BOOL)isSceneDelegateProxyEnabled { + return [GULAppDelegateSwizzler isAppDelegateProxyEnabled]; +} + ++ (void)proxyOriginalSceneDelegate { +#if UISCENE_SUPPORTED + if ([GULAppEnvironmentUtil isAppExtension]) { + return; + } + + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + if (@available(iOS 13.0, tvOS 13.0, *)) { + if (![GULSceneDelegateSwizzler isSceneDelegateProxyEnabled]) { + return; + } + [[NSNotificationCenter defaultCenter] + addObserver:self + selector:@selector(handleSceneWillConnectToNotification:) + name:UISceneWillConnectNotification + object:nil]; + } + }); +#endif // UISCENE_SUPPORTED +} + +#if UISCENE_SUPPORTED ++ (GULSceneDelegateInterceptorID)registerSceneDelegateInterceptor:(id)interceptor { + NSAssert(interceptor, @"SceneDelegateProxy cannot add nil interceptor"); + NSAssert([interceptor conformsToProtocol:@protocol(UISceneDelegate)], + @"SceneDelegateProxy interceptor does not conform to UIApplicationDelegate"); + + if (!interceptor) { + GULOSLogError( + kGULLogSubsystem, kGULLoggerSwizzler, NO, + [NSString + stringWithFormat:@"I-SWZ%06ld", (long)kGULSwizzlerMessageCodeSceneDelegateSwizzling000], + @"SceneDelegateProxy cannot add nil interceptor."); + return nil; + } + if (![interceptor conformsToProtocol:@protocol(UISceneDelegate)]) { + GULOSLogError( + kGULLogSubsystem, kGULLoggerSwizzler, NO, + [NSString + stringWithFormat:@"I-SWZ%06ld", (long)kGULSwizzlerMessageCodeSceneDelegateSwizzling001], + @"SceneDelegateProxy interceptor does not conform to UIApplicationDelegate"); + return nil; + } + + // The ID should be the same given the same interceptor object. + NSString *interceptorID = + [NSString stringWithFormat:@"%@%p", kGULSceneDelegatePrefix, interceptor]; + if (!interceptorID.length) { + GULOSLogError( + kGULLogSubsystem, kGULLoggerSwizzler, NO, + [NSString + stringWithFormat:@"I-SWZ%06ld", (long)kGULSwizzlerMessageCodeSceneDelegateSwizzling002], + @"SceneDelegateProxy cannot create Interceptor ID."); + return nil; + } + GULSceneZeroingWeakContainer *weakObject = [[GULSceneZeroingWeakContainer alloc] init]; + weakObject.object = interceptor; + [GULSceneDelegateSwizzler interceptors][interceptorID] = weakObject; + return interceptorID; +} + ++ (void)unregisterSceneDelegateInterceptorWithID:(GULSceneDelegateInterceptorID)interceptorID { + NSAssert(interceptorID, @"SceneDelegateProxy cannot unregister nil interceptor ID."); + NSAssert(((NSString *)interceptorID).length != 0, + @"SceneDelegateProxy cannot unregister empty interceptor ID."); + + if (!interceptorID) { + GULOSLogError( + kGULLogSubsystem, kGULLoggerSwizzler, NO, + [NSString + stringWithFormat:@"I-SWZ%06ld", (long)kGULSwizzlerMessageCodeSceneDelegateSwizzling003], + @"SceneDelegateProxy cannot unregister empty interceptor ID."); + return; + } + + GULSceneZeroingWeakContainer *weakContainer = + [GULSceneDelegateSwizzler interceptors][interceptorID]; + if (!weakContainer.object) { + GULOSLogError( + kGULLogSubsystem, kGULLoggerSwizzler, NO, + [NSString + stringWithFormat:@"I-SWZ%06ld", (long)kGULSwizzlerMessageCodeSceneDelegateSwizzling004], + @"SceneDelegateProxy cannot unregister interceptor that was not registered. " + "Interceptor ID %@", + interceptorID); + return; + } + + [[GULSceneDelegateSwizzler interceptors] removeObjectForKey:interceptorID]; +} + +#pragma mark - Helper methods + ++ (GULMutableDictionary *)interceptors { + static dispatch_once_t onceToken; + static GULMutableDictionary *sInterceptors; + dispatch_once(&onceToken, ^{ + sInterceptors = [[GULMutableDictionary alloc] init]; + }); + return sInterceptors; +} + ++ (void)clearInterceptors { + [[self interceptors] removeAllObjects]; +} + ++ (nullable NSValue *)originalImplementationForSelector:(SEL)selector object:(id)object { + NSDictionary *realImplementationBySelector = + objc_getAssociatedObject(object, &kGULRealIMPBySelectorKey); + return realImplementationBySelector[NSStringFromSelector(selector)]; +} + ++ (void)proxyDestinationSelector:(SEL)destinationSelector + implementationsFromSourceSelector:(SEL)sourceSelector + fromClass:(Class)sourceClass + toClass:(Class)destinationClass + realClass:(Class)realClass + storeDestinationImplementationTo: + (NSMutableDictionary *)destinationImplementationsBySelector { + [self addInstanceMethodWithDestinationSelector:destinationSelector + withImplementationFromSourceSelector:sourceSelector + fromClass:sourceClass + toClass:destinationClass]; + IMP sourceImplementation = + [GULSceneDelegateSwizzler implementationOfMethodSelector:destinationSelector + fromClass:realClass]; + NSValue *sourceImplementationPointer = [NSValue valueWithPointer:sourceImplementation]; + + NSString *destinationSelectorString = NSStringFromSelector(destinationSelector); + destinationImplementationsBySelector[destinationSelectorString] = sourceImplementationPointer; +} + +/** Copies a method identified by the methodSelector from one class to the other. After this method + * is called, performing [toClassInstance methodSelector] will be similar to calling + * [fromClassInstance methodSelector]. This method does nothing if toClass already has a method + * identified by methodSelector. + * + * @param methodSelector The SEL that identifies both the method on the fromClass as well as the + * one on the toClass. + * @param fromClass The class from which a method is sourced. + * @param toClass The class to which the method is added. If the class already has a method with + * the same selector, this has no effect. + */ ++ (void)addInstanceMethodWithSelector:(SEL)methodSelector + fromClass:(Class)fromClass + toClass:(Class)toClass { + [self addInstanceMethodWithDestinationSelector:methodSelector + withImplementationFromSourceSelector:methodSelector + fromClass:fromClass + toClass:toClass]; +} + +/** Copies a method identified by the sourceSelector from the fromClass as a method for the + * destinationSelector on the toClass. After this method is called, performing + * [toClassInstance destinationSelector] will be similar to calling + * [fromClassInstance sourceSelector]. This method does nothing if toClass already has a method + * identified by destinationSelector. + * + * @param destinationSelector The SEL that identifies the method on the toClass. + * @param sourceSelector The SEL that identifies the method on the fromClass. + * @param fromClass The class from which a method is sourced. + * @param toClass The class to which the method is added. If the class already has a method with + * the same selector, this has no effect. + */ ++ (void)addInstanceMethodWithDestinationSelector:(SEL)destinationSelector + withImplementationFromSourceSelector:(SEL)sourceSelector + fromClass:(Class)fromClass + toClass:(Class)toClass { + Method method = class_getInstanceMethod(fromClass, sourceSelector); + IMP methodIMP = method_getImplementation(method); + const char *types = method_getTypeEncoding(method); + if (!class_addMethod(toClass, destinationSelector, methodIMP, types)) { + GULOSLogWarning( + kGULLogSubsystem, kGULLoggerSwizzler, NO, + [NSString + stringWithFormat:@"I-SWZ%06ld", (long)kGULSwizzlerMessageCodeSceneDelegateSwizzling009], + @"Cannot copy method to destination selector %@ as it already exists", + NSStringFromSelector(destinationSelector)); + } +} + +/** Gets the IMP of the instance method on the class identified by the selector. + * + * @param selector The selector of which the IMP is to be fetched. + * @param aClass The class from which the IMP is to be fetched. + * @return The IMP of the instance method identified by selector and aClass. + */ ++ (IMP)implementationOfMethodSelector:(SEL)selector fromClass:(Class)aClass { + Method aMethod = class_getInstanceMethod(aClass, selector); + return method_getImplementation(aMethod); +} + +/** Enumerates through all the interceptors and if they respond to a given selector, executes a + * GULSceneDelegateInterceptorCallback with the interceptor. + * + * @param methodSelector The SEL to check if an interceptor responds to. + * @param callback the GULSceneDelegateInterceptorCallback. + */ ++ (void)notifyInterceptorsWithMethodSelector:(SEL)methodSelector + callback:(GULSceneDelegateInterceptorCallback)callback + API_AVAILABLE(ios(13.0)) { + if (!callback) { + return; + } + + NSDictionary *interceptors = [GULSceneDelegateSwizzler interceptors].dictionary; + [interceptors enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { + GULSceneZeroingWeakContainer *interceptorContainer = obj; + id interceptor = interceptorContainer.object; + if (!interceptor) { + GULOSLogWarning( + kGULLogSubsystem, kGULLoggerSwizzler, NO, + [NSString stringWithFormat:@"I-SWZ%06ld", + (long)kGULSwizzlerMessageCodeSceneDelegateSwizzling010], + @"SceneDelegateProxy cannot find interceptor with ID %@. Removing the interceptor.", key); + [[GULSceneDelegateSwizzler interceptors] removeObjectForKey:key]; + return; + } + if ([interceptor respondsToSelector:methodSelector]) { + callback(interceptor); + } + }]; +} + ++ (void)handleSceneWillConnectToNotification:(NSNotification *)notification { + if (@available(iOS 13.0, tvOS 13.0, *)) { + if ([notification.object isKindOfClass:[UIScene class]]) { + UIScene *scene = (UIScene *)notification.object; + [GULSceneDelegateSwizzler proxySceneDelegateIfNeeded:scene]; + } + } +} + +#pragma mark - [Donor Methods] UISceneDelegate URL handler + +- (void)scene:(UIScene *)scene + openURLContexts:(NSSet *)URLContexts API_AVAILABLE(ios(13.0), tvos(13.0)) { + if (@available(iOS 13.0, tvOS 13.0, *)) { + SEL methodSelector = @selector(scene:openURLContexts:); + // Call the real implementation if the real Scene Delegate has any. + NSValue *openURLContextsIMPPointer = + [GULSceneDelegateSwizzler originalImplementationForSelector:methodSelector object:self]; + GULOpenURLContextsIMP openURLContextsIMP = [openURLContextsIMPPointer pointerValue]; + + [GULSceneDelegateSwizzler + notifyInterceptorsWithMethodSelector:methodSelector + callback:^(id interceptor) { + if ([interceptor + conformsToProtocol:@protocol(UISceneDelegate)]) { + id sceneInterceptor = + (id)interceptor; + [sceneInterceptor scene:scene openURLContexts:URLContexts]; + } + }]; + + if (openURLContextsIMP) { + openURLContextsIMP(self, methodSelector, scene, URLContexts); + } + } +} + ++ (void)proxySceneDelegateIfNeeded:(UIScene *)scene { + Class realClass = [scene.delegate class]; + NSString *className = NSStringFromClass(realClass); + + // Skip proxying if failed to get the delegate class name for some reason (e.g. `delegate == nil`) + // or the class has a prefix of kGULAppDelegatePrefix, which means it has been proxied before. + if (className == nil || [className hasPrefix:kGULSceneDelegatePrefix]) { + return; + } + + NSString *classNameWithPrefix = [kGULSceneDelegatePrefix stringByAppendingString:className]; + NSString *newClassName = + [NSString stringWithFormat:@"%@-%@", classNameWithPrefix, [NSUUID UUID].UUIDString]; + + if (NSClassFromString(newClassName)) { + GULOSLogError( + kGULLogSubsystem, kGULLoggerSwizzler, NO, + [NSString + stringWithFormat:@"I-SWZ%06ld", + (long) + kGULSwizzlerMessageCodeSceneDelegateSwizzlingInvalidSceneDelegate], + @"Cannot create a proxy for Scene Delegate. Subclass already exists. Original Class" + @": %@, subclass: %@", + className, newClassName); + return; + } + + // Register the new class as subclass of the real one. Do not allocate more than the real class + // size. + Class sceneDelegateSubClass = objc_allocateClassPair(realClass, newClassName.UTF8String, 0); + if (sceneDelegateSubClass == Nil) { + GULOSLogError( + kGULLogSubsystem, kGULLoggerSwizzler, NO, + [NSString + stringWithFormat:@"I-SWZ%06ld", + (long) + kGULSwizzlerMessageCodeSceneDelegateSwizzlingInvalidSceneDelegate], + @"Cannot create a proxy for Scene Delegate. Subclass already exists. Original Class" + @": %@, subclass: Nil", + className); + return; + } + + NSMutableDictionary *realImplementationsBySelector = + [[NSMutableDictionary alloc] init]; + + // For scene:openURLContexts: + SEL openURLContextsSEL = @selector(scene:openURLContexts:); + [self proxyDestinationSelector:openURLContextsSEL + implementationsFromSourceSelector:openURLContextsSEL + fromClass:[GULSceneDelegateSwizzler class] + toClass:sceneDelegateSubClass + realClass:realClass + storeDestinationImplementationTo:realImplementationsBySelector]; + + // Store original implementations to a fake property of the original delegate. + objc_setAssociatedObject(scene.delegate, &kGULRealIMPBySelectorKey, + [realImplementationsBySelector copy], OBJC_ASSOCIATION_RETAIN_NONATOMIC); + objc_setAssociatedObject(scene.delegate, &kGULRealClassKey, realClass, + OBJC_ASSOCIATION_RETAIN_NONATOMIC); + + // The subclass size has to be exactly the same size with the original class size. The subclass + // cannot have more ivars/properties than its superclass since it will cause an offset in memory + // that can lead to overwriting the isa of an object in the next frame. + if (class_getInstanceSize(realClass) != class_getInstanceSize(sceneDelegateSubClass)) { + GULOSLogError( + kGULLogSubsystem, kGULLoggerSwizzler, NO, + [NSString + stringWithFormat:@"I-SWZ%06ld", + (long) + kGULSwizzlerMessageCodeSceneDelegateSwizzlingInvalidSceneDelegate], + @"Cannot create subclass of Scene Delegate, because the created subclass is not the " + @"same size. %@", + className); + NSAssert(NO, @"Classes must be the same size to swizzle isa"); + return; + } + + // Make the newly created class to be the subclass of the real Scene Delegate class. + objc_registerClassPair(sceneDelegateSubClass); + if (object_setClass(scene.delegate, sceneDelegateSubClass)) { + GULOSLogDebug( + kGULLogSubsystem, kGULLoggerSwizzler, NO, + [NSString + stringWithFormat:@"I-SWZ%06ld", + (long) + kGULSwizzlerMessageCodeSceneDelegateSwizzlingInvalidSceneDelegate], + @"Successfully created Scene Delegate Proxy automatically. To disable the " + @"proxy, set the flag %@ to NO (Boolean) in the Info.plist", + [GULSceneDelegateSwizzler correctSceneDelegateProxyKey]); + } +} + ++ (NSString *)correctSceneDelegateProxyKey { + return NSClassFromString(@"FIRCore") ? kGULFirebaseSceneDelegateProxyEnabledPlistKey + : kGULGoogleUtilitiesSceneDelegateProxyEnabledPlistKey; +} + +#endif // UISCENE_SUPPORTED + +@end diff --git a/Pods/GoogleUtilities/GoogleUtilities/AppDelegateSwizzler/Internal/GULAppDelegateSwizzler_Private.h b/Pods/GoogleUtilities/GoogleUtilities/AppDelegateSwizzler/Internal/GULAppDelegateSwizzler_Private.h new file mode 100644 index 0000000..38e9315 --- /dev/null +++ b/Pods/GoogleUtilities/GoogleUtilities/AppDelegateSwizzler/Internal/GULAppDelegateSwizzler_Private.h @@ -0,0 +1,55 @@ +/* + * Copyright 2018 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import +#import "GoogleUtilities/AppDelegateSwizzler/Public/GoogleUtilities/GULAppDelegateSwizzler.h" +#import "GoogleUtilities/Network/Public/GoogleUtilities/GULMutableDictionary.h" + +@class GULApplication; + +NS_ASSUME_NONNULL_BEGIN + +@interface GULAppDelegateSwizzler () + +/** ISA Swizzles the given appDelegate as the original app delegate would be. + * + * @param appDelegate The object that needs to be isa swizzled. This should conform to the + * application delegate protocol. + */ ++ (void)proxyAppDelegate:(id)appDelegate; + +/** Returns a dictionary containing interceptor IDs mapped to a GULZeroingWeakContainer. + * + * @return A dictionary of the form {NSString : GULZeroingWeakContainer}, where the NSString is + * the interceptorID. + */ ++ (GULMutableDictionary *)interceptors; + +/** Deletes all the registered interceptors. */ ++ (void)clearInterceptors; + +/** Resets the token that prevents the app delegate proxy from being isa swizzled multiple times. */ ++ (void)resetProxyOriginalDelegateOnceToken; + +/** Returns the original app delegate that was proxied. + * + * @return The original app delegate instance that was proxied. + */ ++ (id)originalDelegate; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleUtilities/GoogleUtilities/AppDelegateSwizzler/Internal/GULSceneDelegateSwizzler_Private.h b/Pods/GoogleUtilities/GoogleUtilities/AppDelegateSwizzler/Internal/GULSceneDelegateSwizzler_Private.h new file mode 100644 index 0000000..89896f7 --- /dev/null +++ b/Pods/GoogleUtilities/GoogleUtilities/AppDelegateSwizzler/Internal/GULSceneDelegateSwizzler_Private.h @@ -0,0 +1,48 @@ +/* + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import +#import "GoogleUtilities/AppDelegateSwizzler/Public/GoogleUtilities/GULSceneDelegateSwizzler.h" +#import "GoogleUtilities/Network/Public/GoogleUtilities/GULMutableDictionary.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface GULSceneDelegateSwizzler () + +#if UISCENE_SUPPORTED + +/** Returns a dictionary containing interceptor IDs mapped to a GULZeroingWeakContainer. + * + * @return A dictionary of the form {NSString : GULZeroingWeakContainer}, where the NSString is + * the interceptorID. + */ ++ (GULMutableDictionary *)interceptors; + +/** Deletes all the registered interceptors. */ ++ (void)clearInterceptors; + +/** ISA Swizzles the given appDelegate as the original app delegate would be. + * + * @param scene The scene whose delegate needs to be isa swizzled. This should conform to the + * scene delegate protocol. + */ ++ (void)proxySceneDelegateIfNeeded:(UIScene *)scene API_AVAILABLE(ios(13.0), tvos(13.0)); + +#endif // UISCENE_SUPPORTED + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleUtilities/GoogleUtilities/AppDelegateSwizzler/Public/GoogleUtilities/GULAppDelegateSwizzler.h b/Pods/GoogleUtilities/GoogleUtilities/AppDelegateSwizzler/Public/GoogleUtilities/GULAppDelegateSwizzler.h new file mode 100644 index 0000000..58dec49 --- /dev/null +++ b/Pods/GoogleUtilities/GoogleUtilities/AppDelegateSwizzler/Public/GoogleUtilities/GULAppDelegateSwizzler.h @@ -0,0 +1,107 @@ +/* + * Copyright 2018 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "GULApplication.h" + +NS_ASSUME_NONNULL_BEGIN + +typedef NSString *const GULAppDelegateInterceptorID; + +/** This class contains methods that isa swizzle the app delegate. */ +@interface GULAppDelegateSwizzler : NSProxy + +/** Registers an app delegate interceptor whose methods will be invoked as they're invoked on the + * original app delegate. + * + * @param interceptor An instance of a class that conforms to the application delegate protocol. + * The interceptor is NOT retained. + * @return A unique GULAppDelegateInterceptorID if interceptor was successfully registered; nil + * if it fails. + */ ++ (nullable GULAppDelegateInterceptorID)registerAppDelegateInterceptor: + (id)interceptor; + +/** Unregisters an interceptor with the given ID if it exists. + * + * @param interceptorID The object that was generated when the interceptor was registered. + */ ++ (void)unregisterAppDelegateInterceptorWithID:(GULAppDelegateInterceptorID)interceptorID; + +/** This method ensures that the original app delegate has been proxied. Call this before + * registering your interceptor. This method is safe to call multiple times (but it only proxies + * the app delegate once). + * + * This method doesn't proxy APNS related methods: + * @code + * - application:didRegisterForRemoteNotificationsWithDeviceToken: + * - application:didFailToRegisterForRemoteNotificationsWithError: + * - application:didReceiveRemoteNotification:fetchCompletionHandler: + * - application:didReceiveRemoteNotification: + * @endcode + * + * To proxy these methods use +[GULAppDelegateSwizzler + * proxyOriginalDelegateIncludingAPNSMethods]. The methods have to be proxied separately to + * avoid potential warnings from Apple review about missing Push Notification Entitlement (e.g. + * https://github.com/firebase/firebase-ios-sdk/issues/2807) + * + * The method has no effect for extensions. + * + * @see proxyOriginalDelegateIncludingAPNSMethods + */ ++ (void)proxyOriginalDelegate; + +/** This method ensures that the original app delegate has been proxied including APNS related + * methods. Call this before registering your interceptor. This method is safe to call multiple + * times (but it only proxies the app delegate once) or + * after +[GULAppDelegateSwizzler proxyOriginalDelegate] + * + * This method calls +[GULAppDelegateSwizzler proxyOriginalDelegate] under the hood. + * After calling this method the following App Delegate methods will be proxied in addition to + * the methods proxied by proxyOriginalDelegate: + * @code + * - application:didRegisterForRemoteNotificationsWithDeviceToken: + * - application:didFailToRegisterForRemoteNotificationsWithError: + * - application:didReceiveRemoteNotification:fetchCompletionHandler: + * - application:didReceiveRemoteNotification: + * @endcode + * + * The method has no effect for extensions. + * + * @see proxyOriginalDelegate + */ ++ (void)proxyOriginalDelegateIncludingAPNSMethods; + +/** Indicates whether app delegate proxy is explicitly disabled or enabled. Enabled by default. + * + * @return YES if AppDelegateProxy is Enabled, NO otherwise. + */ ++ (BOOL)isAppDelegateProxyEnabled; + +/** Returns the current sharedApplication. + * + * @return the current application instance if in an app, or nil if in extension or if it doesn't + * exist. + */ ++ (nullable GULApplication *)sharedApplication; + +/** Do not initialize this class. */ +- (instancetype)init NS_UNAVAILABLE; + +NS_ASSUME_NONNULL_END + +@end diff --git a/Pods/GoogleUtilities/GoogleUtilities/AppDelegateSwizzler/Public/GoogleUtilities/GULApplication.h b/Pods/GoogleUtilities/GoogleUtilities/AppDelegateSwizzler/Public/GoogleUtilities/GULApplication.h new file mode 100644 index 0000000..9311a17 --- /dev/null +++ b/Pods/GoogleUtilities/GoogleUtilities/AppDelegateSwizzler/Public/GoogleUtilities/GULApplication.h @@ -0,0 +1,50 @@ +/* + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#if TARGET_OS_IOS || TARGET_OS_TV || TARGET_OS_VISION + +#import + +#define GULApplication UIApplication +#define GULApplicationDelegate UIApplicationDelegate +#define GULUserActivityRestoring UIUserActivityRestoring + +static NSString *const kGULApplicationClassName = @"UIApplication"; + +#elif TARGET_OS_OSX + +#import + +#define GULApplication NSApplication +#define GULApplicationDelegate NSApplicationDelegate +#define GULUserActivityRestoring NSUserActivityRestoring + +static NSString *const kGULApplicationClassName = @"NSApplication"; + +#elif TARGET_OS_WATCH + +#import + +// We match the according watchOS API but swizzling should not work in watch +#define GULApplication WKExtension +#define GULApplicationDelegate WKExtensionDelegate +#define GULUserActivityRestoring NSUserActivityRestoring + +static NSString *const kGULApplicationClassName = @"WKExtension"; + +#endif diff --git a/Pods/GoogleUtilities/GoogleUtilities/AppDelegateSwizzler/Public/GoogleUtilities/GULSceneDelegateSwizzler.h b/Pods/GoogleUtilities/GoogleUtilities/AppDelegateSwizzler/Public/GoogleUtilities/GULSceneDelegateSwizzler.h new file mode 100644 index 0000000..d6d8937 --- /dev/null +++ b/Pods/GoogleUtilities/GoogleUtilities/AppDelegateSwizzler/Public/GoogleUtilities/GULSceneDelegateSwizzler.h @@ -0,0 +1,76 @@ +/* + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import +#import + +#if __has_include() +#import +#endif + +#if TARGET_OS_IOS || TARGET_OS_TV +#define UISCENE_SUPPORTED 1 +#endif + +NS_ASSUME_NONNULL_BEGIN + +typedef NSString *const GULSceneDelegateInterceptorID; + +/** This class contains methods that isa swizzle the scene delegate. */ +@interface GULSceneDelegateSwizzler : NSProxy + +#if UISCENE_SUPPORTED + +/** Registers a scene delegate interceptor whose methods will be invoked as they're invoked on the + * original scene delegate. + * + * @param interceptor An instance of a class that conforms to the application delegate protocol. + * The interceptor is NOT retained. + * @return A unique GULSceneDelegateInterceptorID if interceptor was successfully registered; nil + * if it fails. + */ ++ (nullable GULSceneDelegateInterceptorID)registerSceneDelegateInterceptor: + (id)interceptor API_AVAILABLE(ios(13.0), tvos(13.0)); + +/** Unregisters an interceptor with the given ID if it exists. + * + * @param interceptorID The object that was generated when the interceptor was registered. + */ ++ (void)unregisterSceneDelegateInterceptorWithID:(GULSceneDelegateInterceptorID)interceptorID + API_AVAILABLE(ios(13.0), tvos(13.0)); + +/** Do not initialize this class. */ +- (instancetype)init NS_UNAVAILABLE; + +#endif // UISCENE_SUPPORTED + +/** This method ensures that the original scene delegate has been proxied. Call this before + * registering your interceptor. This method is safe to call multiple times (but it only proxies + * the scene delegate once). + * + * The method has no effect for extensions. + */ ++ (void)proxyOriginalSceneDelegate; + +/** Indicates whether scene delegate proxy is explicitly disabled or enabled. Enabled by default. + * + * @return YES if SceneDelegateProxy is Enabled, NO otherwise. + */ ++ (BOOL)isSceneDelegateProxyEnabled; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleUtilities/GoogleUtilities/Common/GULLoggerCodes.h b/Pods/GoogleUtilities/GoogleUtilities/Common/GULLoggerCodes.h new file mode 100644 index 0000000..053ce84 --- /dev/null +++ b/Pods/GoogleUtilities/GoogleUtilities/Common/GULLoggerCodes.h @@ -0,0 +1,56 @@ +/* + * Copyright 2018 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +typedef NS_ENUM(NSInteger, GULSwizzlerMessageCode) { + // App Delegate Swizzling. + kGULSwizzlerMessageCodeAppDelegateSwizzling000 = 1000, // I-SWZ001000 + kGULSwizzlerMessageCodeAppDelegateSwizzling001 = 1001, // I-SWZ001001 + kGULSwizzlerMessageCodeAppDelegateSwizzling002 = 1002, // I-SWZ001002 + kGULSwizzlerMessageCodeAppDelegateSwizzling003 = 1003, // I-SWZ001003 + kGULSwizzlerMessageCodeAppDelegateSwizzling004 = 1004, // I-SWZ001004 + kGULSwizzlerMessageCodeAppDelegateSwizzling005 = 1005, // I-SWZ001005 + kGULSwizzlerMessageCodeAppDelegateSwizzling006 = 1006, // I-SWZ001006 + kGULSwizzlerMessageCodeAppDelegateSwizzling007 = 1007, // I-SWZ001007 + kGULSwizzlerMessageCodeAppDelegateSwizzling008 = 1008, // I-SWZ001008 + kGULSwizzlerMessageCodeAppDelegateSwizzling009 = 1009, // I-SWZ001009 + kGULSwizzlerMessageCodeAppDelegateSwizzling010 = 1010, // I-SWZ001010 + kGULSwizzlerMessageCodeAppDelegateSwizzling011 = 1011, // I-SWZ001011 + kGULSwizzlerMessageCodeAppDelegateSwizzling012 = 1012, // I-SWZ001012 + kGULSwizzlerMessageCodeAppDelegateSwizzling013 = 1013, // I-SWZ001013 + kGULSwizzlerMessageCodeAppDelegateSwizzlingInvalidAppDelegate = 1014, // I-SWZ001014 + + // Scene Delegate Swizzling. + kGULSwizzlerMessageCodeSceneDelegateSwizzling000 = 1100, // I-SWZ001100 + kGULSwizzlerMessageCodeSceneDelegateSwizzling001 = 1101, // I-SWZ001101 + kGULSwizzlerMessageCodeSceneDelegateSwizzling002 = 1102, // I-SWZ001102 + kGULSwizzlerMessageCodeSceneDelegateSwizzling003 = 1103, // I-SWZ001103 + kGULSwizzlerMessageCodeSceneDelegateSwizzling004 = 1104, // I-SWZ001104 + kGULSwizzlerMessageCodeSceneDelegateSwizzling005 = 1105, // I-SWZ001105 + kGULSwizzlerMessageCodeSceneDelegateSwizzling006 = 1106, // I-SWZ001106 + kGULSwizzlerMessageCodeSceneDelegateSwizzling007 = 1107, // I-SWZ001107 + kGULSwizzlerMessageCodeSceneDelegateSwizzling008 = 1108, // I-SWZ001108 + kGULSwizzlerMessageCodeSceneDelegateSwizzling009 = 1109, // I-SWZ001109 + kGULSwizzlerMessageCodeSceneDelegateSwizzling010 = 1110, // I-SWZ001110 + kGULSwizzlerMessageCodeSceneDelegateSwizzling011 = 1111, // I-SWZ001111 + kGULSwizzlerMessageCodeSceneDelegateSwizzling012 = 1112, // I-SWZ001112 + kGULSwizzlerMessageCodeSceneDelegateSwizzling013 = 1113, // I-SWZ001113 + kGULSwizzlerMessageCodeSceneDelegateSwizzlingInvalidSceneDelegate = 1114, // I-SWZ001114 + + // Method Swizzling. + kGULSwizzlerMessageCodeMethodSwizzling000 = 2000, // I-SWZ002000 +}; diff --git a/Pods/GoogleUtilities/GoogleUtilities/Environment/GULAppEnvironmentUtil.m b/Pods/GoogleUtilities/GoogleUtilities/Environment/GULAppEnvironmentUtil.m new file mode 100644 index 0000000..8170c6a --- /dev/null +++ b/Pods/GoogleUtilities/GoogleUtilities/Environment/GULAppEnvironmentUtil.m @@ -0,0 +1,300 @@ +// Copyright 2017 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "GoogleUtilities/Environment/Public/GoogleUtilities/GULAppEnvironmentUtil.h" + +#import +#import +#import +#import + +#import "third_party/IsAppEncrypted/Public/IsAppEncrypted.h" + +#if TARGET_OS_IOS +#import +#endif // TARGET_OS_IOS + +@implementation GULAppEnvironmentUtil + +/// A key for the Info.plist to enable or disable checking if the App Store is running in a sandbox. +/// This will affect your data integrity when using Firebase Analytics, as it will disable some +/// necessary checks. +static NSString *const kFIRAppStoreReceiptURLCheckEnabledKey = + @"FirebaseAppStoreReceiptURLCheckEnabled"; + +/// The file name of the sandbox receipt. This is available on iOS >= 8.0 +static NSString *const kFIRAIdentitySandboxReceiptFileName = @"sandboxReceipt"; + +static BOOL HasSCInfoFolder(void) { +#if TARGET_OS_IOS || TARGET_OS_TV || TARGET_OS_WATCH + NSString *bundlePath = [NSBundle mainBundle].bundlePath; + NSString *scInfoPath = [bundlePath stringByAppendingPathComponent:@"SC_Info"]; + return [[NSFileManager defaultManager] fileExistsAtPath:scInfoPath]; +#elif TARGET_OS_OSX + return NO; +#endif +} + +static BOOL HasEmbeddedMobileProvision(void) { +#if TARGET_OS_IOS || TARGET_OS_TV || TARGET_OS_WATCH + return [[NSBundle mainBundle] pathForResource:@"embedded" ofType:@"mobileprovision"].length > 0; +#elif TARGET_OS_OSX + return NO; +#endif +} + ++ (BOOL)isFromAppStore { + static dispatch_once_t isEncryptedOnce; + static BOOL isEncrypted = NO; + + dispatch_once(&isEncryptedOnce, ^{ + isEncrypted = IsAppEncrypted(); + }); + + if ([GULAppEnvironmentUtil isSimulator]) { + return NO; + } + + // If an app contain the sandboxReceipt file, it means its coming from TestFlight + // This must be checked before the SCInfo Folder check below since TestFlight apps may + // also have an SCInfo folder. + if ([GULAppEnvironmentUtil isAppStoreReceiptSandbox]) { + return NO; + } + + if (HasSCInfoFolder()) { + // When iTunes downloads a .ipa, it also gets a customized .sinf file which is added to the + // main SC_Info directory. + return YES; + } + + // For iOS >= 8.0, iTunesMetadata.plist is moved outside of the sandbox. Any attempt to read + // the iTunesMetadata.plist outside of the sandbox will be rejected by Apple. + // If the app does not contain the embedded.mobileprovision which is stripped out by Apple when + // the app is submitted to store, then it is highly likely that it is from Apple Store. + return isEncrypted && !HasEmbeddedMobileProvision(); +} + ++ (BOOL)isAppStoreReceiptSandbox { + // Since checking the App Store's receipt URL can be memory intensive, check the option in the + // Info.plist if developers opted out of this check. + id enableSandboxCheck = + [[NSBundle mainBundle] objectForInfoDictionaryKey:kFIRAppStoreReceiptURLCheckEnabledKey]; + if (enableSandboxCheck && [enableSandboxCheck isKindOfClass:[NSNumber class]] && + ![enableSandboxCheck boolValue]) { + return NO; + } + + NSURL *appStoreReceiptURL = [NSBundle mainBundle].appStoreReceiptURL; + NSString *appStoreReceiptFileName = appStoreReceiptURL.lastPathComponent; + return [appStoreReceiptFileName isEqualToString:kFIRAIdentitySandboxReceiptFileName]; +} + ++ (BOOL)isSimulator { +#if TARGET_OS_SIMULATOR + return YES; +#elif TARGET_OS_MACCATALYST + return NO; +#elif TARGET_OS_IOS || TARGET_OS_TV + NSString *platform = [GULAppEnvironmentUtil deviceModel]; + return [platform isEqual:@"x86_64"] || [platform isEqual:@"i386"]; +#elif TARGET_OS_OSX + return NO; +#endif + return NO; +} + ++ (NSString *)getSysctlEntry:(const char *)sysctlKey { + static NSString *entryValue; + size_t size; + sysctlbyname(sysctlKey, NULL, &size, NULL, 0); + if (size > 0) { + char *entryValueCStr = malloc(size); + sysctlbyname(sysctlKey, entryValueCStr, &size, NULL, 0); + entryValue = [NSString stringWithCString:entryValueCStr encoding:NSUTF8StringEncoding]; + free(entryValueCStr); + return entryValue; + } else { + return nil; + } +} + ++ (NSString *)deviceModel { + static dispatch_once_t once; + static NSString *deviceModel; + +#if TARGET_OS_OSX || TARGET_OS_MACCATALYST + dispatch_once(&once, ^{ + // The `uname` function only returns x86_64 for Macs. Use `sysctlbyname` instead, but fall back + // to the `uname` function if it fails. + deviceModel = [GULAppEnvironmentUtil getSysctlEntry:"hw.model"]; + if (deviceModel.length == 0) { + struct utsname systemInfo; + if (uname(&systemInfo) == 0) { + deviceModel = [NSString stringWithUTF8String:systemInfo.machine]; + } + } + }); +#else + dispatch_once(&once, ^{ + struct utsname systemInfo; + if (uname(&systemInfo) == 0) { + deviceModel = [NSString stringWithUTF8String:systemInfo.machine]; + } + }); +#endif // TARGET_OS_OSX || TARGET_OS_MACCATALYST + return deviceModel; +} + ++ (NSString *)deviceSimulatorModel { + static dispatch_once_t once; + static NSString *model = nil; + + dispatch_once(&once, ^{ +#if TARGET_OS_SIMULATOR +#if TARGET_OS_WATCH + model = @"watchOS Simulator"; +#elif TARGET_OS_TV + model = @"tvOS Simulator"; +#elif TARGET_OS_VISION + model = @"visionOS Simulator"; +#elif TARGET_OS_IOS + switch ([[UIDevice currentDevice] userInterfaceIdiom]) { + case UIUserInterfaceIdiomPhone: + model = @"iOS Simulator (iPhone)"; + break; + case UIUserInterfaceIdiomPad: + model = @"iOS Simulator (iPad)"; + break; + default: + model = @"iOS Simulator (Unknown)"; + break; + } +#endif +#elif TARGET_OS_EMBEDDED + model = [GULAppEnvironmentUtil getSysctlEntry:"hw.machine"]; +#else + model = [GULAppEnvironmentUtil getSysctlEntry:"hw.model"]; +#endif + }); + + return model; +} + ++ (NSString *)systemVersion { +#if TARGET_OS_IOS + return [UIDevice currentDevice].systemVersion; +#elif TARGET_OS_OSX || TARGET_OS_TV || TARGET_OS_WATCH || TARGET_OS_VISION + // Assemble the systemVersion, excluding the patch version if it's 0. + NSOperatingSystemVersion osVersion = [NSProcessInfo processInfo].operatingSystemVersion; + NSMutableString *versionString = [[NSMutableString alloc] + initWithFormat:@"%ld.%ld", (long)osVersion.majorVersion, (long)osVersion.minorVersion]; + if (osVersion.patchVersion != 0) { + [versionString appendFormat:@".%ld", (long)osVersion.patchVersion]; + } + return versionString; +#endif +} + ++ (BOOL)isAppExtension { +#if TARGET_OS_IOS || TARGET_OS_TV || TARGET_OS_WATCH + // Documented by Apple + BOOL appExtension = [[[NSBundle mainBundle] bundlePath] hasSuffix:@".appex"]; + return appExtension; +#elif TARGET_OS_OSX + return NO; +#endif +} + ++ (BOOL)isAppClip { +#if TARGET_OS_IOS + // Documented by Apple + // App clips have an NSAppClip entry in the top level of their Info.plist. + NSDictionary *appClipEntry = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSAppClip"]; + return appClipEntry != nil; +#elif TARGET_OS_OSX || TARGET_OS_TV || TARGET_OS_WATCH || TARGET_OS_VISION + return NO; +#endif +} + ++ (BOOL)supportsBackgroundURLSessionUploads { + // Neither app extensions nor App Clips support background uploads. + BOOL isExtension = self.isAppExtension; + BOOL isAppClip = self.isAppClip; + return !(isExtension || isAppClip); +} + ++ (NSString *)applePlatform { + NSString *applePlatform = @"unknown"; + + // When a Catalyst app is run on macOS then both `TARGET_OS_MACCATALYST` and `TARGET_OS_IOS` are + // `true`, which means the condition list is order-sensitive. +#if TARGET_OS_MACCATALYST + applePlatform = @"maccatalyst"; +#elif TARGET_OS_IOS + if (@available(iOS 14.0, *)) { + // Early iOS 14 betas do not include isiOSAppOnMac (#6969) + applePlatform = ([[NSProcessInfo processInfo] respondsToSelector:@selector(isiOSAppOnMac)] && + [NSProcessInfo processInfo].isiOSAppOnMac) + ? @"ios_on_mac" + : @"ios"; + } else { + applePlatform = @"ios"; + } +#elif TARGET_OS_TV + applePlatform = @"tvos"; +#elif TARGET_OS_OSX + applePlatform = @"macos"; +#elif TARGET_OS_WATCH + applePlatform = @"watchos"; +#elif TARGET_OS_VISION + applePlatform = @"visionos"; +#endif // TARGET_OS_MACCATALYST + + return applePlatform; +} + ++ (NSString *)appleDevicePlatform { + NSString *firebasePlatform = [GULAppEnvironmentUtil applePlatform]; +#if TARGET_OS_IOS + // This check is necessary because iOS-only apps running on iPad + // will report UIUserInterfaceIdiomPhone via UI_USER_INTERFACE_IDIOM(). + if ([firebasePlatform isEqualToString:@"ios"] && + ([[UIDevice currentDevice].model.lowercaseString containsString:@"ipad"] || + [[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad)) { + return @"ipados"; + } +#endif + + return firebasePlatform; +} + ++ (NSString *)deploymentType { +#if SWIFT_PACKAGE + NSString *deploymentType = @"swiftpm"; +#elif FIREBASE_BUILD_CARTHAGE + NSString *deploymentType = @"carthage"; +#elif FIREBASE_BUILD_ZIP_FILE + NSString *deploymentType = @"zip"; +#elif COCOAPODS + NSString *deploymentType = @"cocoapods"; +#else + NSString *deploymentType = @"unknown"; +#endif + + return deploymentType; +} + +@end diff --git a/Pods/GoogleUtilities/GoogleUtilities/Environment/NetworkInfo/GULNetworkInfo.m b/Pods/GoogleUtilities/GoogleUtilities/Environment/NetworkInfo/GULNetworkInfo.m new file mode 100644 index 0000000..fa3b878 --- /dev/null +++ b/Pods/GoogleUtilities/GoogleUtilities/Environment/NetworkInfo/GULNetworkInfo.m @@ -0,0 +1,80 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "GoogleUtilities/Environment/Public/GoogleUtilities/GULNetworkInfo.h" + +#import + +#import +#if __has_include("CoreTelephony/CTTelephonyNetworkInfo.h") && !TARGET_OS_MACCATALYST && \ + !TARGET_OS_OSX && !TARGET_OS_TV && !TARGET_OS_WATCH +#define TARGET_HAS_MOBILE_CONNECTIVITY +#import +#import +#endif + +@implementation GULNetworkInfo + +#ifdef TARGET_HAS_MOBILE_CONNECTIVITY ++ (CTTelephonyNetworkInfo *)getNetworkInfo { + static CTTelephonyNetworkInfo *networkInfo; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + networkInfo = [[CTTelephonyNetworkInfo alloc] init]; + }); + return networkInfo; +} +#endif + ++ (GULNetworkType)getNetworkType { + GULNetworkType networkType = GULNetworkTypeNone; + +#ifdef TARGET_HAS_MOBILE_CONNECTIVITY + static SCNetworkReachabilityRef reachabilityRef = 0; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + reachabilityRef = SCNetworkReachabilityCreateWithName(kCFAllocatorSystemDefault, "google.com"); + }); + + if (!reachabilityRef) { + return GULNetworkTypeNone; + } + + SCNetworkReachabilityFlags reachabilityFlags = 0; + SCNetworkReachabilityGetFlags(reachabilityRef, &reachabilityFlags); + + // Parse the network flags to set the network type. + if (reachabilityFlags & kSCNetworkReachabilityFlagsReachable) { + if (reachabilityFlags & kSCNetworkReachabilityFlagsIsWWAN) { + networkType = GULNetworkTypeMobile; + } else { + networkType = GULNetworkTypeWIFI; + } + } +#endif + + return networkType; +} + ++ (NSString *)getNetworkRadioType { +#ifdef TARGET_HAS_MOBILE_CONNECTIVITY + CTTelephonyNetworkInfo *networkInfo = [GULNetworkInfo getNetworkInfo]; + if (networkInfo.serviceCurrentRadioAccessTechnology.count) { + return networkInfo.serviceCurrentRadioAccessTechnology.allValues[0] ?: @""; + } +#endif + return @""; +} + +@end diff --git a/Pods/GoogleUtilities/GoogleUtilities/Environment/Public/GoogleUtilities/GULAppEnvironmentUtil.h b/Pods/GoogleUtilities/GoogleUtilities/Environment/Public/GoogleUtilities/GULAppEnvironmentUtil.h new file mode 100644 index 0000000..6eea4a8 --- /dev/null +++ b/Pods/GoogleUtilities/GoogleUtilities/Environment/Public/GoogleUtilities/GULAppEnvironmentUtil.h @@ -0,0 +1,69 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface GULAppEnvironmentUtil : NSObject + +/// Indicates whether the app is from Apple Store or not. Returns NO if the app is on simulator, +/// development environment or sideloaded. ++ (BOOL)isFromAppStore; + +/// Indicates whether the app is a Testflight app. Returns YES if the app has sandbox receipt. +/// Returns NO otherwise. ++ (BOOL)isAppStoreReceiptSandbox; + +/// Indicates whether the app is on simulator or not at runtime depending on the device +/// architecture. ++ (BOOL)isSimulator; + +/// The current device model. Returns an empty string if device model cannot be retrieved. ++ (nullable NSString *)deviceModel; + +/// The current device model, with simulator-specific values. Returns an empty string if device +/// model cannot be retrieved. ++ (nullable NSString *)deviceSimulatorModel; + +/// The current operating system version. Returns an empty string if the system version cannot be +/// retrieved. ++ (NSString *)systemVersion; + +/// Indicates whether it is running inside an extension or an app. ++ (BOOL)isAppExtension; + +/// Indicates whether it is running inside an app clip or a full app. ++ (BOOL)isAppClip; + +/// Indicates whether the current target supports background URL session uploads. +/// App extensions and app clips do not support background URL sessions. ++ (BOOL)supportsBackgroundURLSessionUploads; + +/// @return An Apple platform. Possible values "ios", "tvos", "macos", "watchos", "maccatalyst", and +/// "visionos". ++ (NSString *)applePlatform; + +/// @return An Apple Device platform. Same possible values as `applePlatform`, with the addition of +/// "ipados". ++ (NSString *)appleDevicePlatform; + +/// @return The way the library was added to the app, e.g. "swiftpm", "cocoapods", etc. ++ (NSString *)deploymentType; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleUtilities/GoogleUtilities/Environment/Public/GoogleUtilities/GULKeychainStorage.h b/Pods/GoogleUtilities/GoogleUtilities/Environment/Public/GoogleUtilities/GULKeychainStorage.h new file mode 100644 index 0000000..eb90ea3 --- /dev/null +++ b/Pods/GoogleUtilities/GoogleUtilities/Environment/Public/GoogleUtilities/GULKeychainStorage.h @@ -0,0 +1,84 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/// The class provides a convenient, multiplatform abstraction of the Keychain. +/// +/// When using this API on macOS, the corresponding target must be signed with a provisioning +/// profile that has the Keychain Sharing capability enabled. +@interface GULKeychainStorage : NSObject + +- (instancetype)init NS_UNAVAILABLE; + +/** Initializes the keychain storage with Keychain Service name. + * @param service A Keychain Service name that will be used to store and retrieve objects. See also + * `kSecAttrService`. + */ +- (instancetype)initWithService:(NSString *)service; + +/// Get an object by key. +/// @param key The key. +/// @param objectClass The expected object class required by `NSSecureCoding`. +/// @param accessGroup The Keychain Access Group. +/// @param completionHandler The completion handler to call when the +/// synchronized keychain read is complete. An error is passed to the +/// completion handler if the keychain read fails. Else, the object stored in +/// the keychain, or `nil` if it does not exist, is passed to the completion +/// handler. +- (void)getObjectForKey:(NSString *)key + objectClass:(Class)objectClass + accessGroup:(nullable NSString *)accessGroup + completionHandler: + (void (^)(id _Nullable obj, NSError *_Nullable error))completionHandler; + +/// Saves the given object by the given key. +/// @param object The object to store. +/// @param key The key to store the object. If there is an existing object by the key, it will be +/// overridden. +/// @param accessGroup The Keychain Access Group. +/// @param completionHandler The completion handler to call when the +/// synchronized keychain write is complete. An error is passed to the +/// completion handler if the keychain read fails. Else, the object written to +/// the keychain is passed to the completion handler. +- (void)setObject:(id)object + forKey:(NSString *)key + accessGroup:(nullable NSString *)accessGroup + completionHandler: + (void (^)(id _Nullable obj, NSError *_Nullable error))completionHandler; + +/// Removes the object by the given key. +/// @param key The key to store the object. If there is an existing object by +/// the key, it will be overridden. +/// @param accessGroup The Keychain Access Group. +/// @param completionHandler The completion handler to call when the +/// synchronized keychain removal is complete. An error is passed to the +/// completion handler if the keychain removal fails. +- (void)removeObjectForKey:(NSString *)key + accessGroup:(nullable NSString *)accessGroup + completionHandler:(void (^)(NSError *_Nullable error))completionHandler; + +#if TARGET_OS_OSX +/// If not `nil`, then only this keychain will be used to save and read data (see +/// `kSecMatchSearchList` and `kSecUseKeychain`. It is mostly intended to be used by unit tests. +@property(nonatomic, nullable) SecKeychainRef keychainRef; +#endif // TARGET_OS_OSX + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleUtilities/GoogleUtilities/Environment/Public/GoogleUtilities/GULKeychainUtils.h b/Pods/GoogleUtilities/GoogleUtilities/Environment/Public/GoogleUtilities/GULKeychainUtils.h new file mode 100644 index 0000000..9c17356 --- /dev/null +++ b/Pods/GoogleUtilities/GoogleUtilities/Environment/Public/GoogleUtilities/GULKeychainUtils.h @@ -0,0 +1,64 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +FOUNDATION_EXPORT NSString *const kGULKeychainUtilsErrorDomain; + +/// A collection of helper functions that abstract away common Keychain operations. +/// +/// When using this API on macOS, the corresponding target must be signed with a provisioning +/// profile that has the Keychain Sharing capability enabled. +@interface GULKeychainUtils : NSObject + +/** Fetches a keychain item data matching to the provided query. + * @param query A dictionary with Keychain query parameters. See docs for `SecItemCopyMatching` for + * details. + * @param outError A pointer to `NSError` instance or `NULL`. The instance at `outError` will be + * assigned with an error if there is. + * @returns Data for the first Keychain Item matching the provided query or `nil` if there is not + * such an item (`outError` will be `nil` in this case) or an error occurred. + */ ++ (nullable NSData *)getItemWithQuery:(NSDictionary *)query + error:(NSError *_Nullable *_Nullable)outError; + +/** Stores data to a Keychain Item matching to the provided query. An existing Keychain Item + * matching the query parameters will be updated or a new will be created. + * @param item A Keychain Item data to store. + * @param query A dictionary with Keychain query parameters. See docs for `SecItemAdd` and + * `SecItemUpdate` for details. + * @param outError A pointer to `NSError` instance or `NULL`. The instance at `outError` will be + * assigned with an error if there is. + * @returns `YES` when data was successfully stored, `NO` otherwise. + */ ++ (BOOL)setItem:(NSData *)item + withQuery:(NSDictionary *)query + error:(NSError *_Nullable *_Nullable)outError; + +/** Removes a Keychain Item matching to the provided query. + * @param query A dictionary with Keychain query parameters. See docs for `SecItemDelete` for + * details. + * @param outError A pointer to `NSError` instance or `NULL`. The instance at `outError` will be + * assigned with an error if there is. + * @returns `YES` if the item was removed successfully or doesn't exist, `NO` otherwise. + */ ++ (BOOL)removeItemWithQuery:(NSDictionary *)query error:(NSError *_Nullable *_Nullable)outError; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleUtilities/GoogleUtilities/Environment/Public/GoogleUtilities/GULNetworkInfo.h b/Pods/GoogleUtilities/GoogleUtilities/Environment/Public/GoogleUtilities/GULNetworkInfo.h new file mode 100644 index 0000000..0613941 --- /dev/null +++ b/Pods/GoogleUtilities/GoogleUtilities/Environment/Public/GoogleUtilities/GULNetworkInfo.h @@ -0,0 +1,43 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +NS_ASSUME_NONNULL_BEGIN + +/// The type of network that the device is running with. Values should correspond to the NetworkType +/// values in android/play/playlog/proto/clientanalytics.proto +typedef NS_ENUM(NSInteger, GULNetworkType) { + GULNetworkTypeNone = -1, + GULNetworkTypeMobile = 0, + GULNetworkTypeWIFI = 1, +}; + +/// Collection of utilities to read network status information +@interface GULNetworkInfo : NSObject + +/// Returns an enum indicating the network type. The enum values should be easily transferrable to +/// the NetworkType value in android/play/playlog/proto/clientanalytics.proto. Right now this always +/// returns None on platforms other than iOS. This should be updated in the future to return Wi-Fi +/// values for the other platforms when applicable. ++ (GULNetworkType)getNetworkType; + +/// Returns a string indicating the radio access technology used by the app. The return value will +/// be one of CTRadioAccess constants defined in +/// https://developer.apple.com/documentation/coretelephony/cttelephonynetworkinfo/radio_access_technology_constants ++ (NSString *)getNetworkRadioType; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleUtilities/GoogleUtilities/Environment/SecureStorage/GULKeychainStorage.m b/Pods/GoogleUtilities/GoogleUtilities/Environment/SecureStorage/GULKeychainStorage.m new file mode 100644 index 0000000..e6aa69a --- /dev/null +++ b/Pods/GoogleUtilities/GoogleUtilities/Environment/SecureStorage/GULKeychainStorage.m @@ -0,0 +1,196 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "GoogleUtilities/Environment/Public/GoogleUtilities/GULKeychainStorage.h" +#import + +#import "GoogleUtilities/Environment/Public/GoogleUtilities/GULKeychainUtils.h" + +@interface GULKeychainStorage () +@property(nonatomic, readonly) dispatch_queue_t keychainQueue; +@property(nonatomic, readonly) dispatch_queue_t inMemoryCacheQueue; +@property(nonatomic, readonly) NSString *service; +@property(nonatomic, readonly) NSCache> *inMemoryCache; +@end + +@implementation GULKeychainStorage + +- (instancetype)initWithService:(NSString *)service { + NSCache *cache = [[NSCache alloc] init]; + // Cache up to 5 installations. + cache.countLimit = 5; + return [self initWithService:service cache:cache]; +} + +- (instancetype)initWithService:(NSString *)service cache:(NSCache *)cache { + self = [super init]; + if (self) { + _keychainQueue = + dispatch_queue_create("com.gul.KeychainStorage.Keychain", DISPATCH_QUEUE_SERIAL); + _inMemoryCacheQueue = + dispatch_queue_create("com.gul.KeychainStorage.InMemoryCache", DISPATCH_QUEUE_SERIAL); + _service = [service copy]; + _inMemoryCache = cache; + } + return self; +} + +#pragma mark - Public + +- (void)getObjectForKey:(NSString *)key + objectClass:(Class)objectClass + accessGroup:(nullable NSString *)accessGroup + completionHandler: + (void (^)(id _Nullable obj, NSError *_Nullable error))completionHandler { + dispatch_async(self.inMemoryCacheQueue, ^{ + // Return cached object or fail otherwise. + id object = [self.inMemoryCache objectForKey:key]; + if (object) { + completionHandler(object, nil); + } else { + // Look for the object in the keychain. + [self getObjectFromKeychainForKey:key + objectClass:objectClass + accessGroup:accessGroup + completionHandler:completionHandler]; + } + }); +} + +- (void)setObject:(id)object + forKey:(NSString *)key + accessGroup:(nullable NSString *)accessGroup + completionHandler: + (void (^)(id _Nullable obj, NSError *_Nullable error))completionHandler { + dispatch_async(self.inMemoryCacheQueue, ^{ + // Save to the in-memory cache first. + [self.inMemoryCache setObject:object forKey:[key copy]]; + + dispatch_async(self.keychainQueue, ^{ + // Then store the object to the keychain. + NSDictionary *query = [self keychainQueryWithKey:key accessGroup:accessGroup]; + NSError *error; + NSData *encodedObject = [NSKeyedArchiver archivedDataWithRootObject:object + requiringSecureCoding:YES + error:&error]; + if (!encodedObject) { + completionHandler(nil, error); + return; + } + + if (![GULKeychainUtils setItem:encodedObject withQuery:query error:&error]) { + completionHandler(nil, error); + return; + } + + completionHandler(object, nil); + }); + }); +} + +- (void)removeObjectForKey:(NSString *)key + accessGroup:(nullable NSString *)accessGroup + completionHandler:(void (^)(NSError *_Nullable error))completionHandler { + dispatch_async(self.inMemoryCacheQueue, ^{ + [self.inMemoryCache removeObjectForKey:key]; + dispatch_async(self.keychainQueue, ^{ + NSDictionary *query = [self keychainQueryWithKey:key accessGroup:accessGroup]; + + NSError *error; + if (![GULKeychainUtils removeItemWithQuery:query error:&error]) { + completionHandler(error); + } else { + completionHandler(nil); + } + }); + }); +} + +#pragma mark - Private + +- (void)getObjectFromKeychainForKey:(NSString *)key + objectClass:(Class)objectClass + accessGroup:(nullable NSString *)accessGroup + completionHandler:(void (^)(id _Nullable obj, + NSError *_Nullable error))completionHandler { + // Look for the object in the keychain. + dispatch_async(self.keychainQueue, ^{ + NSDictionary *query = [self keychainQueryWithKey:key accessGroup:accessGroup]; + NSError *error; + NSData *encodedObject = [GULKeychainUtils getItemWithQuery:query error:&error]; + + if (error) { + completionHandler(nil, error); + return; + } + if (!encodedObject) { + completionHandler(nil, nil); + return; + } + id object = [NSKeyedUnarchiver unarchivedObjectOfClass:objectClass + fromData:encodedObject + error:&error]; + if (error) { + completionHandler(nil, error); + return; + } + + dispatch_async(self.inMemoryCacheQueue, ^{ + // Save object to the in-memory cache if exists and return the object. + if (object) { + [self.inMemoryCache setObject:object forKey:[key copy]]; + } + + completionHandler(object, nil); + }); + }); +} + +- (void)resetInMemoryCache { + [self.inMemoryCache removeAllObjects]; +} + +#pragma mark - Keychain + +- (NSMutableDictionary *)keychainQueryWithKey:(NSString *)key + accessGroup:(nullable NSString *)accessGroup { + NSMutableDictionary *query = [NSMutableDictionary dictionary]; + + query[(__bridge NSString *)kSecClass] = (__bridge NSString *)kSecClassGenericPassword; + query[(__bridge NSString *)kSecAttrService] = self.service; + query[(__bridge NSString *)kSecAttrAccount] = key; + + if (accessGroup) { + query[(__bridge NSString *)kSecAttrAccessGroup] = accessGroup; + } + + if (@available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, watchOS 6.0, *)) { + // Ensures that the keychain query behaves the same across all platforms. + // See go/firebase-macos-keychain-popups for details. + query[(__bridge id)kSecUseDataProtectionKeychain] = (__bridge id)kCFBooleanTrue; + } + +#if TARGET_OS_OSX + if (self.keychainRef) { + query[(__bridge NSString *)kSecUseKeychain] = (__bridge id)(self.keychainRef); + query[(__bridge NSString *)kSecMatchSearchList] = @[ (__bridge id)(self.keychainRef) ]; + } +#endif // TARGET_OS_OSX + + return query; +} + +@end diff --git a/Pods/GoogleUtilities/GoogleUtilities/Environment/SecureStorage/GULKeychainUtils.m b/Pods/GoogleUtilities/GoogleUtilities/Environment/SecureStorage/GULKeychainUtils.m new file mode 100644 index 0000000..57855a0 --- /dev/null +++ b/Pods/GoogleUtilities/GoogleUtilities/Environment/SecureStorage/GULKeychainUtils.m @@ -0,0 +1,133 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "GoogleUtilities/Environment/Public/GoogleUtilities/GULKeychainUtils.h" + +NSString *const kGULKeychainUtilsErrorDomain = @"com.gul.keychain.ErrorDomain"; + +@implementation GULKeychainUtils + ++ (nullable NSData *)getItemWithQuery:(NSDictionary *)query + error:(NSError *_Nullable *_Nullable)outError { + NSMutableDictionary *mutableGetItemQuery = + [[[self class] multiplatformQueryWithQuery:query] mutableCopy]; + + mutableGetItemQuery[(__bridge id)kSecReturnData] = @YES; + mutableGetItemQuery[(__bridge id)kSecMatchLimit] = (__bridge id)kSecMatchLimitOne; + + CFDataRef result = NULL; + OSStatus status = + SecItemCopyMatching((__bridge CFDictionaryRef)mutableGetItemQuery, (CFTypeRef *)&result); + + if (status == errSecSuccess && result != NULL) { + if (outError) { + *outError = nil; + } + + return (__bridge_transfer NSData *)result; + } + + if (status == errSecItemNotFound) { + if (outError) { + *outError = nil; + } + } else { + if (outError) { + *outError = [self keychainErrorWithFunction:@"SecItemCopyMatching" status:status]; + } + } + return nil; +} + ++ (BOOL)setItem:(NSData *)item + withQuery:(NSDictionary *)query + error:(NSError *_Nullable *_Nullable)outError { + NSDictionary *multiplatformQuery = [[self class] multiplatformQueryWithQuery:query]; + + NSData *existingItem = [self getItemWithQuery:multiplatformQuery error:outError]; + if (outError && *outError) { + return NO; + } + + OSStatus status; + if (!existingItem) { + NSMutableDictionary *mutableAddItemQuery = [multiplatformQuery mutableCopy]; + mutableAddItemQuery[(__bridge id)kSecAttrAccessible] = + (__bridge id)kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly; + mutableAddItemQuery[(__bridge id)kSecValueData] = item; + + status = SecItemAdd((__bridge CFDictionaryRef)mutableAddItemQuery, NULL); + } else { + NSDictionary *attributes = @{(__bridge id)kSecValueData : item}; + status = SecItemUpdate((__bridge CFDictionaryRef)multiplatformQuery, + (__bridge CFDictionaryRef)attributes); + } + + if (status == noErr) { + if (outError) { + *outError = nil; + } + return YES; + } + + NSString *function = existingItem ? @"SecItemUpdate" : @"SecItemAdd"; + if (outError) { + *outError = [self keychainErrorWithFunction:function status:status]; + } + return NO; +} + ++ (BOOL)removeItemWithQuery:(NSDictionary *)query error:(NSError *_Nullable *_Nullable)outError { + NSDictionary *deleteItemQuery = [[self class] multiplatformQueryWithQuery:query]; + + OSStatus status = SecItemDelete((__bridge CFDictionaryRef)deleteItemQuery); + + if (status == noErr || status == errSecItemNotFound) { + if (outError) { + *outError = nil; + } + return YES; + } + + if (outError) { + *outError = [self keychainErrorWithFunction:@"SecItemDelete" status:status]; + } + return NO; +} + +#pragma mark - Private + +/// Returns a `NSDictionary` query that behaves the same across all platforms. +/// - Note: In practice, this API only makes a difference to keychain queries on macOS. +/// See go/firebase-macos-keychain-popups for details. +/// - Parameter query: A query to create the protected keychain query with. ++ (NSDictionary *)multiplatformQueryWithQuery:(NSDictionary *)query { + NSMutableDictionary *multiplatformQuery = [query mutableCopy]; + if (@available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, watchOS 6.0, *)) { + multiplatformQuery[(__bridge id)kSecUseDataProtectionKeychain] = (__bridge id)kCFBooleanTrue; + } + return [multiplatformQuery copy]; +} + +#pragma mark - Errors + ++ (NSError *)keychainErrorWithFunction:(NSString *)keychainFunction status:(OSStatus)status { + NSString *failureReason = [NSString stringWithFormat:@"%@ (%li)", keychainFunction, (long)status]; + NSDictionary *userInfo = @{NSLocalizedFailureReasonErrorKey : failureReason}; + return [NSError errorWithDomain:kGULKeychainUtilsErrorDomain code:0 userInfo:userInfo]; +} + +@end diff --git a/Pods/GoogleUtilities/GoogleUtilities/Logger/GULLogger.m b/Pods/GoogleUtilities/GoogleUtilities/Logger/GULLogger.m new file mode 100644 index 0000000..a2eb29e --- /dev/null +++ b/Pods/GoogleUtilities/GoogleUtilities/Logger/GULLogger.m @@ -0,0 +1,223 @@ +// Copyright 2018 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "GoogleUtilities/Logger/Public/GoogleUtilities/GULLogger.h" + +#import + +#import "GoogleUtilities/Environment/Public/GoogleUtilities/GULAppEnvironmentUtil.h" +#import "GoogleUtilities/Logger/Public/GoogleUtilities/GULLoggerLevel.h" + +static dispatch_once_t sGULLoggerOnceToken; + +static dispatch_queue_t sGULClientQueue; + +static BOOL sGULLoggerDebugMode; + +static GULLoggerLevel sGULLoggerMaximumLevel; + +// Allow clients to register a version to include in the log. +static NSString *sVersion = @""; + +NSString *const kGULLogSubsystem = @"com.google.utilities.logger"; + +static GULLoggerService kGULLoggerLogger = @"[GULLogger]"; + +static NSMutableDictionary *> + *sGULServiceLogs; + +#ifdef DEBUG +/// The regex pattern for the message code. +static NSString *const kMessageCodePattern = @"^I-[A-Z]{3}[0-9]{6}$"; +static NSRegularExpression *sMessageCodeRegex; +#endif + +void GULLoggerInitialize(void) { + dispatch_once(&sGULLoggerOnceToken, ^{ + sGULLoggerMaximumLevel = GULLoggerLevelNotice; + sGULClientQueue = dispatch_queue_create("GULLoggingClientQueue", DISPATCH_QUEUE_SERIAL); + dispatch_set_target_queue(sGULClientQueue, + dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)); + sGULServiceLogs = [NSMutableDictionary dictionary]; +#ifdef DEBUG + sMessageCodeRegex = [NSRegularExpression regularExpressionWithPattern:kMessageCodePattern + options:0 + error:NULL]; +#endif + }); +} + +void GULLoggerForceDebug(void) { + // We should enable debug mode if we're not running from App Store. + if (![GULAppEnvironmentUtil isFromAppStore]) { + sGULLoggerDebugMode = YES; + GULSetLoggerLevel(GULLoggerLevelDebug); + } +} + +GULLoggerLevel GULGetLoggerLevel(void) { + return sGULLoggerMaximumLevel; +} + +__attribute__((no_sanitize("thread"))) void GULSetLoggerLevel(GULLoggerLevel loggerLevel) { + if (loggerLevel < GULLoggerLevelMin || loggerLevel > GULLoggerLevelMax) { + GULOSLogError(kGULLogSubsystem, kGULLoggerLogger, YES, @"I-COR000023", + @"Invalid logger level, %ld", (long)loggerLevel); + return; + } + GULLoggerInitialize(); + // We should not raise the logger level if we are running from App Store. + if (loggerLevel >= GULLoggerLevelNotice && [GULAppEnvironmentUtil isFromAppStore]) { + return; + } + + sGULLoggerMaximumLevel = loggerLevel; +} + +/** + * Check if the level is high enough to be loggable. + */ +__attribute__((no_sanitize("thread"))) BOOL GULIsLoggableLevel(GULLoggerLevel loggerLevel) { + GULLoggerInitialize(); + if (sGULLoggerDebugMode) { + return YES; + } + return (BOOL)(loggerLevel <= sGULLoggerMaximumLevel); +} + +#ifdef DEBUG +void GULResetLogger(void) { + sGULLoggerOnceToken = 0; + sGULLoggerDebugMode = NO; + sGULLoggerMaximumLevel = GULLoggerLevelNotice; +} + +dispatch_queue_t getGULClientQueue(void) { + return sGULClientQueue; +} + +BOOL getGULLoggerDebugMode(void) { + return sGULLoggerDebugMode; +} +#endif + +void GULLoggerRegisterVersion(NSString *version) { + sVersion = version; +} + +os_log_type_t GULLoggerLevelToOSLogType(GULLoggerLevel level) { + switch (level) { + case GULLoggerLevelError: + return OS_LOG_TYPE_ERROR; + case GULLoggerLevelWarning: + case GULLoggerLevelNotice: + return OS_LOG_TYPE_DEFAULT; + case GULLoggerLevelInfo: + return OS_LOG_TYPE_INFO; + case GULLoggerLevelDebug: + return OS_LOG_TYPE_DEBUG; + } +} + +void GULOSLogBasic(GULLoggerLevel level, + NSString *subsystem, + NSString *category, + BOOL forceLog, + NSString *messageCode, + NSString *message, + va_list args_ptr) { + GULLoggerInitialize(); + if (!(level <= sGULLoggerMaximumLevel || sGULLoggerDebugMode || forceLog)) { + return; + } + +#ifdef DEBUG + NSCAssert(messageCode.length == 11, @"Incorrect message code length."); + NSRange messageCodeRange = NSMakeRange(0, messageCode.length); + NSUInteger __unused numberOfMatches = + [sMessageCodeRegex numberOfMatchesInString:messageCode options:0 range:messageCodeRange]; + NSCAssert(numberOfMatches == 1, @"Incorrect message code format."); +#endif + NSString *logMsg; + if (args_ptr == NULL) { + logMsg = message; + } else { + logMsg = [[NSString alloc] initWithFormat:message arguments:args_ptr]; + } + logMsg = [NSString stringWithFormat:@"%@ - %@[%@] %@", sVersion, category, messageCode, logMsg]; + dispatch_async(sGULClientQueue, ^{ + NSMutableDictionary *subsystemLogs = sGULServiceLogs[subsystem]; + if (!subsystemLogs) { + subsystemLogs = [NSMutableDictionary dictionary]; + sGULServiceLogs[subsystem] = subsystemLogs; + } + + os_log_t serviceLog = [subsystemLogs objectForKey:subsystem]; + if (!serviceLog) { + serviceLog = os_log_create(subsystem.UTF8String, category.UTF8String); + subsystemLogs[category] = serviceLog; + } + + os_log_with_type(serviceLog, GULLoggerLevelToOSLogType(level), "%{public}@", logMsg); + }); +} + +/** + * Generates the logging functions using macros. + * + * Calling GULLogError({service}, @"I-XYZ000001", @"Configure %@ failed.", @"blah") shows: + * yyyy-mm-dd hh:mm:ss.SSS sender[PID] [{service}][I-XYZ000001] Configure blah failed. + * Calling GULLogDebug({service}, @"I-XYZ000001", @"Configure succeed.") shows: + * yyyy-mm-dd hh:mm:ss.SSS sender[PID] [{service}][I-XYZ000001] Configure succeed. + */ +#define GUL_LOGGING_FUNCTION(level) \ + void GULOSLog##level(NSString *subsystem, NSString *category, BOOL force, NSString *messageCode, \ + NSString *message, ...) { \ + va_list args_ptr; \ + va_start(args_ptr, message); \ + GULOSLogBasic(GULLoggerLevel##level, subsystem, category, force, messageCode, message, \ + args_ptr); \ + va_end(args_ptr); \ + } + +GUL_LOGGING_FUNCTION(Error) +GUL_LOGGING_FUNCTION(Warning) +GUL_LOGGING_FUNCTION(Notice) +GUL_LOGGING_FUNCTION(Info) +GUL_LOGGING_FUNCTION(Debug) + +#undef GUL_LOGGING_FUNCTION + +#pragma mark - GULLoggerWrapper + +@implementation GULLoggerWrapper + ++ (void)logWithLevel:(GULLoggerLevel)level + subsystem:(NSString *)subsystem + category:(GULLoggerService)category + messageCode:(NSString *)messageCode + message:(NSString *)message + arguments:(va_list)args { + GULOSLogBasic(level, subsystem, category, NO, messageCode, message, args); +} + ++ (void)logWithLevel:(GULLoggerLevel)level + withService:(GULLoggerService)service + withCode:(NSString *)messageCode + withMessage:(NSString *)message + withArgs:(va_list)args { + GULOSLogBasic(level, kGULLogSubsystem, service, NO, messageCode, message, args); +} + +@end diff --git a/Pods/GoogleUtilities/GoogleUtilities/Logger/Public/GoogleUtilities/GULLogger.h b/Pods/GoogleUtilities/GoogleUtilities/Logger/Public/GoogleUtilities/GULLogger.h new file mode 100644 index 0000000..6702219 --- /dev/null +++ b/Pods/GoogleUtilities/GoogleUtilities/Logger/Public/GoogleUtilities/GULLogger.h @@ -0,0 +1,165 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "GULLoggerLevel.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + * The services used in the logger. + * + * DEPRECATED; use NSString instead. + */ +typedef NSString *const GULLoggerService; + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/// Used for other GoogleUtilities logging. +extern NSString *const kGULLogSubsystem; + +/// Initialize GULLogger. +extern void GULLoggerInitialize(void); + +/// Override log level to Debug. +void GULLoggerForceDebug(void); + +/// Gets the current `GULLoggerLevel`. +extern GULLoggerLevel GULGetLoggerLevel(void); + +/** + * Changes the default logging level of GULLoggerLevelNotice to a user-specified level. + * The default level cannot be set above GULLoggerLevelNotice if the app is running from App Store. + * (required) log level (one of the GULLoggerLevel enum values). + */ +extern void GULSetLoggerLevel(GULLoggerLevel loggerLevel); + +/** + * Checks if the specified logger level is loggable given the current settings. + * (required) log level (one of the GULLoggerLevel enum values). + */ +extern BOOL GULIsLoggableLevel(GULLoggerLevel loggerLevel); + +/** + * Register version to include in logs. + * (required) version + */ +extern void GULLoggerRegisterVersion(NSString *version); + +/** + * Logs a message to the Xcode console and the device log. If running from AppStore, will + * not log any messages with a level higher than GULLoggerLevelNotice to avoid log spamming. + * (required) log level (one of the GULLoggerLevel enum values). + * (required) service name of type GULLoggerService. + * (required) message code starting with "I-" which means iOS, followed by a capitalized + * three-character service identifier and a six digit integer message ID that is unique + * within the service. + * An example of the message code is @"I-COR000001". + * (required) message string which can be a format string. + * (optional) variable arguments list obtained from calling va_start, used when message is a format + * string. + */ +extern void GULOSLogBasic(GULLoggerLevel level, + NSString *subsystem, + NSString *category, + BOOL forceLog, + NSString *messageCode, + NSString *message, +// On 64-bit simulators, va_list is not a pointer, so cannot be marked nullable +// See: http://stackoverflow.com/q/29095469 +#if __LP64__ && TARGET_OS_SIMULATOR || TARGET_OS_OSX + va_list args_ptr +#else + va_list _Nullable args_ptr +#endif +); + +/** + * The following functions accept the following parameters in order: + * (required) service name of type GULLoggerService. + * (required) message code starting from "I-" which means iOS, followed by a capitalized + * three-character service identifier and a six digit integer message ID that is unique + * within the service. + * An example of the message code is @"I-COR000001". + * See go/firebase-log-proposal for details. + * (required) message string which can be a format string. + * (optional) the list of arguments to substitute into the format string. + * Example usage: + * GULLogError(kGULLoggerCore, @"I-COR000001", @"Configuration of %@ failed.", app.name); + */ +extern void GULOSLogError(NSString *subsystem, + GULLoggerService category, + BOOL force, + NSString *messageCode, + NSString *message, + ...) NS_FORMAT_FUNCTION(5, 6); +extern void GULOSLogWarning(NSString *subsystem, + GULLoggerService category, + BOOL force, + NSString *messageCode, + NSString *message, + ...) NS_FORMAT_FUNCTION(5, 6); +extern void GULOSLogNotice(NSString *subsystem, + GULLoggerService category, + BOOL force, + NSString *messageCode, + NSString *message, + ...) NS_FORMAT_FUNCTION(5, 6); +extern void GULOSLogInfo(NSString *subsystem, + GULLoggerService category, + BOOL force, + NSString *messageCode, + NSString *message, + ...) NS_FORMAT_FUNCTION(5, 6); +extern void GULOSLogDebug(NSString *subsystem, + GULLoggerService category, + BOOL force, + NSString *messageCode, + NSString *message, + ...) NS_FORMAT_FUNCTION(5, 6); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + +@interface GULLoggerWrapper : NSObject + +/// Objective-C wrapper for `GULOSLogBasic` to allow weak linking to `GULLogger`. +/// +/// - Parameters: +/// - level: The log level (one of the `GULLoggerLevel` enum values). +/// - subsystem: An identifier for the subsystem performing logging, e.g., `com.example.logger`. +/// - category: The category name within the `subsystem` to group related messages, e.g., +/// `[GoogleUtilities/Example]`. +/// - messageCode: The message code starting with "I-" which means iOS, followed by a capitalized +/// three-character service identifier and a six digit integer message ID that is unique within +/// the service. An example of the message code is @"I-COR000001". +/// - message: The message to log, which may be a format string. +/// - args: The variable arguments list obtained from calling va_start, used when message is +/// a format string; optional if `message` is not a format string. ++ (void)logWithLevel:(GULLoggerLevel)level + subsystem:(NSString *)subsystem + category:(NSString *)category + messageCode:(NSString *)messageCode + message:(NSString *)message + arguments:(va_list)args; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleUtilities/GoogleUtilities/Logger/Public/GoogleUtilities/GULLoggerLevel.h b/Pods/GoogleUtilities/GoogleUtilities/Logger/Public/GoogleUtilities/GULLoggerLevel.h new file mode 100644 index 0000000..6a68eb1 --- /dev/null +++ b/Pods/GoogleUtilities/GoogleUtilities/Logger/Public/GoogleUtilities/GULLoggerLevel.h @@ -0,0 +1,47 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/// The log levels used by internal logging. +typedef NS_ENUM(NSInteger, GULLoggerLevel) { + /// Error level, corresponding to `OS_LOG_TYPE_ERROR`. + GULLoggerLevelError = 3, // For backwards compatibility, the enum value matches `ASL_LEVEL_ERR`. + + /// Warning level, corresponding to `OS_LOG_TYPE_DEFAULT`. + /// + /// > Note: Since OSLog doesn't have a WARNING type, this is equivalent to `GULLoggerLevelNotice`. + GULLoggerLevelWarning = 4, // For backwards compatibility, the value matches `ASL_LEVEL_WARNING`. + + /// Notice level, corresponding to `OS_LOG_TYPE_DEFAULT`. + GULLoggerLevelNotice = 5, // For backwards compatibility, the value matches `ASL_LEVEL_NOTICE`. + + /// Info level, corresponding to `OS_LOG_TYPE_INFO`. + GULLoggerLevelInfo = 6, // For backwards compatibility, the enum value matches `ASL_LEVEL_INFO`. + + /// Debug level, corresponding to `OS_LOG_TYPE_DEBUG`. + GULLoggerLevelDebug = 7, // For backwards compatibility, the value matches `ASL_LEVEL_DEBUG`. + + /// The minimum (most severe) supported logging level. + GULLoggerLevelMin = GULLoggerLevelError, + + /// The maximum (least severe) supported logging level. + GULLoggerLevelMax = GULLoggerLevelDebug +} NS_SWIFT_NAME(GoogleLoggerLevel); + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleUtilities/GoogleUtilities/MethodSwizzler/GULSwizzler.m b/Pods/GoogleUtilities/GoogleUtilities/MethodSwizzler/GULSwizzler.m new file mode 100644 index 0000000..3b40b41 --- /dev/null +++ b/Pods/GoogleUtilities/GoogleUtilities/MethodSwizzler/GULSwizzler.m @@ -0,0 +1,154 @@ +// Copyright 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "GoogleUtilities/MethodSwizzler/Public/GoogleUtilities/GULSwizzler.h" + +#import + +#ifdef DEBUG +#import "GoogleUtilities/Common/GULLoggerCodes.h" +#import "GoogleUtilities/Logger/Public/GoogleUtilities/GULLogger.h" + +static GULLoggerService kGULLoggerSwizzler = @"[GoogleUtilities/MethodSwizzler]"; +#endif + +dispatch_queue_t GetGULSwizzlingQueue(void) { + static dispatch_queue_t queue; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + queue = dispatch_queue_create("com.google.GULSwizzler", DISPATCH_QUEUE_SERIAL); + }); + return queue; +} + +@implementation GULSwizzler + ++ (void)swizzleClass:(Class)aClass + selector:(SEL)selector + isClassSelector:(BOOL)isClassSelector + withBlock:(nullable id)block { + dispatch_sync(GetGULSwizzlingQueue(), ^{ + NSAssert(selector, @"The selector cannot be NULL"); + NSAssert(aClass, @"The class cannot be Nil"); + Class resolvedClass = aClass; + Method method = nil; + if (isClassSelector) { + method = class_getClassMethod(aClass, selector); + resolvedClass = object_getClass(aClass); + } else { + method = class_getInstanceMethod(aClass, selector); + } + NSAssert(method, @"You're attempting to swizzle a method that doesn't exist. (%@, %@)", + NSStringFromClass(resolvedClass), NSStringFromSelector(selector)); + IMP newImp = imp_implementationWithBlock(block); +#ifdef DEBUG + IMP currentImp = class_getMethodImplementation(resolvedClass, selector); + Class class = NSClassFromString(@"GULSwizzlingCache"); + if (class) { + SEL cacheSelector = NSSelectorFromString(@"cacheCurrentIMP:forNewIMP:forClass:withSelector:"); + NSMethodSignature *methodSignature = [class methodSignatureForSelector:cacheSelector]; + if (methodSignature != nil) { + NSInvocation *inv = [NSInvocation invocationWithMethodSignature:methodSignature]; + [inv setSelector:cacheSelector]; + [inv setTarget:class]; + [inv setArgument:&(currentImp) atIndex:2]; + [inv setArgument:&(newImp) atIndex:3]; + [inv setArgument:&(resolvedClass) atIndex:4]; + [inv setArgument:(void *_Nonnull)&(selector) atIndex:5]; + [inv invoke]; + } + } +#endif + + const char *typeEncoding = method_getTypeEncoding(method); + __unused IMP originalImpOfClass = + class_replaceMethod(resolvedClass, selector, newImp, typeEncoding); + +#ifdef DEBUG + // If !originalImpOfClass, then the IMP came from a superclass. + if (originalImpOfClass) { + SEL selector = NSSelectorFromString(@"originalIMPOfCurrentIMP:"); + NSMethodSignature *methodSignature = [class methodSignatureForSelector:selector]; + if (methodSignature != nil) { + NSInvocation *inv = [NSInvocation invocationWithMethodSignature:methodSignature]; + [inv setSelector:selector]; + [inv setTarget:class]; + [inv setArgument:&(currentImp) atIndex:2]; + [inv invoke]; + IMP testOriginal; + [inv getReturnValue:&testOriginal]; + if (originalImpOfClass != testOriginal) { + GULOSLogWarning( + kGULLogSubsystem, kGULLoggerSwizzler, NO, + [NSString + stringWithFormat:@"I-SWZ%06ld", (long)kGULSwizzlerMessageCodeMethodSwizzling000], + @"Swizzling class: %@ SEL:%@ after it has been previously been swizzled.", + NSStringFromClass(resolvedClass), NSStringFromSelector(selector)); + } + } + } +#endif + }); +} + ++ (nullable IMP)currentImplementationForClass:(Class)aClass + selector:(SEL)selector + isClassSelector:(BOOL)isClassSelector { + NSAssert(selector, @"The selector cannot be NULL"); + NSAssert(aClass, @"The class cannot be Nil"); + if (selector == NULL || aClass == nil) { + return nil; + } + __block IMP currentIMP = nil; + dispatch_sync(GetGULSwizzlingQueue(), ^{ + Method method = nil; + if (isClassSelector) { + method = class_getClassMethod(aClass, selector); + } else { + method = class_getInstanceMethod(aClass, selector); + } + NSAssert(method, @"The Method for this class/selector combo doesn't exist (%@, %@).", + NSStringFromClass(aClass), NSStringFromSelector(selector)); + if (method == nil) { + return; + } + currentIMP = method_getImplementation(method); + NSAssert(currentIMP, @"The IMP for this class/selector combo doesn't exist (%@, %@).", + NSStringFromClass(aClass), NSStringFromSelector(selector)); + }); + return currentIMP; +} + ++ (BOOL)selector:(SEL)selector existsInClass:(Class)aClass isClassSelector:(BOOL)isClassSelector { + Method method = isClassSelector ? class_getClassMethod(aClass, selector) + : class_getInstanceMethod(aClass, selector); + return method != nil; +} + ++ (NSArray *)ivarObjectsForObject:(id)object { + NSMutableArray *array = [NSMutableArray array]; + unsigned int count; + Ivar *vars = class_copyIvarList([object class], &count); + for (NSUInteger i = 0; i < count; i++) { + const char *typeEncoding = ivar_getTypeEncoding(vars[i]); + // Check to see if the ivar is an object. + if (strncmp(typeEncoding, "@", 1) == 0) { + id ivarObject = object_getIvar(object, vars[i]); + [array addObject:ivarObject]; + } + } + free(vars); + return array; +} +@end diff --git a/Pods/GoogleUtilities/GoogleUtilities/MethodSwizzler/Public/GoogleUtilities/GULOriginalIMPConvenienceMacros.h b/Pods/GoogleUtilities/GoogleUtilities/MethodSwizzler/Public/GoogleUtilities/GULOriginalIMPConvenienceMacros.h new file mode 100644 index 0000000..18b7b58 --- /dev/null +++ b/Pods/GoogleUtilities/GoogleUtilities/MethodSwizzler/Public/GoogleUtilities/GULOriginalIMPConvenienceMacros.h @@ -0,0 +1,213 @@ +/* + * Copyright 2018 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + * GULOriginalIMPConvenienceMacros.h + * + * This header contains convenience macros for invoking the original IMP of a swizzled method. + */ + +/** + * Invokes original IMP when the original selector takes no arguments. + * + * @param __receivingObject The object on which the IMP is invoked. + * @param __swizzledSEL The selector used for swizzling. + * @param __returnType The return type of the original implementation. + * @param __originalIMP The original IMP. + */ +#define GUL_INVOKE_ORIGINAL_IMP0(__receivingObject, __swizzledSEL, __returnType, __originalIMP) \ + ((__returnType (*)(id, SEL))__originalIMP)(__receivingObject, __swizzledSEL) + +/** + * Invokes original IMP when the original selector takes 1 argument. + * + * @param __receivingObject The object on which the IMP is invoked. + * @param __swizzledSEL The selector used for swizzling. + * @param __returnType The return type of the original implementation. + * @param __originalIMP The original IMP. + * @param __arg1 The first argument. + */ +#define GUL_INVOKE_ORIGINAL_IMP1(__receivingObject, __swizzledSEL, __returnType, __originalIMP, \ + __arg1) \ + ((__returnType (*)(id, SEL, __typeof__(__arg1)))__originalIMP)(__receivingObject, __swizzledSEL, \ + __arg1) + +/** + * Invokes original IMP when the original selector takes 2 arguments. + * + * @param __receivingObject The object on which the IMP is invoked. + * @param __swizzledSEL The selector used for swizzling. + * @param __returnType The return type of the original implementation. + * @param __originalIMP The original IMP. + * @param __arg1 The first argument. + * @param __arg2 The second argument. + */ +#define GUL_INVOKE_ORIGINAL_IMP2(__receivingObject, __swizzledSEL, __returnType, __originalIMP, \ + __arg1, __arg2) \ + ((__returnType (*)(id, SEL, __typeof__(__arg1), __typeof__(__arg2)))__originalIMP)( \ + __receivingObject, __swizzledSEL, __arg1, __arg2) + +/** + * Invokes original IMP when the original selector takes 3 arguments. + * + * @param __receivingObject The object on which the IMP is invoked. + * @param __swizzledSEL The selector used for swizzling. + * @param __returnType The return type of the original implementation. + * @param __originalIMP The original IMP. + * @param __arg1 The first argument. + * @param __arg2 The second argument. + * @param __arg3 The third argument. + */ +#define GUL_INVOKE_ORIGINAL_IMP3(__receivingObject, __swizzledSEL, __returnType, __originalIMP, \ + __arg1, __arg2, __arg3) \ + ((__returnType (*)(id, SEL, __typeof__(__arg1), __typeof__(__arg2), \ + __typeof__(__arg3)))__originalIMP)(__receivingObject, __swizzledSEL, __arg1, \ + __arg2, __arg3) + +/** + * Invokes original IMP when the original selector takes 4 arguments. + * + * @param __receivingObject The object on which the IMP is invoked. + * @param __swizzledSEL The selector used for swizzling. + * @param __returnType The return type of the original implementation. + * @param __originalIMP The original IMP. + * @param __arg1 The first argument. + * @param __arg2 The second argument. + * @param __arg3 The third argument. + * @param __arg4 The fourth argument. + */ +#define GUL_INVOKE_ORIGINAL_IMP4(__receivingObject, __swizzledSEL, __returnType, __originalIMP, \ + __arg1, __arg2, __arg3, __arg4) \ + ((__returnType (*)(id, SEL, __typeof__(__arg1), __typeof__(__arg2), __typeof__(__arg3), \ + __typeof__(__arg4)))__originalIMP)(__receivingObject, __swizzledSEL, __arg1, \ + __arg2, __arg3, __arg4) + +/** + * Invokes original IMP when the original selector takes 5 arguments. + * + * @param __receivingObject The object on which the IMP is invoked. + * @param __swizzledSEL The selector used for swizzling. + * @param __returnType The return type of the original implementation. + * @param __originalIMP The original IMP. + * @param __arg1 The first argument. + * @param __arg2 The second argument. + * @param __arg3 The third argument. + * @param __arg4 The fourth argument. + * @param __arg5 The fifth argument. + */ +#define GUL_INVOKE_ORIGINAL_IMP5(__receivingObject, __swizzledSEL, __returnType, __originalIMP, \ + __arg1, __arg2, __arg3, __arg4, __arg5) \ + ((__returnType (*)(id, SEL, __typeof__(__arg1), __typeof__(__arg2), __typeof__(__arg3), \ + __typeof__(__arg4), __typeof__(__arg5)))__originalIMP)( \ + __receivingObject, __swizzledSEL, __arg1, __arg2, __arg3, __arg4, __arg5) + +/** + * Invokes original IMP when the original selector takes 6 arguments. + * + * @param __receivingObject The object on which the IMP is invoked. + * @param __swizzledSEL The selector used for swizzling. + * @param __returnType The return type of the original implementation. + * @param __originalIMP The original IMP. + * @param __arg1 The first argument. + * @param __arg2 The second argument. + * @param __arg3 The third argument. + * @param __arg4 The fourth argument. + * @param __arg5 The fifth argument. + * @param __arg6 The sixth argument. + */ +#define GUL_INVOKE_ORIGINAL_IMP6(__receivingObject, __swizzledSEL, __returnType, __originalIMP, \ + __arg1, __arg2, __arg3, __arg4, __arg5, __arg6) \ + ((__returnType (*)(id, SEL, __typeof__(__arg1), __typeof__(__arg2), __typeof__(__arg3), \ + __typeof__(__arg4), __typeof__(__arg5), __typeof__(__arg6)))__originalIMP)( \ + __receivingObject, __swizzledSEL, __arg1, __arg2, __arg3, __arg4, __arg5, __arg6) + +/** + * Invokes original IMP when the original selector takes 7 arguments. + * + * @param __receivingObject The object on which the IMP is invoked. + * @param __swizzledSEL The selector used for swizzling. + * @param __returnType The return type of the original implementation. + * @param __originalIMP The original IMP. + * @param __arg1 The first argument. + * @param __arg2 The second argument. + * @param __arg3 The third argument. + * @param __arg4 The fourth argument. + * @param __arg5 The fifth argument. + * @param __arg6 The sixth argument. + * @param __arg7 The seventh argument. + */ +#define GUL_INVOKE_ORIGINAL_IMP7(__receivingObject, __swizzledSEL, __returnType, __originalIMP, \ + __arg1, __arg2, __arg3, __arg4, __arg5, __arg6, __arg7) \ + ((__returnType (*)(id, SEL, __typeof__(__arg1), __typeof__(__arg2), __typeof__(__arg3), \ + __typeof__(__arg4), __typeof__(__arg5), __typeof__(__arg6), \ + __typeof__(__arg7)))__originalIMP)( \ + __receivingObject, __swizzledSEL, __arg1, __arg2, __arg3, __arg4, __arg5, __arg6, __arg7) + +/** + * Invokes original IMP when the original selector takes 8 arguments. + * + * @param __receivingObject The object on which the IMP is invoked. + * @param __swizzledSEL The selector used for swizzling. + * @param __returnType The return type of the original implementation. + * @param __originalIMP The original IMP. + * @param __arg1 The first argument. + * @param __arg2 The second argument. + * @param __arg3 The third argument. + * @param __arg4 The fourth argument. + * @param __arg5 The fifth argument. + * @param __arg6 The sixth argument. + * @param __arg7 The seventh argument. + * @param __arg8 The eighth argument. + */ +#define GUL_INVOKE_ORIGINAL_IMP8(__receivingObject, __swizzledSEL, __returnType, __originalIMP, \ + __arg1, __arg2, __arg3, __arg4, __arg5, __arg6, __arg7, __arg8) \ + ((__returnType (*)(id, SEL, __typeof__(__arg1), __typeof__(__arg2), __typeof__(__arg3), \ + __typeof__(__arg4), __typeof__(__arg5), __typeof__(__arg6), \ + __typeof__(__arg7), __typeof__(__arg8)))__originalIMP)( \ + __receivingObject, __swizzledSEL, __arg1, __arg2, __arg3, __arg4, __arg5, __arg6, __arg7, \ + __arg8) + +/** + * Invokes original IMP when the original selector takes 9 arguments. + * + * @param __receivingObject The object on which the IMP is invoked. + * @param __swizzledSEL The selector used for swizzling. + * @param __returnType The return type of the original implementation. + * @param __originalIMP The original IMP. + * @param __arg1 The first argument. + * @param __arg2 The second argument. + * @param __arg3 The third argument. + * @param __arg4 The fourth argument. + * @param __arg5 The fifth argument. + * @param __arg6 The sixth argument. + * @param __arg7 The seventh argument. + * @param __arg8 The eighth argument. + * @param __arg9 The ninth argument. + */ +#define GUL_INVOKE_ORIGINAL_IMP9(__receivingObject, __swizzledSEL, __returnType, __originalIMP, \ + __arg1, __arg2, __arg3, __arg4, __arg5, __arg6, __arg7, __arg8, \ + __arg9) \ + ((__returnType (*)(id, SEL, __typeof__(__arg1), __typeof__(__arg2), __typeof__(__arg3), \ + __typeof__(__arg4), __typeof__(__arg5), __typeof__(__arg6), \ + __typeof__(__arg7), __typeof__(__arg8), __typeof__(__arg9)))__originalIMP)( \ + __receivingObject, __swizzledSEL, __arg1, __arg2, __arg3, __arg4, __arg5, __arg6, __arg7, \ + __arg8, __arg9) + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleUtilities/GoogleUtilities/MethodSwizzler/Public/GoogleUtilities/GULSwizzler.h b/Pods/GoogleUtilities/GoogleUtilities/MethodSwizzler/Public/GoogleUtilities/GULSwizzler.h new file mode 100644 index 0000000..26949c8 --- /dev/null +++ b/Pods/GoogleUtilities/GoogleUtilities/MethodSwizzler/Public/GoogleUtilities/GULSwizzler.h @@ -0,0 +1,71 @@ +/* + * Copyright 2018 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** This class handles the runtime manipulation necessary to instrument selectors. It stores the + * classes and selectors that have been swizzled, and runs all operations on its own queue. + */ +@interface GULSwizzler : NSObject + +/** Manipulates the Objective-C runtime to replace the original IMP with the supplied block. + * + * @param aClass The class to swizzle. + * @param selector The selector of the class to swizzle. + * @param isClassSelector A BOOL specifying whether the selector is a class or instance selector. + * @param block The block that replaces the original IMP. + */ ++ (void)swizzleClass:(Class)aClass + selector:(SEL)selector + isClassSelector:(BOOL)isClassSelector + withBlock:(nullable id)block; + +/** Returns the current IMP for the given class and selector. + * + * @param aClass The class to use. + * @param selector The selector to find the implementation of. + * @param isClassSelector A BOOL specifying whether the selector is a class or instance selector. + * @return The implementation of the selector in the runtime. + */ ++ (nullable IMP)currentImplementationForClass:(Class)aClass + selector:(SEL)selector + isClassSelector:(BOOL)isClassSelector; + +/** Checks the runtime to see if a selector exists on a class. If a property is declared as + * @dynamic, we have a reverse swizzling situation, where the implementation of a method exists + * only in concrete subclasses, and NOT in the superclass. We can detect that situation using + * this helper method. Similarly, we can detect situations where a class doesn't implement a + * protocol method. + * + * @param selector The selector to check for. + * @param aClass The class to check. + * @param isClassSelector A BOOL specifying whether the selector is a class or instance selector. + * @return YES if the method was found in this selector/class combination, NO otherwise. + */ ++ (BOOL)selector:(SEL)selector existsInClass:(Class)aClass isClassSelector:(BOOL)isClassSelector; + +/** Returns a list of all Objective-C (and not primitive) ivars contained by the given object. + * + * @param object The object whose ivars will be iterated. + * @return The list of ivar objects. + */ ++ (NSArray *)ivarObjectsForObject:(id)object; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleUtilities/GoogleUtilities/NSData+zlib/GULNSData+zlib.m b/Pods/GoogleUtilities/GoogleUtilities/NSData+zlib/GULNSData+zlib.m new file mode 100644 index 0000000..cec621e --- /dev/null +++ b/Pods/GoogleUtilities/GoogleUtilities/NSData+zlib/GULNSData+zlib.m @@ -0,0 +1,207 @@ +// Copyright 2018 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "GoogleUtilities/NSData+zlib/Public/GoogleUtilities/GULNSData+zlib.h" + +#import + +#define kChunkSize 1024 +#define Z_DEFAULT_COMPRESSION (-1) + +NSString *const GULNSDataZlibErrorDomain = @"com.google.GULNSDataZlibErrorDomain"; +NSString *const GULNSDataZlibErrorKey = @"GULNSDataZlibErrorKey"; +NSString *const GULNSDataZlibRemainingBytesKey = @"GULNSDataZlibRemainingBytesKey"; + +@implementation NSData (GULGzip) + ++ (nullable NSData *)gul_dataByInflatingGzippedData:(NSData *)data error:(NSError **)error { + const void *bytes = [data bytes]; + NSUInteger length = [data length]; + if (!bytes || !length) { + return nil; + } + +#if defined(__LP64__) && __LP64__ + // Don't support > 32bit length for 64 bit, see note in header. + if (length > UINT_MAX) { + return nil; + } +#endif + + z_stream strm; + bzero(&strm, sizeof(z_stream)); + + // Setup the input. + strm.avail_in = (unsigned int)length; + strm.next_in = (unsigned char *)bytes; + + int windowBits = 15; // 15 to enable any window size + windowBits += 32; // and +32 to enable zlib or gzip header detection. + + int retCode; + if ((retCode = inflateInit2(&strm, windowBits)) != Z_OK) { + if (error) { + NSDictionary *userInfo = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:retCode] + forKey:GULNSDataZlibErrorKey]; + *error = [NSError errorWithDomain:GULNSDataZlibErrorDomain + code:GULNSDataZlibErrorInternal + userInfo:userInfo]; + } + return nil; + } + + // Hint the size at 4x the input size. + NSMutableData *result = [NSMutableData dataWithCapacity:(length * 4)]; + unsigned char output[kChunkSize]; + + // Loop to collect the data. + do { + // Update what we're passing in. + strm.avail_out = kChunkSize; + strm.next_out = output; + retCode = inflate(&strm, Z_NO_FLUSH); + if ((retCode != Z_OK) && (retCode != Z_STREAM_END)) { + if (error) { + NSMutableDictionary *userInfo = + [NSMutableDictionary dictionaryWithObject:[NSNumber numberWithInt:retCode] + forKey:GULNSDataZlibErrorKey]; + if (strm.msg) { + NSString *message = [NSString stringWithUTF8String:strm.msg]; + if (message) { + [userInfo setObject:message forKey:NSLocalizedDescriptionKey]; + } + } + *error = [NSError errorWithDomain:GULNSDataZlibErrorDomain + code:GULNSDataZlibErrorInternal + userInfo:userInfo]; + } + inflateEnd(&strm); + return nil; + } + // Collect what we got. + unsigned gotBack = kChunkSize - strm.avail_out; + if (gotBack > 0) { + [result appendBytes:output length:gotBack]; + } + + } while (retCode == Z_OK); + + // Make sure there wasn't more data tacked onto the end of a valid compressed stream. + if (strm.avail_in != 0) { + if (error) { + NSDictionary *userInfo = + [NSDictionary dictionaryWithObject:[NSNumber numberWithUnsignedInt:strm.avail_in] + forKey:GULNSDataZlibRemainingBytesKey]; + *error = [NSError errorWithDomain:GULNSDataZlibErrorDomain + code:GULNSDataZlibErrorDataRemaining + userInfo:userInfo]; + } + result = nil; + } + // The only way out of the loop was by hitting the end of the stream. + NSAssert(retCode == Z_STREAM_END, + @"Thought we finished inflate w/o getting a result of stream end, code %d", retCode); + + // Clean up. + inflateEnd(&strm); + + return result; +} + ++ (nullable NSData *)gul_dataByGzippingData:(NSData *)data error:(NSError **)error { + const void *bytes = [data bytes]; + NSUInteger length = [data length]; + + int level = Z_DEFAULT_COMPRESSION; + if (!bytes || !length) { + return nil; + } + +#if defined(__LP64__) && __LP64__ + // Don't support > 32bit length for 64 bit, see note in header. + if (length > UINT_MAX) { + if (error) { + *error = [NSError errorWithDomain:GULNSDataZlibErrorDomain + code:GULNSDataZlibErrorGreaterThan32BitsToCompress + userInfo:nil]; + } + return nil; + } +#endif + + z_stream strm; + bzero(&strm, sizeof(z_stream)); + + int memLevel = 8; // Default. + int windowBits = 15 + 16; // Enable gzip header instead of zlib header. + + int retCode; + if ((retCode = deflateInit2(&strm, level, Z_DEFLATED, windowBits, memLevel, + Z_DEFAULT_STRATEGY)) != Z_OK) { + if (error) { + NSDictionary *userInfo = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:retCode] + forKey:GULNSDataZlibErrorKey]; + *error = [NSError errorWithDomain:GULNSDataZlibErrorDomain + code:GULNSDataZlibErrorInternal + userInfo:userInfo]; + } + return nil; + } + + // Hint the size at 1/4 the input size. + NSMutableData *result = [NSMutableData dataWithCapacity:(length / 4)]; + unsigned char output[kChunkSize]; + + // Setup the input. + strm.avail_in = (unsigned int)length; + strm.next_in = (unsigned char *)bytes; + + // Collect the data. + do { + // update what we're passing in + strm.avail_out = kChunkSize; + strm.next_out = output; + retCode = deflate(&strm, Z_FINISH); + if ((retCode != Z_OK) && (retCode != Z_STREAM_END)) { + if (error) { + NSDictionary *userInfo = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:retCode] + forKey:GULNSDataZlibErrorKey]; + *error = [NSError errorWithDomain:GULNSDataZlibErrorDomain + code:GULNSDataZlibErrorInternal + userInfo:userInfo]; + } + deflateEnd(&strm); + return nil; + } + // Collect what we got. + unsigned gotBack = kChunkSize - strm.avail_out; + if (gotBack > 0) { + [result appendBytes:output length:gotBack]; + } + + } while (retCode == Z_OK); + + // If the loop exits, it used all input and the stream ended. + NSAssert(strm.avail_in == 0, + @"Should have finished deflating without using all input, %u bytes left", strm.avail_in); + NSAssert(retCode == Z_STREAM_END, + @"thought we finished deflate w/o getting a result of stream end, code %d", retCode); + + // Clean up. + deflateEnd(&strm); + + return result; +} + +@end diff --git a/Pods/GoogleUtilities/GoogleUtilities/NSData+zlib/Public/GoogleUtilities/GULNSData+zlib.h b/Pods/GoogleUtilities/GoogleUtilities/NSData+zlib/Public/GoogleUtilities/GULNSData+zlib.h new file mode 100644 index 0000000..f195d57 --- /dev/null +++ b/Pods/GoogleUtilities/GoogleUtilities/NSData+zlib/Public/GoogleUtilities/GULNSData+zlib.h @@ -0,0 +1,53 @@ +// Copyright 2018 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +NS_ASSUME_NONNULL_BEGIN + +/// This is a copy of Google Toolbox for Mac library to avoid creating an extra framework. + +// NOTE: For 64bit, none of these apis handle input sizes >32bits, they will return nil when given +// such data. To handle data of that size you really should be streaming it rather then doing it all +// in memory. + +@interface NSData (GULGzip) + +/// Returns an data as the result of decompressing the payload of |data|.The data to decompress must +/// be a gzipped payloads. ++ (nullable NSData *)gul_dataByInflatingGzippedData:(NSData *)data error:(NSError **)error; + +/// Returns an compressed data with the result of gzipping the payload of |data|. Uses the default +/// compression level. ++ (nullable NSData *)gul_dataByGzippingData:(NSData *)data error:(NSError **)error; + +FOUNDATION_EXPORT NSString *const GULNSDataZlibErrorDomain; +FOUNDATION_EXPORT NSString *const GULNSDataZlibErrorKey; // NSNumber +FOUNDATION_EXPORT NSString *const GULNSDataZlibRemainingBytesKey; // NSNumber + +typedef NS_ENUM(NSInteger, GULNSDataZlibError) { + GULNSDataZlibErrorGreaterThan32BitsToCompress = 1024, + // An internal zlib error. + // GULNSDataZlibErrorKey will contain the error value. + // NSLocalizedDescriptionKey may contain an error string from zlib. + // Look in zlib.h for list of errors. + GULNSDataZlibErrorInternal, + // There was left over data in the buffer that was not used. + // GULNSDataZlibRemainingBytesKey will contain number of remaining bytes. + GULNSDataZlibErrorDataRemaining +}; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleUtilities/GoogleUtilities/Network/GULMutableDictionary.m b/Pods/GoogleUtilities/GoogleUtilities/Network/GULMutableDictionary.m new file mode 100644 index 0000000..7726d15 --- /dev/null +++ b/Pods/GoogleUtilities/GoogleUtilities/Network/GULMutableDictionary.m @@ -0,0 +1,101 @@ +// Copyright 2017 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "GoogleUtilities/Network/Public/GoogleUtilities/GULMutableDictionary.h" + +@implementation GULMutableDictionary { + /// The mutable dictionary. + NSMutableDictionary *_objects; + + /// Serial synchronization queue. All reads should use dispatch_sync, while writes use + /// dispatch_async. + dispatch_queue_t _queue; +} + +- (instancetype)init { + self = [super init]; + + if (self) { + _objects = [[NSMutableDictionary alloc] init]; + _queue = dispatch_queue_create("GULMutableDictionary", DISPATCH_QUEUE_SERIAL); + } + + return self; +} + +- (NSString *)description { + __block NSString *description; + dispatch_sync(_queue, ^{ + description = self->_objects.description; + }); + return description; +} + +- (id)objectForKey:(id)key { + __block id object; + dispatch_sync(_queue, ^{ + object = [self->_objects objectForKey:key]; + }); + return object; +} + +- (void)setObject:(id)object forKey:(id)key { + dispatch_async(_queue, ^{ + [self->_objects setObject:object forKey:key]; + }); +} + +- (void)removeObjectForKey:(id)key { + dispatch_async(_queue, ^{ + [self->_objects removeObjectForKey:key]; + }); +} + +- (void)removeAllObjects { + dispatch_async(_queue, ^{ + [self->_objects removeAllObjects]; + }); +} + +- (NSUInteger)count { + __block NSUInteger count; + dispatch_sync(_queue, ^{ + count = self->_objects.count; + }); + return count; +} + +- (id)objectForKeyedSubscript:(id)key { + __block id object; + dispatch_sync(_queue, ^{ + object = self->_objects[key]; + }); + return object; +} + +- (void)setObject:(id)obj forKeyedSubscript:(id)key { + dispatch_async(_queue, ^{ + self->_objects[key] = obj; + }); +} + +- (NSDictionary *)dictionary { + __block NSDictionary *dictionary; + dispatch_sync(_queue, ^{ + dictionary = [self->_objects copy]; + }); + return dictionary; +} + +@end diff --git a/Pods/GoogleUtilities/GoogleUtilities/Network/GULNetwork.m b/Pods/GoogleUtilities/GoogleUtilities/Network/GULNetwork.m new file mode 100644 index 0000000..23b3bb0 --- /dev/null +++ b/Pods/GoogleUtilities/GoogleUtilities/Network/GULNetwork.m @@ -0,0 +1,406 @@ +// Copyright 2017 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "GoogleUtilities/Network/Public/GoogleUtilities/GULNetwork.h" +#import "GoogleUtilities/Network/Public/GoogleUtilities/GULNetworkMessageCode.h" + +#import "GoogleUtilities/Logger/Public/GoogleUtilities/GULLogger.h" +#import "GoogleUtilities/NSData+zlib/Public/GoogleUtilities/GULNSData+zlib.h" +#import "GoogleUtilities/Network/GULNetworkInternal.h" +#import "GoogleUtilities/Network/Public/GoogleUtilities/GULMutableDictionary.h" +#import "GoogleUtilities/Network/Public/GoogleUtilities/GULNetworkConstants.h" +#import "GoogleUtilities/Reachability/Public/GoogleUtilities/GULReachabilityChecker.h" + +/// Constant string for request header Content-Encoding. +static NSString *const kGULNetworkContentCompressionKey = @"Content-Encoding"; + +/// Constant string for request header Content-Encoding value. +static NSString *const kGULNetworkContentCompressionValue = @"gzip"; + +/// Constant string for request header Content-Length. +static NSString *const kGULNetworkContentLengthKey = @"Content-Length"; + +/// Constant string for request header Content-Type. +static NSString *const kGULNetworkContentTypeKey = @"Content-Type"; + +/// Constant string for request header Content-Type value. +static NSString *const kGULNetworkContentTypeValue = @"application/x-www-form-urlencoded"; + +/// Constant string for GET request method. +static NSString *const kGULNetworkGETRequestMethod = @"GET"; + +/// Constant string for POST request method. +static NSString *const kGULNetworkPOSTRequestMethod = @"POST"; + +/// Default constant string as a prefix for network logger. +static NSString *const kGULNetworkLogTag = @"Google/Utilities/Network"; + +@interface GULNetwork () +@end + +@implementation GULNetwork { + /// Network reachability. + GULReachabilityChecker *_reachability; + + /// The dictionary of requests by session IDs { NSString : id }. + GULMutableDictionary *_requests; +} + +- (instancetype)init { + return [self initWithReachabilityHost:kGULNetworkReachabilityHost]; +} + +- (instancetype)initWithReachabilityHost:(NSString *)reachabilityHost { + self = [super init]; + if (self) { + // Setup reachability. + _reachability = [[GULReachabilityChecker alloc] initWithReachabilityDelegate:self + withHost:reachabilityHost]; + if (![_reachability start]) { + return nil; + } + + _requests = [[GULMutableDictionary alloc] init]; + _timeoutInterval = kGULNetworkTimeOutInterval; + } + return self; +} + +- (void)dealloc { + _reachability.reachabilityDelegate = nil; + [_reachability stop]; +} + +#pragma mark - External Methods + ++ (void)handleEventsForBackgroundURLSessionID:(NSString *)sessionID + completionHandler:(GULNetworkSystemCompletionHandler)completionHandler { + [GULNetworkURLSession handleEventsForBackgroundURLSessionID:sessionID + completionHandler:completionHandler]; +} + +- (nullable NSString *)postURL:(NSURL *)url + payload:(NSData *)payload + queue:(nullable dispatch_queue_t)queue + usingBackgroundSession:(BOOL)usingBackgroundSession + completionHandler:(GULNetworkCompletionHandler)handler { + return [self postURL:url + headers:nil + payload:payload + queue:queue + usingBackgroundSession:usingBackgroundSession + completionHandler:handler]; +} + +- (nullable NSString *)postURL:(NSURL *)url + headers:(nullable NSDictionary *)headers + payload:(NSData *)payload + queue:(nullable dispatch_queue_t)queue + usingBackgroundSession:(BOOL)usingBackgroundSession + completionHandler:(GULNetworkCompletionHandler)handler { + if (!url.absoluteString.length) { + [self handleErrorWithCode:GULErrorCodeNetworkInvalidURL queue:queue withHandler:handler]; + return nil; + } + + NSTimeInterval timeOutInterval = _timeoutInterval ?: kGULNetworkTimeOutInterval; + + NSMutableURLRequest *request = + [[NSMutableURLRequest alloc] initWithURL:url + cachePolicy:NSURLRequestReloadIgnoringLocalCacheData + timeoutInterval:timeOutInterval]; + + if (!request) { + [self handleErrorWithCode:GULErrorCodeNetworkSessionTaskCreation + queue:queue + withHandler:handler]; + return nil; + } + request.allHTTPHeaderFields = headers; + + NSError *compressError = nil; + NSData *compressedData = [NSData gul_dataByGzippingData:payload error:&compressError]; + if (!compressedData || compressError) { + if (compressError || payload.length > 0) { + // If the payload is not empty but it fails to compress the payload, something has been wrong. + [self handleErrorWithCode:GULErrorCodeNetworkPayloadCompression + queue:queue + withHandler:handler]; + return nil; + } + compressedData = [[NSData alloc] init]; + } + + NSString *postLength = @(compressedData.length).stringValue; + + // Set up the request with the compressed data. + [request setValue:postLength forHTTPHeaderField:kGULNetworkContentLengthKey]; + request.HTTPBody = compressedData; + request.HTTPMethod = kGULNetworkPOSTRequestMethod; + [request setValue:kGULNetworkContentTypeValue forHTTPHeaderField:kGULNetworkContentTypeKey]; + [request setValue:kGULNetworkContentCompressionValue + forHTTPHeaderField:kGULNetworkContentCompressionKey]; + + GULNetworkURLSession *fetcher = [[GULNetworkURLSession alloc] initWithNetworkLoggerDelegate:self]; + fetcher.backgroundNetworkEnabled = usingBackgroundSession; + + __weak GULNetwork *weakSelf = self; + NSString *requestID = [fetcher + sessionIDFromAsyncPOSTRequest:request + completionHandler:^(NSHTTPURLResponse *response, NSData *data, + NSString *sessionID, NSError *error) { + GULNetwork *strongSelf = weakSelf; + if (!strongSelf) { + return; + } + dispatch_queue_t queueToDispatch = queue ? queue : dispatch_get_main_queue(); + dispatch_async(queueToDispatch, ^{ + if (sessionID.length) { + [strongSelf->_requests removeObjectForKey:sessionID]; + } + if (handler) { + handler(response, data, error); + } + }); + }]; + if (!requestID) { + [self handleErrorWithCode:GULErrorCodeNetworkSessionTaskCreation + queue:queue + withHandler:handler]; + return nil; + } + + [self GULNetwork_logWithLevel:kGULNetworkLogLevelDebug + messageCode:kGULNetworkMessageCodeNetwork000 + message:@"Uploading data. Host" + context:url]; + _requests[requestID] = fetcher; + return requestID; +} + +- (nullable NSString *)getURL:(NSURL *)url + headers:(nullable NSDictionary *)headers + queue:(nullable dispatch_queue_t)queue + usingBackgroundSession:(BOOL)usingBackgroundSession + completionHandler:(GULNetworkCompletionHandler)handler { + if (!url.absoluteString.length) { + [self handleErrorWithCode:GULErrorCodeNetworkInvalidURL queue:queue withHandler:handler]; + return nil; + } + + NSTimeInterval timeOutInterval = _timeoutInterval ?: kGULNetworkTimeOutInterval; + NSMutableURLRequest *request = + [[NSMutableURLRequest alloc] initWithURL:url + cachePolicy:NSURLRequestReloadIgnoringLocalCacheData + timeoutInterval:timeOutInterval]; + + if (!request) { + [self handleErrorWithCode:GULErrorCodeNetworkSessionTaskCreation + queue:queue + withHandler:handler]; + return nil; + } + + request.HTTPMethod = kGULNetworkGETRequestMethod; + request.allHTTPHeaderFields = headers; + + GULNetworkURLSession *fetcher = [[GULNetworkURLSession alloc] initWithNetworkLoggerDelegate:self]; + fetcher.backgroundNetworkEnabled = usingBackgroundSession; + + __weak GULNetwork *weakSelf = self; + NSString *requestID = [fetcher + sessionIDFromAsyncGETRequest:request + completionHandler:^(NSHTTPURLResponse *response, NSData *data, NSString *sessionID, + NSError *error) { + GULNetwork *strongSelf = weakSelf; + if (!strongSelf) { + return; + } + dispatch_queue_t queueToDispatch = queue ? queue : dispatch_get_main_queue(); + dispatch_async(queueToDispatch, ^{ + if (sessionID.length) { + [strongSelf->_requests removeObjectForKey:sessionID]; + } + if (handler) { + handler(response, data, error); + } + }); + }]; + + if (!requestID) { + [self handleErrorWithCode:GULErrorCodeNetworkSessionTaskCreation + queue:queue + withHandler:handler]; + return nil; + } + + [self GULNetwork_logWithLevel:kGULNetworkLogLevelDebug + messageCode:kGULNetworkMessageCodeNetwork001 + message:@"Downloading data. Host" + context:url]; + _requests[requestID] = fetcher; + return requestID; +} + +- (BOOL)hasUploadInProgress { + return _requests.count > 0; +} + +#pragma mark - Network Reachability + +/// Tells reachability delegate to call reachabilityDidChangeToStatus: to notify the network +/// reachability has changed. +- (void)reachability:(GULReachabilityChecker *)reachability + statusChanged:(GULReachabilityStatus)status { + _networkConnected = (status == kGULReachabilityViaCellular || status == kGULReachabilityViaWifi); + [_reachabilityDelegate reachabilityDidChange]; +} + +#pragma mark - Network logger delegate + +- (void)setLoggerDelegate:(id)loggerDelegate { + // Explicitly check whether the delegate responds to the methods because conformsToProtocol does + // not work correctly even though the delegate does respond to the methods. + if (!loggerDelegate || + ![loggerDelegate respondsToSelector:@selector(GULNetwork_logWithLevel: + messageCode:message:contexts:)] || + ![loggerDelegate respondsToSelector:@selector(GULNetwork_logWithLevel: + messageCode:message:context:)] || + ![loggerDelegate respondsToSelector:@selector(GULNetwork_logWithLevel: + messageCode:message:)]) { + GULOSLogError( + kGULLogSubsystem, kGULLoggerNetwork, NO, + [NSString stringWithFormat:@"I-NET%06ld", (long)kGULNetworkMessageCodeNetwork002], + @"Cannot set the network logger delegate: delegate does not conform to the network " + "logger protocol."); + return; + } + _loggerDelegate = loggerDelegate; +} + +#pragma mark - Private methods + +/// Handles network error and calls completion handler with the error. +- (void)handleErrorWithCode:(NSInteger)code + queue:(dispatch_queue_t)queue + withHandler:(GULNetworkCompletionHandler)handler { + NSDictionary *userInfo = @{kGULNetworkErrorContext : @"Failed to create network request"}; + NSError *error = [[NSError alloc] initWithDomain:kGULNetworkErrorDomain + code:code + userInfo:userInfo]; + [self GULNetwork_logWithLevel:kGULNetworkLogLevelWarning + messageCode:kGULNetworkMessageCodeNetwork002 + message:@"Failed to create network request. Code, error" + contexts:@[ @(code), error ]]; + if (handler) { + dispatch_queue_t queueToDispatch = queue ? queue : dispatch_get_main_queue(); + dispatch_async(queueToDispatch, ^{ + handler(nil, nil, error); + }); + } +} + +#pragma mark - Network logger + +- (void)GULNetwork_logWithLevel:(GULNetworkLogLevel)logLevel + messageCode:(GULNetworkMessageCode)messageCode + message:(NSString *)message + contexts:(NSArray *)contexts { + // Let the delegate log the message if there is a valid logger delegate. Otherwise, just log + // errors/warnings/info messages to the console log. + if (_loggerDelegate) { + [_loggerDelegate GULNetwork_logWithLevel:logLevel + messageCode:messageCode + message:message + contexts:contexts]; + return; + } + if (_isDebugModeEnabled || logLevel == kGULNetworkLogLevelError || + logLevel == kGULNetworkLogLevelWarning || logLevel == kGULNetworkLogLevelInfo) { + NSString *formattedMessage = GULStringWithLogMessage(message, logLevel, contexts); + NSLog(@"%@", formattedMessage); + GULOSLogBasic((GULLoggerLevel)logLevel, kGULLogSubsystem, kGULLoggerNetwork, NO, + [NSString stringWithFormat:@"I-NET%06ld", (long)messageCode], formattedMessage, + NULL); + } +} + +- (void)GULNetwork_logWithLevel:(GULNetworkLogLevel)logLevel + messageCode:(GULNetworkMessageCode)messageCode + message:(NSString *)message + context:(id)context { + if (_loggerDelegate) { + [_loggerDelegate GULNetwork_logWithLevel:logLevel + messageCode:messageCode + message:message + context:context]; + return; + } + NSArray *contexts = context ? @[ context ] : @[]; + [self GULNetwork_logWithLevel:logLevel messageCode:messageCode message:message contexts:contexts]; +} + +- (void)GULNetwork_logWithLevel:(GULNetworkLogLevel)logLevel + messageCode:(GULNetworkMessageCode)messageCode + message:(NSString *)message { + if (_loggerDelegate) { + [_loggerDelegate GULNetwork_logWithLevel:logLevel messageCode:messageCode message:message]; + return; + } + [self GULNetwork_logWithLevel:logLevel messageCode:messageCode message:message contexts:@[]]; +} + +/// Returns a string for the given log level (e.g. kGULNetworkLogLevelError -> @"ERROR"). +static NSString *GULLogLevelDescriptionFromLogLevel(GULNetworkLogLevel logLevel) { + static NSDictionary *levelNames = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + levelNames = @{ + @(kGULNetworkLogLevelError) : @"ERROR", + @(kGULNetworkLogLevelWarning) : @"WARNING", + @(kGULNetworkLogLevelInfo) : @"INFO", + @(kGULNetworkLogLevelDebug) : @"DEBUG" + }; + }); + return levelNames[@(logLevel)]; +} + +/// Returns a formatted string to be used for console logging. +static NSString *GULStringWithLogMessage(NSString *message, + GULNetworkLogLevel logLevel, + NSArray *contexts) { + if (!message) { + message = @"(Message was nil)"; + } else if (!message.length) { + message = @"(Message was empty)"; + } + NSMutableString *result = [[NSMutableString alloc] + initWithFormat:@"<%@/%@> %@", kGULNetworkLogTag, GULLogLevelDescriptionFromLogLevel(logLevel), + message]; + + if (!contexts.count) { + return result; + } + + NSMutableArray *formattedContexts = [[NSMutableArray alloc] init]; + for (id item in contexts) { + [formattedContexts addObject:(item != [NSNull null] ? item : @"(nil)")]; + } + + [result appendString:@": "]; + [result appendString:[formattedContexts componentsJoinedByString:@", "]]; + return result; +} + +@end diff --git a/Pods/GoogleUtilities/GoogleUtilities/Network/GULNetworkConstants.m b/Pods/GoogleUtilities/GoogleUtilities/Network/GULNetworkConstants.m new file mode 100644 index 0000000..e4b8469 --- /dev/null +++ b/Pods/GoogleUtilities/GoogleUtilities/Network/GULNetworkConstants.m @@ -0,0 +1,41 @@ +// Copyright 2017 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "GoogleUtilities/Network/Public/GoogleUtilities/GULNetworkConstants.h" +#import "GoogleUtilities/Logger/Public/GoogleUtilities/GULLogger.h" + +#import + +NSString *const kGULNetworkBackgroundSessionConfigIDPrefix = @"com.gul.network.background-upload"; +NSString *const kGULNetworkApplicationSupportSubdirectory = @"GUL/Network"; +NSString *const kGULNetworkTempDirectoryName = @"GULNetworkTemporaryDirectory"; +const NSTimeInterval kGULNetworkTempFolderExpireTime = 60 * 60; // 1 hour +const NSTimeInterval kGULNetworkTimeOutInterval = 60; // 1 minute. +NSString *const kGULNetworkReachabilityHost = @"app-measurement.com"; +NSString *const kGULNetworkErrorContext = @"Context"; + +const int kGULNetworkHTTPStatusOK = 200; +const int kGULNetworkHTTPStatusNoContent = 204; +const int kGULNetworkHTTPStatusCodeMultipleChoices = 300; +const int kGULNetworkHTTPStatusCodeMovedPermanently = 301; +const int kGULNetworkHTTPStatusCodeFound = 302; +const int kGULNetworkHTTPStatusCodeNotModified = 304; +const int kGULNetworkHTTPStatusCodeMovedTemporarily = 307; +const int kGULNetworkHTTPStatusCodeNotFound = 404; +const int kGULNetworkHTTPStatusCodeCannotAcceptTraffic = 429; +const int kGULNetworkHTTPStatusCodeUnavailable = 503; + +NSString *const kGULNetworkErrorDomain = @"com.gul.network.ErrorDomain"; + +GULLoggerService kGULLoggerNetwork = @"[GULNetwork]"; diff --git a/Pods/GoogleUtilities/GoogleUtilities/Network/GULNetworkInternal.h b/Pods/GoogleUtilities/GoogleUtilities/Network/GULNetworkInternal.h new file mode 100644 index 0000000..5aca9fd --- /dev/null +++ b/Pods/GoogleUtilities/GoogleUtilities/Network/GULNetworkInternal.h @@ -0,0 +1,24 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "GoogleUtilities/Logger/Public/GoogleUtilities/GULLogger.h" + +extern NSString *const kGULNetworkErrorDomain; + +/// The logger service for GULNetwork. +extern GULLoggerService kGULLoggerNetwork; diff --git a/Pods/GoogleUtilities/GoogleUtilities/Network/GULNetworkURLSession.m b/Pods/GoogleUtilities/GoogleUtilities/Network/GULNetworkURLSession.m new file mode 100644 index 0000000..c29de0c --- /dev/null +++ b/Pods/GoogleUtilities/GoogleUtilities/Network/GULNetworkURLSession.m @@ -0,0 +1,729 @@ +// Copyright 2017 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +#import "GoogleUtilities/Network/Public/GoogleUtilities/GULNetworkURLSession.h" + +#import "GoogleUtilities/Logger/Public/GoogleUtilities/GULLogger.h" +#import "GoogleUtilities/Network/GULNetworkInternal.h" +#import "GoogleUtilities/Network/Public/GoogleUtilities/GULMutableDictionary.h" +#import "GoogleUtilities/Network/Public/GoogleUtilities/GULNetworkConstants.h" +#import "GoogleUtilities/Network/Public/GoogleUtilities/GULNetworkMessageCode.h" + +@interface GULNetworkURLSession () +@end + +@implementation GULNetworkURLSession { + /// The handler to be called when the request completes or error has occurs. + GULNetworkURLSessionCompletionHandler _completionHandler; + + /// Session ID generated randomly with a fixed prefix. + NSString *_sessionID; + + /// The session configuration. + NSURLSessionConfiguration *_sessionConfig; + + /// The current NSURLSession. + NSURLSession *__weak _Nullable _URLSession; + + /// The path to the directory where all temporary files are stored before uploading. + NSURL *_networkDirectoryURL; + + /// The downloaded data from fetching. + NSData *_downloadedData; + + /// The path to the temporary file which stores the uploading data. + NSURL *_uploadingFileURL; + + /// The current request. + NSURLRequest *_request; +} + +#pragma mark - Init + +- (instancetype)initWithNetworkLoggerDelegate:(id)networkLoggerDelegate { + self = [super init]; + if (self) { + // Create URL to the directory where all temporary files to upload have to be stored. +#if TARGET_OS_TV + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); +#else + NSArray *paths = + NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES); +#endif + NSString *storageDirectory = paths.firstObject; + NSArray *tempPathComponents = @[ + storageDirectory, kGULNetworkApplicationSupportSubdirectory, kGULNetworkTempDirectoryName + ]; + _networkDirectoryURL = [NSURL fileURLWithPathComponents:tempPathComponents]; + _sessionID = [NSString stringWithFormat:@"%@-%@", kGULNetworkBackgroundSessionConfigIDPrefix, + [[NSUUID UUID] UUIDString]]; + _loggerDelegate = networkLoggerDelegate; + } + return self; +} + +#pragma mark - External Methods + +#pragma mark - To be called from AppDelegate + ++ (void)handleEventsForBackgroundURLSessionID:(NSString *)sessionID + completionHandler: + (GULNetworkSystemCompletionHandler)systemCompletionHandler { + // The session may not be Analytics background. Ignore those that do not have the prefix. + if (![sessionID hasPrefix:kGULNetworkBackgroundSessionConfigIDPrefix]) { + return; + } + GULNetworkURLSession *fetcher = [self fetcherWithSessionIdentifier:sessionID]; + if (fetcher != nil) { + [fetcher addSystemCompletionHandler:systemCompletionHandler forSession:sessionID]; + } else { + GULOSLogError(kGULLogSubsystem, kGULLoggerNetwork, NO, + [NSString stringWithFormat:@"I-NET%06ld", (long)kGULNetworkMessageCodeNetwork003], + @"Failed to retrieve background session with ID %@ after app is relaunched.", + sessionID); + } +} + +#pragma mark - External Methods + +/// Sends an async POST request using `NSURLSession`, and returns an ID of the connection. +- (nullable NSString *)sessionIDFromAsyncPOSTRequest:(NSURLRequest *)request + completionHandler: + (GULNetworkURLSessionCompletionHandler)handler { + // NSURLSessionUploadTask does not work with NSData in the background. + // To avoid this issue, write the data to a temporary file to upload it. + // Make a temporary file with the data subset. + _uploadingFileURL = [self temporaryFilePathWithSessionID:_sessionID]; + NSError *writeError; + NSURLSessionUploadTask *postRequestTask; + NSURLSession *session; + BOOL didWriteFile = NO; + + // Clean up the entire temp folder to avoid temp files that remain in case the previous session + // crashed and did not clean up. + [self maybeRemoveTempFilesAtURL:_networkDirectoryURL + expiringTime:kGULNetworkTempFolderExpireTime]; + + // If there is no background network enabled, no need to write to file. This will allow default + // network session which runs on the foreground. + if (_backgroundNetworkEnabled && [self ensureTemporaryDirectoryExists]) { + didWriteFile = [request.HTTPBody writeToFile:_uploadingFileURL.path + options:NSDataWritingAtomic + error:&writeError]; + + if (writeError) { + [_loggerDelegate GULNetwork_logWithLevel:kGULNetworkLogLevelError + messageCode:kGULNetworkMessageCodeURLSession000 + message:@"Failed to write request data to file" + context:writeError]; + } + } + + if (didWriteFile) { + // Exclude this file from backing up to iTunes. There are conflicting reports that excluding + // directory from backing up does not exclude files of that directory from backing up. + [self excludeFromBackupForURL:_uploadingFileURL]; + + _sessionConfig = [self backgroundSessionConfigWithSessionID:_sessionID]; + } else { + // If we cannot write to file, just send it in the foreground. + _sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration]; + } + [self populateSessionConfig:_sessionConfig withRequest:request]; + session = [NSURLSession sessionWithConfiguration:_sessionConfig + delegate:self + delegateQueue:[NSOperationQueue mainQueue]]; + // To avoid a runtime warning in Xcode 15 Beta 4, the given `URLRequest` + // should have a nil `HTTPBody`. To workaround this, the given `URLRequest` + // is copied and the `HTTPBody` data is removed. + NSData *givenRequestHTTPBody = [request.HTTPBody copy]; + NSMutableURLRequest *requestWithoutHTTPBody = [request mutableCopy]; + requestWithoutHTTPBody.HTTPBody = nil; + + if (didWriteFile) { + postRequestTask = [session uploadTaskWithRequest:requestWithoutHTTPBody + fromFile:_uploadingFileURL]; + } else { + postRequestTask = [session uploadTaskWithRequest:requestWithoutHTTPBody + fromData:givenRequestHTTPBody]; + } + + if (!session || !postRequestTask) { + NSError *error = [[NSError alloc] + initWithDomain:kGULNetworkErrorDomain + code:GULErrorCodeNetworkRequestCreation + userInfo:@{kGULNetworkErrorContext : @"Cannot create network session"}]; + [self callCompletionHandler:handler withResponse:nil data:nil error:error]; + return nil; + } + + _URLSession = session; + + // Save the session into memory. + [[self class] setSessionInFetcherMap:self forSessionID:_sessionID]; + + _request = [request copy]; + + // Store completion handler because background session does not accept handler block but custom + // delegate. + _completionHandler = [handler copy]; + [postRequestTask resume]; + + return _sessionID; +} + +/// Sends an async GET request using `NSURLSession`, and returns an ID of the session. +- (nullable NSString *)sessionIDFromAsyncGETRequest:(NSURLRequest *)request + completionHandler:(GULNetworkURLSessionCompletionHandler)handler { + if (_backgroundNetworkEnabled) { + _sessionConfig = [self backgroundSessionConfigWithSessionID:_sessionID]; + } else { + _sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration]; + } + + [self populateSessionConfig:_sessionConfig withRequest:request]; + + // Do not cache the GET request. + _sessionConfig.URLCache = nil; + + NSURLSession *session = [NSURLSession sessionWithConfiguration:_sessionConfig + delegate:self + delegateQueue:[NSOperationQueue mainQueue]]; + NSURLSessionDownloadTask *downloadTask = [session downloadTaskWithRequest:request]; + + if (!session || !downloadTask) { + NSError *error = [[NSError alloc] + initWithDomain:kGULNetworkErrorDomain + code:GULErrorCodeNetworkRequestCreation + userInfo:@{kGULNetworkErrorContext : @"Cannot create network session"}]; + [self callCompletionHandler:handler withResponse:nil data:nil error:error]; + return nil; + } + + _URLSession = session; + + // Save the session into memory. + [[self class] setSessionInFetcherMap:self forSessionID:_sessionID]; + + _request = [request copy]; + + _completionHandler = [handler copy]; + [downloadTask resume]; + + return _sessionID; +} + +#pragma mark - NSURLSessionDataDelegate + +/// Called by the NSURLSession when the data task has received some of the expected data. +/// Once the session is completed, URLSession:task:didCompleteWithError will be called and the +/// completion handler will be called with the downloaded data. +- (void)URLSession:(NSURLSession *)session + dataTask:(NSURLSessionDataTask *)dataTask + didReceiveData:(NSData *)data { + @synchronized(self) { + NSMutableData *mutableData = [[NSMutableData alloc] init]; + if (_downloadedData) { + mutableData = _downloadedData.mutableCopy; + } + [mutableData appendData:data]; + _downloadedData = mutableData; + } +} + +#pragma mark - NSURLSessionTaskDelegate + +/// Called by the NSURLSession once the download task is completed. The file is saved in the +/// provided URL so we need to read the data and store into _downloadedData. Once the session is +/// completed, URLSession:task:didCompleteWithError will be called and the completion handler will +/// be called with the downloaded data. +- (void)URLSession:(NSURLSession *)session + downloadTask:(NSURLSessionDownloadTask *)task + didFinishDownloadingToURL:(NSURL *)url { + if (!url.path) { + [_loggerDelegate + GULNetwork_logWithLevel:kGULNetworkLogLevelError + messageCode:kGULNetworkMessageCodeURLSession001 + message:@"Unable to read downloaded data from empty temp path"]; + _downloadedData = nil; + return; + } + + NSError *error; + _downloadedData = [NSData dataWithContentsOfFile:url.path options:0 error:&error]; + + if (error) { + [_loggerDelegate GULNetwork_logWithLevel:kGULNetworkLogLevelError + messageCode:kGULNetworkMessageCodeURLSession002 + message:@"Cannot read the content of downloaded data" + context:error]; + _downloadedData = nil; + } +} + +#if TARGET_OS_IOS || TARGET_OS_TV +- (void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session { + [_loggerDelegate GULNetwork_logWithLevel:kGULNetworkLogLevelDebug + messageCode:kGULNetworkMessageCodeURLSession003 + message:@"Background session finished" + context:session.configuration.identifier]; + [self callSystemCompletionHandler:session.configuration.identifier]; +} +#endif + +- (void)URLSession:(NSURLSession *)session + task:(NSURLSessionTask *)task + didCompleteWithError:(NSError *)error { + // Avoid any chance of recursive behavior leading to it being used repeatedly. + GULNetworkURLSessionCompletionHandler handler = _completionHandler; + _completionHandler = nil; + + if (task.response) { + // The following assertion should always be true for HTTP requests, see https://goo.gl/gVLxT7. + NSAssert([task.response isKindOfClass:[NSHTTPURLResponse class]], @"URL response must be HTTP"); + + // The server responded so ignore the error created by the system. + error = nil; + } else if (!error) { + error = [[NSError alloc] + initWithDomain:kGULNetworkErrorDomain + code:GULErrorCodeNetworkInvalidResponse + userInfo:@{kGULNetworkErrorContext : @"Network Error: Empty network response"}]; + } + + [self callCompletionHandler:handler + withResponse:(NSHTTPURLResponse *)task.response + data:_downloadedData + error:error]; + + // Remove the temp file to avoid trashing devices with lots of temp files. + [self removeTempItemAtURL:_uploadingFileURL]; + + // Try to clean up stale files again. + [self maybeRemoveTempFilesAtURL:_networkDirectoryURL + expiringTime:kGULNetworkTempFolderExpireTime]; + + // This is called without checking the sessionID here since non-background sessions + // won't have an ID. + [session finishTasksAndInvalidate]; + + // Explicitly remove the session so it won't be reused. The weak map table should + // remove the session on deallocation, but dealloc may not happen immediately after + // calling `finishTasksAndInvalidate`. + NSString *sessionID = session.configuration.identifier; + [[self class] setSessionInFetcherMap:nil forSessionID:sessionID]; +} + +- (void)URLSession:(NSURLSession *)session + task:(NSURLSessionTask *)task + didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge + completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, + NSURLCredential *credential))completionHandler { + // The handling is modeled after GTMSessionFetcher. + if ([challenge.protectionSpace.authenticationMethod + isEqualToString:NSURLAuthenticationMethodServerTrust]) { + SecTrustRef serverTrust = challenge.protectionSpace.serverTrust; + if (serverTrust == NULL) { + [_loggerDelegate GULNetwork_logWithLevel:kGULNetworkLogLevelDebug + messageCode:kGULNetworkMessageCodeURLSession004 + message:@"Received empty server trust for host. Host" + context:_request.URL]; + completionHandler(NSURLSessionAuthChallengePerformDefaultHandling, nil); + return; + } + NSURLCredential *credential = [NSURLCredential credentialForTrust:serverTrust]; + if (!credential) { + [_loggerDelegate GULNetwork_logWithLevel:kGULNetworkLogLevelWarning + messageCode:kGULNetworkMessageCodeURLSession005 + message:@"Unable to verify server identity. Host" + context:_request.URL]; + completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, nil); + return; + } + + [_loggerDelegate GULNetwork_logWithLevel:kGULNetworkLogLevelDebug + messageCode:kGULNetworkMessageCodeURLSession006 + message:@"Received SSL challenge for host. Host" + context:_request.URL]; + + void (^callback)(BOOL) = ^(BOOL allow) { + if (allow) { + completionHandler(NSURLSessionAuthChallengeUseCredential, credential); + } else { + [self->_loggerDelegate + GULNetwork_logWithLevel:kGULNetworkLogLevelDebug + messageCode:kGULNetworkMessageCodeURLSession007 + message:@"Cancelling authentication challenge for host. Host" + context:self->_request.URL]; + completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, nil); + } + }; + + // Retain the trust object to avoid a SecTrustEvaluate() crash on iOS 7. + CFRetain(serverTrust); + + // Evaluate the certificate chain. + // + // The delegate queue may be the main thread. Trust evaluation could cause some + // blocking network activity, so we must evaluate async, as documented at + // https://developer.apple.com/library/ios/technotes/tn2232/ + dispatch_queue_t evaluateBackgroundQueue = + dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); + + dispatch_async(evaluateBackgroundQueue, ^{ + BOOL shouldAllow; + CFErrorRef errorRef = NULL; + + @synchronized([GULNetworkURLSession class]) { + shouldAllow = SecTrustEvaluateWithError(serverTrust, &errorRef); + } + + if (errorRef) { + [self->_loggerDelegate + GULNetwork_logWithLevel:kGULNetworkLogLevelError + messageCode:kGULNetworkMessageCodeURLSession008 + message:@"Cannot evaluate server trust. Error, host" + contexts:@[ @((int)CFErrorGetCode(errorRef)), self->_request.URL ]]; + CFRelease(errorRef); + } + + // Call the call back with the permission. + callback(shouldAllow); + + CFRelease(serverTrust); + }); + return; + } + + // Default handling for other Auth Challenges. + completionHandler(NSURLSessionAuthChallengePerformDefaultHandling, nil); +} + +#pragma mark - Internal Methods + +/// Stores system completion handler with session ID as key. +- (void)addSystemCompletionHandler:(GULNetworkSystemCompletionHandler)handler + forSession:(NSString *)identifier { + if (!handler) { + [_loggerDelegate + GULNetwork_logWithLevel:kGULNetworkLogLevelError + messageCode:kGULNetworkMessageCodeURLSession009 + message:@"Cannot store nil system completion handler in network"]; + return; + } + + if (!identifier.length) { + [_loggerDelegate + GULNetwork_logWithLevel:kGULNetworkLogLevelError + messageCode:kGULNetworkMessageCodeURLSession010 + message:@"Cannot store system completion handler with empty network " + "session identifier"]; + return; + } + + GULMutableDictionary *systemCompletionHandlers = + [[self class] sessionIDToSystemCompletionHandlerDictionary]; + if (systemCompletionHandlers[identifier]) { + [_loggerDelegate GULNetwork_logWithLevel:kGULNetworkLogLevelWarning + messageCode:kGULNetworkMessageCodeURLSession011 + message:@"Got multiple system handlers for a single session ID" + context:identifier]; + } + + systemCompletionHandlers[identifier] = handler; +} + +/// Calls the system provided completion handler with the session ID stored in the dictionary. +/// The handler will be removed from the dictionary after being called. +- (void)callSystemCompletionHandler:(NSString *)identifier { + GULMutableDictionary *systemCompletionHandlers = + [[self class] sessionIDToSystemCompletionHandlerDictionary]; + GULNetworkSystemCompletionHandler handler = [systemCompletionHandlers objectForKey:identifier]; + + if (handler) { + [systemCompletionHandlers removeObjectForKey:identifier]; + + dispatch_async(dispatch_get_main_queue(), ^{ + handler(); + }); + } +} + +/// Sets or updates the session ID of this session. +- (void)setSessionID:(NSString *)sessionID { + _sessionID = [sessionID copy]; +} + +/// Creates a background session configuration with the session ID using the supported method. +- (NSURLSessionConfiguration *)backgroundSessionConfigWithSessionID:(NSString *)sessionID { + return [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:sessionID]; +} + +- (void)maybeRemoveTempFilesAtURL:(NSURL *)folderURL expiringTime:(NSTimeInterval)staleTime { + if (!folderURL.absoluteString.length) { + return; + } + + NSFileManager *fileManager = [NSFileManager defaultManager]; + NSError *error = nil; + + NSArray *properties = @[ NSURLCreationDateKey ]; + NSArray *directoryContent = + [fileManager contentsOfDirectoryAtURL:folderURL + includingPropertiesForKeys:properties + options:NSDirectoryEnumerationSkipsSubdirectoryDescendants + error:&error]; + if (error && error.code != NSFileReadNoSuchFileError) { + [_loggerDelegate + GULNetwork_logWithLevel:kGULNetworkLogLevelDebug + messageCode:kGULNetworkMessageCodeURLSession012 + message:@"Cannot get files from the temporary network folder. Error" + context:error]; + return; + } + + if (!directoryContent.count) { + return; + } + + NSTimeInterval now = [NSDate date].timeIntervalSince1970; + for (NSURL *tempFile in directoryContent) { + NSDate *creationDate; + BOOL getCreationDate = [tempFile getResourceValue:&creationDate + forKey:NSURLCreationDateKey + error:NULL]; + if (!getCreationDate) { + continue; + } + NSTimeInterval creationTimeInterval = creationDate.timeIntervalSince1970; + if (fabs(now - creationTimeInterval) > staleTime) { + [self removeTempItemAtURL:tempFile]; + } + } +} + +/// Removes the temporary file written to disk for sending the request. It has to be cleaned up +/// after the session is done. +- (void)removeTempItemAtURL:(NSURL *)fileURL { + if (!fileURL.absoluteString.length) { + return; + } + + NSFileManager *fileManager = [NSFileManager defaultManager]; + NSError *error = nil; + + if (![fileManager removeItemAtURL:fileURL error:&error] && error.code != NSFileNoSuchFileError) { + [_loggerDelegate + GULNetwork_logWithLevel:kGULNetworkLogLevelError + messageCode:kGULNetworkMessageCodeURLSession013 + message:@"Failed to remove temporary uploading data file. Error" + context:error.localizedDescription]; + } +} + +/// Gets the fetcher with the session ID. ++ (instancetype)fetcherWithSessionIdentifier:(NSString *)sessionIdentifier { + GULNetworkURLSession *session = [self sessionFromFetcherMapForSessionID:sessionIdentifier]; + if (!session && [sessionIdentifier hasPrefix:kGULNetworkBackgroundSessionConfigIDPrefix]) { + session = [[GULNetworkURLSession alloc] initWithNetworkLoggerDelegate:nil]; + [session setSessionID:sessionIdentifier]; + [self setSessionInFetcherMap:session forSessionID:sessionIdentifier]; + } + return session; +} + +/// Returns a map of the fetcher by session ID. Creates a map if it is not created. +/// When reading and writing from/to the session map, don't use this method directly. +/// To avoid thread safety issues, use one of the helper methods at the bottom of the +/// file: setSessionInFetcherMap:forSessionID:, sessionFromFetcherMapForSessionID: ++ (NSMapTable *)sessionIDToFetcherMap { + static NSMapTable *sessionIDToFetcherMap; + + static dispatch_once_t sessionMapOnceToken; + dispatch_once(&sessionMapOnceToken, ^{ + sessionIDToFetcherMap = [NSMapTable strongToWeakObjectsMapTable]; + }); + return sessionIDToFetcherMap; +} + ++ (NSLock *)sessionIDToFetcherMapReadWriteLock { + static NSLock *lock; + + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + lock = [[NSLock alloc] init]; + }); + return lock; +} + +/// Returns a map of system provided completion handler by session ID. Creates a map if it is not +/// created. ++ (GULMutableDictionary *)sessionIDToSystemCompletionHandlerDictionary { + static GULMutableDictionary *systemCompletionHandlers; + + static dispatch_once_t systemCompletionHandlerOnceToken; + dispatch_once(&systemCompletionHandlerOnceToken, ^{ + systemCompletionHandlers = [[GULMutableDictionary alloc] init]; + }); + return systemCompletionHandlers; +} + +- (NSURL *)temporaryFilePathWithSessionID:(NSString *)sessionID { + NSString *tempName = [NSString stringWithFormat:@"GULUpload_temp_%@", sessionID]; + return [_networkDirectoryURL URLByAppendingPathComponent:tempName]; +} + +/// Makes sure that the directory to store temp files exists. If not, tries to create it and returns +/// YES. If there is anything wrong, returns NO. +- (BOOL)ensureTemporaryDirectoryExists { + NSFileManager *fileManager = [NSFileManager defaultManager]; + NSError *error = nil; + + // Create a temporary directory if it does not exist or was deleted. + if ([_networkDirectoryURL checkResourceIsReachableAndReturnError:&error]) { + return YES; + } + + if (error && error.code != NSFileReadNoSuchFileError) { + [_loggerDelegate + GULNetwork_logWithLevel:kGULNetworkLogLevelWarning + messageCode:kGULNetworkMessageCodeURLSession014 + message:@"Error while trying to access Network temp folder. Error" + context:error]; + } + + NSError *writeError = nil; + + [fileManager createDirectoryAtURL:_networkDirectoryURL + withIntermediateDirectories:YES + attributes:nil + error:&writeError]; + if (writeError) { + [_loggerDelegate GULNetwork_logWithLevel:kGULNetworkLogLevelError + messageCode:kGULNetworkMessageCodeURLSession015 + message:@"Cannot create temporary directory. Error" + context:writeError]; + return NO; + } + + // Set the iCloud exclusion attribute on the Documents URL. + [self excludeFromBackupForURL:_networkDirectoryURL]; + + return YES; +} + +- (void)excludeFromBackupForURL:(NSURL *)url { + if (!url.path) { + return; + } + + // Set the iCloud exclusion attribute on the Documents URL. + NSError *preventBackupError = nil; + [url setResourceValue:@YES forKey:NSURLIsExcludedFromBackupKey error:&preventBackupError]; + if (preventBackupError) { + [_loggerDelegate GULNetwork_logWithLevel:kGULNetworkLogLevelError + messageCode:kGULNetworkMessageCodeURLSession016 + message:@"Cannot exclude temporary folder from iTunes backup"]; + } +} + +- (void)URLSession:(NSURLSession *)session + task:(NSURLSessionTask *)task + willPerformHTTPRedirection:(NSHTTPURLResponse *)response + newRequest:(NSURLRequest *)request + completionHandler:(void (^)(NSURLRequest *))completionHandler { + NSArray *nonAllowedRedirectionCodes = @[ + @(kGULNetworkHTTPStatusCodeFound), @(kGULNetworkHTTPStatusCodeMovedPermanently), + @(kGULNetworkHTTPStatusCodeMovedTemporarily), @(kGULNetworkHTTPStatusCodeMultipleChoices) + ]; + + // Allow those not in the non allowed list to be followed. + if (![nonAllowedRedirectionCodes containsObject:@(response.statusCode)]) { + completionHandler(request); + return; + } + + // Do not allow redirection if the response code is in the non-allowed list. + NSURLRequest *newRequest = request; + + if (response) { + newRequest = nil; + } + + completionHandler(newRequest); +} + +#pragma mark - Helper Methods + ++ (void)setSessionInFetcherMap:(GULNetworkURLSession *)session forSessionID:(NSString *)sessionID { + [[self sessionIDToFetcherMapReadWriteLock] lock]; + GULNetworkURLSession *existingSession = + [[[self class] sessionIDToFetcherMap] objectForKey:sessionID]; + if (existingSession) { + if (session) { + NSString *message = [NSString stringWithFormat:@"Discarding session: %@", existingSession]; + [existingSession->_loggerDelegate GULNetwork_logWithLevel:kGULNetworkLogLevelInfo + messageCode:kGULNetworkMessageCodeURLSession019 + message:message]; + } + [existingSession->_URLSession finishTasksAndInvalidate]; + } + if (session) { + [[[self class] sessionIDToFetcherMap] setObject:session forKey:sessionID]; + } else { + [[[self class] sessionIDToFetcherMap] removeObjectForKey:sessionID]; + } + [[self sessionIDToFetcherMapReadWriteLock] unlock]; +} + ++ (nullable GULNetworkURLSession *)sessionFromFetcherMapForSessionID:(NSString *)sessionID { + [[self sessionIDToFetcherMapReadWriteLock] lock]; + GULNetworkURLSession *session = [[[self class] sessionIDToFetcherMap] objectForKey:sessionID]; + [[self sessionIDToFetcherMapReadWriteLock] unlock]; + return session; +} + +- (void)callCompletionHandler:(GULNetworkURLSessionCompletionHandler)handler + withResponse:(NSHTTPURLResponse *)response + data:(NSData *)data + error:(NSError *)error { + if (error) { + [_loggerDelegate GULNetwork_logWithLevel:kGULNetworkLogLevelError + messageCode:kGULNetworkMessageCodeURLSession017 + message:@"Encounter network error. Code, error" + contexts:@[ @(error.code), error ]]; + } + + if (handler) { + dispatch_async(dispatch_get_main_queue(), ^{ + handler(response, data, self->_sessionID, error); + }); + } +} + +// Always use the request parameters even if the default session configuration is more restrictive. +- (void)populateSessionConfig:(NSURLSessionConfiguration *)sessionConfig + withRequest:(NSURLRequest *)request { + sessionConfig.HTTPAdditionalHeaders = request.allHTTPHeaderFields; + sessionConfig.timeoutIntervalForRequest = request.timeoutInterval; + sessionConfig.timeoutIntervalForResource = request.timeoutInterval; + sessionConfig.requestCachePolicy = request.cachePolicy; +} + +@end diff --git a/Pods/GoogleUtilities/GoogleUtilities/Network/Public/GoogleUtilities/GULMutableDictionary.h b/Pods/GoogleUtilities/GoogleUtilities/Network/Public/GoogleUtilities/GULMutableDictionary.h new file mode 100644 index 0000000..02f25db --- /dev/null +++ b/Pods/GoogleUtilities/GoogleUtilities/Network/Public/GoogleUtilities/GULMutableDictionary.h @@ -0,0 +1,50 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/// A mutable dictionary that provides atomic accessor and mutators. +@interface GULMutableDictionary : NSObject + +/// Returns an object given a key in the dictionary or nil if not found. +- (id)objectForKey:(id)key; + +/// Updates the object given its key or adds it to the dictionary if it is not in the dictionary. +- (void)setObject:(id)object forKey:(id)key; + +/// Removes the object given its session ID from the dictionary. +- (void)removeObjectForKey:(id)key; + +/// Removes all objects. +- (void)removeAllObjects; + +/// Returns the number of current objects in the dictionary. +- (NSUInteger)count; + +/// Returns an object given a key in the dictionary or nil if not found. +- (id)objectForKeyedSubscript:(id)key; + +/// Updates the object given its key or adds it to the dictionary if it is not in the dictionary. +- (void)setObject:(id)obj forKeyedSubscript:(id)key; + +/// Returns the immutable dictionary. +- (NSDictionary *)dictionary; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleUtilities/GoogleUtilities/Network/Public/GoogleUtilities/GULNetwork.h b/Pods/GoogleUtilities/GoogleUtilities/Network/Public/GoogleUtilities/GULNetwork.h new file mode 100644 index 0000000..4c5b5f5 --- /dev/null +++ b/Pods/GoogleUtilities/GoogleUtilities/Network/Public/GoogleUtilities/GULNetwork.h @@ -0,0 +1,101 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "GULNetworkConstants.h" +#import "GULNetworkLoggerProtocol.h" +#import "GULNetworkURLSession.h" + +NS_ASSUME_NONNULL_BEGIN + +/// Delegate protocol for GULNetwork events. +@protocol GULNetworkReachabilityDelegate + +/// Tells the delegate to handle events when the network reachability changes to connected or not +/// connected. +- (void)reachabilityDidChange; + +@end + +/// The Network component that provides network status and handles network requests and responses. +/// This is not thread safe. +/// +/// NOTE: +/// User must add FIRAnalytics handleEventsForBackgroundURLSessionID:completionHandler to the +/// AppDelegate application:handleEventsForBackgroundURLSession:completionHandler: +@interface GULNetwork : NSObject + +/// Indicates if network connectivity is available. +@property(nonatomic, readonly, getter=isNetworkConnected) BOOL networkConnected; + +/// Indicates if there are any uploads in progress. +@property(nonatomic, readonly, getter=hasUploadInProgress) BOOL uploadInProgress; + +/// An optional delegate that can be used in the event when network reachability changes. +@property(nonatomic, weak) id reachabilityDelegate; + +/// An optional delegate that can be used to log messages, warnings or errors that occur in the +/// network operations. +@property(nonatomic, weak) id loggerDelegate; + +/// Indicates whether the logger should display debug messages. +@property(nonatomic, assign) BOOL isDebugModeEnabled; + +/// The time interval in seconds for the network request to timeout. +@property(nonatomic, assign) NSTimeInterval timeoutInterval; + +/// Initializes with the default reachability host. +- (instancetype)init; + +/// Initializes with a custom reachability host. +- (instancetype)initWithReachabilityHost:(NSString *)reachabilityHost; + +/// Handles events when background session with the given ID has finished. ++ (void)handleEventsForBackgroundURLSessionID:(NSString *)sessionID + completionHandler:(GULNetworkSystemCompletionHandler)completionHandler; + +/// Compresses and sends a POST request with the provided data to the URL. The session will be +/// background session if usingBackgroundSession is YES. Otherwise, the POST session is default +/// session. Returns a session ID or nil if an error occurs. +- (nullable NSString *)postURL:(NSURL *)url + payload:(NSData *)payload + queue:(nullable dispatch_queue_t)queue + usingBackgroundSession:(BOOL)usingBackgroundSession + completionHandler:(GULNetworkCompletionHandler)handler; + +/// Compresses and sends a POST request with the provided headers and data to the URL. The session +/// will be background session if usingBackgroundSession is YES. Otherwise, the POST session is +/// default session. Returns a session ID or nil if an error occurs. +- (nullable NSString *)postURL:(NSURL *)url + headers:(nullable NSDictionary *)headers + payload:(NSData *)payload + queue:(nullable dispatch_queue_t)queue + usingBackgroundSession:(BOOL)usingBackgroundSession + completionHandler:(GULNetworkCompletionHandler)handler; + +/// Sends a GET request with the provided data to the URL. The session will be background session +/// if usingBackgroundSession is YES. Otherwise, the GET session is default session. Returns a +/// session ID or nil if an error occurs. +- (nullable NSString *)getURL:(NSURL *)url + headers:(nullable NSDictionary *)headers + queue:(nullable dispatch_queue_t)queue + usingBackgroundSession:(BOOL)usingBackgroundSession + completionHandler:(GULNetworkCompletionHandler)handler; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleUtilities/GoogleUtilities/Network/Public/GoogleUtilities/GULNetworkConstants.h b/Pods/GoogleUtilities/GoogleUtilities/Network/Public/GoogleUtilities/GULNetworkConstants.h new file mode 100644 index 0000000..341b974 --- /dev/null +++ b/Pods/GoogleUtilities/GoogleUtilities/Network/Public/GoogleUtilities/GULNetworkConstants.h @@ -0,0 +1,75 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/// Error codes in Firebase Network error domain. +/// Note: these error codes should never change. It would make it harder to decode the errors if +/// we inadvertently altered any of these codes in a future SDK version. +typedef NS_ENUM(NSInteger, GULNetworkErrorCode) { + /// Unknown error. + GULNetworkErrorCodeUnknown = 0, + /// Error occurs when the request URL is invalid. + GULErrorCodeNetworkInvalidURL = 1, + /// Error occurs when request cannot be constructed. + GULErrorCodeNetworkRequestCreation = 2, + /// Error occurs when payload cannot be compressed. + GULErrorCodeNetworkPayloadCompression = 3, + /// Error occurs when session task cannot be created. + GULErrorCodeNetworkSessionTaskCreation = 4, + /// Error occurs when there is no response. + GULErrorCodeNetworkInvalidResponse = 5 +}; + +#pragma mark - Network constants + +/// The prefix of the ID of the background session. +extern NSString *const kGULNetworkBackgroundSessionConfigIDPrefix; + +/// The sub directory to store the files of data that is being uploaded in the background. +extern NSString *const kGULNetworkApplicationSupportSubdirectory; + +/// Name of the temporary directory that stores files for background uploading. +extern NSString *const kGULNetworkTempDirectoryName; + +/// The period when the temporary uploading file can stay. +extern const NSTimeInterval kGULNetworkTempFolderExpireTime; + +/// The default network request timeout interval. +extern const NSTimeInterval kGULNetworkTimeOutInterval; + +/// The host to check the reachability of the network. +extern NSString *const kGULNetworkReachabilityHost; + +/// The key to get the error context of the UserInfo. +extern NSString *const kGULNetworkErrorContext; + +#pragma mark - Network Status Code + +extern const int kGULNetworkHTTPStatusOK; +extern const int kGULNetworkHTTPStatusNoContent; +extern const int kGULNetworkHTTPStatusCodeMultipleChoices; +extern const int kGULNetworkHTTPStatusCodeMovedPermanently; +extern const int kGULNetworkHTTPStatusCodeFound; +extern const int kGULNetworkHTTPStatusCodeNotModified; +extern const int kGULNetworkHTTPStatusCodeMovedTemporarily; +extern const int kGULNetworkHTTPStatusCodeNotFound; +extern const int kGULNetworkHTTPStatusCodeCannotAcceptTraffic; +extern const int kGULNetworkHTTPStatusCodeUnavailable; + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleUtilities/GoogleUtilities/Network/Public/GoogleUtilities/GULNetworkLoggerProtocol.h b/Pods/GoogleUtilities/GoogleUtilities/Network/Public/GoogleUtilities/GULNetworkLoggerProtocol.h new file mode 100644 index 0000000..b9e93ec --- /dev/null +++ b/Pods/GoogleUtilities/GoogleUtilities/Network/Public/GoogleUtilities/GULNetworkLoggerProtocol.h @@ -0,0 +1,53 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "GULNetworkMessageCode.h" + +NS_ASSUME_NONNULL_BEGIN + +/// The log levels used by GULNetworkLogger. +typedef NS_ENUM(NSInteger, GULNetworkLogLevel) { + kGULNetworkLogLevelError = 3, + kGULNetworkLogLevelWarning = 4, + kGULNetworkLogLevelInfo = 6, + kGULNetworkLogLevelDebug = 7, +}; + +@protocol GULNetworkLoggerDelegate + +@required +/// Tells the delegate to log a message with an array of contexts and the log level. +- (void)GULNetwork_logWithLevel:(GULNetworkLogLevel)logLevel + messageCode:(GULNetworkMessageCode)messageCode + message:(NSString *)message + contexts:(NSArray *)contexts; + +/// Tells the delegate to log a message with a context and the log level. +- (void)GULNetwork_logWithLevel:(GULNetworkLogLevel)logLevel + messageCode:(GULNetworkMessageCode)messageCode + message:(NSString *)message + context:(id)context; + +/// Tells the delegate to log a message with the log level. +- (void)GULNetwork_logWithLevel:(GULNetworkLogLevel)logLevel + messageCode:(GULNetworkMessageCode)messageCode + message:(NSString *)message; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleUtilities/GoogleUtilities/Network/Public/GoogleUtilities/GULNetworkMessageCode.h b/Pods/GoogleUtilities/GoogleUtilities/Network/Public/GoogleUtilities/GULNetworkMessageCode.h new file mode 100644 index 0000000..2d45ec6 --- /dev/null +++ b/Pods/GoogleUtilities/GoogleUtilities/Network/Public/GoogleUtilities/GULNetworkMessageCode.h @@ -0,0 +1,51 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +// Make sure these codes do not overlap with any contained in the FIRAMessageCode enum. +typedef NS_ENUM(NSInteger, GULNetworkMessageCode) { + // GULNetwork.m + kGULNetworkMessageCodeNetwork000 = 900000, // I-NET900000 + kGULNetworkMessageCodeNetwork001 = 900001, // I-NET900001 + kGULNetworkMessageCodeNetwork002 = 900002, // I-NET900002 + kGULNetworkMessageCodeNetwork003 = 900003, // I-NET900003 + // GULNetworkURLSession.m + kGULNetworkMessageCodeURLSession000 = 901000, // I-NET901000 + kGULNetworkMessageCodeURLSession001 = 901001, // I-NET901001 + kGULNetworkMessageCodeURLSession002 = 901002, // I-NET901002 + kGULNetworkMessageCodeURLSession003 = 901003, // I-NET901003 + kGULNetworkMessageCodeURLSession004 = 901004, // I-NET901004 + kGULNetworkMessageCodeURLSession005 = 901005, // I-NET901005 + kGULNetworkMessageCodeURLSession006 = 901006, // I-NET901006 + kGULNetworkMessageCodeURLSession007 = 901007, // I-NET901007 + kGULNetworkMessageCodeURLSession008 = 901008, // I-NET901008 + kGULNetworkMessageCodeURLSession009 = 901009, // I-NET901009 + kGULNetworkMessageCodeURLSession010 = 901010, // I-NET901010 + kGULNetworkMessageCodeURLSession011 = 901011, // I-NET901011 + kGULNetworkMessageCodeURLSession012 = 901012, // I-NET901012 + kGULNetworkMessageCodeURLSession013 = 901013, // I-NET901013 + kGULNetworkMessageCodeURLSession014 = 901014, // I-NET901014 + kGULNetworkMessageCodeURLSession015 = 901015, // I-NET901015 + kGULNetworkMessageCodeURLSession016 = 901016, // I-NET901016 + kGULNetworkMessageCodeURLSession017 = 901017, // I-NET901017 + kGULNetworkMessageCodeURLSession018 = 901018, // I-NET901018 + kGULNetworkMessageCodeURLSession019 = 901019, // I-NET901019 +}; + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleUtilities/GoogleUtilities/Network/Public/GoogleUtilities/GULNetworkURLSession.h b/Pods/GoogleUtilities/GoogleUtilities/Network/Public/GoogleUtilities/GULNetworkURLSession.h new file mode 100644 index 0000000..3f9f7f9 --- /dev/null +++ b/Pods/GoogleUtilities/GoogleUtilities/Network/Public/GoogleUtilities/GULNetworkURLSession.h @@ -0,0 +1,62 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "GULNetworkLoggerProtocol.h" + +NS_ASSUME_NONNULL_BEGIN + +typedef void (^GULNetworkCompletionHandler)(NSHTTPURLResponse *_Nullable response, + NSData *_Nullable data, + NSError *_Nullable error); +typedef void (^GULNetworkURLSessionCompletionHandler)(NSHTTPURLResponse *_Nullable response, + NSData *_Nullable data, + NSString *sessionID, + NSError *_Nullable error); +typedef void (^GULNetworkSystemCompletionHandler)(void); + +/// The protocol that uses NSURLSession for iOS >= 7.0 to handle requests and responses. +@interface GULNetworkURLSession : NSObject + +/// Indicates whether the background network is enabled. Default value is NO. +@property(nonatomic, getter=isBackgroundNetworkEnabled) BOOL backgroundNetworkEnabled; + +/// The logger delegate to log message, errors or warnings that occur during the network operations. +@property(nonatomic, weak, nullable) id loggerDelegate; + +/// Calls the system provided completion handler after the background session is finished. ++ (void)handleEventsForBackgroundURLSessionID:(NSString *)sessionID + completionHandler:(GULNetworkSystemCompletionHandler)completionHandler; + +/// Initializes with logger delegate. +- (instancetype)initWithNetworkLoggerDelegate: + (nullable id)networkLoggerDelegate NS_DESIGNATED_INITIALIZER; + +- (instancetype)init NS_UNAVAILABLE; + +/// Sends an asynchronous POST request and calls the provided completion handler when the request +/// completes or when errors occur, and returns an ID of the session/connection. +- (nullable NSString *)sessionIDFromAsyncPOSTRequest:(NSURLRequest *)request + completionHandler:(GULNetworkURLSessionCompletionHandler)handler; + +/// Sends an asynchronous GET request and calls the provided completion handler when the request +/// completes or when errors occur, and returns an ID of the session. +- (nullable NSString *)sessionIDFromAsyncGETRequest:(NSURLRequest *)request + completionHandler:(GULNetworkURLSessionCompletionHandler)handler; + +NS_ASSUME_NONNULL_END +@end diff --git a/Pods/GoogleUtilities/GoogleUtilities/Privacy/Resources/PrivacyInfo.xcprivacy b/Pods/GoogleUtilities/GoogleUtilities/Privacy/Resources/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..1c9e1a6 --- /dev/null +++ b/Pods/GoogleUtilities/GoogleUtilities/Privacy/Resources/PrivacyInfo.xcprivacy @@ -0,0 +1,34 @@ + + + + + NSPrivacyTracking + + NSPrivacyTrackingDomains + + + NSPrivacyCollectedDataTypes + + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryFileTimestamp + NSPrivacyAccessedAPITypeReasons + + C617.1 + + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + NSPrivacyAccessedAPITypeReasons + + C56D.1 + + + + + + diff --git a/Pods/GoogleUtilities/GoogleUtilities/Reachability/GULReachabilityChecker+Internal.h b/Pods/GoogleUtilities/GoogleUtilities/Reachability/GULReachabilityChecker+Internal.h new file mode 100644 index 0000000..103ed3b --- /dev/null +++ b/Pods/GoogleUtilities/GoogleUtilities/Reachability/GULReachabilityChecker+Internal.h @@ -0,0 +1,48 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "GoogleUtilities/Reachability/Public/GoogleUtilities/GULReachabilityChecker.h" + +#if !TARGET_OS_WATCH +typedef SCNetworkReachabilityRef (*GULReachabilityCreateWithNameFn)(CFAllocatorRef allocator, + const char *host); + +typedef Boolean (*GULReachabilitySetCallbackFn)(SCNetworkReachabilityRef target, + SCNetworkReachabilityCallBack callback, + SCNetworkReachabilityContext *context); +typedef Boolean (*GULReachabilityScheduleWithRunLoopFn)(SCNetworkReachabilityRef target, + CFRunLoopRef runLoop, + CFStringRef runLoopMode); +typedef Boolean (*GULReachabilityUnscheduleFromRunLoopFn)(SCNetworkReachabilityRef target, + CFRunLoopRef runLoop, + CFStringRef runLoopMode); + +typedef void (*GULReachabilityReleaseFn)(CFTypeRef cf); + +struct GULReachabilityApi { + GULReachabilityCreateWithNameFn createWithNameFn; + GULReachabilitySetCallbackFn setCallbackFn; + GULReachabilityScheduleWithRunLoopFn scheduleWithRunLoopFn; + GULReachabilityUnscheduleFromRunLoopFn unscheduleFromRunLoopFn; + GULReachabilityReleaseFn releaseFn; +}; +#endif +@interface GULReachabilityChecker (Internal) + +- (const struct GULReachabilityApi *)reachabilityApi; +- (void)setReachabilityApi:(const struct GULReachabilityApi *)reachabilityApi; + +@end diff --git a/Pods/GoogleUtilities/GoogleUtilities/Reachability/GULReachabilityChecker.m b/Pods/GoogleUtilities/GoogleUtilities/Reachability/GULReachabilityChecker.m new file mode 100644 index 0000000..e3745c6 --- /dev/null +++ b/Pods/GoogleUtilities/GoogleUtilities/Reachability/GULReachabilityChecker.m @@ -0,0 +1,263 @@ +// Copyright 2017 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +#import "GoogleUtilities/Reachability/Public/GoogleUtilities/GULReachabilityChecker.h" + +#import "GoogleUtilities/Reachability/GULReachabilityChecker+Internal.h" +#import "GoogleUtilities/Reachability/GULReachabilityMessageCode.h" + +#import "GoogleUtilities/Logger/Public/GoogleUtilities/GULLogger.h" + +static GULLoggerService kGULLoggerReachability = @"[GULReachability]"; +#if !TARGET_OS_WATCH +static void ReachabilityCallback(SCNetworkReachabilityRef reachability, + SCNetworkReachabilityFlags flags, + void *info); + +static const struct GULReachabilityApi kGULDefaultReachabilityApi = { + SCNetworkReachabilityCreateWithName, + SCNetworkReachabilitySetCallback, + SCNetworkReachabilityScheduleWithRunLoop, + SCNetworkReachabilityUnscheduleFromRunLoop, + CFRelease, +}; + +static NSString *const kGULReachabilityUnknownStatus = @"Unknown"; +static NSString *const kGULReachabilityConnectedStatus = @"Connected"; +static NSString *const kGULReachabilityDisconnectedStatus = @"Disconnected"; +#endif +@interface GULReachabilityChecker () + +@property(nonatomic, assign) const struct GULReachabilityApi *reachabilityApi; +@property(nonatomic, assign) GULReachabilityStatus reachabilityStatus; +@property(nonatomic, copy) NSString *host; +#if !TARGET_OS_WATCH +@property(nonatomic, assign) SCNetworkReachabilityRef reachability; +#endif + +@end + +@implementation GULReachabilityChecker + +@synthesize reachabilityApi = reachabilityApi_; +#if !TARGET_OS_WATCH +@synthesize reachability = reachability_; +#endif + +- (const struct GULReachabilityApi *)reachabilityApi { + return reachabilityApi_; +} + +- (void)setReachabilityApi:(const struct GULReachabilityApi *)reachabilityApi { +#if !TARGET_OS_WATCH + if (reachability_) { + GULOSLogError(kGULLogSubsystem, kGULLoggerReachability, NO, + [NSString stringWithFormat:@"I-REA%06ld", (long)kGULReachabilityMessageCode000], + @"Cannot change reachability API while reachability is running. " + @"Call stop first."); + return; + } + reachabilityApi_ = reachabilityApi; +#endif +} + +@synthesize reachabilityStatus = reachabilityStatus_; +@synthesize host = host_; +@synthesize reachabilityDelegate = reachabilityDelegate_; + +- (BOOL)isActive { +#if !TARGET_OS_WATCH + return reachability_ != nil; +#else + return NO; +#endif +} + +- (void)setReachabilityDelegate:(id)reachabilityDelegate { + if (reachabilityDelegate && + (![(NSObject *)reachabilityDelegate conformsToProtocol:@protocol(GULReachabilityDelegate)])) { + GULOSLogError(kGULLogSubsystem, kGULLoggerReachability, NO, + [NSString stringWithFormat:@"I-NET%06ld", (long)kGULReachabilityMessageCode005], + @"Reachability delegate doesn't conform to Reachability protocol."); + return; + } + reachabilityDelegate_ = reachabilityDelegate; +} + +- (instancetype)initWithReachabilityDelegate:(id)reachabilityDelegate + withHost:(NSString *)host { + self = [super init]; + + if (!host || !host.length) { + GULOSLogError(kGULLogSubsystem, kGULLoggerReachability, NO, + [NSString stringWithFormat:@"I-REA%06ld", (long)kGULReachabilityMessageCode001], + @"Invalid host specified"); + return nil; + } + if (self) { +#if !TARGET_OS_WATCH + [self setReachabilityDelegate:reachabilityDelegate]; + reachabilityApi_ = &kGULDefaultReachabilityApi; + reachabilityStatus_ = kGULReachabilityUnknown; + host_ = [host copy]; + reachability_ = nil; +#endif + } + return self; +} + +- (void)dealloc { + reachabilityDelegate_ = nil; + [self stop]; +} + +- (BOOL)start { +#if TARGET_OS_WATCH + return NO; +#else + + if (!reachability_) { + reachability_ = reachabilityApi_->createWithNameFn(kCFAllocatorDefault, [host_ UTF8String]); + if (!reachability_) { + return NO; + } + SCNetworkReachabilityContext context = { + 0, /* version */ + (__bridge void *)(self), /* info (passed as last parameter to reachability callback) */ + NULL, /* retain */ + NULL, /* release */ + NULL /* copyDescription */ + }; + if (!reachabilityApi_->setCallbackFn(reachability_, ReachabilityCallback, &context) || + !reachabilityApi_->scheduleWithRunLoopFn(reachability_, CFRunLoopGetMain(), + kCFRunLoopCommonModes)) { + reachabilityApi_->releaseFn(reachability_); + reachability_ = nil; + + GULOSLogError(kGULLogSubsystem, kGULLoggerReachability, NO, + [NSString stringWithFormat:@"I-REA%06ld", (long)kGULReachabilityMessageCode002], + @"Failed to start reachability handle"); + return NO; + } + } + GULOSLogDebug(kGULLogSubsystem, kGULLoggerReachability, NO, + [NSString stringWithFormat:@"I-REA%06ld", (long)kGULReachabilityMessageCode003], + @"Monitoring the network status"); + return YES; +#endif +} + +- (void)stop { +#if !TARGET_OS_WATCH + if (reachability_) { + reachabilityStatus_ = kGULReachabilityUnknown; + reachabilityApi_->unscheduleFromRunLoopFn(reachability_, CFRunLoopGetMain(), + kCFRunLoopCommonModes); + reachabilityApi_->releaseFn(reachability_); + reachability_ = nil; + } +#endif +} + +#if !TARGET_OS_WATCH +- (GULReachabilityStatus)statusForFlags:(SCNetworkReachabilityFlags)flags { + GULReachabilityStatus status = kGULReachabilityNotReachable; + // If the Reachable flag is not set, we definitely don't have connectivity. + if (flags & kSCNetworkReachabilityFlagsReachable) { + // Reachable flag is set. Check further flags. + if (!(flags & kSCNetworkReachabilityFlagsConnectionRequired)) { +// Connection required flag is not set, so we have connectivity. +#if TARGET_OS_IOS || TARGET_OS_TV || TARGET_OS_VISION + status = (flags & kSCNetworkReachabilityFlagsIsWWAN) ? kGULReachabilityViaCellular + : kGULReachabilityViaWifi; +#elif TARGET_OS_OSX + status = kGULReachabilityViaWifi; +#endif + } else if ((flags & (kSCNetworkReachabilityFlagsConnectionOnDemand | + kSCNetworkReachabilityFlagsConnectionOnTraffic)) && + !(flags & kSCNetworkReachabilityFlagsInterventionRequired)) { +// If the connection on demand or connection on traffic flag is set, and user intervention +// is not required, we have connectivity. +#if TARGET_OS_IOS || TARGET_OS_TV || TARGET_OS_VISION + status = (flags & kSCNetworkReachabilityFlagsIsWWAN) ? kGULReachabilityViaCellular + : kGULReachabilityViaWifi; +#elif TARGET_OS_OSX + status = kGULReachabilityViaWifi; +#endif + } + } + return status; +} + +- (void)reachabilityFlagsChanged:(SCNetworkReachabilityFlags)flags { + GULReachabilityStatus status = [self statusForFlags:flags]; + if (reachabilityStatus_ != status) { + NSString *reachabilityStatusString; + if (status == kGULReachabilityUnknown) { + reachabilityStatusString = kGULReachabilityUnknownStatus; + } else { + reachabilityStatusString = (status == kGULReachabilityNotReachable) + ? kGULReachabilityDisconnectedStatus + : kGULReachabilityConnectedStatus; + } + + GULOSLogDebug(kGULLogSubsystem, kGULLoggerReachability, NO, + [NSString stringWithFormat:@"I-REA%06ld", (long)kGULReachabilityMessageCode004], + @"Network status has changed. Code:%@, status:%@", @(status), + reachabilityStatusString); + reachabilityStatus_ = status; + [reachabilityDelegate_ reachability:self statusChanged:reachabilityStatus_]; + } +} + +#endif +@end + +#if !TARGET_OS_WATCH +static void ReachabilityCallback(SCNetworkReachabilityRef reachability, + SCNetworkReachabilityFlags flags, + void *info) { + GULReachabilityChecker *checker = (__bridge GULReachabilityChecker *)info; + [checker reachabilityFlagsChanged:flags]; +} +#endif + +// This function used to be at the top of the file, but it was moved here +// as a workaround for a suspected compiler bug. When compiled in Release mode +// and run on an iOS device with WiFi disabled, the reachability code crashed +// when calling SCNetworkReachabilityScheduleWithRunLoop, or shortly thereafter. +// After unsuccessfully trying to diagnose the cause of the crash, it was +// discovered that moving this function to the end of the file magically fixed +// the crash. If you are going to edit this file, exercise caution and make sure +// to test thoroughly with an iOS device under various network conditions. +const NSString *GULReachabilityStatusString(GULReachabilityStatus status) { + switch (status) { + case kGULReachabilityUnknown: + return @"Reachability Unknown"; + + case kGULReachabilityNotReachable: + return @"Not reachable"; + + case kGULReachabilityViaWifi: + return @"Reachable via Wifi"; + + case kGULReachabilityViaCellular: + return @"Reachable via Cellular Data"; + + default: + return [NSString stringWithFormat:@"Invalid reachability status %d", (int)status]; + } +} diff --git a/Pods/GoogleUtilities/GoogleUtilities/Reachability/GULReachabilityMessageCode.h b/Pods/GoogleUtilities/GoogleUtilities/Reachability/GULReachabilityMessageCode.h new file mode 100644 index 0000000..373e0af --- /dev/null +++ b/Pods/GoogleUtilities/GoogleUtilities/Reachability/GULReachabilityMessageCode.h @@ -0,0 +1,29 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +// Make sure these codes do not overlap with any contained in the FIRAMessageCode enum. +typedef NS_ENUM(NSInteger, GULReachabilityMessageCode) { + // GULReachabilityChecker.m + kGULReachabilityMessageCode000 = 902000, // I-NET902000 + kGULReachabilityMessageCode001 = 902001, // I-NET902001 + kGULReachabilityMessageCode002 = 902002, // I-NET902002 + kGULReachabilityMessageCode003 = 902003, // I-NET902003 + kGULReachabilityMessageCode004 = 902004, // I-NET902004 + kGULReachabilityMessageCode005 = 902005, // I-NET902005 + kGULReachabilityMessageCode006 = 902006, // I-NET902006 +}; diff --git a/Pods/GoogleUtilities/GoogleUtilities/Reachability/Public/GoogleUtilities/GULReachabilityChecker.h b/Pods/GoogleUtilities/GoogleUtilities/Reachability/Public/GoogleUtilities/GULReachabilityChecker.h new file mode 100644 index 0000000..cac5ca3 --- /dev/null +++ b/Pods/GoogleUtilities/GoogleUtilities/Reachability/Public/GoogleUtilities/GULReachabilityChecker.h @@ -0,0 +1,83 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import +#if !TARGET_OS_WATCH +#import +#endif + +NS_ASSUME_NONNULL_BEGIN + +/// Reachability Status +typedef enum { + kGULReachabilityUnknown, ///< Have not yet checked or been notified whether host is reachable. + kGULReachabilityNotReachable, ///< Host is not reachable. + kGULReachabilityViaWifi, ///< Host is reachable via Wifi. + kGULReachabilityViaCellular, ///< Host is reachable via cellular. +} GULReachabilityStatus; + +const NSString *GULReachabilityStatusString(GULReachabilityStatus status); + +@class GULReachabilityChecker; + +/// Google Analytics iOS Reachability Checker. +@protocol GULReachabilityDelegate +@required +/// Called when network status has changed. +- (void)reachability:(GULReachabilityChecker *)reachability + statusChanged:(GULReachabilityStatus)status; +@end + +/// Google Analytics iOS Network Status Checker. +@interface GULReachabilityChecker : NSObject + +/// The last known reachability status, or GULReachabilityStatusUnknown if the +/// checker is not active. +@property(nonatomic, readonly) GULReachabilityStatus reachabilityStatus; +/// The host to which reachability status is to be checked. +@property(nonatomic, copy, readonly) NSString *host; +/// The delegate to be notified of reachability status changes. +@property(nonatomic, weak) id reachabilityDelegate; +/// `YES` if the reachability checker is active, `NO` otherwise. +@property(nonatomic, readonly) BOOL isActive; + +/// Initialize the reachability checker. Note that you must call start to begin checking for and +/// receiving notifications about network status changes. +/// +/// @param reachabilityDelegate The delegate to be notified when reachability status to host +/// changes. +/// +/// @param host The name of the host. +/// +- (instancetype)initWithReachabilityDelegate:(id)reachabilityDelegate + withHost:(NSString *)host; + +- (instancetype)init NS_UNAVAILABLE; + +/// Start checking for reachability to the specified host. This has no effect if the status +/// checker is already checking for connectivity. +/// +/// @return `YES` if initiating status checking was successful or the status checking has already +/// been initiated, `NO` otherwise. +- (BOOL)start; + +/// Stop checking for reachability to the specified host. This has no effect if the status +/// checker is not checking for connectivity. +- (void)stop; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleUtilities/GoogleUtilities/UserDefaults/GULUserDefaults.m b/Pods/GoogleUtilities/GoogleUtilities/UserDefaults/GULUserDefaults.m new file mode 100644 index 0000000..b4ac798 --- /dev/null +++ b/Pods/GoogleUtilities/GoogleUtilities/UserDefaults/GULUserDefaults.m @@ -0,0 +1,165 @@ +// Copyright 2018 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "GoogleUtilities/UserDefaults/Public/GoogleUtilities/GULUserDefaults.h" + +#import "GoogleUtilities/Logger/Public/GoogleUtilities/GULLogger.h" + +NS_ASSUME_NONNULL_BEGIN + +static NSString *const kGULLogFormat = @"I-GUL%06ld"; + +static GULLoggerService kGULLogUserDefaultsService = @"[GoogleUtilities/UserDefaults]"; + +typedef NS_ENUM(NSInteger, GULUDMessageCode) { + GULUDMessageCodeInvalidKeyGet = 1, + GULUDMessageCodeInvalidKeySet = 2, + GULUDMessageCodeInvalidObjectSet = 3, + GULUDMessageCodeSynchronizeFailed = 4, +}; + +@interface GULUserDefaults () + +@property(nonatomic, readonly) NSUserDefaults *userDefaults; + +@end + +@implementation GULUserDefaults + ++ (GULUserDefaults *)standardUserDefaults { + static GULUserDefaults *standardUserDefaults; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + standardUserDefaults = [[GULUserDefaults alloc] init]; + }); + return standardUserDefaults; +} + +- (instancetype)init { + return [self initWithSuiteName:nil]; +} + +- (instancetype)initWithSuiteName:(nullable NSString *)suiteName { + self = [super init]; + + NSString *name = [suiteName copy]; + + if (self) { + _userDefaults = name.length ? [[NSUserDefaults alloc] initWithSuiteName:name] + : [NSUserDefaults standardUserDefaults]; + } + + return self; +} + +- (nullable id)objectForKey:(NSString *)defaultName { + NSString *key = [defaultName copy]; + if (![key isKindOfClass:[NSString class]] || !key.length) { + GULOSLogWarning(kGULLogSubsystem, @"", NO, + [NSString stringWithFormat:kGULLogFormat, (long)GULUDMessageCodeInvalidKeyGet], + @"Cannot get object for invalid user default key."); + return nil; + } + + return [self.userDefaults objectForKey:key]; +} + +- (void)setObject:(nullable id)value forKey:(NSString *)defaultName { + NSString *key = [defaultName copy]; + if (![key isKindOfClass:[NSString class]] || !key.length) { + GULOSLogWarning(kGULLogSubsystem, kGULLogUserDefaultsService, NO, + [NSString stringWithFormat:kGULLogFormat, (long)GULUDMessageCodeInvalidKeySet], + @"Cannot set object for invalid user default key."); + return; + } + if (!value) { + [self.userDefaults removeObjectForKey:key]; + return; + } + BOOL isAcceptableValue = + [value isKindOfClass:[NSString class]] || [value isKindOfClass:[NSNumber class]] || + [value isKindOfClass:[NSArray class]] || [value isKindOfClass:[NSDictionary class]] || + [value isKindOfClass:[NSDate class]] || [value isKindOfClass:[NSData class]]; + if (!isAcceptableValue) { + GULOSLogWarning( + kGULLogSubsystem, kGULLogUserDefaultsService, NO, + [NSString stringWithFormat:kGULLogFormat, (long)GULUDMessageCodeInvalidObjectSet], + @"Cannot set invalid object to user defaults. Must be a string, number, array, " + @"dictionary, date, or data. Value: %@", + value); + return; + } + + [self.userDefaults setObject:value forKey:key]; +} + +- (void)removeObjectForKey:(NSString *)key { + [self setObject:nil forKey:key]; +} + +#pragma mark - Getters + +- (NSInteger)integerForKey:(NSString *)defaultName { + NSNumber *object = [self objectForKey:defaultName]; + return object.integerValue; +} + +- (float)floatForKey:(NSString *)defaultName { + NSNumber *object = [self objectForKey:defaultName]; + return object.floatValue; +} + +- (double)doubleForKey:(NSString *)defaultName { + NSNumber *object = [self objectForKey:defaultName]; + return object.doubleValue; +} + +- (BOOL)boolForKey:(NSString *)defaultName { + NSNumber *object = [self objectForKey:defaultName]; + return object.boolValue; +} + +- (nullable NSString *)stringForKey:(NSString *)defaultName { + return [self objectForKey:defaultName]; +} + +- (nullable NSArray *)arrayForKey:(NSString *)defaultName { + return [self objectForKey:defaultName]; +} + +- (nullable NSDictionary *)dictionaryForKey:(NSString *)defaultName { + return [self objectForKey:defaultName]; +} + +#pragma mark - Setters + +- (void)setInteger:(NSInteger)integer forKey:(NSString *)defaultName { + [self setObject:@(integer) forKey:defaultName]; +} + +- (void)setFloat:(float)value forKey:(NSString *)defaultName { + [self setObject:@(value) forKey:defaultName]; +} + +- (void)setDouble:(double)doubleNumber forKey:(NSString *)defaultName { + [self setObject:@(doubleNumber) forKey:defaultName]; +} + +- (void)setBool:(BOOL)boolValue forKey:(NSString *)defaultName { + [self setObject:@(boolValue) forKey:defaultName]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleUtilities/GoogleUtilities/UserDefaults/Public/GoogleUtilities/GULUserDefaults.h b/Pods/GoogleUtilities/GoogleUtilities/UserDefaults/Public/GoogleUtilities/GULUserDefaults.h new file mode 100644 index 0000000..83b23fa --- /dev/null +++ b/Pods/GoogleUtilities/GoogleUtilities/UserDefaults/Public/GoogleUtilities/GULUserDefaults.h @@ -0,0 +1,105 @@ +// Copyright 2018 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +NS_ASSUME_NONNULL_BEGIN + +/// A thread-safe user defaults that uses C functions from CFPreferences.h instead of +/// `NSUserDefaults`. This is to avoid sending an `NSNotification` when it's changed from a +/// background thread to avoid crashing. // TODO: Insert radar number here. +@interface GULUserDefaults : NSObject + +/// A shared user defaults similar to +[NSUserDefaults standardUserDefaults] and accesses the same +/// data of the standardUserDefaults. ++ (GULUserDefaults *)standardUserDefaults; + +/// Initializes preferences with a suite name that is the same with the NSUserDefaults' suite name. +/// Both of CFPreferences and NSUserDefaults share the same plist file so their data will exactly +/// the same. +/// +/// @param suiteName The name of the suite of the user defaults. +- (instancetype)initWithSuiteName:(nullable NSString *)suiteName; + +#pragma mark - Getters + +/// Searches the receiver's search list for a default with the key 'defaultName' and return it. If +/// another process has changed defaults in the search list, NSUserDefaults will automatically +/// update to the latest values. If the key in question has been marked as ubiquitous via a Defaults +/// Configuration File, the latest value may not be immediately available, and the registered value +/// will be returned instead. +- (nullable id)objectForKey:(NSString *)defaultName; + +/// Equivalent to -objectForKey:, except that it will return nil if the value is not an NSArray. +- (nullable NSArray *)arrayForKey:(NSString *)defaultName; + +/// Equivalent to -objectForKey:, except that it will return nil if the value +/// is not an NSDictionary. +- (nullable NSDictionary *)dictionaryForKey:(NSString *)defaultName; + +/// Equivalent to -objectForKey:, except that it will convert NSNumber values to their NSString +/// representation. If a non-string non-number value is found, nil will be returned. +- (nullable NSString *)stringForKey:(NSString *)defaultName; + +/// Equivalent to -objectForKey:, except that it converts the returned value to an NSInteger. If the +/// value is an NSNumber, the result of -integerValue will be returned. If the value is an NSString, +/// it will be converted to NSInteger if possible. If the value is a boolean, it will be converted +/// to either 1 for YES or 0 for NO. If the value is absent or can't be converted to an integer, 0 +/// will be returned. +- (NSInteger)integerForKey:(NSString *)defaultName; + +/// Similar to -integerForKey:, except that it returns a float, and boolean values will not be +/// converted. +- (float)floatForKey:(NSString *)defaultName; + +/// Similar to -integerForKey:, except that it returns a double, and boolean values will not be +/// converted. +- (double)doubleForKey:(NSString *)defaultName; + +/// Equivalent to -objectForKey:, except that it converts the returned value to a BOOL. If the value +/// is an NSNumber, NO will be returned if the value is 0, YES otherwise. If the value is an +/// NSString, values of "YES" or "1" will return YES, and values of "NO", "0", or any other string +/// will return NO. If the value is absent or can't be converted to a BOOL, NO will be returned. +- (BOOL)boolForKey:(NSString *)defaultName; + +#pragma mark - Setters + +/// Immediately stores a value (or removes the value if `nil` is passed as the value) for the +/// provided key in the search list entry for the receiver's suite name in the current user and any +/// host, then asynchronously stores the value persistently, where it is made available to other +/// processes. +- (void)setObject:(nullable id)value forKey:(NSString *)defaultName; + +/// Equivalent to -setObject:forKey: except that the value is converted from a float to an NSNumber. +- (void)setFloat:(float)value forKey:(NSString *)defaultName; + +/// Equivalent to -setObject:forKey: except that the value is converted from a double to an +/// NSNumber. +- (void)setDouble:(double)value forKey:(NSString *)defaultName; + +/// Equivalent to -setObject:forKey: except that the value is converted from an NSInteger to an +/// NSNumber. +- (void)setInteger:(NSInteger)value forKey:(NSString *)defaultName; + +/// Equivalent to -setObject:forKey: except that the value is converted from a BOOL to an NSNumber. +- (void)setBool:(BOOL)value forKey:(NSString *)defaultName; + +#pragma mark - Removing Defaults + +/// Equivalent to -[... setObject:nil forKey:defaultName] +- (void)removeObjectForKey:(NSString *)defaultName; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleUtilities/LICENSE b/Pods/GoogleUtilities/LICENSE new file mode 100644 index 0000000..47e7301 --- /dev/null +++ b/Pods/GoogleUtilities/LICENSE @@ -0,0 +1,224 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +================================================================================ + +Copyright (c) 2017 Landon J. Fuller +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Pods/GoogleUtilities/README.md b/Pods/GoogleUtilities/README.md new file mode 100644 index 0000000..56659d9 --- /dev/null +++ b/Pods/GoogleUtilities/README.md @@ -0,0 +1,180 @@ +[![Version](https://img.shields.io/cocoapods/v/GoogleUtilities.svg?style=flat)](https://cocoapods.org/pods/GoogleUtilities) +[![License](https://img.shields.io/cocoapods/l/GoogleUtilities.svg?style=flat)](https://cocoapods.org/pods/GoogleUtilities) +[![Platform](https://img.shields.io/cocoapods/p/GoogleUtilities.svg?style=flat)](https://cocoapods.org/pods/GoogleUtilities) + +[![Actions Status][gh-google-utilities-badge]][gh-actions] + +# GoogleUtilities + +GoogleUtilities provides a set of utilities for Firebase and other Google SDKs for Apple platform +development. + +The utilities are not directly supported for non-Google library usage. + +## Integration Testing +These instructions apply to minor and patch version updates. Major versions need +a customized adaptation. + +After the CI is green: +* Determine the next version for release by checking the + [tagged releases](https://github.com/google/GoogleUtilities/tags). + Ensure that the next release version keeps the Swift PM and CocoaPods versions in sync. +* Verify that the releasing version is the latest entry in the [CHANGELOG.md](CHANGELOG.md), + updating it if necessary. +* Update the version in the podspec to match the latest entry in the [CHANGELOG.md](CHANGELOG.md) +* Checkout the `main` branch and ensure it is up to date + ```console + git checkout main + git pull + ``` +* Add the CocoaPods tag (`{version}` will be the latest version in the [podspec](GoogleUtilities.podspec#L3)) + ```console + git tag CocoaPods-{version} + git push origin CocoaPods-{version} + ``` +* Push the podspec to the designated repo + * If this version of GoogleUtilities is intended to launch **before or with** the next Firebase release: +
+ Push to SpecsStaging + + ```console + pod repo push --skip-tests --use-json staging GoogleUtilities.podspec + ``` + + If the command fails with `Unable to find the 'staging' repo.`, add the staging repo with: + ```console + pod repo add staging git@github.com:firebase/SpecsStaging.git + ``` +
+ * Otherwise: +
+ Push to SpecsDev + + ```console + pod repo push --skip-tests --use-json dev GoogleUtilities.podspec + ``` + + If the command fails with `Unable to find the 'dev' repo.`, add the dev repo with: + ```console + pod repo add dev git@github.com:firebase/SpecsDev.git + ``` +
+* Run Firebase CI by waiting until next nightly or adding a PR that touches `Gemfile`. +* On google3, run copybara using the command below. Then, start a global TAP on the generated CL. Deflake as needed. + ```console + third_party/firebase/ios/Releases/run_copy_bara.py --directory GoogleUtilities --branch main + ``` + +## Publishing +The release process is as follows: +1. [Tag and release for Swift PM](#swift-package-manager) +2. [Publish to CocoaPods](#cocoapods) +3. [Create GitHub Release](#create-github-release) +4. [Perform post release cleanup](#post-release-cleanup) + +### Swift Package Manager + By creating and [pushing a tag](https://github.com/google/GoogleUtilities/tags) + for Swift PM, the newly tagged version will be immediately released for public use. + Given this, please verify the intended time of release for Swift PM. + * Add a version tag for Swift PM + ```console + git tag {version} + git push origin {version} + ``` + *Note: Ensure that any inflight PRs that depend on the new `GoogleUtilities` version are updated to point to the + newly tagged version rather than a checksum.* + +### CocoaPods +* Publish the newly versioned pod to CocoaPods + + It's recommended to point to the `GoogleUtilities.podspec` in `staging` to make sure the correct spec is being published. + ```console + pod trunk push ~/.cocoapods/repos/staging/GoogleUtilities/{version}/GoogleUtilities.podspec.json + ``` + *Note: In some cases, it may be acceptable to `pod trunk push` with the `--skip-tests` flag. Please double check with + the maintainers before doing so.* + + The pod push was successful if the above command logs: `🚀 GoogleUtilities ({version}) successfully published`. + In addition, a new commit that publishes the new version (co-authored by [CocoaPodsAtGoogle](https://github.com/CocoaPodsAtGoogle)) + should appear in the [CocoaPods specs repo](https://github.com/CocoaPods/Specs). Last, the latest version should be displayed + on [GoogleUtilities's CocoaPods page](https://cocoapods.org/pods/GoogleUtilities). + +### [Create GitHub Release](https://github.com/google/GoogleUtilities/releases/new/) + Update the [release template](https://github.com/google/GoogleUtilities/releases/new/)'s **Tag version** and **Release title** + fields with the latest version. In addition, reference the [Release Notes](./CHANGELOG.md) in the release's description. + + See [this release](https://github.com/google/GoogleUtilities/releases/edit/7.7.0) for an example. + + *Don't forget to perform the [post release cleanup](#post-release-cleanup)!* + +### Post Release Cleanup +
+ Clean up SpecsStaging + + ```console + pwd=$(pwd) + mkdir -p /tmp/release-cleanup && cd $_ + git clone git@github.com:firebase/SpecsStaging.git + cd SpecsStaging/ + git rm -rf GoogleUtilities/ + git commit -m "Post publish cleanup" + git push origin master + rm -rf /tmp/release-cleanup + cd $pwd + ``` +
+ +## Development + +To develop in this repository, ensure that you have at least the following software: + + * Xcode 12.0 (or later) + * CocoaPods 1.10.0 (or later) + * [CocoaPods generate](https://github.com/square/cocoapods-generate) + +For the pod that you want to develop: + +`pod gen GoogleUtilities.podspec --local-sources=./ --auto-open --platforms=ios` + +Note: If the CocoaPods cache is out of date, you may need to run +`pod repo update` before the `pod gen` command. + +Note: Set the `--platforms` option to `macos` or `tvos` to develop/test for +those platforms. Since 10.2, Xcode does not properly handle multi-platform +CocoaPods workspaces. + +### Development for Catalyst +* `pod gen GoogleUtilities.podspec --local-sources=./ --auto-open --platforms=ios` +* Check the Mac box in the App-iOS Build Settings +* Sign the App in the Settings Signing & Capabilities tab +* Click Pods in the Project Manager +* Add Signing to the iOS host app and unit test targets +* Select the Unit-unit scheme +* Run it to build and test + +Alternatively disable signing in each target: +* Go to Build Settings tab +* Click `+` +* Select `Add User-Defined Setting` +* Add `CODE_SIGNING_REQUIRED` setting with a value of `NO` + +### Code Formatting + +See [firebase-ios-sdk's code formatting docs][firebase-ios-sdk-formatting]. + +### Running Unit Tests + +Select a scheme and press Command-u to build a component and run its unit tests. + +## Contributing + +See [Contributing](CONTRIBUTING.md). + +## License + +The contents of this repository is licensed under the +[Apache License, version 2.0](http://www.apache.org/licenses/LICENSE-2.0). + +[gh-actions]: https://github.com/firebase/firebase-ios-sdk/actions +[gh-google-utilities-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/google-utilities/badge.svg +[firebase-ios-sdk-formatting]: https://github.com/firebase/firebase-ios-sdk?tab=readme-ov-file#code-formatting diff --git a/Pods/GoogleUtilities/third_party/IsAppEncrypted/IsAppEncrypted.m b/Pods/GoogleUtilities/third_party/IsAppEncrypted/IsAppEncrypted.m new file mode 100644 index 0000000..e2f7275 --- /dev/null +++ b/Pods/GoogleUtilities/third_party/IsAppEncrypted/IsAppEncrypted.m @@ -0,0 +1,104 @@ +// Copyright (c) 2017 Landon J. Fuller +// All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// +// Comment from +// iPhone Dev +// Wiki Crack Prevention: +// App Store binaries are signed by both their developer and Apple. This +// encrypts the binary so that decryption keys are needed in order to make the +// binary readable. When iOS executes the binary, the decryption keys are used +// to decrypt the binary into a readable state where it is then loaded into +// memory and executed. iOS can tell the encryption status of a binary via the +// cryptid structure member of LC_ENCRYPTION_INFO MachO load command. If +// cryptid is a non-zero value then the binary is encrypted. +// +// 'Cracking' works by letting the kernel decrypt the binary then siphoning the +// decrypted data into a new binary file, resigning, and repackaging. This will +// only work on jailbroken devices as codesignature validation has been +// removed. Resigning takes place because while the codesignature doesn't have +// to be valid thanks to the jailbreak, it does have to be in place unless you +// have AppSync or similar to disable codesignature checks. +// +// More information at +// Landon Fuller's blog + +#import "third_party/IsAppEncrypted/Public/IsAppEncrypted.h" + +#import +#import + +/// The encryption info struct and constants are missing from the iPhoneSimulator SDK, but not from +/// the iPhoneOS or Mac OS X SDKs. Since one doesn't ever ship a Simulator binary, we'll just +/// provide the definitions here. +#if TARGET_OS_SIMULATOR && !defined(LC_ENCRYPTION_INFO) +#define LC_ENCRYPTION_INFO 0x21 +struct encryption_info_command { + uint32_t cmd; + uint32_t cmdsize; + uint32_t cryptoff; + uint32_t cryptsize; + uint32_t cryptid; +}; +#endif + +BOOL IsAppEncrypted(void) { + const struct mach_header *executableHeader = NULL; + for (uint32_t i = 0; i < _dyld_image_count(); i++) { + const struct mach_header *header = _dyld_get_image_header(i); + if (header && header->filetype == MH_EXECUTE) { + executableHeader = header; + break; + } + } + + if (!executableHeader) { + return NO; + } + + BOOL is64bit = (executableHeader->magic == MH_MAGIC_64); + uintptr_t cursor = (uintptr_t)executableHeader + + (is64bit ? sizeof(struct mach_header_64) : sizeof(struct mach_header)); + const struct segment_command *segmentCommand = NULL; + uint32_t i = 0; + + while (i++ < executableHeader->ncmds) { + segmentCommand = (struct segment_command *)cursor; + + if (!segmentCommand) { + continue; + } + + if ((!is64bit && segmentCommand->cmd == LC_ENCRYPTION_INFO) || + (is64bit && segmentCommand->cmd == LC_ENCRYPTION_INFO_64)) { + if (is64bit) { + struct encryption_info_command_64 *cryptCmd = + (struct encryption_info_command_64 *)segmentCommand; + return cryptCmd && cryptCmd->cryptid != 0; + } else { + struct encryption_info_command *cryptCmd = (struct encryption_info_command *)segmentCommand; + return cryptCmd && cryptCmd->cryptid != 0; + } + } + cursor += segmentCommand->cmdsize; + } + + return NO; +} diff --git a/Pods/GoogleUtilities/third_party/IsAppEncrypted/Public/IsAppEncrypted.h b/Pods/GoogleUtilities/third_party/IsAppEncrypted/Public/IsAppEncrypted.h new file mode 100644 index 0000000..1a4305a --- /dev/null +++ b/Pods/GoogleUtilities/third_party/IsAppEncrypted/Public/IsAppEncrypted.h @@ -0,0 +1,24 @@ +// Copyright (c) 2017 Landon J. Fuller +// All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. + +#import + +BOOL IsAppEncrypted(void); diff --git a/Pods/Headers/Private/IronSourceAdQualitySDK/ISAdQualityAdType.h b/Pods/Headers/Private/IronSourceAdQualitySDK/ISAdQualityAdType.h new file mode 120000 index 0000000..3b72ab9 --- /dev/null +++ b/Pods/Headers/Private/IronSourceAdQualitySDK/ISAdQualityAdType.h @@ -0,0 +1 @@ +../../../IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64_x86_64-simulator/Headers/ISAdQualityAdType.h \ No newline at end of file diff --git a/Pods/Headers/Private/IronSourceAdQualitySDK/ISAdQualityConfig.h b/Pods/Headers/Private/IronSourceAdQualitySDK/ISAdQualityConfig.h new file mode 120000 index 0000000..29589ee --- /dev/null +++ b/Pods/Headers/Private/IronSourceAdQualitySDK/ISAdQualityConfig.h @@ -0,0 +1 @@ +../../../IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64_x86_64-simulator/Headers/ISAdQualityConfig.h \ No newline at end of file diff --git a/Pods/Headers/Private/IronSourceAdQualitySDK/ISAdQualityCustomMediationRevenue.h b/Pods/Headers/Private/IronSourceAdQualitySDK/ISAdQualityCustomMediationRevenue.h new file mode 120000 index 0000000..68c1a49 --- /dev/null +++ b/Pods/Headers/Private/IronSourceAdQualitySDK/ISAdQualityCustomMediationRevenue.h @@ -0,0 +1 @@ +../../../IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64_x86_64-simulator/Headers/ISAdQualityCustomMediationRevenue.h \ No newline at end of file diff --git a/Pods/Headers/Private/IronSourceAdQualitySDK/ISAdQualityMediationNetwork.h b/Pods/Headers/Private/IronSourceAdQualitySDK/ISAdQualityMediationNetwork.h new file mode 120000 index 0000000..79fe1cf --- /dev/null +++ b/Pods/Headers/Private/IronSourceAdQualitySDK/ISAdQualityMediationNetwork.h @@ -0,0 +1 @@ +../../../IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64_x86_64-simulator/Headers/ISAdQualityMediationNetwork.h \ No newline at end of file diff --git a/Pods/Headers/Private/IronSourceAdQualitySDK/ISAdQualitySegment.h b/Pods/Headers/Private/IronSourceAdQualitySDK/ISAdQualitySegment.h new file mode 120000 index 0000000..60bba94 --- /dev/null +++ b/Pods/Headers/Private/IronSourceAdQualitySDK/ISAdQualitySegment.h @@ -0,0 +1 @@ +../../../IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64_x86_64-simulator/Headers/ISAdQualitySegment.h \ No newline at end of file diff --git a/Pods/Headers/Private/IronSourceAdQualitySDK/IronSourceAdQuality.h b/Pods/Headers/Private/IronSourceAdQualitySDK/IronSourceAdQuality.h new file mode 120000 index 0000000..5c538f2 --- /dev/null +++ b/Pods/Headers/Private/IronSourceAdQualitySDK/IronSourceAdQuality.h @@ -0,0 +1 @@ +../../../IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64_x86_64-simulator/Headers/IronSourceAdQuality.h \ No newline at end of file diff --git a/Pods/Headers/Public/IronSourceAdQualitySDK/ISAdQualityAdType.h b/Pods/Headers/Public/IronSourceAdQualitySDK/ISAdQualityAdType.h new file mode 120000 index 0000000..3b72ab9 --- /dev/null +++ b/Pods/Headers/Public/IronSourceAdQualitySDK/ISAdQualityAdType.h @@ -0,0 +1 @@ +../../../IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64_x86_64-simulator/Headers/ISAdQualityAdType.h \ No newline at end of file diff --git a/Pods/Headers/Public/IronSourceAdQualitySDK/ISAdQualityConfig.h b/Pods/Headers/Public/IronSourceAdQualitySDK/ISAdQualityConfig.h new file mode 120000 index 0000000..29589ee --- /dev/null +++ b/Pods/Headers/Public/IronSourceAdQualitySDK/ISAdQualityConfig.h @@ -0,0 +1 @@ +../../../IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64_x86_64-simulator/Headers/ISAdQualityConfig.h \ No newline at end of file diff --git a/Pods/Headers/Public/IronSourceAdQualitySDK/ISAdQualityCustomMediationRevenue.h b/Pods/Headers/Public/IronSourceAdQualitySDK/ISAdQualityCustomMediationRevenue.h new file mode 120000 index 0000000..68c1a49 --- /dev/null +++ b/Pods/Headers/Public/IronSourceAdQualitySDK/ISAdQualityCustomMediationRevenue.h @@ -0,0 +1 @@ +../../../IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64_x86_64-simulator/Headers/ISAdQualityCustomMediationRevenue.h \ No newline at end of file diff --git a/Pods/Headers/Public/IronSourceAdQualitySDK/ISAdQualityMediationNetwork.h b/Pods/Headers/Public/IronSourceAdQualitySDK/ISAdQualityMediationNetwork.h new file mode 120000 index 0000000..79fe1cf --- /dev/null +++ b/Pods/Headers/Public/IronSourceAdQualitySDK/ISAdQualityMediationNetwork.h @@ -0,0 +1 @@ +../../../IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64_x86_64-simulator/Headers/ISAdQualityMediationNetwork.h \ No newline at end of file diff --git a/Pods/Headers/Public/IronSourceAdQualitySDK/ISAdQualitySegment.h b/Pods/Headers/Public/IronSourceAdQualitySDK/ISAdQualitySegment.h new file mode 120000 index 0000000..60bba94 --- /dev/null +++ b/Pods/Headers/Public/IronSourceAdQualitySDK/ISAdQualitySegment.h @@ -0,0 +1 @@ +../../../IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64_x86_64-simulator/Headers/ISAdQualitySegment.h \ No newline at end of file diff --git a/Pods/Headers/Public/IronSourceAdQualitySDK/IronSourceAdQuality.h b/Pods/Headers/Public/IronSourceAdQualitySDK/IronSourceAdQuality.h new file mode 120000 index 0000000..5c538f2 --- /dev/null +++ b/Pods/Headers/Public/IronSourceAdQualitySDK/IronSourceAdQuality.h @@ -0,0 +1 @@ +../../../IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64_x86_64-simulator/Headers/IronSourceAdQuality.h \ No newline at end of file diff --git a/Pods/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/Info.plist b/Pods/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/Info.plist new file mode 100644 index 0000000..97c5157 --- /dev/null +++ b/Pods/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/Info.plist @@ -0,0 +1,44 @@ + + + + + AvailableLibraries + + + HeadersPath + Headers + LibraryIdentifier + ios-arm64 + LibraryPath + libIronSourceAdQuality.a + SupportedArchitectures + + arm64 + + SupportedPlatform + ios + + + HeadersPath + Headers + LibraryIdentifier + ios-arm64_x86_64-simulator + LibraryPath + libIronSourceAdQuality.a + SupportedArchitectures + + arm64 + x86_64 + + SupportedPlatform + ios + SupportedPlatformVariant + simulator + + + CFBundlePackageType + XFWK + XCFrameworkFormatVersion + 1.0 + + diff --git a/Pods/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64/Headers/ISAdQualityAdType.h b/Pods/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64/Headers/ISAdQualityAdType.h new file mode 100644 index 0000000..0272cdb --- /dev/null +++ b/Pods/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64/Headers/ISAdQualityAdType.h @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2012-2015 Soomla Inc. - All Rights Reserved + * + * Unauthorized copying of this file, via any medium is strictly prohibited + * Proprietary and confidential + * + * Written by Refael Dakar + */ + +/** + an Enumaration listing all the ads available + */ +typedef enum { + IS_AD_QUALITY_AD_TYPE_UNKNOWN = -1, + IS_AD_QUALITY_AD_TYPE_RICH_MEDIA = 0, + IS_AD_QUALITY_AD_TYPE_INTERSTITIAL = 1, + IS_AD_QUALITY_AD_TYPE_APP_WALL = 2, + IS_AD_QUALITY_AD_TYPE_VIDEO = 3, + IS_AD_QUALITY_AD_TYPE_REWARDED_VIDEO = 4, + IS_AD_QUALITY_AD_TYPE_NATIVE = 5, + IS_AD_QUALITY_AD_TYPE_BANNER = 6, + IS_AD_QUALITY_AD_TYPE_OFFER_WALL = 7, + IS_AD_QUALITY_AD_TYPE_NATIVE_HTML = 8, + IS_AD_QUALITY_AD_TYPE_EXTERNAL = 9, + IS_AD_QUALITY_AD_TYPE_REWARDED = 10, + IS_AD_QUALITY_AD_TYPE_INTERACTIVE = 11 +} ISAdQualityAdType; diff --git a/Pods/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64/Headers/ISAdQualityConfig.h b/Pods/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64/Headers/ISAdQualityConfig.h new file mode 100644 index 0000000..bf27a2c --- /dev/null +++ b/Pods/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64/Headers/ISAdQualityConfig.h @@ -0,0 +1,68 @@ +// +// ISAdQualityConfig.h +// ironSource Ad Quality +// +// Created by Boris Spektor on 25/10/2018. +// Copyright © 2018 SOOMLA. All rights reserved. +// + +#import + +typedef enum { + IS_AD_QUALITY_LOG_LEVEL_NONE = 0, + IS_AD_QUALITY_LOG_LEVEL_ERROR = 1, + IS_AD_QUALITY_LOG_LEVEL_WARNING = 2, + IS_AD_QUALITY_LOG_LEVEL_INFO = 3, + IS_AD_QUALITY_LOG_LEVEL_DEBUG = 4, + IS_AD_QUALITY_LOG_LEVEL_VERBOSE = 5 +} ISAdQualityLogLevel; + +typedef enum { + IS_AD_QUALITY_INIT_ERROR_SDK_WAS_SHUTDOWN = 0, + IS_AD_QUALITY_INIT_ERROR_ILLEGAL_USER_ID = 1, + IS_AD_QUALITY_INIT_ERROR_ILLEGAL_APPKEY = 2, + IS_AD_QUALITY_INIT_ERROR_EXCEPTION_ON_INIT = 3, + IS_AD_QUALITY_INIT_ERROR_NO_NETWORK_CONNECTION = 4, + IS_AD_QUALITY_INIT_ERROR_CONFIG_LOAD_TIMEOUT = 5, + IS_AD_QUALITY_INIT_ERROR_CONNECTOR_LOAD_TIMEOUT = 6, + IS_AD_QUALITY_INIT_ERROR_AD_NETWORK_VERSION_NOT_SUPPORTED_YET = 7, + IS_AD_QUALITY_INIT_ERROR_AD_NETWORK_SDK_REQUIRES_NEWER_AD_QUALITY_SDK = 8, + IS_AD_QUALITY_INIT_ERROR_AD_QUALITY_ALREADY_INITIALIZED = 9, + IS_AD_QUALITY_INIT_ERROR_NO_AD_NETWORKS = 10 +} ISAdQualityInitError; + +typedef enum { + IS_AD_QUALITY_DEVICE_ID_TYPE_NONE = 0, + IS_AD_QUALITY_DEVICE_ID_TYPE_GAID = 1, + IS_AD_QUALITY_DEVICE_ID_TYPE_IDFA = 2, +} ISAdQualityDeviceIdType; + +@protocol ISAdQualityInitDelegate +- (void)adQualitySdkInitSuccess; +- (void)adQualitySdkInitFailed:(ISAdQualityInitError)error withMessage:(NSString *)message; +@end + +@interface ISAdQualityConfig : NSObject + +@property (nonatomic) NSString *userId; +@property (nonatomic) BOOL testMode; +@property (nonatomic) ISAdQualityLogLevel logLevel; +@property (nonatomic, weak) id adQualityInitDelegate __attribute__((deprecated("This setter is deprecated, please use [ISAdQualityConfig addAdQualityInitDelegate:] instead"))); +@property (nonatomic) NSString *initializationSource; +@property (nonatomic) BOOL coppa; +@property (nonatomic) ISAdQualityDeviceIdType deviceIdType; +@property (nonatomic, strong, readonly) NSMutableDictionary *metaData; + ++ (ISAdQualityConfig *)config; + ++ (ISAdQualityConfig *)merge:(ISAdQualityConfig *)primary with:(ISAdQualityConfig *)fallback; + +- (void)setMetaDataDictionary:(NSDictionary *)dict; + +- (void)setMetaData:(NSString *)value forKey:(NSString *)key; + +- (void)addAdQualityInitDelegate:(id)delegate; + +- (void)removeAdQualityInitDelegate:(id)delegate; + +@end diff --git a/Pods/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64/Headers/ISAdQualityCustomMediationRevenue.h b/Pods/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64/Headers/ISAdQualityCustomMediationRevenue.h new file mode 100644 index 0000000..85d21fa --- /dev/null +++ b/Pods/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64/Headers/ISAdQualityCustomMediationRevenue.h @@ -0,0 +1,19 @@ +// +// ISAdQualityCustomMediationRevenue.h +// SoomlaTraceback +// +// Created by Ben Zilonka on 29/09/2022. +// Copyright © 2022 SOOMLA. All rights reserved. +// + +#import "ISAdQualityMediationNetwork.h" +#import "ISAdQualityAdType.h" + +@interface ISAdQualityCustomMediationRevenue : NSObject + +@property (nonatomic) ISAdQualityMediationNetwork mediationNetwork; +@property (nonatomic) ISAdQualityAdType adType; +@property (nonatomic) double revenue; +@property (nonatomic) NSString *placement; + +@end diff --git a/Pods/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64/Headers/ISAdQualityMediationNetwork.h b/Pods/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64/Headers/ISAdQualityMediationNetwork.h new file mode 100644 index 0000000..e0f67a9 --- /dev/null +++ b/Pods/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64/Headers/ISAdQualityMediationNetwork.h @@ -0,0 +1,19 @@ +// +// ISAdQualityMediationNetwork.h +// SoomlaTraceback +// +// Created by Ben Zilonka on 02/10/2022. +// Copyright © 2022 SOOMLA. All rights reserved. +// + +typedef enum { + IS_AD_QUALITY_MEDIATION_NETWORK_UNKNOWN = -1, + IS_AD_QUALITY_MEDIATION_NETWORK_ADMOB = 0, + IS_AD_QUALITY_MEDIATION_NETWORK_DT_FAIR_BID = 1, + IS_AD_QUALITY_MEDIATION_NETWORK_HELIUM = 2, + IS_AD_QUALITY_MEDIATION_NETWORK_LEVEL_PLAY = 3, + IS_AD_QUALITY_MEDIATION_NETWORK_MAX = 4, + IS_AD_QUALITY_MEDIATION_NETWORK_UNITY = 5, + IS_AD_QUALITY_MEDIATION_NETWORK_SELF_MEDIATED = 6, + IS_AD_QUALITY_MEDIATION_NETWORK_OTHER = 7 +} ISAdQualityMediationNetwork; diff --git a/Pods/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64/Headers/ISAdQualitySegment.h b/Pods/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64/Headers/ISAdQualitySegment.h new file mode 100644 index 0000000..62c9f83 --- /dev/null +++ b/Pods/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64/Headers/ISAdQualitySegment.h @@ -0,0 +1,24 @@ +// +// ISAdQualitySegment.h +// SoomlaTraceback +// +// Created by Yuri Marinkov on 20/11/2022. +// Copyright © 2022 SOOMLA. All rights reserved. +// + +#import + +@interface ISAdQualitySegment : NSObject + +@property (nonatomic, strong) NSString *name; +@property (nonatomic) int age; +@property (nonatomic) NSString *gender; +@property (nonatomic) int level; +@property (nonatomic) BOOL isPaying; +@property (nonatomic) double inAppPurchasesTotal; +@property (nonatomic, strong) NSDate *userCreationDate; +@property (nonatomic, strong, readonly) NSMutableDictionary *customData; + +- (void)setCustomValue:(NSString *)value forKey:(NSString *)key; + +@end diff --git a/Pods/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64/Headers/IronSourceAdQuality.h b/Pods/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64/Headers/IronSourceAdQuality.h new file mode 100644 index 0000000..a84beb9 --- /dev/null +++ b/Pods/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64/Headers/IronSourceAdQuality.h @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2012-2016 Soomla Inc. - All Rights Reserved + * + * Unauthorized copying of this file, via any medium is strictly prohibited + * Proprietary and confidential + * + * Written by Refael Dakar + */ + +#import +#import "ISAdQualityAdType.h" +#import "ISAdQualityConfig.h" +#import "ISAdQualityCustomMediationRevenue.h" +#import "ISAdQualitySegment.h" + +#define IRONSOURCE_AD_QUALITY_VERSION @"9.1.1" + +static NSString *IRONSOURCE_AD_QUALITY_TAG = @"ISAdQualitySDK"; + +@protocol ISAdQualityDelegate + +@required + +@optional + +- (void)adDisplayedForAdNetwork:(NSString *)adNetwork andAdType:(ISAdQualityAdType)adType; +- (void)adClosedForAdNetwork:(NSString *)adNetwork andAdType:(ISAdQualityAdType)adType; + +@end + +@interface IronSourceAdQuality : NSObject + +@property (nonatomic, weak) id delegate; + ++ (IronSourceAdQuality *)getInstance; ++ (NSString *)getSDKVersion; + +- (void)initializeWithAppKey:(NSString *)appKey; +- (void)initializeWithAppKey:(NSString *)appKey andConfig:(ISAdQualityConfig *)config; +- (void)shutdown +DEPRECATED_MSG_ATTRIBUTE("This method is deprecated and will be removed in version 10.0.0"); +- (void)changeUserId:(NSString *)userId; +- (void)sendCustomMediationRevenue:(ISAdQualityCustomMediationRevenue *)customMediationRev; +- (void)setSegment:(ISAdQualitySegment *)segment; + +- (void)setUserConsent:(BOOL)userConsent __attribute__((deprecated("This method has been deprecated and will be removed soon"))); + +- (void)setConfig:(ISAdQualityConfig *)config; + +@end diff --git a/Pods/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64/PrivacyInfo.xcprivacy b/Pods/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..2c6d428 --- /dev/null +++ b/Pods/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64/PrivacyInfo.xcprivacy @@ -0,0 +1,19 @@ + + + + + NSPrivacyCollectedDataTypes + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPITypeReasons + + CA92.1 + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + + + + diff --git a/Pods/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64/libIronSourceAdQuality.a b/Pods/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64/libIronSourceAdQuality.a new file mode 100644 index 0000000..4ea8bc2 Binary files /dev/null and b/Pods/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64/libIronSourceAdQuality.a differ diff --git a/Pods/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64_x86_64-simulator/Headers/ISAdQualityAdType.h b/Pods/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64_x86_64-simulator/Headers/ISAdQualityAdType.h new file mode 100644 index 0000000..0272cdb --- /dev/null +++ b/Pods/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64_x86_64-simulator/Headers/ISAdQualityAdType.h @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2012-2015 Soomla Inc. - All Rights Reserved + * + * Unauthorized copying of this file, via any medium is strictly prohibited + * Proprietary and confidential + * + * Written by Refael Dakar + */ + +/** + an Enumaration listing all the ads available + */ +typedef enum { + IS_AD_QUALITY_AD_TYPE_UNKNOWN = -1, + IS_AD_QUALITY_AD_TYPE_RICH_MEDIA = 0, + IS_AD_QUALITY_AD_TYPE_INTERSTITIAL = 1, + IS_AD_QUALITY_AD_TYPE_APP_WALL = 2, + IS_AD_QUALITY_AD_TYPE_VIDEO = 3, + IS_AD_QUALITY_AD_TYPE_REWARDED_VIDEO = 4, + IS_AD_QUALITY_AD_TYPE_NATIVE = 5, + IS_AD_QUALITY_AD_TYPE_BANNER = 6, + IS_AD_QUALITY_AD_TYPE_OFFER_WALL = 7, + IS_AD_QUALITY_AD_TYPE_NATIVE_HTML = 8, + IS_AD_QUALITY_AD_TYPE_EXTERNAL = 9, + IS_AD_QUALITY_AD_TYPE_REWARDED = 10, + IS_AD_QUALITY_AD_TYPE_INTERACTIVE = 11 +} ISAdQualityAdType; diff --git a/Pods/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64_x86_64-simulator/Headers/ISAdQualityConfig.h b/Pods/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64_x86_64-simulator/Headers/ISAdQualityConfig.h new file mode 100644 index 0000000..bf27a2c --- /dev/null +++ b/Pods/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64_x86_64-simulator/Headers/ISAdQualityConfig.h @@ -0,0 +1,68 @@ +// +// ISAdQualityConfig.h +// ironSource Ad Quality +// +// Created by Boris Spektor on 25/10/2018. +// Copyright © 2018 SOOMLA. All rights reserved. +// + +#import + +typedef enum { + IS_AD_QUALITY_LOG_LEVEL_NONE = 0, + IS_AD_QUALITY_LOG_LEVEL_ERROR = 1, + IS_AD_QUALITY_LOG_LEVEL_WARNING = 2, + IS_AD_QUALITY_LOG_LEVEL_INFO = 3, + IS_AD_QUALITY_LOG_LEVEL_DEBUG = 4, + IS_AD_QUALITY_LOG_LEVEL_VERBOSE = 5 +} ISAdQualityLogLevel; + +typedef enum { + IS_AD_QUALITY_INIT_ERROR_SDK_WAS_SHUTDOWN = 0, + IS_AD_QUALITY_INIT_ERROR_ILLEGAL_USER_ID = 1, + IS_AD_QUALITY_INIT_ERROR_ILLEGAL_APPKEY = 2, + IS_AD_QUALITY_INIT_ERROR_EXCEPTION_ON_INIT = 3, + IS_AD_QUALITY_INIT_ERROR_NO_NETWORK_CONNECTION = 4, + IS_AD_QUALITY_INIT_ERROR_CONFIG_LOAD_TIMEOUT = 5, + IS_AD_QUALITY_INIT_ERROR_CONNECTOR_LOAD_TIMEOUT = 6, + IS_AD_QUALITY_INIT_ERROR_AD_NETWORK_VERSION_NOT_SUPPORTED_YET = 7, + IS_AD_QUALITY_INIT_ERROR_AD_NETWORK_SDK_REQUIRES_NEWER_AD_QUALITY_SDK = 8, + IS_AD_QUALITY_INIT_ERROR_AD_QUALITY_ALREADY_INITIALIZED = 9, + IS_AD_QUALITY_INIT_ERROR_NO_AD_NETWORKS = 10 +} ISAdQualityInitError; + +typedef enum { + IS_AD_QUALITY_DEVICE_ID_TYPE_NONE = 0, + IS_AD_QUALITY_DEVICE_ID_TYPE_GAID = 1, + IS_AD_QUALITY_DEVICE_ID_TYPE_IDFA = 2, +} ISAdQualityDeviceIdType; + +@protocol ISAdQualityInitDelegate +- (void)adQualitySdkInitSuccess; +- (void)adQualitySdkInitFailed:(ISAdQualityInitError)error withMessage:(NSString *)message; +@end + +@interface ISAdQualityConfig : NSObject + +@property (nonatomic) NSString *userId; +@property (nonatomic) BOOL testMode; +@property (nonatomic) ISAdQualityLogLevel logLevel; +@property (nonatomic, weak) id adQualityInitDelegate __attribute__((deprecated("This setter is deprecated, please use [ISAdQualityConfig addAdQualityInitDelegate:] instead"))); +@property (nonatomic) NSString *initializationSource; +@property (nonatomic) BOOL coppa; +@property (nonatomic) ISAdQualityDeviceIdType deviceIdType; +@property (nonatomic, strong, readonly) NSMutableDictionary *metaData; + ++ (ISAdQualityConfig *)config; + ++ (ISAdQualityConfig *)merge:(ISAdQualityConfig *)primary with:(ISAdQualityConfig *)fallback; + +- (void)setMetaDataDictionary:(NSDictionary *)dict; + +- (void)setMetaData:(NSString *)value forKey:(NSString *)key; + +- (void)addAdQualityInitDelegate:(id)delegate; + +- (void)removeAdQualityInitDelegate:(id)delegate; + +@end diff --git a/Pods/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64_x86_64-simulator/Headers/ISAdQualityCustomMediationRevenue.h b/Pods/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64_x86_64-simulator/Headers/ISAdQualityCustomMediationRevenue.h new file mode 100644 index 0000000..85d21fa --- /dev/null +++ b/Pods/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64_x86_64-simulator/Headers/ISAdQualityCustomMediationRevenue.h @@ -0,0 +1,19 @@ +// +// ISAdQualityCustomMediationRevenue.h +// SoomlaTraceback +// +// Created by Ben Zilonka on 29/09/2022. +// Copyright © 2022 SOOMLA. All rights reserved. +// + +#import "ISAdQualityMediationNetwork.h" +#import "ISAdQualityAdType.h" + +@interface ISAdQualityCustomMediationRevenue : NSObject + +@property (nonatomic) ISAdQualityMediationNetwork mediationNetwork; +@property (nonatomic) ISAdQualityAdType adType; +@property (nonatomic) double revenue; +@property (nonatomic) NSString *placement; + +@end diff --git a/Pods/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64_x86_64-simulator/Headers/ISAdQualityMediationNetwork.h b/Pods/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64_x86_64-simulator/Headers/ISAdQualityMediationNetwork.h new file mode 100644 index 0000000..e0f67a9 --- /dev/null +++ b/Pods/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64_x86_64-simulator/Headers/ISAdQualityMediationNetwork.h @@ -0,0 +1,19 @@ +// +// ISAdQualityMediationNetwork.h +// SoomlaTraceback +// +// Created by Ben Zilonka on 02/10/2022. +// Copyright © 2022 SOOMLA. All rights reserved. +// + +typedef enum { + IS_AD_QUALITY_MEDIATION_NETWORK_UNKNOWN = -1, + IS_AD_QUALITY_MEDIATION_NETWORK_ADMOB = 0, + IS_AD_QUALITY_MEDIATION_NETWORK_DT_FAIR_BID = 1, + IS_AD_QUALITY_MEDIATION_NETWORK_HELIUM = 2, + IS_AD_QUALITY_MEDIATION_NETWORK_LEVEL_PLAY = 3, + IS_AD_QUALITY_MEDIATION_NETWORK_MAX = 4, + IS_AD_QUALITY_MEDIATION_NETWORK_UNITY = 5, + IS_AD_QUALITY_MEDIATION_NETWORK_SELF_MEDIATED = 6, + IS_AD_QUALITY_MEDIATION_NETWORK_OTHER = 7 +} ISAdQualityMediationNetwork; diff --git a/Pods/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64_x86_64-simulator/Headers/ISAdQualitySegment.h b/Pods/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64_x86_64-simulator/Headers/ISAdQualitySegment.h new file mode 100644 index 0000000..62c9f83 --- /dev/null +++ b/Pods/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64_x86_64-simulator/Headers/ISAdQualitySegment.h @@ -0,0 +1,24 @@ +// +// ISAdQualitySegment.h +// SoomlaTraceback +// +// Created by Yuri Marinkov on 20/11/2022. +// Copyright © 2022 SOOMLA. All rights reserved. +// + +#import + +@interface ISAdQualitySegment : NSObject + +@property (nonatomic, strong) NSString *name; +@property (nonatomic) int age; +@property (nonatomic) NSString *gender; +@property (nonatomic) int level; +@property (nonatomic) BOOL isPaying; +@property (nonatomic) double inAppPurchasesTotal; +@property (nonatomic, strong) NSDate *userCreationDate; +@property (nonatomic, strong, readonly) NSMutableDictionary *customData; + +- (void)setCustomValue:(NSString *)value forKey:(NSString *)key; + +@end diff --git a/Pods/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64_x86_64-simulator/Headers/IronSourceAdQuality.h b/Pods/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64_x86_64-simulator/Headers/IronSourceAdQuality.h new file mode 100644 index 0000000..a84beb9 --- /dev/null +++ b/Pods/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64_x86_64-simulator/Headers/IronSourceAdQuality.h @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2012-2016 Soomla Inc. - All Rights Reserved + * + * Unauthorized copying of this file, via any medium is strictly prohibited + * Proprietary and confidential + * + * Written by Refael Dakar + */ + +#import +#import "ISAdQualityAdType.h" +#import "ISAdQualityConfig.h" +#import "ISAdQualityCustomMediationRevenue.h" +#import "ISAdQualitySegment.h" + +#define IRONSOURCE_AD_QUALITY_VERSION @"9.1.1" + +static NSString *IRONSOURCE_AD_QUALITY_TAG = @"ISAdQualitySDK"; + +@protocol ISAdQualityDelegate + +@required + +@optional + +- (void)adDisplayedForAdNetwork:(NSString *)adNetwork andAdType:(ISAdQualityAdType)adType; +- (void)adClosedForAdNetwork:(NSString *)adNetwork andAdType:(ISAdQualityAdType)adType; + +@end + +@interface IronSourceAdQuality : NSObject + +@property (nonatomic, weak) id delegate; + ++ (IronSourceAdQuality *)getInstance; ++ (NSString *)getSDKVersion; + +- (void)initializeWithAppKey:(NSString *)appKey; +- (void)initializeWithAppKey:(NSString *)appKey andConfig:(ISAdQualityConfig *)config; +- (void)shutdown +DEPRECATED_MSG_ATTRIBUTE("This method is deprecated and will be removed in version 10.0.0"); +- (void)changeUserId:(NSString *)userId; +- (void)sendCustomMediationRevenue:(ISAdQualityCustomMediationRevenue *)customMediationRev; +- (void)setSegment:(ISAdQualitySegment *)segment; + +- (void)setUserConsent:(BOOL)userConsent __attribute__((deprecated("This method has been deprecated and will be removed soon"))); + +- (void)setConfig:(ISAdQualityConfig *)config; + +@end diff --git a/Pods/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64_x86_64-simulator/PrivacyInfo.xcprivacy b/Pods/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64_x86_64-simulator/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..2c6d428 --- /dev/null +++ b/Pods/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64_x86_64-simulator/PrivacyInfo.xcprivacy @@ -0,0 +1,19 @@ + + + + + NSPrivacyCollectedDataTypes + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPITypeReasons + + CA92.1 + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + + + + diff --git a/Pods/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64_x86_64-simulator/libIronSourceAdQuality.a b/Pods/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64_x86_64-simulator/libIronSourceAdQuality.a new file mode 100644 index 0000000..1fcccae Binary files /dev/null and b/Pods/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework/ios-arm64_x86_64-simulator/libIronSourceAdQuality.a differ diff --git a/Pods/IronSourceAdQualitySDK/Resources/PrivacyInfo.xcprivacy b/Pods/IronSourceAdQualitySDK/Resources/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..2c6d428 --- /dev/null +++ b/Pods/IronSourceAdQualitySDK/Resources/PrivacyInfo.xcprivacy @@ -0,0 +1,19 @@ + + + + + NSPrivacyCollectedDataTypes + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPITypeReasons + + CA92.1 + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + + + + diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/Info.plist b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/Info.plist new file mode 100644 index 0000000..8479e21 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/Info.plist @@ -0,0 +1,44 @@ + + + + + AvailableLibraries + + + BinaryPath + IronSource.framework/IronSource + LibraryIdentifier + ios-arm64_x86_64-simulator + LibraryPath + IronSource.framework + SupportedArchitectures + + arm64 + x86_64 + + SupportedPlatform + ios + SupportedPlatformVariant + simulator + + + BinaryPath + IronSource.framework/IronSource + LibraryIdentifier + ios-arm64 + LibraryPath + IronSource.framework + SupportedArchitectures + + arm64 + + SupportedPlatform + ios + + + CFBundlePackageType + XFWK + XCFrameworkFormatVersion + 1.0 + + diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAAdFormat.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAAdFormat.h new file mode 100644 index 0000000..3461202 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAAdFormat.h @@ -0,0 +1,43 @@ +// +// ISAAdFormat.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + Enum representing available ad formats. + */ +typedef NS_ENUM(NSUInteger, ISAAdFormatType) { + ISAAdFormatTypeInterstitial, + ISAAdFormatTypeRewarded, + ISAAdFormatTypeBanner +}; + +/** + Class representing an ad format. + */ +@interface ISAAdFormat : NSObject + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +/** + The ad format type. + */ +@property(readonly, nonatomic) ISAAdFormatType adFormatType; + +/** + Initializes with the given ad format type. + + @param adFormatType the ad format type to represent. + */ +- (instancetype)initWithAdFormatType:(ISAAdFormatType)adFormatType; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAAdSize.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAAdSize.h new file mode 100644 index 0000000..7871c68 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAAdSize.h @@ -0,0 +1,46 @@ +// +// ISAAdSize.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + Class representing an ad size. + */ +@interface ISAAdSize : NSObject + +@property(nonatomic, readonly) CGFloat width; +@property(nonatomic, readonly) CGFloat height; +@property(nonatomic, readonly, copy) NSString *sizeDescription; + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +/** + Creates an `ISAAdSize` for a banner ad. + */ ++ (ISAAdSize *)banner; + +/** + Creates an `ISAAdSize` for a large ad. + */ ++ (ISAAdSize *)large; + +/** + Creates an `ISAAdSize` for a medium rectangle ad. + */ ++ (ISAAdSize *)mediumRectangle; + +/** + Creates an `ISAAdSize` for a leaderboard ad. + */ ++ (ISAAdSize *)leaderboard; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISABannerAdInfo.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISABannerAdInfo.h new file mode 100644 index 0000000..ff5fc2c --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISABannerAdInfo.h @@ -0,0 +1,32 @@ +// +// ISABannerAdInfo.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + Class containing information on the associated banner ad. + */ +@interface ISABannerAdInfo : NSObject + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +/** + The identifier of the network instance. + */ +@property(nonatomic, strong, readonly) NSString *instanceId; + +/** + The unique identifier of the ad. + */ +@property(nonatomic, strong, readonly) NSString *adId; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISABannerAdLoader.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISABannerAdLoader.h new file mode 100644 index 0000000..6fb52f9 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISABannerAdLoader.h @@ -0,0 +1,35 @@ +// +// ISNBannerLoader.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import "ISABannerAdLoaderDelegate.h" +#import "ISABannerAdRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + Class responsible for loading banner ads. + */ +@interface ISABannerAdLoader : NSObject + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +/** + Loads a banner ad. + The delegate will send a `bannerAdDidLoad:` or + `bannerAdDidFailToLoadWithError:` callback. + + @param adRequest The request configuration for the ad to be loaded. + @param delegate The delegate to be notified of ad loading callbacks. The callbacks will be invoked + on the main thread. The delegate is held weakly. + */ ++ (void)loadAdWithAdRequest:(ISABannerAdRequest *)adRequest + delegate:(id)delegate; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISABannerAdLoaderDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISABannerAdLoaderDelegate.h new file mode 100644 index 0000000..6dcbd39 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISABannerAdLoaderDelegate.h @@ -0,0 +1,34 @@ +// +// ISABannerAdLoaderDelegate.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import "ISABannerAdView.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + Protocol handling loading callbacks for a requested banner ad. + The callbacks will be invoked on the main thread. + */ +@protocol ISABannerAdLoaderDelegate + +/** + Called when a banner ad is successfully loaded. + + @param bannerAdView The banner ad that is loaded. + */ +- (void)bannerAdDidLoad:(ISABannerAdView *)bannerAdView; + +/** + Called when a banner ad fails to load. + + @param error The error that occurred during loading. + */ +- (void)bannerAdDidFailToLoadWithError:(NSError *)error; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISABannerAdRequest.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISABannerAdRequest.h new file mode 100644 index 0000000..5c2a8ba --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISABannerAdRequest.h @@ -0,0 +1,49 @@ +// +// ISNBannerAdRequest.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import +#import "ISAAdSize.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + Class representing a loading request for a banner ad. + Use `ISABannerAdRequestBuilder` in order to create an instance of this class. + */ +@interface ISABannerAdRequest : NSObject + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +/** + The identifier for the network instance. + */ +@property(nonatomic, strong, readonly) NSString *instanceId; + +/** + The ad markup. + */ +@property(nonatomic, strong, readonly) NSString *adm; + +/** + The ad size. + */ +@property(nonatomic, strong, readonly) ISAAdSize *size; + +/** + The view controller to show the ad on, if available. + */ +@property(nonatomic, weak, readonly, nullable) UIViewController *viewController; + +/** + Extra parameters for the ad request. + */ +@property(nonatomic, strong, readonly, nullable) NSDictionary *extraParams; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISABannerAdRequestBuilder.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISABannerAdRequestBuilder.h new file mode 100644 index 0000000..6c1bef9 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISABannerAdRequestBuilder.h @@ -0,0 +1,61 @@ +// +// ISABannerAdRequestBuilder.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import +#import "ISAAdSize.h" +#import "ISABannerAdRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + Builder class for `ISABannerAdRequest`. + */ +@interface ISABannerAdRequestBuilder : NSObject + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +/** + Initializes the builder. + + @param instanceId The identifier for the network instance. + @param adm The ad markup. + @param size The ad size. + */ +- (instancetype)initWithInstanceId:(NSString *)instanceId + adm:(NSString *)adm + size:(ISAAdSize *)size; + +/** + Sets extra parameters for the ad request. + Optional. + + @param extraParams The extra parameters dictionary. + + @return The Builder instance. + */ +- (ISABannerAdRequestBuilder *)withExtraParams:(NSDictionary *)extraParams; + +/** + Sets the view controller that will show the ad, if available. + + @param viewController The view controller that will show the ad, if available. + + @return The Builder instance. + */ +- (ISABannerAdRequestBuilder *)withViewController:(UIViewController *)viewController; + +/** + Builds the `ISABannerAdRequest` instance. + + @return The ad request instance. + */ +- (ISABannerAdRequest *)build; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISABannerAdView.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISABannerAdView.h new file mode 100644 index 0000000..6d09f2d --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISABannerAdView.h @@ -0,0 +1,26 @@ +// +// ISNBannerAdView.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import +#import +#import "ISABannerAdInfo.h" +#import "ISABannerAdViewDelegate.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface ISABannerAdView : UIView + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +@property(nonatomic, weak, nullable) id delegate; +@property(nonatomic, strong, readonly) ISABannerAdInfo* adInfo; +@property(nonatomic, weak, nullable) UIViewController* viewController; + +NS_ASSUME_NONNULL_END + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISABannerAdViewDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISABannerAdViewDelegate.h new file mode 100644 index 0000000..fb0f2af --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISABannerAdViewDelegate.h @@ -0,0 +1,34 @@ +// +// ISABannerAdViewDelegate.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +NS_ASSUME_NONNULL_BEGIN + +@class ISABannerAdView; + +/** + Protocol handling banner ad show events for `ISABannerAd`. + The callbacks will be invoked on the main thread. + */ +@protocol ISABannerAdViewDelegate + +/** + Called when a banner ad is shown. + + @param bannerAdView The banner ad that is shown. + */ +- (void)bannerAdViewDidShow:(ISABannerAdView *)bannerAdView; + +/** + Called when a banner ad is clicked. + + @param bannerAdView The banner ad that is clicked. + */ +- (void)bannerAdViewDidClick:(ISABannerAdView *)bannerAdView; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAInitRequest.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAInitRequest.h new file mode 100644 index 0000000..a26839b --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAInitRequest.h @@ -0,0 +1,45 @@ +// +// ISAInitRequest.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import +#import "ISAAdFormat.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + Enum representing the different log levels in IronSourceAds. + */ +typedef NS_ENUM(NSInteger, ISALogLevel) { ISALogLevelNone, ISALogLevelError, ISALogLevelVerbose }; + +/** + Class representing an initialization request for IronSourceAds. + Use `ISAInitRequestBuilder` to create an instance of this class. + */ +@interface ISAInitRequest : NSObject + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +/** + The application key. + */ +@property(readonly, nonatomic) NSString *appKey; + +/** + Legacy ad formats for the initialization request. + */ +@property(readonly, nonatomic) NSArray *legacyAdFormats; + +/** + Log level to use in IronSourceAds. + Default value is `ISALogLevelNone`. + */ +@property(readonly, nonatomic) ISALogLevel logLevel; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAInitRequestBuilder.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAInitRequestBuilder.h new file mode 100644 index 0000000..5938300 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAInitRequestBuilder.h @@ -0,0 +1,59 @@ +// +// ISAInitRequestBuilder.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import +#import "ISAAdFormat.h" +#import "ISAInitRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + Builder class for `ISAInitRequest`. + */ +@interface ISAInitRequestBuilder : NSObject + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +/** + Initializes the builder. + + @param appKey the application key. + */ +- (instancetype)initWithAppKey:(NSString *)appKey; + +/** + Builds the `ISAInitRequest` instance. + + @return The init request instance. + */ +- (ISAInitRequest *)build; + +/** + Sets the legacy ad formats for the initialization request. + To enable non-bidding instances, pass the relevant legacy ad formats. + For bidding instances, this is non-mandatory. + + @param legacyAdFormats The list of legacy ad formats. + + @return The Builder instance. + */ +- (ISAInitRequestBuilder *)withLegacyAdFormats:(NSArray *)legacyAdFormats; + +/** + Sets the log level for the initialization request. + Default value is `ISALogLevelNone`. + + @param logLevel The log level. + + @return The Builder instance. + */ +- (ISAInitRequestBuilder *)withLogLevel:(ISALogLevel)logLevel; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAInterstitialAd.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAInterstitialAd.h new file mode 100644 index 0000000..71aa302 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAInterstitialAd.h @@ -0,0 +1,54 @@ +// +// ISAInterstitialAd.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import +#import +#import "ISAInterstitialAdDelegate.h" +#import "ISAInterstitialAdInfo.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + Class responsible for handling the operations and callbacks of an interstitial ad. + */ +@interface ISAInterstitialAd : NSObject + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +/** + The delegate for the ad callbacks. + Set this delegate in order to receive callbacks from the ad. + The callbacks will be invoked on the main thread. + */ +@property(nonatomic, weak, nullable) id delegate; + +/** + Contains information associated with the ad. + */ +@property(nonatomic, strong, readonly) ISAInterstitialAdInfo *adInfo; + +/** + Check if the ad is ready to show. + Showing an ad that is not ready will result in a show failure. + + @return Whether the ad is ready to show. + */ +- (BOOL)isReadyToShow; + +/** + Show the ad. + The delegate will send a `interstitialAdDidShow:` or + `interstitialAd:didFailToShowWithError:` callback. + + @param viewController The view controller where the ad will be shown. + */ +- (void)showFromViewController:(UIViewController *)viewController; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAInterstitialAdDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAInterstitialAdDelegate.h new file mode 100644 index 0000000..4d3784c --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAInterstitialAdDelegate.h @@ -0,0 +1,49 @@ +// +// ISAInterstitialAdDelegate.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +NS_ASSUME_NONNULL_BEGIN + +@class ISAInterstitialAd; + +/** + Protocol handling interstitial ad show events for `ISAInterstitialAd`. + The callbacks will be invoked on the main thread. + */ +@protocol ISAInterstitialAdDelegate + +/** + Called when an interstitial ad is shown. + + @param interstitialAd The interstitial ad that is shown. + */ +- (void)interstitialAdDidShow:(ISAInterstitialAd *)interstitialAd; + +/** + Called when an interstitial ad fails to show. + + @param interstitialAd The interstitial ad that fails to show. + @param error The error that occurred. + */ +- (void)interstitialAd:(ISAInterstitialAd *)interstitialAd didFailToShowWithError:(NSError *)error; + +/** + Called when an interstitial ad is clicked. + + @param interstitialAd The interstitial ad that is clicked. + */ +- (void)interstitialAdDidClick:(ISAInterstitialAd *)interstitialAd; + +/** + Called when an interstitial ad is dismissed. + + @param interstitialAd The interstitial ad that is dismissed. + */ +- (void)interstitialAdDidDismiss:(ISAInterstitialAd *)interstitialAd; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAInterstitialAdInfo.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAInterstitialAdInfo.h new file mode 100644 index 0000000..56755df --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAInterstitialAdInfo.h @@ -0,0 +1,32 @@ +// +// ISAInterstitialAdInfo.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + Class containing information on the associated interstitial ad. + */ +@interface ISAInterstitialAdInfo : NSObject + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +/** + The identifier of the network instance. + */ +@property(nonatomic, strong, readonly) NSString *instanceId; + +/** + The unique identifier of the ad. + */ +@property(nonatomic, strong, readonly) NSString *adId; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAInterstitialAdLoader.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAInterstitialAdLoader.h new file mode 100644 index 0000000..147962f --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAInterstitialAdLoader.h @@ -0,0 +1,36 @@ +// +// ISNLoaderInterstitial.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import +#import "ISAInterstitialAdLoaderDelegate.h" +#import "ISAInterstitialAdRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + Class responsible for loading interstitial ads. + */ +@interface ISAInterstitialAdLoader : NSObject + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +/** + Loads an interstitial ad. + The delegate will send a `interstitialAdDidLoad:` or + `interstitialAdDidFailToLoadWithError:` callback. + + @param adRequest The request configuration for the ad to be loaded. + @param delegate The delegate to be notified of ad loading callbacks. The callbacks will be invoked + on the main thread. The delegate is held weakly. + */ ++ (void)loadAdWithAdRequest:(ISAInterstitialAdRequest *)adRequest + delegate:(id)delegate; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAInterstitialAdLoaderDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAInterstitialAdLoaderDelegate.h new file mode 100644 index 0000000..0bce215 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAInterstitialAdLoaderDelegate.h @@ -0,0 +1,34 @@ +// +// ISAInterstitialAdLoaderDelegate.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import "ISAInterstitialAd.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + Protocol handling loading callbacks for a requested interstitial ad. + The callbacks will be invoked on the main thread. + */ +@protocol ISAInterstitialAdLoaderDelegate + +/** + Called when an interstitial ad is successfully loaded. + + @param interstitialAd The interstitial ad that is loaded. + */ +- (void)interstitialAdDidLoad:(ISAInterstitialAd *)interstitialAd; + +/** + Called when an interstitial ad fails to load. + + @param error The error that occurred during loading. + */ +- (void)interstitialAdDidFailToLoadWithError:(NSError *)error; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAInterstitialAdRequest.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAInterstitialAdRequest.h new file mode 100644 index 0000000..bee365f --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAInterstitialAdRequest.h @@ -0,0 +1,38 @@ +// +// ISAInterstitialAdRequest.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + Class representing a loading request for an interstitial ad. + Use `ISAInterstitialAdRequestBuilder` in order to create an instance of this class. + */ +@interface ISAInterstitialAdRequest : NSObject + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +/** + The identifier for the network instance. + */ +@property(readonly, nonatomic, strong) NSString *instanceId; + +/** + The ad markup. + */ +@property(readonly, nonatomic, strong) NSString *adm; + +/** + Extra parameters for the ad request. + */ +@property(readonly, nonatomic, strong, nullable) NSDictionary *extraParams; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAInterstitialAdRequestBuilder.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAInterstitialAdRequestBuilder.h new file mode 100644 index 0000000..e9e24ae --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAInterstitialAdRequestBuilder.h @@ -0,0 +1,48 @@ +// +// ISAInterstitialAdRequestBuilder.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import +#import "ISAInterstitialAdRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + Builder class for `ISAInterstitialAdRequest`. + */ +@interface ISAInterstitialAdRequestBuilder : NSObject + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +/** + Initializes the builder. + + @param instanceId The identifier for the network instance. + @param adm The ad markup. + */ +- (instancetype)initWithInstanceId:(NSString *)instanceId adm:(NSString *)adm; + +/** + Sets extra parameters for the ad request. + Optional. + + @param extraParams The extra parameters dictionary. + + @return The Builder instance. + */ +- (ISAInterstitialAdRequestBuilder *)withExtraParams:(NSDictionary *)extraParams; + +/** + Builds the `ISAInterstitialAdRequest` instance. + + @return The ad request instance. + */ +- (ISAInterstitialAdRequest *)build; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISARewardedAd.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISARewardedAd.h new file mode 100644 index 0000000..c5939bf --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISARewardedAd.h @@ -0,0 +1,54 @@ +// +// ISARewardedAd.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import +#import +#import "ISARewardedAdDelegate.h" +#import "ISARewardedAdInfo.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + Class responsible for handling the operations and callbacks of a rewarded ad. + */ +@interface ISARewardedAd : NSObject + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +/** + The delegate for the ad callbacks. + Set this delegate in order to receive callbacks from the ad. + The callbacks will be invoked on the main thread. + */ +@property(nonatomic, weak, nullable) id delegate; + +/** + Contains information associated with the ad. + */ +@property(nonatomic, strong, readonly) ISARewardedAdInfo *adInfo; + +/** + Check if the ad is ready to show. + Showing an ad that is not ready will result in a show failure. + + @return Whether the ad is ready to show. + */ +- (BOOL)isReadyToShow; + +/** + Show the ad. + The delegate will send a `rewardedAdDidShow:` or + `rewardedAd:didFailToShowWithError:` callback. + + @param viewController The view controller where the ad will be shown. + */ +- (void)showFromViewController:(UIViewController *)viewController; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISARewardedAdDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISARewardedAdDelegate.h new file mode 100644 index 0000000..4f30afc --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISARewardedAdDelegate.h @@ -0,0 +1,56 @@ +// +// ISARewardedAdDelegate.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +NS_ASSUME_NONNULL_BEGIN + +@class ISARewardedAd; + +/** + Protocol handling rewarded ad show events for `ISARewardedAd`. + The callbacks will be invoked on the main thread. + */ +@protocol ISARewardedAdDelegate + +/** + Called when a rewarded ad is shown. + + @param rewardedAd The rewarded ad that is shown. + */ +- (void)rewardedAdDidShow:(ISARewardedAd *)rewardedAd; + +/** + Called when a rewarded ad fails to show. + + @param rewardedAd The rewarded ad that fails to show. + @param error The error that occurred. + */ +- (void)rewardedAd:(ISARewardedAd *)rewardedAd didFailToShowWithError:(NSError *)error; + +/** + Called when the user earns a reward. + + @param rewardedAd The rewarded ad that the user earns a reward from. + */ +- (void)rewardedAdDidUserEarnReward:(ISARewardedAd *)rewardedAd; + +/** + Called when a rewarded ad is clicked. + + @param rewardedAd The rewarded ad that is clicked. + */ +- (void)rewardedAdDidClick:(ISARewardedAd *)rewardedAd; + +/** + Called when a rewarded ad is dismissed. + + @param rewardedAd The rewarded ad that is dismissed. + */ +- (void)rewardedAdDidDismiss:(ISARewardedAd *)rewardedAd; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISARewardedAdInfo.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISARewardedAdInfo.h new file mode 100644 index 0000000..2a1a0bd --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISARewardedAdInfo.h @@ -0,0 +1,32 @@ +// +// ISARewardedAdInfo.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + Class containing information on the associated rewarded ad. + */ +@interface ISARewardedAdInfo : NSObject + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +/** + The identifier of the network instance. + */ +@property(nonatomic, strong, readonly) NSString *instanceId; + +/** + The unique identifier of the ad. + */ +@property(nonatomic, strong, readonly) NSString *adId; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISARewardedAdLoader.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISARewardedAdLoader.h new file mode 100644 index 0000000..2ffa26f --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISARewardedAdLoader.h @@ -0,0 +1,36 @@ +// +// ISNLoaderRewardedVideo.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import +#import "ISARewardedAdLoaderDelegate.h" +#import "ISARewardedAdRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + Class responsible for loading rewarded ads. + */ +@interface ISARewardedAdLoader : NSObject + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +/** + Loads a rewarded ad. + The delegate will send a `rewardedAdDidLoad:` or + `rewardedAdDidFailToLoadWithError:` callback. + + @param adRequest The request configuration for the ad to be loaded. + @param delegate The delegate to be notified of ad loading callbacks. The callbacks will be invoked + on the main thread. The delegate is held weakly. + */ ++ (void)loadAdWithAdRequest:(ISARewardedAdRequest *)adRequest + delegate:(id)delegate; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISARewardedAdLoaderDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISARewardedAdLoaderDelegate.h new file mode 100644 index 0000000..af3f93d --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISARewardedAdLoaderDelegate.h @@ -0,0 +1,34 @@ +// +// ISARewardedAdLoaderDelegate.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import "ISARewardedAd.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + Protocol handling loading callbacks for a requested rewarded ad. + The callbacks will be invoked on the main thread. + */ +@protocol ISARewardedAdLoaderDelegate + +/** + Called when a rewarded ad is successfully loaded. + + @param rewardedAd The rewarded ad that is loaded. + */ +- (void)rewardedAdDidLoad:(ISARewardedAd *)rewardedAd; + +/** + Called when a rewarded ad fails to load. + + @param error The error that occurred during loading. + */ +- (void)rewardedAdDidFailToLoadWithError:(NSError *)error; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISARewardedAdRequest.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISARewardedAdRequest.h new file mode 100644 index 0000000..082fb82 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISARewardedAdRequest.h @@ -0,0 +1,38 @@ +// +// ISARewardedAdRequest.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + Class representing a loading request for a rewarded ad. + Use `ISARewardedAdRequestBuilder` in order to create an instance of this class. + */ +@interface ISARewardedAdRequest : NSObject + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +/** + The identifier for the network instance. + */ +@property(readonly, nonatomic, strong) NSString *instanceId; + +/** + The ad markup. + */ +@property(readonly, nonatomic, strong) NSString *adm; + +/** + Extra parameters for the ad request. + */ +@property(readonly, nonatomic, strong, nullable) NSDictionary *extraParams; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISARewardedAdRequestBuilder.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISARewardedAdRequestBuilder.h new file mode 100644 index 0000000..05d8b27 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISARewardedAdRequestBuilder.h @@ -0,0 +1,48 @@ +// +// ISARewardedAdRequestBuilder.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import +#import "ISARewardedAdRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + Builder class for `ISARewardedAdRequest`. + */ +@interface ISARewardedAdRequestBuilder : NSObject + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +/** + Initializes the builder. + + @param instanceId The identifier for the network instance. + @param adm The ad markup. + */ +- (instancetype)initWithInstanceId:(NSString *)instanceId adm:(NSString *)adm; + +/** + Sets extra parameters for the ad request. + Optional. + + @param extraParams The extra parameters dictionary. + + @return The Builder instance. + */ +- (ISARewardedAdRequestBuilder *)withExtraParams:(NSDictionary *)extraParams; + +/** + Builds the `ISARewardedAdRequest` instance. + + @return The ad request instance. + */ +- (ISARewardedAdRequest *)build; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdData.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdData.h new file mode 100644 index 0000000..f932e92 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdData.h @@ -0,0 +1,42 @@ +// +// ISAdData.h +// IronSource +// +// Created by Yonti Makmel on 22/04/2021. +// Copyright © 2021 ironSource. All rights reserved. +// +#import +#import "ISAdapterConfig.h" +#import "ISBannerSize.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface ISAdData : NSObject + +// The server data containing the adm +@property(nonatomic, strong, readonly, nullable) NSString *serverData; + +// The server configuration +@property(nonatomic, strong, readonly) NSDictionary *configuration; + +// The configuration holding userId, banner size, ad unit data from auction response and adapter +// config +@property(nonatomic, strong, readonly, nullable) NSDictionary *adUnitData; + +- (instancetype)initWithServerData:(nullable NSString *)serverData + configuration:(NSDictionary *)configuration + adUnitData:(nullable NSDictionary *)adUnitData; + +- (nullable NSString *)getString:(NSString *)key; + +- (NSInteger)getInt:(NSString *)key; + +- (BOOL)getBoolean:(NSString *)key; + +- (nullable NSNumber *)getNumber:(NSString *)key; + +- (nullable NSDictionary *)getAdUnitData; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdInfo.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdInfo.h new file mode 100644 index 0000000..63e90fd --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdInfo.h @@ -0,0 +1,30 @@ +// +// ISAdInfo.h +// IronSource +// +// Copyright © 2022 IronSource. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface ISAdInfo : NSObject + +@property(readonly, copy) NSString* auction_id; +@property(readonly, copy) NSString* ad_network; +@property(readonly, copy) NSString* instance_name; +@property(readonly, copy) NSString* instance_id; +@property(readonly, copy) NSString* country; +@property(readonly, copy) NSNumber* revenue; +@property(readonly, copy) NSString* precision; +@property(readonly, copy) NSString* ab; +@property(readonly, copy) NSString* segment_name; +@property(readonly, copy) NSString* encrypted_cpm; +@property(readonly, copy) NSNumber* conversion_value; + +- (instancetype)init; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdOptionsPosition.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdOptionsPosition.h new file mode 100644 index 0000000..df4e5a2 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdOptionsPosition.h @@ -0,0 +1,17 @@ +// +// ISAdOptionsPosition.h +// IronSource +// +// Created by Hadar Pur on 06/07/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +// ISAdOptionsPosition +typedef NS_ENUM(NSInteger, ISAdOptionsPosition) { + ISAdOptionsPositionTopLeft, + ISAdOptionsPositionTopRight, + ISAdOptionsPositionBottomLeft, + ISAdOptionsPositionBottomRight +}; + +static NSString* const kAdOptionsPosKey = @"adOptionsPos"; diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdUnitAdapterProtocol.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdUnitAdapterProtocol.h new file mode 100644 index 0000000..c95c47a --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdUnitAdapterProtocol.h @@ -0,0 +1,12 @@ +// +// ISAdUnitAdapterProtocol.h +// IronSource +// +// Copyright © 2023 IronSource. All rights reserved. +// + +#import "ISNetworkInitCallbackProtocol.h" + +@protocol ISAdUnitAdapterProtocol + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterAdDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterAdDelegate.h new file mode 100644 index 0000000..9ae73be --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterAdDelegate.h @@ -0,0 +1,59 @@ +// +// ISAdapterAdDelegate.h +// IronSource +// +// Created by Yonti Makmel on 28/04/2021. +// Copyright © 2021 ironSource. All rights reserved. +// + +#ifndef ISAdapterAdDelegate_h +#define ISAdapterAdDelegate_h + +#import "ISAdapterErrorType.h" + +NS_ASSUME_NONNULL_BEGIN + +@protocol ISAdapterAdDelegate + +// Mandatory callbacks + +- (void)adDidLoad; +- (void)adDidLoadWithExtraData:(NSDictionary *)extraData; + +/// @param errorType the load error type, including NO_FILL +/// @param errorCode the error code if available, general ones in AdapterErrors +/// @param errorMessage the error message if available +- (void)adDidFailToLoadWithErrorType:(ISAdapterErrorType)errorType + errorCode:(NSInteger)errorCode + errorMessage:(nullable NSString *)errorMessage; + +/// @param errorType the load error type, including NO_FILL +/// @param errorCode the error code if available, general ones in AdapterErrors +/// @param errorMessage the error message if available +- (void)adDidFailToLoadWithErrorType:(ISAdapterErrorType)errorType + errorCode:(NSInteger)errorCode + errorMessage:(nullable NSString *)errorMessage + extraData:(NSDictionary *)extraData; + +- (void)adDidOpen; +- (void)adDidOpenWithExtraData:(NSDictionary *)extraData; + +/// @param errorCode the error code if available, general ones in AdapterErrors +/// @param errorMessage the error message if available +- (void)adDidFailToShowWithErrorCode:(NSInteger)errorCode + errorMessage:(nullable NSString *)errorMessage; + +/// @param errorCode the error code if available, general ones in AdapterErrors +/// @param errorMessage the error message if available +- (void)adDidFailToShowWithErrorCode:(NSInteger)errorCode + errorMessage:(nullable NSString *)errorMessage + extraData:(NSDictionary *)extraData; + +- (void)adDidClick; +- (void)adDidClickWithExtraData:(NSDictionary *)extraData; + +@end + +NS_ASSUME_NONNULL_END + +#endif /* ISAdapterAdDelegate_h */ diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterAdFullscreenProtocol.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterAdFullscreenProtocol.h new file mode 100644 index 0000000..2be571e --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterAdFullscreenProtocol.h @@ -0,0 +1,40 @@ +// +// ISAdapterAdFullscreenProtocol.h +// IronSource +// +// Copyright © 2023 IronSource. All rights reserved. +// + +#import +#import "ISAdData.h" +#import "ISAdapterAdInteractionDelegate.h" + +@protocol ISAdapterAdFullscreenProtocol + +/// load the ad +/// @param adData data containing the configuration passed from the server and other related +/// parameters passed from the publisher like userId +/// @param delegate the delegate to return mandatory callbacks based on the network - load success, +/// load failure, ad opened, ad closed, show failed optional callbacks - show success, clicked +- (void)loadAdWithAdData:(ISAdData *)adData delegate:(id)delegate; + +/// show the ad +/// @param viewController current viewController for showing the ad +/// @param adData data containing the configuration passed from the server and other related +/// parameters passed from the publisher like userId +/// @param delegate the callback listener +- (void)showAdWithViewController:(UIViewController *)viewController + adData:(ISAdData *)adData + delegate:(id)delegate; + +/// returning whether the ad is available or not +/// @param adData data containing the configuration passed from the server and other related +/// parameters passed from the publisher like userId +- (BOOL)isAdAvailableWithAdData:(ISAdData *)adData; + +/// destroy the ad +/// @param adData data containing the configuration passed from the server and other related +/// parameters passed from the publisher like userId +- (void)destroyAdWithAdData:(ISAdData *)adData; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterAdInteractionDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterAdInteractionDelegate.h new file mode 100644 index 0000000..66c2d4e --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterAdInteractionDelegate.h @@ -0,0 +1,37 @@ +// +// ISAdapterAdInteractionDelegate.h +// IronSource +// +// Created by Bar David on 21/10/2021. +// Copyright © 2021 IronSource. All rights reserved. +// + +#ifndef ISAdapterAdInteractionDelegate_h +#define ISAdapterAdInteractionDelegate_h + +#import "ISAdapterAdDelegate.h" + +NS_ASSUME_NONNULL_BEGIN + +@protocol ISAdapterAdInteractionDelegate + +// Mandatory callbacks + +- (void)adDidClose; +- (void)adDidCloseWithExtraData:(NSDictionary *)extraData; + +// Optional callbacks +- (void)adDidBecomeVisible; +- (void)adDidBecomeVisibleWithExtraData:(NSDictionary *)extraData; + +- (void)adDidStart; +- (void)adDidStartWithExtraData:(NSDictionary *)extraData; + +- (void)adDidEnd; +- (void)adDidEndWithExtraData:(NSDictionary *)extraData; + +@end + +NS_ASSUME_NONNULL_END + +#endif /* ISAdapterAdInteractionDelegate_h */ diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterAdRewardedDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterAdRewardedDelegate.h new file mode 100644 index 0000000..cd85c12 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterAdRewardedDelegate.h @@ -0,0 +1,26 @@ +// +// ISAdapterAdRewardedDelegate.h +// IronSource +// +// Created by Bar David on 21/10/2021. +// Copyright © 2021 IronSource. All rights reserved. +// + +#ifndef ISAdapterAdRewardedDelegate_h +#define ISAdapterAdRewardedDelegate_h + +#import "ISAdapterAdInteractionDelegate.h" + +NS_ASSUME_NONNULL_BEGIN + +@protocol ISAdapterAdRewardedDelegate + +// mandatory callbacks + +- (void)adRewarded; +- (void)adRewardedWithExtraData:(NSDictionary *)extraData; + +@end + +NS_ASSUME_NONNULL_END +#endif /* ISAdapterAdRewardedDelegate_h */ diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterAdViewDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterAdViewDelegate.h new file mode 100644 index 0000000..5316b21 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterAdViewDelegate.h @@ -0,0 +1,66 @@ +// +// ISAdapterAdViewDelegate.h +// IronSource +// +// Created by Guy Lis on 27/03/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +#ifndef ISAdapterAdViewDelegate_h +#define ISAdapterAdViewDelegate_h + +#import +#import "ISAdapterAdDelegate.h" + +@protocol ISAdapterAdViewDelegate + +// mandatory callbacks + +/** + * @param view the view that was loaded + */ +- (void)adDidLoadWithView:(UIView *)view; + +/** + * @param view the view that was loaded + * @param extraData custom data + */ +- (void)adDidLoadWithView:(UIView *)view extraData:(NSDictionary *)extraData; + +// optional callbacks (must be implemented in the adapter but can have empty implementation) + +/** + * This method should be invoked before the user is taken out of the application after a click + */ +- (void)adWillLeaveApplication; + +/** + * This method should be invoked before the user is taken out of the application after a click + * @param extraData custom data + */ +- (void)adWillLeaveApplicationWithExtraData:(NSDictionary *)extraData; + +/** + * This method should be invoked after the ad view presents fullscreen content + */ +- (void)adWillPresentScreen; + +/** + * This method should be invoked after the ad view presents fullscreen content + * @param extraData custom data + */ +- (void)adWillPresentScreenWithExtraData:(NSDictionary *)extraData; + +/** + * This method should be invoked after the fullscreen content is dismissed + */ +- (void)adDidDismissScreen; + +/** + * This method should be invoked after the fullscreen content is dismissed + * @param extraData custom data + */ +- (void)adDidDismissScreenWithExtraData:(NSDictionary *)extraData; +@end + +#endif /* ISAdapterAdViewDelegate_h */ diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterAdaptiveProtocol.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterAdaptiveProtocol.h new file mode 100644 index 0000000..cb58c70 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterAdaptiveProtocol.h @@ -0,0 +1,12 @@ +// +// ISAdapterAdaptiveProtocol.h +// IronSource +// + +#import + +@protocol ISAdapterAdaptiveProtocol + +- (CGFloat)getAdaptiveHeightWithWidth:(CGFloat)width; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterBannerProtocol.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterBannerProtocol.h new file mode 100644 index 0000000..6474b7e --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterBannerProtocol.h @@ -0,0 +1,41 @@ +// +// ISAdapterBannerProtocol.h +// IronSource +// +// Created by Guy Lis on 27/03/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +#import "ISAdData.h" +#import "ISBannerAdDelegate.h" +#import "ISBannerSize.h" + +@protocol ISAdapterBannerProtocol + +/** + * load the ad + * + * @param adData data containing the configuration passed from the server and other related + * parameters passed from the publisher like userId + * @param viewController the application view controller + * @param size the banner size the ad will be presented on + * @param delegate the callback listener to return + * mandatory callbacks based on the network - load success, load failure, ad opened + * optional callbacks - clicked, left application, presented, dismissed + */ +- (void)loadAdWithAdData:(nonnull ISAdData *)adData + viewController:(nonnull UIViewController *)viewController + size:(nonnull ISBannerSize *)size + delegate:(nonnull id)delegate; + +/** + * destroy the ad + * + * @param adData - data containing the configuration passed from the server and other related + * parameters passed from the publisher like userId + */ +- (void)destroyAdWithAdData:(nonnull ISAdData *)adData; + +- (BOOL)isSupportAdaptiveBanner; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterBaseProtocol.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterBaseProtocol.h new file mode 100644 index 0000000..346f63e --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterBaseProtocol.h @@ -0,0 +1,30 @@ +// +// ISAdapterBaseInterface.h +// IronSource +// +// Created by Yonti Makmel on 27/04/2021. +// Copyright © 2021 ironSource. All rights reserved. +// +#import "ISAdData.h" +#import "ISNetworkInitializationDelegate.h" + +#ifndef ISAdapterBaseProtocol_h +#define ISAdapterBaseProtocol_h + +@protocol ISAdapterBaseProtocol + +/// initializes the network +/// @param adData data containing the configuration passed from the server and other related +/// parameters passed from the publisher like userId +/// @param delegate the delegate to return whether the initialization was a success or failure +- (void)init:(ISAdData*)adData delegate:(id)delegate; + +/// returns the network SDK version +- (NSString*)networkSDKVersion; + +/// returns the adapter version +- (NSString*)adapterVersion; + +@end + +#endif /* ISAdapterBaseInterface_h */ diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterConfig.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterConfig.h new file mode 100644 index 0000000..813a0cf --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterConfig.h @@ -0,0 +1,73 @@ +// +// ISAdapterConfig.m +// IronSource +// +// Created by Gili Ariel on 8/1/15. +// Copyright (c) 2015 IronSource. All rights reserved. +// +#import + +#define DEFAULT_CAPPING_PER_DAY 99 +#define DEFAULT_CAPPING_PER_SESSION 99 +#define DEFAULT_CAPPING_PER_ITERATION 99 + +@interface ISAdapterConfig : NSObject + +@property(strong, nonatomic, readonly) NSDictionary *settings; +@property(strong, nonatomic, readonly) NSString *providerName; /* Name from waterfall */ +@property(strong, nonatomic, readonly) NSString *reflectionName; /* Name of Adapter class to load */ +@property(strong, nonatomic, readonly) NSString *name; /* name of adapter in mediation cycle' */ +@property(strong, nonatomic, readonly) NSString *requestUrl; +@property(strong, nonatomic, readonly) NSString *subAdapterId; +@property(strong, nonatomic, readonly) NSString *instanceId; +@property(strong, nonatomic, readonly) NSNumber *maxAdsPerIteration; +@property(strong, nonatomic, readonly) NSNumber *maxAdsPerSession; +@property(strong, nonatomic, readonly) NSString *instanceType; +@property(assign, nonatomic, readonly) NSInteger maxAdsPerDay; +@property(assign, nonatomic, readonly) double loadTimeOutSec; +@property(assign, nonatomic, readonly) BOOL isMultiProviderInstance; +@property(strong, nonatomic, readonly) + NSString *adSourceNameForEvent; // name from adSourceName property on init +@property(assign, nonatomic, readonly) BOOL isBidder; +@property(assign, nonatomic, readonly) BOOL shouldEarlyInit; +@property(strong, nonatomic, readonly) NSString *adFormat; +@property(strong, nonatomic, readonly) NSDictionary *appSettings; +@property(strong, nonatomic, readonly) NSDictionary *interstitialSettings; +@property(strong, nonatomic, readonly) NSDictionary *rewardedVideoSettings; +// The banner settings contains the provider configs which may be changed with the banner +// configuration during the flow, so it's not defined as readonly. +@property(strong, nonatomic) NSDictionary *bannerSettings; +@property(strong, nonatomic, readonly) NSDictionary *nativeAdSettings; + +@property(strong, nonatomic, readonly) NSString + *providerDefaultInstance; /* Name of Adapter class to load (fallback to reflectionName) */ +@property(strong, nonatomic, readonly) + NSString *providerNetworkKey; /* Name to be used in the public API (e.g. setNetworkData) */ +@property(strong, nonatomic, readonly) + NSString *customNetwork; /* name of the custom network is exists */ +@property(assign, nonatomic, readonly) + BOOL isCustomNetwork; /* whether the configuration is for a custom network*/ + +- (instancetype)initWithProviderName:(NSString *)providerName; + +- (void)setSettings:(NSDictionary *)settings; +- (void)setReflectionName:(NSString *)reflectionName; +- (void)setLoadTimeOut:(double)loadTimeOut; +- (void)setAdFormat:(NSString *)adFormat; +- (BOOL)isIronSource; +- (void)setAppSettings:(NSDictionary *)appSettings; +- (void)setInterstitialSettings:(NSDictionary *)interstitialSettings; +- (void)setRewardedVideoSettings:(NSDictionary *)rewardedVideoSettings; +- (void)setBannerSettings:(NSDictionary *)bannerSettings; +- (void)setNativeAdSettings:(NSDictionary *)nativeAdSettings; +- (void)setProviderDefaultInstance:(NSString *)providerDefaultInstance; +- (void)setIsOneFlow:(BOOL)isOneFlow; +- (NSString *_Nullable)customNetworkAdapterNameForAdFormat:(NSString *_Nullable)adFormat; +- (NSDictionary *)adUnitSettings; +- (NSString *)demandSourceName; +- (NSNumber *)isOneFlow; + +- (BOOL)hasConsentCMP; +- (BOOL)getConsentCMP; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterConsentProtocol.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterConsentProtocol.h new file mode 100644 index 0000000..3b52b4d --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterConsentProtocol.h @@ -0,0 +1,17 @@ +// +// ISAdapterConsentProtocol.h +// IronSource +// +// Created by Yonti Makmel on 16/06/2021. +// Copyright © 2021 ironSource. All rights reserved. +// +#ifndef ISAdapterConsentProtocol_h +#define ISAdapterConsentProtocol_h + +@protocol ISAdapterConsentProtocol + +- (void)setConsent:(BOOL)consent; + +@end + +#endif /* ISAdapterConsentProtocol_h */ diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterDebugProtocol.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterDebugProtocol.h new file mode 100644 index 0000000..f852338 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterDebugProtocol.h @@ -0,0 +1,17 @@ +// +// ISAdapterDebugProtocol.h +// IronSource +// +// Created by Yonti Makmel on 16/06/2021. +// Copyright © 2021 ironSource. All rights reserved. +// +#ifndef ISAdapterDebugProtocol_h +#define ISAdapterDebugProtocol_h + +@protocol ISAdapterDebugProtocol + +- (void)setAdapterDebug:(BOOL)adapterDebug; + +@end + +#endif /* ISAdapterDebugProtocol_h */ diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterErrorType.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterErrorType.h new file mode 100644 index 0000000..d0ec92d --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterErrorType.h @@ -0,0 +1,20 @@ +// +// ISAdapterErrorType.h +// IronSource +// +// Created by Guy Lis on 11/08/2021. +// Copyright © 2021 ironSource. All rights reserved. +// + +#import + +#ifndef ISAdapterErrorType_h +#define ISAdapterErrorType_h + +typedef NS_ENUM(NSInteger, ISAdapterErrorType) { + ISAdapterErrorTypeNoFill, + ISAdapterErrorTypeAdExpired, + ISAdapterErrorTypeInternal +}; + +#endif /* ISAdapterErrorType_h */ diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterErrors.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterErrors.h new file mode 100644 index 0000000..3826c1f --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterErrors.h @@ -0,0 +1,19 @@ +// +// AdapterErrors.h +// IronSource +// +// Created by Guy Lis on 05/07/2021. +// Copyright © 2021 ironSource. All rights reserved. +// + +#ifndef AdapterErrors_h +#define AdapterErrors_h + +typedef NS_ENUM(NSInteger, ISAdapterErrors) { + ISAdapterErrorInternal = 1000, // internal error + ISAdapterErrorAdExpired = 1001, // expired ad error + ISAdapterErrorMissingParams = 1002 // missing parameters error + +}; + +#endif /* AdapterErrors_h */ diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterMetaDataProtocol.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterMetaDataProtocol.h new file mode 100644 index 0000000..6efa7a6 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterMetaDataProtocol.h @@ -0,0 +1,18 @@ +// +// ISAdapterMetaDataProtocol.h +// IronSource +// +// Created by Guy Lis on 06/07/2021. +// Copyright © 2021 ironSource. All rights reserved. +// + +#ifndef ISAdapterMetaDataProtocol_h +#define ISAdapterMetaDataProtocol_h + +@protocol ISAdapterMetaDataProtocol + +- (void)setMetaDataWithKey:(NSString *)key andValues:(NSMutableArray *)values; + +@end + +#endif /* ISAdapterMetaDataProtocol_h */ diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterNativeAdData.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterNativeAdData.h new file mode 100644 index 0000000..0d53345 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterNativeAdData.h @@ -0,0 +1,18 @@ +// +// ISAdapterNativeAdData.h +// IronSource +// +// Created by Hadar Pur on 27/06/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +#import +#import "ISNativeAdDataProtocol.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface ISAdapterNativeAdData : NSObject + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterNativeAdProtocol.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterNativeAdProtocol.h new file mode 100644 index 0000000..a7b118f --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterNativeAdProtocol.h @@ -0,0 +1,36 @@ +// +// ISAdapterNativeAdProtocol.h +// IronSource +// +// Created by Hadar Pur on 28/06/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +#import "ISAdData.h" +#import "ISNativeAdDelegate.h" + +@protocol ISAdapterNativeAdProtocol + +/** + * load the ad + * + * @param adData data containing the configuration passed from the server and other related + * parameters passed from the publisher like userId + * @param viewController the application view controller + * @param delegate the callback listener to return + * mandatory callbacks based on the network - load success, load failure, ad opened + * optional callbacks - clicked, left application, presented, dismissed + */ +- (void)loadAdWithAdData:(nonnull ISAdData *)adData + viewController:(nonnull UIViewController *)viewController + delegate:(nonnull id)delegate; + +/** + * destroy the ad + * + * @param adData - data containing the configuration passed from the server and other related + * parameters passed from the publisher like userId + */ +- (void)destroyAdWithAdData:(nonnull ISAdData *)adData; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterNativeAdViewBinder.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterNativeAdViewBinder.h new file mode 100644 index 0000000..6b98eee --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterNativeAdViewBinder.h @@ -0,0 +1,16 @@ +// +// ISAdapterNativeAdViewBinder.h +// IronSource +// +// Created by Hadar Pur on 19/06/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +#import "ISAdapterNativeAdViewBinderProtocol.h" +#import "ISNativeAdViewHolder.h" + +@interface ISAdapterNativeAdViewBinder : NSObject + +@property(nonatomic, strong, nullable) ISNativeAdViewHolder *adViewHolder; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterNativeAdViewBinderProtocol.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterNativeAdViewBinderProtocol.h new file mode 100644 index 0000000..c6ebb7b --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterNativeAdViewBinderProtocol.h @@ -0,0 +1,24 @@ +// +// ISAdapterNativeAdViewBinderProtocol.h +// IronSource +// +// Created by Hadar Pur on 02/07/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +#import +#import "ISNativeAdViewBinderProtocol.h" + +NS_ASSUME_NONNULL_BEGIN + +@protocol ISAdapterNativeAdViewBinderProtocol + +@required + +@property(nonatomic, strong, nullable) UIView *networkNativeAdView; + +- (void)setNativeAdView:(UIView *_Nullable)nativeAdView; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterNetworkData.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterNetworkData.h new file mode 100644 index 0000000..8596be2 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterNetworkData.h @@ -0,0 +1,14 @@ +// +// ISAdapterNetworkData.h +// IronSourceSDK +// + +@protocol ISAdapterNetworkData + +@required + +- (NSDictionary *)allData; + +- (id)dataByKeyIgnoreCase:(NSString *)desiredKey valueType:(Class)valueType; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterNetworkDataProtocol.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterNetworkDataProtocol.h new file mode 100644 index 0000000..fe167c0 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterNetworkDataProtocol.h @@ -0,0 +1,14 @@ +// +// ISAdapterNetworkDataProtocol.h +// IronSourceSDK +// + +#import "ISAdapterNetworkData.h" + +@protocol ISAdapterNetworkDataProtocol + +@required + +- (void)setNetworkData:(id)networkData; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAppStoreErrorDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAppStoreErrorDelegate.h new file mode 100644 index 0000000..2b2a9eb --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAppStoreErrorDelegate.h @@ -0,0 +1,15 @@ +// +// ISAppStoreErrorDelegate.h +// IronSourceSDK +// +// Created by Gal Salti on 27/09/2023. +// + +#import "ISNAppStoreVCRootViewDelegate.h" + +NS_ASSUME_NONNULL_BEGIN + +@protocol ISAppStoreErrorDelegate +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBannerAdDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBannerAdDelegate.h new file mode 100644 index 0000000..01bb94c --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBannerAdDelegate.h @@ -0,0 +1,18 @@ +// +// ISBannerAdDelegate.h +// IronSource +// +// Created by Guy Lis on 27/03/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +#import "ISAdapterAdViewDelegate.h" + +#ifndef ISBannerAdDelegate_h +#define ISBannerAdDelegate_h + +@protocol ISBannerAdDelegate + +@end + +#endif /* ISBannerAdDelegate_h */ diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBannerAdapterDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBannerAdapterDelegate.h new file mode 100644 index 0000000..eeb7e81 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBannerAdapterDelegate.h @@ -0,0 +1,52 @@ +// +// ISBannerAdapterDelegate.h +// IronSource +// +// Created by Pnina Rapoport on 02/04/2017. +// Copyright © 2017 Supersonic. All rights reserved. +// + +#import +#import + +@protocol ISBannerAdapterDelegate + +@required + +- (void)adapterBannerInitSuccess; +- (void)adapterBannerInitSuccessWithExtraData:(NSDictionary *)extraData; + +- (void)adapterBannerInitFailedWithError:(NSError *)error; +- (void)adapterBannerInitFailedWithError:(NSError *)error + extraData:(NSDictionary *)extraData; + +- (void)adapterBannerDidLoad:(UIView *)bannerView; +- (void)adapterBannerDidLoad:(UIView *)bannerView + extraData:(NSDictionary *)extraData; + +- (void)adapterBannerDidFailToLoadWithError:(NSError *)error; +- (void)adapterBannerDidFailToLoadWithError:(NSError *)error + extraData:(NSDictionary *)extraData; + +- (void)adapterBannerDidClick; +- (void)adapterBannerDidClickWithExtraData:(NSDictionary *)extraData; + +#pragma mark - optional - when supported by network + +- (void)adapterBannerWillPresentScreen; +- (void)adapterBannerWillPresentScreenWithExtraData:(NSDictionary *)extraData; + +- (void)adapterBannerDidDismissScreen; +- (void)adapterBannerDidDismissScreenWithExtraData:(NSDictionary *)extraData; + +- (void)adapterBannerWillLeaveApplication; +- (void)adapterBannerWillLeaveApplicationWithExtraData:(NSDictionary *)extraData; + +- (void)adapterBannerDidShow; +- (void)adapterBannerDidShowWithExtraData:(NSDictionary *)extraData; + +- (void)adapterBannerDidFailToShowWithError:(NSError *)error; +- (void)adapterBannerDidFailToShowWithError:(NSError *)error + extraData:(NSDictionary *)extraData; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBannerAdapterProtocol.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBannerAdapterProtocol.h new file mode 100644 index 0000000..60a5638 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBannerAdapterProtocol.h @@ -0,0 +1,60 @@ +// +// ISBannerAdapterProtocol.h +// IronSource +// +// Created by Pnina Rapoport on 02/04/2017. +// Copyright © 2017 IronSource. All rights reserved. +// + +#import +#import +#import "ISAdUnitAdapterProtocol.h" +#import "ISBannerAdapterDelegate.h" +#import "ISBannerSize.h" +#import "ISBiddingDataDelegate.h" + +@class ISAdapterConfig; +@protocol ISBannerAdapterProtocol + +@optional + +#pragma mark - for bidders, non bidders and demand only + +- (void)destroyBannerWithAdapterConfig:(ISAdapterConfig *)adapterConfig; + +- (CGFloat)getAdaptiveHeightWithWidth:(CGFloat)width; + +#pragma mark - for non bidders + +- (void)initBannerWithUserId:(NSString *)userId + adapterConfig:(ISAdapterConfig *)adapterConfig + delegate:(id)delegate; + +- (void)loadBannerWithAdapterConfig:(ISAdapterConfig *)adapterConfig + adData:(NSDictionary *)adData + viewController:(UIViewController *)viewController + size:(ISBannerSize *)size + delegate:(id)delegate; + +#pragma mark - for bidders and demand only + +- (NSDictionary *)getBannerBiddingDataWithAdapterConfig:(ISAdapterConfig *)adapterConfig + adData:(NSDictionary *)adData; + +- (void)collectBannerBiddingDataWithAdapterConfig:(ISAdapterConfig *)adapterConfig + adData:(NSDictionary *)adData + delegate:(id)delegate; + +- (void)initBannerForBiddingWithUserId:(NSString *)userId + adapterConfig:(ISAdapterConfig *)adapterConfig + delegate:(id)delegate; + +// used for banner, bidders + non-bidders(one-flow) for demand only +- (void)loadBannerForBiddingWithAdapterConfig:(ISAdapterConfig *)adapterConfig + adData:(NSDictionary *)adData + serverData:(NSString *)serverData + viewController:(UIViewController *)viewController + size:(ISBannerSize *)size + delegate:(id)delegate; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBannerSize.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBannerSize.h new file mode 100644 index 0000000..5d4fd58 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBannerSize.h @@ -0,0 +1,54 @@ +// +// ISBannerSize.h +// IronSource +// +// Created by Dor Alon on 12/09/2018. +// Copyright © 2018 IronSource. All rights reserved. +// + +@class LPMAdSize; + +#import + +static NSString* const kSizeBanner = @"BANNER"; +static NSString* const kSizeLarge = @"LARGE"; +static NSString* const kSizeRectangle = @"RECTANGLE"; +static NSString* const kSizeLeaderboard = @"LEADERBOARD"; +static NSString* const kSizeSmart = @"SMART"; +static NSString* const kSizeCustom = @"CUSTOM"; + +#define ISBannerSize_BANNER \ + [[ISBannerSize alloc] initWithDescription:kSizeBanner width:320 height:50] +#define ISBannerSize_LARGE [[ISBannerSize alloc] initWithDescription:kSizeLarge width:320 height:90] +#define ISBannerSize_RECTANGLE \ + [[ISBannerSize alloc] initWithDescription:kSizeRectangle width:300 height:250] +#define ISBannerSize_SMART [[ISBannerSize alloc] initWithDescription:kSizeSmart width:0 height:0] + +@interface ISBannerSize : NSObject + +#define ISBannerSize_LEADERBOARD \ + [[ISBannerSize alloc] initWithDescription:kSizeLeaderboard width:728 height:90] + +- (instancetype)initWithWidth:(NSInteger)width andHeight:(NSInteger)height; +- (instancetype)initWithDescription:(NSString*)description + width:(NSInteger)width + height:(NSInteger)height; +- (BOOL)isSmart; +- (LPMAdSize*)toLPMAdSize; + +/** + Calculates and returns the maximum height of an adaptive banner for a given width. + + If there are no adaptive banner supporting networks, the return value will be -1. + + @param width The specified width for which the maximum height is calculated. + @return The maximal height of an adaptive banner, or -1 if no supporting networks are found. + */ ++ (CGFloat)getMaximalAdaptiveHeightWithWidth:(CGFloat)width; + +@property(readonly) NSString* sizeDescription; +@property(readonly) NSInteger width; +@property(readonly) NSInteger height; +@property(readwrite, getter=isAdaptive) BOOL adaptive; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseAdAdapter.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseAdAdapter.h new file mode 100644 index 0000000..89cbdaa --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseAdAdapter.h @@ -0,0 +1,51 @@ +// +// ISBaseAdAdapter.h +// IronSource +// +// Created by Yonti Makmel on 27/04/2021. +// Copyright © 2021 ironSource. All rights reserved. +// + +#import +#import "ISAdapterAdDelegate.h" +#import "ISAdapterBaseProtocol.h" +#import "ISAdapterConfig.h" +#import "LevelPlay.h" + +@class ISAdData; + +NS_ASSUME_NONNULL_BEGIN + +@interface ISBaseAdAdapter : NSObject + +@property(nonatomic) NSString *adFormat; +@property(nonatomic, readonly) ISAdapterConfig *adapterConfig; +@property(nonatomic, readonly, nullable) NSUUID *adUnitObjectId; + +/// @param adFormat the ad format represented by the adapter +/// @param adapterConfig the configuration relevant for the adapter instance +- (instancetype)initWithAdFormat:(NSString *)adFormat + adapterConfig:(ISAdapterConfig *)adapterConfig; + +/// @param adFormat the ad format represented by the adapter +/// @param adapterConfig the configuration relevant for the adapter instance +/// @param adUnitObjectId the object id for the ad loaded + +- (instancetype)initWithAdFormat:(NSString *)adFormat + adapterConfig:(ISAdapterConfig *)adapterConfig + adUnitObjectId:(nullable NSUUID *)adUnitObjectId; + +/// the network sdk version +- (nullable id)getNetworkAdapter; + +/** + * destroy the ad + * + * @param adData - data containing the configuration passed from the server and other related + * parameters passed from the publisher like userId + */ +- (void)destroyAdWithAdData:(ISAdData *)adData; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseAdInteractionAdapter.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseAdInteractionAdapter.h new file mode 100644 index 0000000..b5218cd --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseAdInteractionAdapter.h @@ -0,0 +1,18 @@ +// +// ISBaseAdInteractionAdapter.h +// IronSource +// +// Created by Yonti Makmel on 11/10/2021. +// Copyright © 2021 IronSource. All rights reserved. +// + +#import "ISAdapterAdFullscreenProtocol.h" +#import "ISBaseAdAdapter.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface ISBaseAdInteractionAdapter : ISBaseAdAdapter + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseAdUnitAdapter.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseAdUnitAdapter.h new file mode 100644 index 0000000..4b90cad --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseAdUnitAdapter.h @@ -0,0 +1,18 @@ +// +// ISBaseAdUnitAdapter.h +// IronSource +// +// Copyright © 2023 IronSource. All rights reserved. +// + +#import +#import "ISAdapterConfig.h" +#import "ISNetworkInitCallbackProtocol.h" + +@interface ISBaseAdUnitAdapter : NSObject + +- (NSString *)getStringValueFromAdapterConfig:(ISAdapterConfig *)adapterConfig + forKey:(NSString *)key; +- (NSString *)getMissingParamErrorStringWithKey:(NSString *)key; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseAdapter+Internal.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseAdapter+Internal.h new file mode 100644 index 0000000..79ffaec --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseAdapter+Internal.h @@ -0,0 +1,52 @@ + +// +// ISBaseAdapter+Internal.h +// IronSource +// +// Created by Yotam Ohayon on 01/03/2016. +// Copyright © 2016 IronSource. All rights reserved. +// + +#ifndef ISBaseAdapter_Internal_h +#define ISBaseAdapter_Internal_h + +#import "ISBaseAdapter.h" + +#import "ISBannerAdapterDelegate.h" +#import "ISInterstitialAdapterDelegate.h" +#import "ISNativeAdAdapterDelegate.h" +#import "ISRewardedVideoAdapterDelegate.h" + +#import "ISConfigurations.h" +#import "ISMetaDataConstants.h" +#import "ISMetaDataUtils.h" + +#import "ISConcurrentMutableDictionary.h" +#import "ISConcurrentMutableSet.h" +#import "ISError.h" +#import "ISLog.h" +#import "ISNetworkInitCallbackProtocol.h" + +#import "ISBaseBannerAdapter.h" +#import "ISBaseInterstitialAdapter.h" +#import "ISBaseNativeAdAdapter.h" +#import "ISBaseRewardedVideoAdapter.h" + +#import "ISAdapterNativeAdData.h" +#import "ISAdapterNativeAdViewBinder.h" +#import "ISNativeAdViewHolder.h" +#import "UIView+ISNativeView.h" + +@interface ISBaseAdapter () + +#pragma mark - Validation +- (BOOL)isConfigValueValid:(NSString *)value; +- (NSError *)errorForMissingCredentialFieldWithName:(NSString *)fieldName; + +#pragma mark - Private +- (UIViewController *)topMostController; +- (void)setMetaDataWithKey:(NSString *)key andValues:(NSMutableArray *)values; + +@end + +#endif /* ISBaseAdapter_Internal_h */ diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseAdapter.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseAdapter.h new file mode 100644 index 0000000..9a63c99 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseAdapter.h @@ -0,0 +1,62 @@ +// +// ISBaseAdapter.h +// IronSource +// +// Copyright (c) 2015 IronSource. All rights reserved. +// + +#import + +#import "ISAdapterConfig.h" +#import "ISAdapterNetworkDataProtocol.h" +#import "ISBannerAdapterProtocol.h" +#import "ISConcurrentMutableDictionary.h" +#import "ISInterstitialAdapterProtocol.h" +#import "ISLoadWhileShowSupportState.h" +#import "ISNativeAdAdapterProtocol.h" +#import "ISRewardedVideoAdapterProtocol.h" + +@interface ISBaseAdapter : NSObject { + @protected + ISLoadWhileShowSupportState LWSState; +} + +@property(nonatomic, strong) NSString *adapterName; +@property(nonatomic, strong) NSString *providerNetworkKey; +@property(strong, nonatomic) NSString *pluginType; +@property(strong, nonatomic) NSString *userId; +@property(strong, nonatomic) id adUnitAdapters; + +- (instancetype)initAdapter:(NSString *)name; +- (void)earlyInitWithAdapterConfig:(ISAdapterConfig *)adapterConfig; + +- (NSString *)sdkVersion; +- (NSString *)version; +- (NSString *)dynamicUserId; + +// to be used by adapters that implement each ad unit separately +- (ISLoadWhileShowSupportState)getLWSSupportState:(ISAdapterConfig *)adapterConfig; + +- (void)setNetworkData:(id)networkData; + +- (void)setRewardedVideoAdapter:(id)rewardedVideoAdapter; +- (void)setInterstitialAdapter:(id)interstitialAdapter; +- (void)setBannerAdapter:(id)bannerAdapter; +- (void)setNativeAdAdapter:(id)nativeAdAdapter; +- (void)setConsent:(BOOL)consent; + +- (id)getRewardedVideoAdapter; +- (id)getInterstitialAdapter; +- (id)getBannerAdapter; +- (id)getNativeAdAdapter; + +- (CGFloat)getAdaptiveHeightWithWidth:(CGFloat)width; + +- (void)destroyRewardedVideoAdWithAdapterConfig:(ISAdapterConfig *)adapterConfig; +- (void)destroyInterstitialAdWithAdapterConfig:(ISAdapterConfig *)adapterConfig; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseBanner.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseBanner.h new file mode 100644 index 0000000..4baba36 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseBanner.h @@ -0,0 +1,46 @@ +// +// ISBaseBanner.h +// IronSource +// +// Created by Guy Lis on 27/03/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +#import "ISAdapterAdViewDelegate.h" +#import "ISAdapterBannerProtocol.h" +#import "ISBannerAdDelegate.h" +#import "ISBaseAdAdapter.h" +NS_ASSUME_NONNULL_BEGIN + +@interface ISBaseBanner : ISBaseAdAdapter + +/// @param providerConfig the configuration relevant for the adapter instance +- (instancetype)init:(ISAdapterConfig *)providerConfig; + +/** + * load the ad + * + * @param adData data containing the configuration passed from the server and other related + * parameters passed from the publisher like userId + * @param viewController the application view controller + * @param size the banner size the ad will be presented on + * @param delegate the callback listener to return + * mandatory callbacks based on the network - load success, load failure, ad opened + * optional callbacks - clicked, left application, presented, dismissed + */ +- (void)loadAdWithAdData:(nonnull ISAdData *)adData + viewController:(nonnull UIViewController *)viewController + size:(nonnull ISBannerSize *)size + delegate:(nonnull id)delegate; + +/** + * destroy the ad + * + * @param adData - data containing the configuration passed from the server and other related + * parameters passed from the publisher like userId + */ +- (void)destroyAdWithAdData:(nonnull ISAdData *)adData; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseBannerAdapter.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseBannerAdapter.h new file mode 100644 index 0000000..8cd0524 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseBannerAdapter.h @@ -0,0 +1,13 @@ +// +// ISBaseBannerAdapter.h +// IronSource +// +// Copyright © 2023 IronSource. All rights reserved. +// + +#import "ISBannerAdapterProtocol.h" +#import "ISBaseAdUnitAdapter.h" + +@interface ISBaseBannerAdapter : ISBaseAdUnitAdapter + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseInterstitial.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseInterstitial.h new file mode 100644 index 0000000..c2c9555 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseInterstitial.h @@ -0,0 +1,41 @@ +// +// ISBaseInterstitial.h +// IronSource +// +// Created by Bar David on 24/10/2021. +// Copyright © 2021 IronSource. All rights reserved. +// + +#import "ISBaseAdInteractionAdapter.h" + +NS_ASSUME_NONNULL_BEGIN + +@protocol ISInterstitialAdDelegate + +@end + +@interface ISBaseInterstitial : ISBaseAdInteractionAdapter + +/// @param providerConfig the configuration relevant for the adapter instance +- (instancetype)init:(ISAdapterConfig *)providerConfig; + +/// load the ad +/// @param adData data containing the configuration passed from the server and other related +/// parameters passed from the publisher like userId +/// @param delegate the delegate to return mandatory callbacks based on the network - load success, +/// load failure +- (void)loadAdWithAdData:(ISAdData *)adData delegate:(id)delegate; + +/// show the ad +/// @param viewController current viewController for showing the ad +/// @param adData data containing the configuration passed from the server and other related +/// parameters passed from the publisher like userId +/// @param delegate the delegate to return mandatory callbacks based on the network - ad opened, ad +/// closed, show failed optional callbacks - show success, ad clicked +- (void)showAdWithViewController:(UIViewController *)viewController + adData:(ISAdData *)adData + delegate:(id)delegate; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseInterstitialAdapter.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseInterstitialAdapter.h new file mode 100644 index 0000000..b844e26 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseInterstitialAdapter.h @@ -0,0 +1,13 @@ +// +// ISBaseInterstitialAdapter.h +// IronSource +// +// Copyright © 2023 IronSource. All rights reserved. +// + +#import "ISBaseAdUnitAdapter.h" +#import "ISInterstitialAdapterProtocol.h" + +@interface ISBaseInterstitialAdapter : ISBaseAdUnitAdapter + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseNativeAd.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseNativeAd.h new file mode 100644 index 0000000..d92871f --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseNativeAd.h @@ -0,0 +1,53 @@ +// +// ISBaseNativeAd.h +// IronSourceSDK +// +// Created by Ronit Epstein on 15/06/2025. +// Copyright © 2025 Unity. All rights reserved. +// + +#import "ISAdapterNativeAdProtocol.h" +#import "ISBaseAdAdapter.h" + +@protocol ISNativeAdDelegate; +@class ISNativeAdProperties; + +NS_ASSUME_NONNULL_BEGIN + +@interface ISBaseNativeAd : ISBaseAdAdapter + +/// @param providerConfig the configuration relevant for the adapter instance +- (instancetype)init:(ISAdapterConfig *)providerConfig; + +/** + * load the ad + * + * @param adData data containing the configuration passed from the server and other related + * parameters passed from the publisher like userId + * @param viewController the application view controller + * @param delegate the callback listener to return + * mandatory callbacks based on the network - load success, load failure, ad opened + * optional callbacks - clicked, left application, presented, dismissed + */ +- (void)loadAdWithAdData:(nonnull ISAdData *)adData + viewController:(nonnull UIViewController *)viewController + delegate:(nonnull id)delegate; + +/** + * destroy the ad + * + * @param adData - data containing the configuration passed from the server and other related + * parameters passed from the publisher like userId + */ +- (void)destroyAdWithAdData:(nonnull ISAdData *)adData; + +/** + * Get the native ad properties from the ad data. + * + * @param adData The ad data containing the native ad information. + */ +- (ISNativeAdProperties *)getNativeAdPropertiesWithAdData:(nonnull ISAdData *)adData; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseNativeAdAdapter.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseNativeAdAdapter.h new file mode 100644 index 0000000..2d8ca18 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseNativeAdAdapter.h @@ -0,0 +1,22 @@ +// +// ISBaseNativeAdAdapter.h +// IronSource +// +// Created by Hadar Pur on 06/07/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +#import "ISBaseAdUnitAdapter.h" +#import "ISNativeAdAdapterProtocol.h" +#import "ISNativeAdProperties.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface ISBaseNativeAdAdapter : ISBaseAdUnitAdapter + +- (ISNativeAdProperties *)getNativeAdPropertiesWithAdapterConfig: + (nonnull ISAdapterConfig *)adapterConfig; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseNetworkAdapter.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseNetworkAdapter.h new file mode 100644 index 0000000..640a1eb --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseNetworkAdapter.h @@ -0,0 +1,24 @@ +// +// ISBaseNetworkAdapter.h +// IronSource +// +// Created by Guy Lis on 05/07/2021. +// Copyright © 2021 ironSource. All rights reserved. +// + +#import "ISAdapterBaseProtocol.h" +#import "ISAdapterConsentProtocol.h" +#import "ISAdapterDebugProtocol.h" +#import "ISAdapterMetaDataProtocol.h" +#import "ISAdapterNetworkDataProtocol.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface ISBaseNetworkAdapter : NSObject + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseRewardedVideo.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseRewardedVideo.h new file mode 100644 index 0000000..97218be --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseRewardedVideo.h @@ -0,0 +1,42 @@ +// +// ISBaseRewardedVideo.h +// IronSource +// +// Created by Bar David on 24/10/2021. +// Copyright © 2021 IronSource. All rights reserved. +// + +#import "ISAdapterAdRewardedDelegate.h" +#import "ISBaseAdInteractionAdapter.h" + +NS_ASSUME_NONNULL_BEGIN + +@protocol ISRewardedVideoAdDelegate + +@end + +@interface ISBaseRewardedVideo : ISBaseAdInteractionAdapter + +/// @param providerConfig the configuration relevant for the adapter instance +- (instancetype)init:(ISAdapterConfig *)providerConfig; + +/// load the ad +/// @param adData data containing the configuration passed from the server and other related +/// parameters passed from the publisher like userId +/// @param delegate the delegate to return mandatory callbacks based on the network - load success, +/// load failure +- (void)loadAdWithAdData:(ISAdData *)adData delegate:(id)delegate; + +/// show the ad +/// @param viewController current viewController for showing the ad +/// @param adData data containing the configuration passed from the server and other related +/// parameters passed from the publisher like userId +/// @param delegate the delegate to return mandatory callbacks based on the network - ad opened, ad +/// closed, show failed optional callbacks - show success, ad clicked +- (void)showAdWithViewController:(UIViewController *)viewController + adData:(ISAdData *)adData + delegate:(id)delegate; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseRewardedVideoAdapter.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseRewardedVideoAdapter.h new file mode 100644 index 0000000..7d60aa1 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseRewardedVideoAdapter.h @@ -0,0 +1,13 @@ +// +// ISBaseRewardedVideoAdapter.h +// IronSource +// +// Copyright © 2023 IronSource. All rights reserved. +// + +#import "ISBaseAdUnitAdapter.h" +#import "ISRewardedVideoAdapterProtocol.h" + +@interface ISBaseRewardedVideoAdapter : ISBaseAdUnitAdapter + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBiddingDataDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBiddingDataDelegate.h new file mode 100644 index 0000000..42595f1 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBiddingDataDelegate.h @@ -0,0 +1,18 @@ +// +// ISBiddingDataDelegate.h +// IronSource +// +// Created by Liron Matityahu on 26/12/2022. +// Copyright © 2022 IronSource. All rights reserved. +// + +#import + +@protocol ISBiddingDataDelegate + +@required + +- (void)successWithBiddingData:(NSDictionary *)biddingData; +- (void)failureWithError:(NSString *)error; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBiddingDataProtocol.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBiddingDataProtocol.h new file mode 100644 index 0000000..5a94549 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBiddingDataProtocol.h @@ -0,0 +1,25 @@ +// +// ISBiddingDataProtocol.h +// IronSource +// +// Created by Bar David on 07/02/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +#import +#import "ISAdData.h" +#import "ISBiddingDataDelegate.h" + +#ifndef ISBiddingDataProtocol_h +#define ISBiddingDataProtocol_h + +@protocol ISBiddingDataProtocol + +/// Collects bidding data for the network. The method supports non-MADU flow. It is duplicated on +/// `AdAdapterBridge` to support MADU flow. +- (void)collectBiddingDataWithAdData:(ISAdData *)adData + delegate:(id)delegate; + +@end + +#endif /* ISBiddingDataProtocol_h */ diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISConcurrentMutableArray.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISConcurrentMutableArray.h new file mode 100644 index 0000000..a93125c --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISConcurrentMutableArray.h @@ -0,0 +1,22 @@ +// +// ISConcurrentMutableArray.h +// IronSourceSDK +// +// Created by Asaf Gur on 15/12/2024. +// + +#import + +@interface ISConcurrentMutableArray<__covariant ObjectType> : NSObject + +- (instancetype)init; +- (NSUInteger)count; +- (void)addObject:(ObjectType)object; +- (ObjectType)objectAtIndex:(NSUInteger)index; +- (void)removeObjectAtIndex:(NSUInteger)index; +- (void)addObjectsFromArray:(NSArray *)array; +- (void)removeAllObjects; +- (BOOL)containsObject:(ObjectType)object; +- (NSArray *)copy; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISConcurrentMutableDictionary.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISConcurrentMutableDictionary.h new file mode 100644 index 0000000..386bd52 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISConcurrentMutableDictionary.h @@ -0,0 +1,31 @@ +// +// ISConcurrentMutableDictionary.h +// Environment +// +// Copyright © 2021 ironSource. All rights reserved. +// + +#import + +@protocol LPMThreadSafeDictionaryProtocol + +- (NSUInteger)count; + +- (id)objectForKey:(NSString *)key; +- (void)setObject:(id)object forKey:(NSString *)key; +- (BOOL)hasObjectForKey:(NSString *)key; + +- (void)removeObjectForKey:(NSString *)key; +- (void)removeAllObjects; + +- (NSArray *)allKeys; +- (NSArray *)allValues; +- (NSDictionary *)allData; + +@end + +@interface ISConcurrentMutableDictionary : NSObject + ++ (instancetype)dictionary; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISConcurrentMutableSet.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISConcurrentMutableSet.h new file mode 100644 index 0000000..be4aea7 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISConcurrentMutableSet.h @@ -0,0 +1,34 @@ +// +// ISConcurrentMutableSet.h +// Environment +// +// Copyright © 2021 ironSource. All rights reserved. +// + +#import + +@interface ISConcurrentMutableSet : NSObject + ++ (instancetype)set; ++ (instancetype)setWithSet:(id)set; + +- (instancetype)initCommon; +- (instancetype)init; +- (instancetype)initWithCapacity:(NSUInteger)numItems; +- (instancetype)initWithCoder:(NSCoder *)aDecoder; +- (instancetype)initWithSet:(NSMutableSet *)set; +- (instancetype)initWithArray:(NSArray *)array; + +- (NSUInteger)count; +- (void)addObject:(id)object; +- (void)removeObject:(id)object; +- (void)addObjectsFromArray:(NSArray *)array; +- (void)intersectSet:(NSSet *)otherSet; +- (void)minusSet:(NSSet *)otherSet; +- (void)removeAllObjects; +- (void)unionSet:(NSSet *)otherSet; +- (NSArray *)allObjects; +- (BOOL)hasObject:(id)object; +- (NSEnumerator *)objectEnumerator; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISConfigurations.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISConfigurations.h new file mode 100644 index 0000000..df38f74 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISConfigurations.h @@ -0,0 +1,48 @@ +// +// Copyright © 2017 IronSource. All rights reserved. +// + +#ifndef IRONSOURCE_CONFIGURATION_H +#define IRONSOURCE_CONFIGURATION_H + +#import + +@class LPMSegment; + +@interface ISConfigurations : NSObject + +@property(nonatomic, strong) NSString *userId; +@property(nonatomic, strong) NSString *appKey; +@property(nonatomic, strong) NSString *segmentId; +@property(nonatomic, strong) NSDictionary *customSegmentParams; +@property(nonatomic, strong) LPMSegment *segment; +@property(nonatomic, strong) NSDictionary *rewardedVideoCustomParameters; +@property(nonatomic, strong) NSString *version; +@property(nonatomic, strong) NSNumber *adapterTimeOutInSeconds; +@property(nonatomic, strong) NSNumber *maxNumOfAdaptersToLoadOnStart; +@property(nonatomic, assign) BOOL advancedLoading; +@property(nonatomic, strong) NSString *plugin; +@property(nonatomic, strong) NSString *pluginVersion; +@property(nonatomic, strong) NSString *pluginFrameworkVersion; +@property(nonatomic, strong) NSNumber *maxVideosPerIteration; +@property(nonatomic, assign) NSInteger userAge; +@property(nonatomic, assign) BOOL trackReachability; +@property(nonatomic, strong) NSString *dynamicUserId; +@property(nonatomic, assign) BOOL adaptersDebug; +@property(nonatomic, strong) NSString *mediationType; +@property(nonatomic, strong) NSNumber *serr; +@property(nonatomic, strong) NSString *abt; +@property(nonatomic, strong) NSDictionary *rvServerParams; +@property(nonatomic, assign) NSInteger consent; +@property(nonatomic, assign) BOOL didSetConsent; +@property(nonatomic, strong) NSDictionary *batchGenericParams; +@property(nonatomic, strong) NSDictionary *eventGenericParams; +@property(nonatomic, strong) NSDictionary *eventPixelParams; + ++ (ISConfigurations *)getConfigurations; + +typedef NS_ENUM(NSInteger, DebugLevel) { None, Error, Info, Verbose }; + +@end + +#endif diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISDataKeys.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISDataKeys.h new file mode 100644 index 0000000..769d3ae --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISDataKeys.h @@ -0,0 +1,26 @@ +// +// ISDataKeys.h +// IronSource +// +// Created by Yonti Makmel on 18/04/2021. +// Copyright © 2021 ironSource. All rights reserved. +// +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface ISDataKeys : NSObject + +// Keys used in AdData of the configuration + ++ (NSString *)USER_ID; + ++ (NSString *)AD_UNIT; + ++ (NSString *)AD_DATA_IS_MULTIPLE_AD_UNITS_FLOW; + ++ (NSString *)AD_UNIT_ID; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISDemandOnlyBannerDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISDemandOnlyBannerDelegate.h new file mode 100644 index 0000000..c954e84 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISDemandOnlyBannerDelegate.h @@ -0,0 +1,54 @@ +// +// ISDemandOnlyBannerDelegate.h +// IronSource +// +// Created by Jonathan Benedek on 28/10/2021. +// Copyright © 2021 IronSource. All rights reserved. +// + +#import "ISDemandOnlyBannerView.h" + +#ifndef IS_DEMAND_ONLY_BANNER_DELEGATE_H +#define IS_DEMAND_ONLY_BANNER_DELEGATE_H + +@protocol ISDemandOnlyBannerDelegate + +@required +/** + Called after a banner ad has been successfully loaded + @param bannerView The view that contains the ad. + @param instanceId The demand only instance id to be used to display the banner. + */ +- (void)bannerDidLoad:(ISDemandOnlyBannerView *)bannerView instanceId:(NSString *)instanceId; + +/** + Called after a banner has attempted to load an ad but failed. + @param error The reason for the error + @param instanceId The demand only instance id that fail to load. + */ +- (void)bannerDidFailToLoadWithError:(NSError *)error instanceId:(NSString *)instanceId; + +/** + Called when a banner was shown + @param instanceId The demand only instance id which did show. + + */ +- (void)bannerDidShow:(NSString *)instanceId; + +/** + Called after a banner has been clicked. + @param instanceId The demand only instance id which clicked. + + */ +- (void)didClickBanner:(NSString *)instanceId; + +/** + Called when a user would be taken out of the application context. + @param instanceId The demand only instance id that taken out of the application. + + */ +- (void)bannerWillLeaveApplication:(NSString *)instanceId; + +@end + +#endif /* IS_DEMAND_ONLY_BANNER_DELEGATE_H */ diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISDemandOnlyBannerView.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISDemandOnlyBannerView.h new file mode 100644 index 0000000..88f6bdf --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISDemandOnlyBannerView.h @@ -0,0 +1,17 @@ +// +// ISDemandOnlyBannerView.h +// IronSource +// +// Created by Ariel Barsheshet on 23/08/2022. +// Copyright © 2022 IronSource. All rights reserved. +// + +#import + +#ifndef ISDemandOnlyBannerView_h +#define ISDemandOnlyBannerView_h + +@interface ISDemandOnlyBannerView : UIView +@end + +#endif /* ISDemandOnlyBannerView_h */ diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISDemandOnlyInterstitialDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISDemandOnlyInterstitialDelegate.h new file mode 100644 index 0000000..073649e --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISDemandOnlyInterstitialDelegate.h @@ -0,0 +1,47 @@ +// +// Copyright © 2017 IronSource. All rights reserved. +// + +#ifndef IS_DEMAND_ONLY_INSTINTERSTITIAL_DELEGATE_H +#define IS_DEMAND_ONLY_INSTINTERSTITIAL_DELEGATE_H + +@protocol ISDemandOnlyInterstitialDelegate + +@required +/** + Called after an interstitial has been loaded + */ +- (void)interstitialDidLoad:(NSString *)instanceId; + +/** + Called after an interstitial has attempted to load but failed. + + @param error The reason for the error + */ +- (void)interstitialDidFailToLoadWithError:(NSError *)error instanceId:(NSString *)instanceId; + +/** + Called after an interstitial has been opened. + */ +- (void)interstitialDidOpen:(NSString *)instanceId; + +/** + Called after an interstitial has been dismissed. + */ +- (void)interstitialDidClose:(NSString *)instanceId; + +/** + Called after an interstitial has attempted to show but failed. + + @param error The reason for the error + */ +- (void)interstitialDidFailToShowWithError:(NSError *)error instanceId:(NSString *)instanceId; + +/** + Called after an interstitial has been clicked. + */ +- (void)didClickInterstitial:(NSString *)instanceId; + +@end + +#endif diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISDemandOnlyRewardedVideoDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISDemandOnlyRewardedVideoDelegate.h new file mode 100644 index 0000000..22679cf --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISDemandOnlyRewardedVideoDelegate.h @@ -0,0 +1,28 @@ +// +// Copyright © 2017 IronSource. All rights reserved. +// + +#ifndef IS_DEMAND_ONLY_REWARDEDVIDEO_DELEGATE_H +#define IS_DEMAND_ONLY_REWARDEDVIDEO_DELEGATE_H + +#import + +@protocol ISDemandOnlyRewardedVideoDelegate +@required +- (void)rewardedVideoDidLoad:(NSString *)instanceId; + +- (void)rewardedVideoDidFailToLoadWithError:(NSError *)error instanceId:(NSString *)instanceId; + +- (void)rewardedVideoDidOpen:(NSString *)instanceId; + +- (void)rewardedVideoDidFailToShowWithError:(NSError *)error instanceId:(NSString *)instanceId; + +- (void)rewardedVideoDidClick:(NSString *)instanceId; + +- (void)rewardedVideoAdRewarded:(NSString *)instanceId; + +- (void)rewardedVideoDidClose:(NSString *)instanceId; + +@end + +#endif diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISError.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISError.h new file mode 100644 index 0000000..c944e70 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISError.h @@ -0,0 +1,232 @@ +// +// ISError.h +// IronSource +// +// Created by Roni Parshani on 1/5/15. +// Copyright (c) 2015 IronSource. All rights reserved. +// + +#import + +static NSString *const kSSErrorsOnlyCharacterNumbers = + @"- should contain only english characters and numbers"; +static NSString *const kSSErrorsLength5to10 = @"- length should be between 5-10 characters"; +static NSString *const kSSErrorsAppKey = @"appKey"; +static NSString *const kSSErrorsUserId = @"UserId"; +static NSString *const kSSErrorsForSS = @"for IronSource"; + +static NSString *const kEmptyString = @""; + +typedef NS_ENUM(NSUInteger, ISErrorCode) { + + ERROR_CODE_DECRYPT_FAILED = 1, + ERROR_CODE_NO_ADAPTIVE_SUPPORTIVE_NETWORKS = 2, + + ERROR_CODE_NO_CONFIGURATION_AVAILABLE = 501, + ERROR_CODE_USING_CACHED_CONFIGURATION = 502, + ERROR_CODE_KEY_NOT_SET = 505, + ERROR_CODE_INVALID_KEY_VALUE = 506, + ERROR_CODE_INIT_FAILED = 508, + ERROR_CODE_NO_ADS_TO_SHOW = 509, + ERROR_CODE_GENERIC = 510, + ERROR_CODE_NO_ADS_TO_RELOAD = 519, + ERROR_NO_INTERNET_CONNECTION = 520, + ERROR_MULTIPLE_IRONSOURCE_APP_KEY = 522, + ERROR_PLACEMENT_CAPPED = 524, + ERROR_AD_FORMAT_CAPPED = 525, + ERROR_REACHED_CAP_LIMIT_PER_SESSION = 526, + ERROR_UNKNOWN_INSTANCE_ID = 527, + ERROR_SEND_EVENTS_FAILURE = 528, + ERROR_PULL_LOCAL_FAILURE_FAILURE = 529, + ERROR_AD_UNIT_CAPPED = 530, + + ERROR_BN_LOAD_AFTER_INIT_FAILED = 600, + ERROR_BN_LOAD_AFTER_LONG_INITIATION = 601, + ERROR_BN_INIT_FAILED_AFTER_LOAD = 602, + ERROR_BN_LOAD_PLACEMENT_CAPPED = 604, + ERROR_BN_LOAD_EXCEPTION = 605, + ERROR_BN_LOAD_NO_FILL = 606, + ERROR_BN_INSTANCE_INIT_TIMEOUT = 607, + ERROR_BN_INSTANCE_LOAD_TIMEOUT = 608, + ERROR_BN_INSTANCE_RELOAD_TIMEOUT = 609, + ERROR_BN_INSTANCE_LOAD_EMPTY_BANNER = 610, + ERROR_BN_INSTANCE_LOAD_EMPTY_ADAPTER = 611, + ERROR_BN_INSTANCE_INIT_EXCEPTION = 612, + ERROR_BN_RELOAD_SKIP_INVISIBLE = 613, + ERROR_BN_RELOAD_SKIP_BACKGROUND = 614, + ERROR_BN_LOAD_NO_CONFIG = 615, + ERROR_BN_UNSUPPORTED_SIZE = 616, + ERROR_DO_BN_INSTANCE_LOAD_EMPTY_SERVER_DATA = 618, + ERROR_DO_BN_LOAD_ALREADY_IN_PROGRESS = 619, + ERROR_DO_BN_LOAD_BEFORE_INIT_SUCCESS = 620, + ERROR_DO_BN_INSTANCE_LOAD_AUCTION_FAILED = 621, + ERROR_CODE_NO_AD_UNIT_SPECIFIED = 624, + ERROR_CODE_LOAD_BEFORE_INIT_SUCCESS_CALLBACK = 625, + ERROR_CODE_INVALID_AD_UNIT_ID = 626, + ERROR_CODE_LOAD_FAILED_ALREADY_CALLED = 627, + ERROR_CODE_SHOW_BEFORE_LOAD_SUCCESS_CALLBACK = 628, + ERROR_CODE_LOAD_WHILE_SHOW = 629, + ERROR_CODE_SHOW_WHILE_SHOW = 630, + ERROR_CODE_SHOW_CONTROLLER_NIL = 631, + ERROR_CODE_SHOW_VIEW_CONTROLLER_NIL = 632, + ERROR_CODE_BN_LOAD_CALLED_AFTER_DESTROY = 633, + + ERROR_NT_LOAD_AFTER_INIT_FAILED = 700, + ERROR_NT_LOAD_AFTER_LONG_INITIATION = 701, + ERROR_NT_INIT_FAILED_AFTER_LOAD = 702, + ERROR_NT_LOAD_WHILE_LONG_INITIATION = 703, + ERROR_NT_LOAD_PLACEMENT_CAPPED = 704, + ERROR_NT_LOAD_EXCEPTION = 705, + ERROR_NT_LOAD_NO_FILL = 706, + ERROR_NT_INSTANCE_INIT_TIMEOUT = 707, + ERROR_NT_INSTANCE_LOAD_TIMEOUT = 708, + ERROR_NT_INSTANCE_LOAD_EMPTY_ADAPTER = 711, + ERROR_NT_INSTANCE_INIT_EXCEPTION = 712, + ERROR_NT_LOAD_NO_CONFIG = 715, + ERROR_NT_INSTANCE_LOAD_EMPTY_SERVER_DATA = 718, + ERROR_NT_NETWORK_ADAPTER_IS_NULL = 719, + ERROR_NT_NETWORK_NATIVE_AD_PARAMS_NIL = 720, + ERROR_NT_NETWORK_NATIVE_AD_LOAD_FAILED = 721, + + AUCTION_ERROR_REQUEST = 1000, + AUCTION_ERROR_RESPONSE_CODE_NOT_VALID = 1001, + AUCTION_ERROR_PARSE = 1002, + AUCTION_ERROR_DECRYPTION = 1003, + AUCTION_ERROR_EMPTY_WATERFALL = 1004, + AUCTION_ERROR_NO_CANDIDATES = 1005, + AUCTION_ERROR_CONNECTION_TIMED_OUT = 1006, + AUCTION_ERROR_REQUEST_MISSING_PARAMS = 1007, + AUCTION_ERROR_DECOMPRESSION = 1008, + + NOTIFICATIONS_ERROR_LOADED_NOT_FOUND = 1010, + NOTIFICATIONS_ERROR_SHOWING_NOT_FOUND = 1011, + + ERROR_SESSION_KEY_ENCRYPTION_FAILURE = 1015, + + ERROR_NT_EMPTY_DEFAULT_PLACEMENT = 1018, + ERROR_IS_EMPTY_DEFAULT_PLACEMENT = 1020, + ERROR_RV_EMPTY_DEFAULT_PLACEMENT = 1021, + ERROR_RV_SHOW_CALLED_DURING_SHOW = 1022, + ERROR_RV_SHOW_CALLED_WRONG_STATE = 1023, + ERROR_RV_LOAD_FAILED_NO_CANDIDATES = 1024, + ERROR_LOAD_FAILED_TIMEOUT = 1025, + ERROR_RV_LOAD_DURING_LOAD = 1026, + ERROR_RV_LOAD_DURING_SHOW = 1027, + ERROR_RV_LOAD_SUCCESS_UNEXPECTED = 1028, + ERROR_RV_LOAD_SUCCESS_WRONG_AUCTION_ID = 1029, + ERROR_RV_LOAD_FAIL_UNEXPECTED = 1030, + ERROR_RV_LOAD_FAIL_WRONG_AUCTION_ID = 1031, + ERROR_RV_INIT_FAILED_TIMEOUT = 1032, + ERROR_RV_LOAD_FAIL_DUE_TO_INIT = 1033, + ERROR_RV_LOAD_UNEXPECTED_CALLBACK = 1034, + ERROR_IS_LOAD_FAILED_NO_CANDIDATES = 1035, + ERROR_IS_SHOW_CALLED_DURING_SHOW = 1036, + ERROR_IS_LOAD_DURING_SHOW = 1037, + ERROR_RV_SHOW_EXCEPTION = 1038, + ERROR_IS_SHOW_EXCEPTION = 1039, + ERROR_RV_INSTANCE_INIT_EXCEPTION = 1040, + ERROR_IS_INSTANCE_INIT_EXCEPTION = 1041, + ERROR_BN_LOAD_FAILED_NO_CANDIDATES = 1044, + ERROR_NT_LOAD_FAILED_NO_CANDIDATES = 1045, + + ERROR_DO_IS_LOAD_ALREADY_IN_PROGRESS = 1050, + ERROR_DO_IS_CALL_LOAD_BEFORE_SHOW = 1051, + ERROR_DO_IS_LOAD_TIMED_OUT = 1052, + ERROR_DO_RV_LOAD_ALREADY_IN_PROGRESS = 1053, + ERROR_DO_RV_SHOW_CALLED_BEFORE_LOAD = 1054, + ERROR_DO_RV_LOAD_TIMED_OUT = 1055, + ERROR_DO_RV_LOAD_DURING_SHOW = 1056, + ERROR_RV_EXPIRED_ADS = 1057, + ERROR_DO_BN_LOAD_MISSING_VIEW_CONTROLLER = 1060, + ERROR_RV_LOAD_AFTER_LONG_INITIATION = 1061, + ERROR_DO_RV_INSTANCE_LOAD_EMPTY_SERVER_DATA = 1062, + ERROR_CODE_MISSING_CONFIGURATION = 1063, + ERROR_DO_IS_SHOW_DURING_SHOW = 1064, + ERROR_DO_IS_SHOW_DURING_LOAD = 1065, + ERROR_DO_IS_SHOW_NO_AVAILABLE_ADS = 1066, + ERROR_DO_RV_SHOW_DURING_SHOW = 1067, + ERROR_DO_RV_SHOW_DURING_LOAD = 1068, + ERROR_DO_RV_SHOW_NO_AVAILABLE_ADS = 1069, + ERROR_DO_RV_INSTANCE_LOAD_AUCTION_FAILED = 1070, + ERROR_RV_LOAD_AFTER_INIT_FAILED = 1072, + + ERROR_RV_LOAD_NO_FILL = 1058, + ERROR_IS_LOAD_NO_FILL = 1158, + + ERROR_IS_LOAD_AFTER_INIT_FAILED = 1160, + ERROR_IS_LOAD_AFTER_LONG_INITIATION = 1161, + ERROR_DO_IS_INSTANCE_LOAD_EMPTY_SERVER_DATA = 1162, + ERROR_DO_IS_INSTANCE_LOAD_EMPTY_ADAPTER = 1163, + ERROR_DO_IS_INSTANCE_LOAD_AUCTION_FAILED = 1164, + + ERROR_CONSENT_VIEW_TYPE_NOT_FOUND = 1601, + ERROR_CONSENT_VIEW_DICTIONARY_NOT_FOUND = 1602, + ERROR_CONSENT_VIEW_URL_NOT_FOUND = 1603, + ERROR_CONSENT_VIEW_NOT_LOADED = 1604, + ERROR_CONSENT_VIEW_LOAD_FAILED = 1605, + ERROR_CONSENT_VIEW_SHOW_DURING_SHOW = 1606, + ERROR_CONSENT_VIEW_CANNOT_BE_OPENED = 1607, + ERROR_CONSENT_VIEW_LOAD_DURING_LOAD = 1608, + + // TestSuite error codes + ERROR_CODE_TEST_SUITE_SDK_NOT_INITIALIZED = 1721, + ERROR_CODE_TEST_SUITE_DISABLED = 1722, + ERROR_CODE_TEST_SUITE_EXCEPTION_ON_LAUNCH = 1723, + ERROR_CODE_TEST_SUITE_WEB_CONTROLLER_NOT_LOADED = 1724, + ERROR_CODE_TEST_SUITE_NO_NETWORK_CONNECTIVITY = 1725, + + // Smash TS error codes + ERROR_CODE_BIDDING_DATA_EXCEPTION = 5001, + ERROR_CODE_IS_READY_EXCEPTION = 5002, + ERROR_CODE_LOAD_IN_PROGRESS_EXCEPTION = 5003, + ERROR_CODE_SHOW_IN_PROGRESS_EXCEPTION = 5004, + ERROR_CODE_LOAD_EXCEPTION = 5005, + ERROR_CODE_SHOW_FAILED_EXCEPTION = 5006, + ERROR_CODE_INIT_SUCCESS_EXCEPTION = 5007, + ERROR_CODE_INIT_FAILED_EXCEPTION = 5008, + ERROR_CODE_AD_CLOSE_EXCEPTION = 5008, + ERROR_CODE_DESTROY_EXCEPTION = 5009, + ERROR_CODE_INTERNAL_EXCEPTION = 5010, + ERROR_CODE_SMASH_IS_NIL = 5012, + ERROR_CODE_SMASH_INSTANCE_NAME_IS_NIL = 5013, + + // Init error codes + ERROR_OLD_INIT_API_APP_KEY_NOT_VALID = 2010, + ERROR_NEW_INIT_API_ALREADY_CALLED = 2020, + ERROR_OLD_API_INIT_IN_PROGRESS = 2030, + ERROR_INIT_ALREADY_FINISHED = 2040, + ERROR_LEGACY_INIT_FAILED = 2060, + ERROR_INIT_HTTP_REQUEST_FAILED = 2070, + ERROR_INIT_INVALID_RESPONSE = 2080, + ERROR_INIT_DECRYPT_FAILED = 2090, + ERROR_INIT_NO_RESPONSE_KEY = 2100, + ERROR_OLD_INIT_API_MULTIPLE_CALLS = 2110, + ERROR_INIT_DECOMPRESS_FAILED = 2120, + ERROR_INIT_CONNECTION_ERROR = 2130, + + // Capping service error codes + ERROR_CAPPING_VALIDATION_FAILED = 3000, + ERROR_DELIVERY_CAPPING_VALIDATION_FAILED = 3001, + ERROR_CAPPING_ENABLED_FALSE = 3002, + ERROR_CAPPING_CONFIG_ADDITION_FAILED = 3003, + + // Reward + ERROR_REWARD_VALIDATION_FAILED = 3004 +}; + +@interface ISError : NSError + +@property(strong) NSString *prefix; +@property(strong) NSString *suffix; + ++ (NSError *)createError:(ISErrorCode)errorCode; ++ (NSError *)createError:(ISErrorCode)errorCode withParams:(NSArray *)params; ++ (NSError *)createError:(ISErrorCode)errorCode withMessage:(NSString *)message; ++ (NSError *)createErrorWithDomain:(NSString *)domain + code:(ISErrorCode)code + message:(NSString *)message; ++ (NSError *)appendError:(NSError *)error withPrefix:(NSString *)prefix; ++ (NSError *)appendError:(NSError *)error withSuffix:(NSString *)suffix; ++ (ISErrorCode)getCode:(ISErrorCode)errorCode; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISInterstitialAdapterDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISInterstitialAdapterDelegate.h new file mode 100644 index 0000000..26ffb3f --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISInterstitialAdapterDelegate.h @@ -0,0 +1,50 @@ +// +// ISInterstitialAdapterDelegate.h +// IronSource +// +// Created by Roni Parshani on 10/12/14. +// Copyright (c) 2014 IronSource. All rights reserved. +// + +#import + +@protocol ISInterstitialAdapterDelegate + +- (void)adapterInterstitialInitSuccess; +- (void)adapterInterstitialInitSuccessWithExtraData:(NSDictionary *)extraData; + +- (void)adapterInterstitialInitFailedWithError:(NSError *)error; +- (void)adapterInterstitialInitFailedWithError:(NSError *)error + extraData:(NSDictionary *)extraData; + +- (void)adapterInterstitialDidLoad; +- (void)adapterInterstitialDidLoadWithExtraData:(NSDictionary *)extraData; + +- (void)adapterInterstitialDidFailToLoadWithError:(NSError *)error; +- (void)adapterInterstitialDidFailToLoadWithError:(NSError *)error + extraData:(NSDictionary *)extraData; + +- (void)adapterInterstitialDidOpen; +- (void)adapterInterstitialDidOpenWithExtraData:(NSDictionary *)extraData; + +- (void)adapterInterstitialDidClose; +- (void)adapterInterstitialDidCloseWithExtraData:(NSDictionary *)extraData; + +- (void)adapterInterstitialDidShow; +- (void)adapterInterstitialDidShowWithExtraData:(NSDictionary *)extraData; + +- (void)adapterInterstitialDidFailToShowWithError:(NSError *)error; +- (void)adapterInterstitialDidFailToShowWithError:(NSError *)error + extraData:(NSDictionary *)extraData; + +#pragma mark - optional - when supported by network + +- (void)adapterInterstitialDidClick; +- (void)adapterInterstitialDidClickWithExtraData:(NSDictionary *)extraData; + +#pragma mark - relevant only for ironSource adapter + +- (void)adapterInterstitialDidBecomeVisible; +- (void)adapterInterstitialDidBecomeVisibleWithExtraData:(NSDictionary *)extraData; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISInterstitialAdapterProtocol.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISInterstitialAdapterProtocol.h new file mode 100644 index 0000000..c766696 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISInterstitialAdapterProtocol.h @@ -0,0 +1,58 @@ +// +// ISInterstitialAdapterProtocol.h +// IronSource +// +// Created by Roni Parshani on 10/12/14. +// Copyright (c) 2014 IronSource. All rights reserved. +// + +#import +#import +#import "ISAdUnitAdapterProtocol.h" +#import "ISBiddingDataDelegate.h" +#import "ISInterstitialAdapterDelegate.h" + +@class ISAdapterConfig; +@protocol ISInterstitialAdapterProtocol + +@optional + +#pragma mark - for bidders, non bidders and demand only + +- (void)showInterstitialWithViewController:(UIViewController *)viewController + adapterConfig:(ISAdapterConfig *)adapterConfig + delegate:(id)delegate; + +- (BOOL)hasInterstitialWithAdapterConfig:(ISAdapterConfig *)adapterConfig; + +- (void)destroyInterstitialAdWithAdapterConfig:(ISAdapterConfig *)adapterConfig; + +#pragma mark - for non bidders and demand only + +- (void)initInterstitialWithUserId:(NSString *)userId + adapterConfig:(ISAdapterConfig *)adapterConfig + delegate:(id)delegate; + +- (void)loadInterstitialWithAdapterConfig:(ISAdapterConfig *)adapterConfig + adData:(NSDictionary *)adData + delegate:(id)delegate; + +#pragma mark - for bidders and demand only + +- (NSDictionary *)getInterstitialBiddingDataWithAdapterConfig:(ISAdapterConfig *)adapterConfig + adData:(NSDictionary *)adData; + +- (void)collectInterstitialBiddingDataWithAdapterConfig:(ISAdapterConfig *)adapterConfig + adData:(NSDictionary *)adData + delegate:(id)delegate; + +- (void)initInterstitialForBiddingWithUserId:(NSString *)userId + adapterConfig:(ISAdapterConfig *)adapterConfig + delegate:(id)delegate; + +- (void)loadInterstitialForBiddingWithAdapterConfig:(ISAdapterConfig *)adapterConfig + adData:(NSDictionary *)adData + serverData:(NSString *)serverData + delegate:(id)delegate; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISIronSourceAdapter.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISIronSourceAdapter.h new file mode 100644 index 0000000..4cfc181 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISIronSourceAdapter.h @@ -0,0 +1,18 @@ +// +// ISIronSourceAdapter.h +// IronSource +// +// Created by Dor Alon on 07/03/2019. +// Copyright © 2019 IronSource. All rights reserved. +// + +#import +#import "ISBaseAdapter+Internal.h" + +@interface ISIronSourceAdapter : ISBaseAdapter + +- (void)initSDK:(ISAdapterConfig *)adapterConfig; + +- (NSDictionary *)createInitExtraParams; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISLoadWhileShowSupportState.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISLoadWhileShowSupportState.h new file mode 100644 index 0000000..0da3603 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISLoadWhileShowSupportState.h @@ -0,0 +1,25 @@ +// +// ISLoadWhileShowSupportState.h +// IronSource +// +// Created by Yonti Makmel on 11/10/2021. +// Copyright © 2021 IronSource. All rights reserved. +// + +#ifndef ISLoadWhileShowSupportState_h +#define ISLoadWhileShowSupportState_h + +/* +The various support states for load while show - currently used for rewarded videos +by instance - a network can load an instance while showing the same once +by network - a network can load an instance while showing a different instance +none - a network can't load an instance while showing any of its instances + */ + +typedef NS_ENUM(NSInteger, ISLoadWhileShowSupportState) { + LOAD_WHILE_SHOW_NONE = 0, + LOAD_WHILE_SHOW_BY_INSTANCE = 1, + LOAD_WHILE_SHOW_BY_NETWORK = 2 +}; + +#endif /* ISLoadWhileShowSupportState_h */ diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISLog.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISLog.h new file mode 100644 index 0000000..9327c59 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISLog.h @@ -0,0 +1,108 @@ +// +// ISLog.h +// IronSource +// +// Created by Yonti Makmel on 09/06/2020. +// Copyright © 2020 ironSource. All rights reserved. +// + +#import +#import "ISLoggerManager.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface ISLog : NSObject + +// new dynamic logs +#define logGeneric(logLevel, tag, format, ...) \ + [[ISLoggerManager sharedInstance] dynamicLog:(char *)__PRETTY_FUNCTION__ \ + message:[NSString stringWithFormat:format, ##__VA_ARGS__] \ + level:logLevel \ + withTag:tag] + +// TAG_API +#define LogApi_Internal(format, ...) logGeneric(IS_LOG_INTERNAL, TAG_API, format, ##__VA_ARGS__) +#define LogApi_Info(format, ...) logGeneric(IS_LOG_INFO, TAG_API, format, ##__VA_ARGS__) +#define LogApi_Warning(format, ...) logGeneric(IS_LOG_WARNING, TAG_API, format, ##__VA_ARGS__) +#define LogApi_Error(format, ...) logGeneric(IS_LOG_ERROR, TAG_API, format, ##__VA_ARGS__) +#define LogApi_General(format, ...) logGeneric(IS_LOG_GENERAL, TAG_API, format, ##__VA_ARGS__) + +// TAG_DELEGATE +#define LogDelegate_Internal(format, ...) \ + logGeneric(IS_LOG_INTERNAL, TAG_DELEGATE, format, ##__VA_ARGS__) +#define LogDelegate_Info(format, ...) logGeneric(IS_LOG_INFO, TAG_DELEGATE, format, ##__VA_ARGS__) +#define LogDelegate_Warning(format, ...) \ + logGeneric(IS_LOG_WARNING, TAG_DELEGATE, format, ##__VA_ARGS__) +#define LogDelegate_Error(format, ...) logGeneric(IS_LOG_ERROR, TAG_DELEGATE, format, ##__VA_ARGS__) +#define LogDelegate_General(format, ...) \ + logGeneric(IS_LOG_GENERAL, TAG_DELEGATE, format, ##__VA_ARGS__) + +// TAG_ADAPTER_API +#define LogAdapterApi_Internal(format, ...) \ + logGeneric(IS_LOG_INTERNAL, TAG_ADAPTER_API, format, ##__VA_ARGS__) +#define LogAdapterApi_Info(format, ...) \ + logGeneric(IS_LOG_INFO, TAG_ADAPTER_API, format, ##__VA_ARGS__) +#define LogAdapterApi_Warning(format, ...) \ + logGeneric(IS_LOG_WARNING, TAG_ADAPTER_API, format, ##__VA_ARGS__) +#define LogAdapterApi_Error(format, ...) \ + logGeneric(IS_LOG_ERROR, TAG_ADAPTER_API, format, ##__VA_ARGS__) +#define LogAdapterApi_General(format, ...) \ + logGeneric(IS_LOG_GENERAL, TAG_ADAPTER_API, format, ##__VA_ARGS__) + +// TAG_ADAPTER_DELEGATE +#define LogAdapterDelegate_Internal(format, ...) \ + logGeneric(IS_LOG_INTERNAL, TAG_ADAPTER_DELEGATE, format, ##__VA_ARGS__) +#define LogAdapterDelegate_Info(format, ...) \ + logGeneric(IS_LOG_INFO, TAG_ADAPTER_DELEGATE, format, ##__VA_ARGS__) +#define LogAdapterDelegate_Warning(format, ...) \ + logGeneric(IS_LOG_WARNING, TAG_ADAPTER_DELEGATE, format, ##__VA_ARGS__) +#define LogAdapterDelegate_Error(format, ...) \ + logGeneric(IS_LOG_ERROR, TAG_ADAPTER_DELEGATE, format, ##__VA_ARGS__) +#define LogAdapterDelegate_General(format, ...) \ + logGeneric(IS_LOG_GENERAL, TAG_ADAPTER_DELEGATE, format, ##__VA_ARGS__) + +// TAG_NETWORK +#define LogNetwork_Internal(format, ...) \ + logGeneric(IS_LOG_INTERNAL, TAG_NETWORK, format, ##__VA_ARGS__) +#define LogNetwork_Info(format, ...) logGeneric(IS_LOG_INFO, TAG_NETWORK, format, ##__VA_ARGS__) +#define LogNetwork_Warning(format, ...) \ + logGeneric(IS_LOG_WARNING, TAG_NETWORK, format, ##__VA_ARGS__) +#define LogNetwork_Error(format, ...) logGeneric(IS_LOG_ERROR, TAG_NETWORK, format, ##__VA_ARGS__) +#define LogNetwork_General(format, ...) \ + logGeneric(IS_LOG_GENERAL, TAG_NETWORK, format, ##__VA_ARGS__) + +// TAG_NATIVE +#define LogNative_Internal(format, ...) \ + logGeneric(IS_LOG_INTERNAL, TAG_NATIVE, format, ##__VA_ARGS__) +#define LogNative_Info(format, ...) logGeneric(IS_LOG_INFO, TAG_NATIVE, format, ##__VA_ARGS__) +#define LogNative_Warning(format, ...) logGeneric(IS_LOG_WARNING, TAG_NATIVE, format, ##__VA_ARGS__) +#define LogNative_Error(format, ...) logGeneric(IS_LOG_ERROR, TAG_NATIVE, format, ##__VA_ARGS__) +#define LogNative_General(format, ...) logGeneric(IS_LOG_GENERAL, TAG_NATIVE, format, ##__VA_ARGS__) + +// TAG_INTERNAL +#define LogInternal_Internal(format, ...) \ + logGeneric(IS_LOG_INTERNAL, TAG_INTERNAL, format, ##__VA_ARGS__) +#define LogInternal_Info(format, ...) logGeneric(IS_LOG_INFO, TAG_INTERNAL, format, ##__VA_ARGS__) +#define LogInternal_Warning(format, ...) \ + logGeneric(IS_LOG_WARNING, TAG_INTERNAL, format, ##__VA_ARGS__) +#define LogInternal_Error(format, ...) logGeneric(IS_LOG_ERROR, TAG_INTERNAL, format, ##__VA_ARGS__) +#define LogInternal_General(format, ...) \ + logGeneric(IS_LOG_GENERAL, TAG_INTERNAL, format, ##__VA_ARGS__) + +// TAG_EVENT +#define LogEvent_Internal(format, ...) logGeneric(IS_LOG_INTERNAL, TAG_EVENT, format, ##__VA_ARGS__) +#define LogEvent_Info(format, ...) logGeneric(IS_LOG_INFO, TAG_EVENT, format, ##__VA_ARGS__) +#define LogEvent_Warning(format, ...) logGeneric(IS_LOG_WARNING, TAG_EVENT, format, ##__VA_ARGS__) +#define LogEvent_Error(format, ...) logGeneric(IS_LOG_ERROR, TAG_EVENT, format, ##__VA_ARGS__) +#define LogEvent_General(format, ...) logGeneric(IS_LOG_GENERAL, TAG_EVENT, format, ##__VA_ARGS__) + +// AUTOMATION +#define LogAutomation(format, ...) \ + [[ISLoggerManager sharedInstance] \ + automationLog:[NSString stringWithFormat:format, ##__VA_ARGS__] \ + level:IS_LOG_INTERNAL \ + withTag:TAG_INTERNAL] + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISLoggerManager.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISLoggerManager.h new file mode 100644 index 0000000..8ffe2da --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISLoggerManager.h @@ -0,0 +1,68 @@ +// +// LogManager.h +// IronSource +// +// Created by Roni Parshani on 10/22/14. +// Copyright (c) 2014 IronSource. All rights reserved. +// + +#import + +typedef enum LogLevelValues { + IS_LOG_NONE = -1, + IS_LOG_INTERNAL = 0, + IS_LOG_INFO = 1, + IS_LOG_WARNING = 2, + IS_LOG_ERROR = 3, + IS_LOG_GENERAL = 4, // Publisher log level, always visible + IS_LOG_CRITICAL = 5, + +} ISLogLevel; + +typedef enum LogTagValue { + TAG_API, + TAG_DELEGATE, + TAG_ADAPTER_API, + TAG_ADAPTER_DELEGATE, + TAG_NETWORK, + TAG_NATIVE, + TAG_INTERNAL, + TAG_EVENT +} LogTag; + +#define ISLogInternal(tag2, format, ...) \ + [[ISLoggerManager sharedInstance] log:[NSString stringWithFormat:(format), ##__VA_ARGS__] \ + level:IS_LOG_INTERNAL \ + tag:tag2] +#define ISLogInfo(tag2, format, ...) \ + [[ISLoggerManager sharedInstance] log:[NSString stringWithFormat:(format), ##__VA_ARGS__] \ + level:IS_LOG_INFO \ + tag:tag2] +#define ISLogError(tag2, format, ...) \ + [[ISLoggerManager sharedInstance] log:[NSString stringWithFormat:(format), ##__VA_ARGS__] \ + level:IS_LOG_ERROR \ + tag:tag2] + +@class ISLogger; + +@interface ISLoggerManager : NSObject + ++ (ISLoggerManager *)sharedInstance; + +- (void)setLoggingLevels:(NSInteger)server + publisher:(NSInteger)publisher + console:(NSInteger)console; +- (void)log:(NSString *)message level:(ISLogLevel)logLevel tag:(LogTag)logTag; +- (void)logFromError:(NSError *)error level:(ISLogLevel)logLevel tag:(LogTag)logTag; +- (void)logFromException:(NSException *)exception level:(ISLogLevel)logLevel tag:(LogTag)logTag; +- (void)logFromException:(NSException *)exception + message:(NSString *)message + level:(ISLogLevel)logLevel + tag:(LogTag)logTag; +- (void)dynamicLog:(char *)calledFrom + message:(NSString *)message + level:(ISLogLevel)logLevel + withTag:(LogTag)logTag; +- (void)automationLog:(NSString *)message level:(ISLogLevel)logLevel withTag:(LogTag)logTag; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISMediationGlobalDataWriterFacade.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISMediationGlobalDataWriterFacade.h new file mode 100644 index 0000000..cc2da27 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISMediationGlobalDataWriterFacade.h @@ -0,0 +1,13 @@ +// +// ISMediationGlobalDataWriterFacade.h +// IronSource +// +// Created by noy.fridman on 21/03/2024. +// + +#import + +@interface ISMediationGlobalDataWriterFacade : NSObject +- (void)setGoogleWaterMark:(NSString *)waterMark; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISMetaData.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISMetaData.h new file mode 100644 index 0000000..26d6f3e --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISMetaData.h @@ -0,0 +1,31 @@ +// +// ISMetaData.h +// IronSource +// +// Created by Roi Eshel on 30/01/2020. +// Copyright © 2020 ironSource. All rights reserved. +// + +#import + +@interface ISMetaData : NSObject + +typedef NS_ENUM(NSUInteger, ISMetaDataValueTypes) { + META_DATA_VALUE_STRING, + META_DATA_VALUE_BOOL, + META_DATA_VALUE_INT, + META_DATA_VALUE_LONG, + META_DATA_VALUE_DOUBLE, + META_DATA_VALUE_FLOAT +}; + +- (instancetype)initWithKey:(NSString *)key andValues:(NSMutableArray *)values; +- (instancetype)initWithKey:(NSString *)key + values:(NSMutableArray *)values + andValuesType:(NSMutableArray *)valuesType; + +@property NSString *key; +@property NSMutableArray *values; +@property NSMutableArray *valuesType; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISMetaDataConstants.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISMetaDataConstants.h new file mode 100644 index 0000000..32e1f95 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISMetaDataConstants.h @@ -0,0 +1,21 @@ +// +// ISMetaDataConstants.h +// IronSource +// +// Created by Roi Eshel on 30/01/2020. +// Copyright © 2020 ironSource. All rights reserved. +// + +// ************* Meta Data Keys ************ + +#define kMetaDataCCPAKey @"do_not_sell" +#define kMetaDataISCOPPAKey @"is_child_directed" +#define kMetaDataTestSuiteKey @"is_test_suite" +#define kMetaDataIIQFKey @"iiqf" + +// ************* Meta Data Values ************ + +#define kMetaDataTrueValue @"true" +#define kMetaDataFalseValue @"false" +#define kMetaDataTestSuiteEnableValue @"enable" +#define kMetaDataGoogleWaterMark @"google_water_mark" diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISMetaDataUtils.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISMetaDataUtils.h new file mode 100644 index 0000000..2049083 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISMetaDataUtils.h @@ -0,0 +1,34 @@ +// +// ISMetaDataUtils.h +// IronSource +// +// Created by Roi Eshel on 30/01/2020. +// Copyright © 2020 ironSource. All rights reserved. +// + +#import +#import "ISMetaData.h" + +@interface ISMetaDataUtils : NSObject + ++ (ISMetaDataValueTypes)getValueTypeForKey:(NSString *)key; + ++ (BOOL)isKnownKey:(NSString *)key; + ++ (BOOL)isMediationOnlyKey:(NSString *)key; + ++ (NSString *)formatValue:(NSString *)value forType:(ISMetaDataValueTypes)valueType; + ++ (ISMetaData *)formatMetaDataKey:(NSString *)key andValues:(NSMutableArray *)values; + ++ (BOOL)isMetaDataKeyValid:(NSString *)key error:(NSString **)error; + ++ (BOOL)isMetaDataValuesValid:(NSMutableArray *)values error:(NSString **)error; + ++ (BOOL)isValidCCPAMetaDataWithKey:(NSString *)key andValue:(NSString *)value; + ++ (BOOL)isValidMetaDataWithKey:(NSString *)key flag:(NSString *)flag andValue:(NSString *)value; + ++ (BOOL)getMetaDataBooleanValue:(NSString *)value; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNAdViewsManagerSwiftFacade.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNAdViewsManagerSwiftFacade.h new file mode 100644 index 0000000..db65f1c --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNAdViewsManagerSwiftFacade.h @@ -0,0 +1,20 @@ +// +// ISNAdViewManagmentProtocol.h +// SSASDKXCFramework +// +// Created by Ariel Barsheshet on 27/07/2023. +// Copyright © 2023 ironSource. All rights reserved. +// + +#import + +@class UIView; + +@protocol ISNAdViewsManagerSwiftFacade + +- (UIView *)getAdViewById:(NSString *)adViewId; + +@end + +@interface ISNAdViewsManagerSwiftFacade : NSObject +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNAppStoreVCRootViewDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNAppStoreVCRootViewDelegate.h new file mode 100644 index 0000000..a1c68e9 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNAppStoreVCRootViewDelegate.h @@ -0,0 +1,16 @@ +// +// ISNAppStoreVCRootViewDelegate.h +// IronSourceSDK +// +// Created by Gal Salti on 27/09/2023. +// + +NS_ASSUME_NONNULL_BEGIN + +@protocol ISNAppStoreVCRootViewDelegate + +- (void)didReceiveOutOfAppStoreTouchWithType:(NSString *)type; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNControllerManagerSwiftFacade.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNControllerManagerSwiftFacade.h new file mode 100644 index 0000000..806974f --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNControllerManagerSwiftFacade.h @@ -0,0 +1,24 @@ +// +// ISNControllerManagerSwiftFacade.h +// SSASDKXCFramework +// +// Created by Ariel Barsheshet on 24/07/2023. +// Copyright © 2023 ironSource. All rights reserved. +// + +#import + +@class MessageToController, CallbackToNative; +@protocol ISNControllerMessageListener; + +@interface ISNControllerManagerSwiftFacade : NSObject + +- (void)sendMessage:(MessageToController *)message + callbackHandler:(void (^)(CallbackToNative *))callbackHandler; + +- (void)setControllerMessageListenerWithAdId:(NSString *)adId + listener:(id)listener; + +- (void)removeControllerMessageListenerWithAdId:(NSString *)adId; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNControllerMessageListener.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNControllerMessageListener.h new file mode 100644 index 0000000..79e8322 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNControllerMessageListener.h @@ -0,0 +1,21 @@ +// +// ISNControllerMessageListener.h +// SSASDK +// +// Created by Gal Salti on 15/08/2023. +// Copyright © 2023 ironSource. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@class MessageToNative; + +@protocol ISNControllerMessageListener + +- (void)onReceiveWithMessage:(nullable MessageToNative *)message; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNEvent.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNEvent.h new file mode 100644 index 0000000..e05c82b --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNEvent.h @@ -0,0 +1,19 @@ +// +// ISNEvent.h +// SSASDK +// +// Created by Tomer Ben-Rachel on 19/04/2020. +// Copyright © 2020 SSA Ltd. All rights reserved. +// +// This class represents an IronSourceNetwork Event with an id and a name + +#import + +@interface ISNEvent : NSObject + +@property(nonatomic, strong) NSString* eventName; +@property(nonatomic, strong) NSNumber* eventId; + +- (instancetype)initWithEventId:(NSNumber*)eventId eventName:(NSString*)eventName; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNEventTrackerInterface.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNEventTrackerInterface.h new file mode 100644 index 0000000..473e4f7 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNEventTrackerInterface.h @@ -0,0 +1,15 @@ +// +// ISNEventTrackerInterface.h +// SSASDKXCFramework +// +// Created by Ariel Barsheshet on 23/07/2023. +// Copyright © 2023 ironSource. All rights reserved. +// + +#import "ISNEvent.h" + +@protocol ISNEventTrackerInterface + +- (void)logEvent:(ISNEvent*)event data:(NSDictionary*)data; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNEventTrackerWrapper.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNEventTrackerWrapper.h new file mode 100644 index 0000000..e5af3a1 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNEventTrackerWrapper.h @@ -0,0 +1,13 @@ +// +// ISNEventTrackerWrapper.h +// ISEventsTrackerXCFramework +// +// Created by Ariel Barsheshet on 23/07/2023. +// Copyright © 2023 ironSource. All rights reserved. +// + +#import "ISNEventTrackerInterface.h" + +@interface ISNEventTrackerWrapper : NSObject + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNSupersonicAdsPublisherSwiftFacade.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNSupersonicAdsPublisherSwiftFacade.h new file mode 100644 index 0000000..20f7744 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNSupersonicAdsPublisherSwiftFacade.h @@ -0,0 +1,14 @@ +// +// ISNSupersonicAdsPublisherSwiftFacade.h +// IronSource +// +// Created by Idan Ginat on 03/01/2024. +// + +#import + +@interface ISNSupersonicAdsPublisherSwiftFacade : NSObject + +- (void)setControllerConfig:(NSString *)config; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNativeAdAdapterDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNativeAdAdapterDelegate.h new file mode 100644 index 0000000..2b7350b --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNativeAdAdapterDelegate.h @@ -0,0 +1,30 @@ +// +// ISNativeAdAdapterDelegate.h +// IronSource +// +// Created by Hadar Pur on 02/07/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +#import "ISAdapterNativeAdData.h" +#import "ISAdapterNativeAdViewBinder.h" +#import "ISError.h" + +@protocol ISNativeAdAdapterDelegate + +@required + +- (void)adapterNativeAdInitSuccess; + +- (void)adapterNativeAdInitFailedWithError:(NSError *)error; + +- (void)adapterNativeAdDidLoadWithAdData:(ISAdapterNativeAdData *)adapterNativeAdData + adViewBinder:(ISAdapterNativeAdViewBinder *)nativeAdViewBinder; + +- (void)adapterNativeAdDidFailToLoadWithError:(NSError *)error; + +- (void)adapterNativeAdDidShow; + +- (void)adapterNativeAdDidClick; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNativeAdAdapterProtocol.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNativeAdAdapterProtocol.h new file mode 100644 index 0000000..24358b7 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNativeAdAdapterProtocol.h @@ -0,0 +1,45 @@ +// +// ISNativeAdAdapterProtocol.h +// IronSource +// +// Created by Hadar Pur on 06/07/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +#import "ISAdUnitAdapterProtocol.h" +#import "ISBiddingDataDelegate.h" +#import "ISNativeAdAdapterDelegate.h" + +@protocol ISNativeAdAdapterProtocol + +@optional + +- (void)initNativeAdsWithUserId:(NSString *)userId + adapterConfig:(ISAdapterConfig *)adapterConfig + delegate:(id)delegate; + +- (void)initNativeAdForBiddingWithUserId:(NSString *)userId + adapterConfig:(ISAdapterConfig *)adapterConfig + delegate:(id)delegate; + +- (void)loadNativeAdWithAdapterConfig:(ISAdapterConfig *)adapterConfig + adData:(NSDictionary *)adData + viewController:(UIViewController *)viewController + delegate:(id)delegate; + +- (void)loadNativeAdForBiddingWithAdapterConfig:(ISAdapterConfig *)adapterConfig + adData:(NSDictionary *)adData + serverData:(NSString *)serverData + viewController:(UIViewController *)viewController + delegate:(id)delegate; + +- (void)destroyNativeAdWithAdapterConfig:(ISAdapterConfig *)adapterConfig; + +- (NSDictionary *)getNativeAdBiddingDataWithAdapterConfig:(ISAdapterConfig *)adapterConfig + adData:(NSDictionary *)adData; + +- (void)collectNativeAdBiddingDataWithAdapterConfig:(ISAdapterConfig *)adapterConfig + adData:(NSDictionary *)adData + delegate:(id)delegate; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNativeAdDataImage.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNativeAdDataImage.h new file mode 100644 index 0000000..7031de6 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNativeAdDataImage.h @@ -0,0 +1,25 @@ +// +// ISNativeAdDataImage.h +// IronSource +// +// Created by Hadar Pur on 02/07/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface ISNativeAdDataImage : NSObject + +@property(nonatomic, strong, readonly, nullable) UIImage *image; +@property(nonatomic, strong, readonly, nullable) NSURL *url; + +- (instancetype)initWithImage:(nullable UIImage *)image url:(nullable NSURL *)url; +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNativeAdDataProtocol.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNativeAdDataProtocol.h new file mode 100644 index 0000000..690a525 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNativeAdDataProtocol.h @@ -0,0 +1,21 @@ +// +// ISNativeAdDataProtocol.h +// IronSource +// +// Created by Hadar Pur on 02/07/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +#import "ISNativeAdDataImage.h" + +@protocol ISNativeAdDataProtocol + +@required + +@property(nonatomic, strong, nullable) NSString *title; +@property(nonatomic, strong, nullable) NSString *advertiser; +@property(nonatomic, strong, nullable) NSString *body; +@property(nonatomic, strong, nullable) NSString *callToAction; +@property(nonatomic, strong, nullable) ISNativeAdDataImage *icon; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNativeAdDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNativeAdDelegate.h new file mode 100644 index 0000000..e66ed0f --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNativeAdDelegate.h @@ -0,0 +1,25 @@ +// +// ISNativeAdDelegate.h +// IronSource +// +// Created by Hadar Pur on 27/06/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +#import "ISAdapterAdDelegate.h" +#import "ISAdapterNativeAdData.h" +#import "ISAdapterNativeAdViewBinder.h" + +NS_ASSUME_NONNULL_BEGIN + +@protocol ISNativeAdDelegate + +/// mandatory callbacks +/// @param adapterNativeAdData the native ad data +/// @param nativeAdViewBinder the native ad view binder +- (void)adDidLoadWithAdData:(ISAdapterNativeAdData *)adapterNativeAdData + adViewBinder:(ISAdapterNativeAdViewBinder *)nativeAdViewBinder; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNativeAdInteractionDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNativeAdInteractionDelegate.h new file mode 100644 index 0000000..14dcb1b --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNativeAdInteractionDelegate.h @@ -0,0 +1,35 @@ +// +// ISNativeAdInteractionDelegate.h +// IronSource +// +// Created by Hadar Pur on 22/06/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +#import "ISAdInfo.h" + +NS_ASSUME_NONNULL_BEGIN + +@class LevelPlayNativeAd; + +@protocol ISNativeAdInteractionDelegate + +@required + +/** + Called after a native ad impression has been recorded. + @param nativeAd Level Play native ad. + @param adInfo The info of the ad. + */ +- (void)didRecordImpression:(LevelPlayNativeAd *)nativeAd withAdInfo:(ISAdInfo *)adInfo; + +/** + Called after a native ad has been clicked. + @param nativeAd Level Play native ad. + @param adInfo The info of the ad. + */ +- (void)didClick:(LevelPlayNativeAd *)nativeAd withAdInfo:(ISAdInfo *)adInfo; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNativeAdLoadDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNativeAdLoadDelegate.h new file mode 100644 index 0000000..9016733 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNativeAdLoadDelegate.h @@ -0,0 +1,36 @@ +// +// ISNativeAdLoadDelegate.h +// IronSource +// +// Created by Hadar Pur on 22/06/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +#import "ISAdInfo.h" +#import "ISError.h" + +@class LevelPlayNativeAd; + +NS_ASSUME_NONNULL_BEGIN + +@protocol ISNativeAdLoadDelegate + +@required + +/** + Called after a native ad has been successfully loaded + @param nativeAd Level Play native ad. + @param adInfo The info of the ad. + */ +- (void)didLoad:(LevelPlayNativeAd *)nativeAd withAdInfo:(ISAdInfo *)adInfo; + +/** + Called after a native has attempted to load an ad but failed. + @param nativeAd Level Play native ad. + @param error The reason for the error + */ +- (void)didFailToLoad:(LevelPlayNativeAd *)nativeAd withError:(NSError *)error; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNativeAdProperties.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNativeAdProperties.h new file mode 100644 index 0000000..0f300c8 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNativeAdProperties.h @@ -0,0 +1,22 @@ +// +// ISNativeAdProperties.h +// IronSource +// +// Created by Hadar Pur on 06/07/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +#import +#import "ISAdOptionsPosition.h" +#import "ISAdapterConfig.h" + +@interface ISNativeAdProperties : NSObject + +@property(nonatomic, assign, readonly) ISAdOptionsPosition adOptionsPosition; + +- (instancetype)initWithAdapterConfig:(ISAdapterConfig *)adapterConfig; +- (instancetype)initWithServerConfig:(NSDictionary *)serverConfig; +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNativeAdProtocol.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNativeAdProtocol.h new file mode 100644 index 0000000..028dab1 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNativeAdProtocol.h @@ -0,0 +1,17 @@ +// +// ISNativeAdProtocol.h +// IronSource +// +// Created by Maoz Elbaz on 11/07/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +@protocol ISNativeAdProtocol + +@required + +- (void)loadAd; + +- (void)destroyAd; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNativeAdView.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNativeAdView.h new file mode 100644 index 0000000..4315282 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNativeAdView.h @@ -0,0 +1,35 @@ +// +// ISNativeAdView.h +// IronSource +// +// Created by Hadar Pur on 04/06/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +#import +#import "ISNativeAdViewBinderProtocol.h" +#import "LevelPlayMediaView.h" +#import "LevelPlayNativeAd.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface ISNativeAdView : UIView + +/// Weak reference to your ad view's icon asset view. +@property(weak, nonatomic) IBOutlet UIImageView *adAppIcon; +/// Weak reference to your ad view's headline asset view. +@property(weak, nonatomic) IBOutlet UILabel *adTitleView; +/// Weak reference to your ad view's advertiser asset view. +@property(weak, nonatomic) IBOutlet UILabel *adAdvertiserView; +/// Weak reference to your ad view's body asset view. +@property(weak, nonatomic) IBOutlet UILabel *adBodyView; +/// Weak reference to your ad view's media asset view. +@property(weak, nonatomic) IBOutlet LevelPlayMediaView *adMediaView; +/// Weak reference to your ad view's call to action asset view. +@property(weak, nonatomic) IBOutlet UIButton *adCallToActionView; + +- (void)registerNativeAdViews:(LevelPlayNativeAd *)nativeAd; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNativeAdViewBinderProtocol.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNativeAdViewBinderProtocol.h new file mode 100644 index 0000000..326ceda --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNativeAdViewBinderProtocol.h @@ -0,0 +1,23 @@ +// +// ISNativeAdViewBinderProtocol.h +// IronSource +// +// Created by Hadar Pur on 19/06/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +#import +#import "LevelPlayMediaView.h" + +@protocol ISNativeAdViewBinderProtocol + +@required + +- (void)setIconView:(UIImageView *)iconView; +- (void)setTitleView:(UILabel *)titleView; +- (void)setAdvertiserView:(UILabel *)advertiserView; +- (void)setBodyView:(UILabel *)bodyView; +- (void)setMediaView:(LevelPlayMediaView *)mediaView; +- (void)setCallToActionView:(UIButton *)callToActionView; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNativeAdViewHolder.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNativeAdViewHolder.h new file mode 100644 index 0000000..5e4d54e --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNativeAdViewHolder.h @@ -0,0 +1,21 @@ +// +// ISNativeAdViewHolder.h +// IronSource +// +// Created by Hadar Pur on 22/06/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +#import +#import "LevelPlayMediaView.h" + +@interface ISNativeAdViewHolder : NSObject + +@property(weak, nonatomic, nullable) UIImageView *iconView; +@property(weak, nonatomic, nullable) UILabel *titleView; +@property(weak, nonatomic, nullable) UILabel *advertiserView; +@property(weak, nonatomic, nullable) UILabel *bodyView; +@property(weak, nonatomic, nullable) LevelPlayMediaView *mediaView; +@property(weak, nonatomic, nullable) UIButton *callToActionView; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNetworkInitCallbackProtocol.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNetworkInitCallbackProtocol.h new file mode 100644 index 0000000..c5f7810 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNetworkInitCallbackProtocol.h @@ -0,0 +1,22 @@ +// +// ISNetworkInitCallbackDelegate.h +// IronSource +// +// Created by Yonti Makmel on 17/05/2020. +// Copyright © 2020 ironSource. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@protocol ISNetworkInitCallbackProtocol + +@optional + +- (void)onNetworkInitCallbackSuccess; +- (void)onNetworkInitCallbackFailed:(NSString *)errorMessage; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNetworkInitializationDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNetworkInitializationDelegate.h new file mode 100644 index 0000000..99d99ff --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNetworkInitializationDelegate.h @@ -0,0 +1,32 @@ +// +// ISNetworkInitializationDelegate.h +// IronSource +// +// Created by Yonti Makmel on 07/06/2021. +// Copyright © 2021 ironSource. All rights reserved. +// + +NS_ASSUME_NONNULL_BEGIN + +@protocol ISNetworkInitializationDelegate + +// mandatory callbacks + +- (void)onInitDidSucceed; +- (void)onInitDidSucceedWithExtraData:(NSDictionary *)extraData; + +/// @param errorCode the error code if available, general ones in AdapterErrors +/// @param errorMessage the error message if available +- (void)onInitDidFailWithErrorCode:(NSInteger)errorCode + errorMessage:(nullable NSString *)errorMessage; + +/// @param errorCode the error code if available, general ones in AdapterErrors +/// @param errorMessage the error message if available +/// @param extraData custom data +- (void)onInitDidFailWithErrorCode:(NSInteger)errorCode + errorMessage:(nullable NSString *)errorMessage + extraData:(NSDictionary *)extraData; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISRewardedVideoAdapterDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISRewardedVideoAdapterDelegate.h new file mode 100644 index 0000000..301d3a4 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISRewardedVideoAdapterDelegate.h @@ -0,0 +1,64 @@ +// +// ISRewardedVideoAdapterDelegate.h +// IronSource +// +// Created by Roni Parshani on 10/12/14. +// Copyright (c) 2014 IronSource. All rights reserved. +// + +#import + +@protocol ISRewardedVideoAdapterDelegate + +- (void)adapterRewardedVideoHasChangedAvailability:(BOOL)available; +- (void)adapterRewardedVideoHasChangedAvailability:(BOOL)available + extraData:(NSDictionary *)extraData; + +- (void)adapterRewardedVideoDidFailToLoadWithError:(NSError *)error; +- (void)adapterRewardedVideoDidFailToLoadWithError:(NSError *)error + extraData:(NSDictionary *)extraData; + +- (void)adapterRewardedVideoDidReceiveReward; +- (void)adapterRewardedVideoDidReceiveRewardWithExtraData:(NSDictionary *)extraData; + +- (void)adapterRewardedVideoDidFailToShowWithError:(NSError *)error; +- (void)adapterRewardedVideoDidFailToShowWithError:(NSError *)error + extraData:(NSDictionary *)extraData; + +- (void)adapterRewardedVideoDidOpen; +- (void)adapterRewardedVideoDidOpenWithExtraData:(NSDictionary *)extraData; + +- (void)adapterRewardedVideoDidClose; +- (void)adapterRewardedVideoDidCloseWithExtraData:(NSDictionary *)extraData; + +#pragma mark - demand only + +- (void)adapterRewardedVideoDidLoad; +- (void)adapterRewardedVideoDidLoadWithExtraData:(NSDictionary *)extraData; + +#pragma mark - optional - when supported by network + +- (void)adapterRewardedVideoDidClick; +- (void)adapterRewardedVideoDidClickWithExtraData:(NSDictionary *)extraData; + +- (void)adapterRewardedVideoDidStart; +- (void)adapterRewardedVideoDidStartWithExtraData:(NSDictionary *)extraData; + +- (void)adapterRewardedVideoDidEnd; +- (void)adapterRewardedVideoDidEndWithExtraData:(NSDictionary *)extraData; + +#pragma mark - relevant only for bidding + +- (void)adapterRewardedVideoInitSuccess; +- (void)adapterRewardedVideoInitSuccessWithExtraData:(NSDictionary *)extraData; + +- (void)adapterRewardedVideoInitFailed:(NSError *)error; +- (void)adapterRewardedVideoInitFailed:(NSError *)error + extraData:(NSDictionary *)extraData; + +#pragma mark - relevant only for ironSource adapter + +- (void)adapterRewardedVideoDidBecomeVisible; +- (void)adapterRewardedVideoDidBecomeVisibleWithExtraData:(NSDictionary *)extraData; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISRewardedVideoAdapterProtocol.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISRewardedVideoAdapterProtocol.h new file mode 100644 index 0000000..496ede1 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISRewardedVideoAdapterProtocol.h @@ -0,0 +1,77 @@ +// +// ISRewardedVideoAdapterProtocol.h +// IronSource +// +// Created by Roni Parshani on 10/12/14. +// Copyright (c) 2014 IronSource. All rights reserved. +// + +#import +#import +#import "ISAdUnitAdapterProtocol.h" +#import "ISBiddingDataDelegate.h" +#import "ISRewardedVideoAdapterDelegate.h" + +@class ISAdapterConfig; +@protocol ISRewardedVideoAdapterProtocol + +@optional + +#pragma mark - for bidders, non bidders and demand only + +- (BOOL)hasRewardedVideoWithAdapterConfig:(ISAdapterConfig *)adapterConfig; + +- (void)showRewardedVideoWithViewController:(UIViewController *)viewController + adapterConfig:(ISAdapterConfig *)adapterConfig + delegate:(id)delegate; + +- (void)destroyRewardedVideoAdWithAdapterConfig:(ISAdapterConfig *)adapterConfig; + +#pragma mark - shared + +- (void)initAndLoadRewardedVideoWithUserId:(NSString *)userId + adapterConfig:(ISAdapterConfig *)adapterConfig + adData:(NSDictionary *)adData + delegate:(id)delegate; + +- (void)initRewardedVideoForCallbacksWithUserId:(NSString *)userId + adapterConfig:(ISAdapterConfig *)adapterConfig + delegate:(id)delegate; + +#pragma mark - for non bidders + +- (void)loadRewardedVideoWithAdapterConfig:(ISAdapterConfig *)adapterConfig + adData:(NSDictionary *)adData + delegate:(id)delegate; + +#pragma mark - for bidders + +- (NSDictionary *)getRewardedVideoBiddingDataWithAdapterConfig:(ISAdapterConfig *)adapterConfig + adData:(NSDictionary *)adData; + +- (void)collectRewardedVideoBiddingDataWithAdapterConfig:(ISAdapterConfig *)adapterConfig + adData:(NSDictionary *)adData + delegate:(id)delegate; + +- (void)loadRewardedVideoForBiddingWithAdapterConfig:(ISAdapterConfig *)adapterConfig + adData:(NSDictionary *)adData + serverData:(NSString *)serverData + delegate:(id)delegate; + +#pragma mark - for demand only + +- (void)initRewardedVideoForDemandOnlyWithUserId:(NSString *)userId + adapterConfig:(ISAdapterConfig *)adapterConfig + delegate:(id)delegate; + +- (void)loadRewardedVideoForDemandOnlyWithAdapterConfig:(ISAdapterConfig *)adapterConfig + delegate: + (id)delegate; + +- (void)loadRewardedVideoForDemandOnlyForBiddingWithAdapterConfig:(ISAdapterConfig *)adapterConfig + serverData:(NSString *)serverData + delegate: + (id) + delegate; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISSetAPSDataProtocol.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISSetAPSDataProtocol.h new file mode 100644 index 0000000..43defcc --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISSetAPSDataProtocol.h @@ -0,0 +1,24 @@ +// +// ISSetAPSDataProtocol.h +// IronSource +// +// Created by Sveta Itskovich on 29/11/2021. +// Copyright © 2021 IronSource. All rights reserved. +// + +#ifndef ISSetAPSDataProtocol_h +#define ISSetAPSDataProtocol_h + +#import + +NS_ASSUME_NONNULL_BEGIN + +@protocol ISSetAPSDataProtocol + +- (void)setAPSDataWithAdUnit:(NSString *)adUnit apsData:(NSDictionary *)apsData; + +@end + +NS_ASSUME_NONNULL_END + +#endif /* ISSetAPSDataProtocol_h */ diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISSupersonicAdsConfiguration.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISSupersonicAdsConfiguration.h new file mode 100644 index 0000000..3c42c3a --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISSupersonicAdsConfiguration.h @@ -0,0 +1,21 @@ +// +// Copyright © 2017 IronSource. All rights reserved. +// +#import + +@interface ISSupersonicAdsConfiguration : NSObject + +@property(nonatomic, strong) NSString *language; +@property(nonatomic, strong) NSString *minimumOfferCommission; +@property(nonatomic, strong) NSDictionary *controllerConfig; +@property(nonatomic, strong) NSString *itemName; +@property(nonatomic, strong) NSString *controllerUrl; +@property(strong) NSNumber *itemCount; +@property(strong) NSNumber *maxVideoLength; +@property(nonatomic, strong) NSString *privateKey; +@property(nonatomic) BOOL debugMode; +@property(nonatomic) NSInteger debugLevel; + ++ (ISSupersonicAdsConfiguration *)configurations; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/IronSource.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/IronSource.h new file mode 100644 index 0000000..5849597 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/IronSource.h @@ -0,0 +1,230 @@ +// +// Copyright © 2017 IronSource. All rights reserved. +// + +#ifndef IRONSOURCE_H +#define IRONSOURCE_H + + +// import core classes +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import + +#import "ISABannerAdLoader.h" +#import "ISABannerAdRequestBuilder.h" +#import "ISAInitRequestBuilder.h" +#import "ISAInterstitialAdLoader.h" +#import "ISAInterstitialAdRequestBuilder.h" +#import "ISARewardedAdLoader.h" +#import "ISARewardedAdRequestBuilder.h" +#import "ISAdInfo.h" +#import "ISAdapterAdaptiveProtocol.h" +#import "ISBannerSize.h" +#import "ISConfigurations.h" +#import "ISDemandOnlyBannerDelegate.h" +#import "ISDemandOnlyInterstitialDelegate.h" +#import "ISDemandOnlyRewardedVideoDelegate.h" +#import "ISSupersonicAdsConfiguration.h" +#import "IronSourceAds.h" +#import "LPMDispatcherProtocol.h" +#import "LPMImpressionData.h" +#import "LPMImpressionDataDelegate.h" +#import "LPMSegment.h" + +// imports used for custom adapters infra +#import "ISAdapterErrors.h" +#import "ISBaseBanner.h" +#import "ISBaseInterstitial.h" +#import "ISBaseNativeAd.h" +#import "ISBaseNetworkAdapter.h" +#import "ISBaseRewardedVideo.h" +#import "ISDataKeys.h" +#import "ISSetAPSDataProtocol.h" + +// Native Ads +#import "ISNativeAdProtocol.h" +#import "ISNativeAdView.h" +#import "LevelPlayMediaView.h" +#import "LevelPlayNativeAd.h" +#import "LevelPlayNativeAdDelegate.h" + +// LevelPlay imports +#import "LPMAdInfo.h" +#import "LPMAdSize.h" +#import "LPMBannerAdView.h" +#import "LPMBannerAdViewConfig.h" +#import "LPMBannerAdViewConfigBuilder.h" +#import "LPMInitRequestBuilder.h" +#import "LPMInterstitialAd.h" +#import "LPMInterstitialAdConfig.h" +#import "LPMInterstitialAdConfigBuilder.h" +#import "LPMInterstitialAdDelegate.h" +#import "LPMRewardedAd.h" +#import "LPMRewardedAdConfig.h" +#import "LPMRewardedAdConfigBuilder.h" +#import "LPMRewardedAdDelegate.h" +#import "LevelPlay.h" + +#import "IronSourceNetworkSwiftBridge.h" + +NS_ASSUME_NONNULL_BEGIN + +#define IS_REWARDED_VIDEO @"rewardedvideo" +#define IS_INTERSTITIAL @"interstitial" +#define IS_BANNER @"banner" +#define IS_NATIVE_AD @"nativead" + +static NSString *const MEDIATION_SDK_VERSION = @"9.2.0"; +static NSString *GitHash = @"19b9775"; + +@interface IronSource : NSObject + +/** + @abstact Retrieve a string-based representation of the SDK version. + @discussion The returned value will be in the form of "..". + + @return NSString representing the current IronSource SDK version. + */ ++ (NSString *)sdkVersion DEPRECATED_MSG_ATTRIBUTE("For LevelPlay, use [LevelPlay sdkVersion]. For " + "IronSourceAds, use [IronSourceAds sdkVersion]."); + +/** + @abstract Sets a mediation type. + @discussion This method is used only for IronSource's SDK, and will be passed as a custom param. + + @param mediationType a mediation type name. Should be alphanumeric and between 1-64 chars in + length. + */ ++ (void)setMediationType:(NSString *)mediationType; + +/** +@abstact used for demand only API, return the bidding data token. +*/ ++ (NSString *)getISDemandOnlyBiddingData; + +#pragma mark - Demand Only Rewarded Video + +/** + @abstract Sets the delegate for demand only rewarded video callbacks. + @param delegate The 'ISDemandOnlyRewardedVideoDelegate' for IronSource to send callbacks to. + */ ++ (void)setISDemandOnlyRewardedVideoDelegate:(id)delegate; + +/** + @abstract Loads a demand only rewarded video for a non bidder instance. + @discussion This method will load a demand only rewarded video ad for a non bidder instance. + @param instanceId The demand only instance id to be used to display the rewarded video. + */ ++ (void)loadISDemandOnlyRewardedVideo:(NSString *)instanceId; + +/** + @abstract Shows a demand only rewarded video using the default placement. + @param viewController The UIViewController to display the rewarded video within. + @param instanceId The demand only instance id to be used to display the rewarded video. + */ ++ (void)showISDemandOnlyRewardedVideo:(UIViewController *)viewController + instanceId:(NSString *)instanceId; + +/** + @abstract Determine if a locally cached demand only rewarded video exists for an instance id. + @discussion A return value of YES here indicates that there is a cached rewarded video for the + instance id. + @param instanceId The demand only instance id to be used to display the rewarded video. + @return YES if rewarded video is ready to be played, NO otherwise. + */ ++ (BOOL)hasISDemandOnlyRewardedVideo:(NSString *)instanceId; + +#pragma mark - Demand Only Interstitial + +/** + @abstract Sets the delegate for demand only interstitial callbacks. + @param delegate The 'ISDemandOnlyInterstitialDelegate' for IronSource to send callbacks to. + */ ++ (void)setISDemandOnlyInterstitialDelegate:(id)delegate; + +/** + @abstract Loads a demand only interstitial. + @discussion This method will load a demand only interstitial ad. + @param instanceId The demand only instance id to be used to display the interstitial. + */ ++ (void)loadISDemandOnlyInterstitial:(NSString *)instanceId; + +/** + @abstract Show a demand only interstitial using the default placement. + @param viewController The UIViewController to display the interstitial within. + @param instanceId The demand only instance id to be used to display the interstitial. + */ ++ (void)showISDemandOnlyInterstitial:(UIViewController *)viewController + instanceId:(NSString *)instanceId; + +/** + @abstract Determine if a locally cached interstitial exists for a demand only instance id. + @discussion A return value of YES here indicates that there is a cached interstitial for the + instance id. + @param instanceId The demand only instance id to be used to display the interstitial. + @return YES if there is a locally cached interstitial, NO otherwise. + */ ++ (BOOL)hasISDemandOnlyInterstitial:(NSString *)instanceId; + +#pragma mark Demand Only Banner +/** + @abstract Sets the delegate for demand only Banner callbacks. + @param delegate The 'ISDemandOnlyBannerDelegate' for IronSource to send callbacks to. + @param instanceId The instance id on which the delegate will notify. + */ ++ (void)setISDemandOnlyBannerDelegate:(id)delegate + forInstanceId:(NSString *)instanceId; + +/** + @abstract Loads a demand only Banner for a non bidder instance. + @discussion This method will load a demand only Banner ad for a non bidder instance. + @param instanceId The demand only instance id to be used to display the Banner. + @param viewController The view controller on which the banner should be presented + @param size The required banner ad size + */ ++ (void)loadISDemandOnlyBannerWithInstanceId:(NSString *)instanceId + viewController:(UIViewController *)viewController + size:(ISBannerSize *)size; + +/** + @abstract Removes the banner from memory. + @param instanceId The demand only instance id of the Banner that should be destroyed. + */ ++ (void)destroyISDemandOnlyBannerWithInstanceId:(NSString *)instanceId; + +#pragma mark - Impression Data + +/** + @abstract Ad revenue data + + @param dataSource the external source id from which the impression data is sent. + @param impressionData the impression data + + */ ++ (void)setAdRevenueDataWithDataSource:(NSString *)dataSource + impressionData:(NSData *)impressionData; + +@end + +NS_ASSUME_NONNULL_END + +#endif diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/IronSourceAds.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/IronSourceAds.h new file mode 100644 index 0000000..596a890 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/IronSourceAds.h @@ -0,0 +1,89 @@ +// +// IronSourceAds.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import +#import "ISAAdFormat.h" +#import "ISAInitRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + Defines the completion callback for IronSourceAds SDK initialization. + */ +typedef void (^ISAInitCompletionHandler)(BOOL success, NSError *_Nullable error); + +/** + Object used to initialize IronSourceAds network. + */ +@interface IronSourceAds : NSObject + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +#pragma mark - SDK Initialization + +/** + Initializes IronSourceAds SDK. + + @param request The initialization request containing the necessary configurations for + initialization. + @param completion The completion for initialization. The completion will be invoked on the main + thread. + */ ++ (void)initWithRequest:(ISAInitRequest *)request completion:(ISAInitCompletionHandler)completion; + +#pragma mark - SDK Properties + +/** + @abstact Retrieve a string-based representation of the SDK version. + @discussion The returned value will be in the form of "..". + + @return NSString representing the current IronSource SDK version. + */ ++ (NSString *)sdkVersion; + +/** + @abstract Sets if IAds should allow debug logs. + @discussion This value will be passed to the IAds Network. + + Default is NO. + + @param enable YES to allow IAds Network debug logs, NO otherwise. + */ ++ (void)enableDebugMode:(BOOL)enable; + +/** +@abstact Sets the meta data with a key and value. +@discussion This value will be passed to the IronSourceAds network. + +@param key The meta data key. +@param value The meta data value + +*/ ++ (void)setMetaDataWithKey:(NSString *)key value:(NSString *)value; + +/** + @abstact Sets the meta data with a key and values. + @discussion This value will be passed to the IronSourceAds network. + + @param key The meta data key. + @param values The meta data values + + */ ++ (void)setMetaDataWithKey:(NSString *)key values:(NSMutableArray *)values; + +/** + @abstract Sets the consent value. + @discussion Sets the consent, boolean value that indicates whether the user has granted consent for + the SDK to collect and share data. Consent is used for GDPR compliance. + @param consent value. + */ ++ (void)setConsent:(BOOL)consent; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/IronSourceNetworkSwiftBridge.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/IronSourceNetworkSwiftBridge.h new file mode 100644 index 0000000..77fd27a --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/IronSourceNetworkSwiftBridge.h @@ -0,0 +1,19 @@ +// +// IronSourceNetworkBridgingHeader.h +// IronSource +// +// Created by Ariel Barsheshet on 21/08/2023. +// + +#import "ISAppStoreErrorDelegate.h" +#import "ISBaseNativeAdAdapter.h" +#import "ISIronSourceAdapter.h" +#import "ISMediationGlobalDataWriterFacade.h" +#import "ISNAdViewsManagerSwiftFacade.h" +#import "ISNAppStoreVCRootViewDelegate.h" +#import "ISNControllerManagerSwiftFacade.h" +#import "ISNControllerMessageListener.h" +#import "ISNEvent.h" +#import "ISNEventTrackerInterface.h" +#import "ISNEventTrackerWrapper.h" +#import "ISNSupersonicAdsPublisherSwiftFacade.h" diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMAdInfo.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMAdInfo.h new file mode 100644 index 0000000..72e9e72 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMAdInfo.h @@ -0,0 +1,36 @@ +// +// LPMAdInfo.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import +#import "LPMAdSize.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface LPMAdInfo : NSObject + +@property(readonly, copy, nonnull) NSString *adId; +@property(readonly, copy) NSString *adUnitId; +@property(readonly, copy) NSString *adUnitName; +@property(readonly, copy, nullable) NSString *placementName; +@property(readonly, copy, nullable) LPMAdSize *adSize; +@property(readonly, copy) NSString *adFormat; +@property(readonly, copy) NSString *auctionId; +@property(readonly, copy) NSString *country; +@property(readonly, copy) NSString *ab; +@property(readonly, copy) NSString *segmentName; +@property(readonly, copy) NSString *adNetwork; +@property(readonly, copy) NSString *instanceName; +@property(readonly, copy) NSString *instanceId; +@property(readonly, copy) NSNumber *revenue; +@property(readonly, copy) NSString *precision; +@property(readonly, copy) NSString *encryptedCPM; +@property(readonly, copy) NSNumber *conversionValue; +@property(readonly, copy) NSString *creativeId; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMAdSize.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMAdSize.h new file mode 100644 index 0000000..a307a33 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMAdSize.h @@ -0,0 +1,58 @@ +// +// LPMAdSize.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +typedef NS_ENUM(NSInteger, LPMAdSizeType) { + LPMAdSizeBanner, + LPMAdSizeLarge, + LPMAdSizeMediumRectangle, + LPMAdSizeCustom, + LPMAdSizeLeaderBoard +}; + +@interface LPMAdSize : NSObject + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +@property(nonatomic, readonly) LPMAdSizeType type; +@property(nonatomic, readonly) NSInteger width; +@property(nonatomic, readonly) NSInteger height; +@property(nonatomic, readonly, copy) NSString* sizeDescription; +@property(nonatomic, readonly) BOOL isAdaptive; + ++ (instancetype)bannerSize; ++ (instancetype)largeSize; ++ (instancetype)mediumRectangleSize; ++ (instancetype)leaderBoardSize; ++ (instancetype)customSizeWithWidth:(NSInteger)width height:(NSInteger)height; + +/** + Creates and returns an adaptive ad size for a given width. + + If the provided width is invalid (less than or equal to 0), the method uses the screen width + based on the device orientation. + + @param width The specified width for which the adaptive ad size is calculated. + @return An instance of LPMAdSize with the calculated height for the given width, or `nil` if the + SDK is not initialized. + */ ++ (nullable instancetype)createAdaptiveAdSizeWithWidth:(CGFloat)width; +/** + Creates and returns an adaptive ad size using the screen width based on the device orientation. + + @return An instance of LPMAdSize with the calculated height for the screen width, or `nil` if the + SDK is not initialized. + */ ++ (nullable instancetype)createAdaptiveAdSize; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMBannerAdView.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMBannerAdView.h new file mode 100644 index 0000000..5c34dc4 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMBannerAdView.h @@ -0,0 +1,42 @@ +// +// LPMBannerAdView.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import +#import +#import "LPMBannerAdViewDelegate.h" + +@class LPMAdSize, LPMBannerAdViewConfig; + +NS_ASSUME_NONNULL_BEGIN + +@interface LPMBannerAdView : UIView + +/** + * A unique identifier associated with the ad object. + */ +@property(nonatomic, strong, readonly) NSString *adId; + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +- (instancetype)initWithAdUnitId:(NSString *)adUnitId; + +- (instancetype)initWithAdUnitId:(NSString *)adUnitId config:(LPMBannerAdViewConfig *)config; + +- (void)setDelegate:(id)delegate; + +- (void)loadAdWithViewController:(UIViewController *)viewController; + +- (void)destroy; + +- (void)pauseAutoRefresh; + +- (void)resumeAutoRefresh; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMBannerAdViewConfig.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMBannerAdViewConfig.h new file mode 100644 index 0000000..8afbb77 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMBannerAdViewConfig.h @@ -0,0 +1,40 @@ +// +// LPMBannerAdViewConfig.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import + +@class LPMAdSize; + +NS_ASSUME_NONNULL_BEGIN + +/** + Class representing a banner ad configuration. + Use `LPMBannerAdViewConfigBuilder` to create an instance of this class. + */ +@interface LPMBannerAdViewConfig : NSObject + +/** + * An ad size to be applied to the ad object. + */ +@property(nonatomic, strong, nullable, readonly) LPMAdSize *adSize; + +/** + * A bidding floor to be applied to the ad object. + */ +@property(nonatomic, strong, nullable, readonly) NSNumber *bidFloor; + +/** + * A placement name to be applied to the ad object. + */ +@property(nonatomic, strong, nullable, readonly) NSString *placementName; + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMBannerAdViewConfigBuilder.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMBannerAdViewConfigBuilder.h new file mode 100644 index 0000000..15c5694 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMBannerAdViewConfigBuilder.h @@ -0,0 +1,49 @@ +// +// LPMBannerAdViewConfigBuilder.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import + +@class LPMBannerAdViewConfig, LPMAdSize; + +NS_ASSUME_NONNULL_BEGIN + +@interface LPMBannerAdViewConfigBuilder : NSObject + +/** + Set an ad size to be applied to the ad object. + + @param adSize an ad size. + @returns The builder that had the setter called. + */ +- (LPMBannerAdViewConfigBuilder *)setWithAdSize:(LPMAdSize *)adSize NS_SWIFT_NAME(set(adSize:)); + +/** + Set a bid floor to be applied to the ad object. + + @param bidFloor bid floor value in USD. + @returns The builder that had the setter called. + */ +- (LPMBannerAdViewConfigBuilder *)setWithBidFloor:(NSNumber *)bidFloor + NS_SWIFT_NAME(set(bidFloor:)); + +/** + Set a placement name to be applied to the ad object. + + @param placementName The placement name for the ad. + @returns The builder that had the setter called. + */ +- (LPMBannerAdViewConfigBuilder *)setWithPlacementName:(NSString *)placementName + NS_SWIFT_NAME(set(placementName:)); + +/** + @returns a banner ad configuration from this builder + */ +- (LPMBannerAdViewConfig *)build; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMBannerAdViewDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMBannerAdViewDelegate.h new file mode 100644 index 0000000..9ccb1ae --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMBannerAdViewDelegate.h @@ -0,0 +1,36 @@ +// +// LPMBannerAdViewDelegate.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +@class LPMAdInfo; + +NS_ASSUME_NONNULL_BEGIN + +@protocol LPMBannerAdViewDelegate + +@required + +- (void)didLoadAdWithAdInfo:(LPMAdInfo *)adInfo; + +- (void)didFailToLoadAdWithAdUnitId:(NSString *)adUnitId error:(NSError *)error; + +@optional + +- (void)didClickAdWithAdInfo:(LPMAdInfo *)adInfo; + +- (void)didDisplayAdWithAdInfo:(LPMAdInfo *)adInfo; + +- (void)didFailToDisplayAdWithAdInfo:(LPMAdInfo *)adInfo error:(NSError *)error; + +- (void)didLeaveAppWithAdInfo:(LPMAdInfo *)adInfo; + +- (void)didExpandAdWithAdInfo:(LPMAdInfo *)adInfo; + +- (void)didCollapseAdWithAdInfo:(LPMAdInfo *)adInfo; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMConfiguration.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMConfiguration.h new file mode 100644 index 0000000..c592864 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMConfiguration.h @@ -0,0 +1,19 @@ +// +// LPMConfiguration.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface LPMConfiguration : NSObject + +@property(nonatomic, assign) BOOL isAdQualityEnabled; +@property(nonatomic, strong, nullable) NSString *ab; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMDispatcherProtocol.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMDispatcherProtocol.h new file mode 100644 index 0000000..faeff3b --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMDispatcherProtocol.h @@ -0,0 +1,17 @@ +// +// LPMDispatcherProtocol.h +// IronSource +// +// Created by Gal Yedidovich on 16/12/2024. +// + +NS_ASSUME_NONNULL_BEGIN + +typedef void (^LPMDispatcherBlock)(void); + +@protocol LPMDispatcherProtocol + +- (void)dispatch:(LPMDispatcherBlock _Nonnull)task; +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMImpressionData.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMImpressionData.h new file mode 100644 index 0000000..e5f5068 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMImpressionData.h @@ -0,0 +1,41 @@ +// +// LPMImpressionData.h +// IronSource +// +// Copyright © 2020 ironSource. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface LPMImpressionData : NSObject + +@property(readonly, copy, nullable) NSString *auctionId; +@property(readonly, copy, nullable) NSString *mediationAdUnitName; +@property(readonly, copy, nullable) NSString *mediationAdUnitId; +@property(readonly, copy, nullable) NSString *adFormat; +@property(readonly, copy, nullable) NSString *adNetwork; +@property(readonly, copy, nullable) NSString *instanceName; +@property(readonly, copy, nullable) NSString *instanceId; +@property(readonly, copy, nullable) NSString *country; +@property(readonly, copy, nullable) NSString *placement; +@property(readonly, copy, nullable) NSNumber *revenue; +@property(readonly, copy, nullable) NSString *precision; +@property(readonly, copy, nullable) NSString *ab; +@property(readonly, copy, nullable) NSString *segmentName; +@property(readonly, copy, nullable) NSString *encryptedCpm; +@property(readonly, copy, nullable) NSNumber *conversionValue; +@property(readonly, copy, nullable) NSString *creativeId; + +@property(readonly, copy, nullable) NSDictionary *allData; + +- (instancetype)initWithDictionary:(NSDictionary *)dictionary; + +- (instancetype)initWithImpressionData:(LPMImpressionData *)impressionData; + +- (void)replacePlacementMacro:(NSString *)macro value:(NSString *)value; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMImpressionDataDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMImpressionDataDelegate.h new file mode 100644 index 0000000..08ceff0 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMImpressionDataDelegate.h @@ -0,0 +1,14 @@ +// +// LPMImpressionDataDelegate.h +// IronSource +// +// Copyright © 2020 ironSource. All rights reserved. +// + +#import "LPMImpressionData.h" + +@protocol LPMImpressionDataDelegate + +- (void)impressionDataDidSucceed:(LPMImpressionData *)impressionData; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMInitRequest.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMInitRequest.h new file mode 100644 index 0000000..60214ac --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMInitRequest.h @@ -0,0 +1,25 @@ +// +// LPMInitRequest.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface LPMInitRequest : NSObject + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +- (instancetype)initWithAppKey:(NSString *)appKey userId:(nullable NSString *)userId; + +@property(readonly, nonatomic) NSString *appKey; +@property(readonly, nonatomic) NSArray *legacyAdFormats; +@property(readonly, nonatomic, nullable) NSString *userId; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMInitRequestBuilder.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMInitRequestBuilder.h new file mode 100644 index 0000000..22deb8f --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMInitRequestBuilder.h @@ -0,0 +1,26 @@ +// +// LPMInitRequestBuilder.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import +#import "LPMInitRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface LPMInitRequestBuilder : NSObject + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +- (instancetype)initWithAppKey:(NSString *)appKey; + +- (LPMInitRequest *)build; + +- (LPMInitRequestBuilder *)withUserId:(NSString *)userId; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMInterstitialAd.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMInterstitialAd.h new file mode 100644 index 0000000..c216976 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMInterstitialAd.h @@ -0,0 +1,93 @@ +// +// LPMInterstitialAd.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import +#import +#import "LPMInterstitialAdDelegate.h" + +@class LPMInterstitialAdConfig; + +NS_ASSUME_NONNULL_BEGIN + +/** + Class responsible for handling the APIs, callbacks and overall operations of an interstitial ad. + */ +@interface LPMInterstitialAd : NSObject + +/** + * A unique identifier associated with the ad object. + */ +@property(nonatomic, strong, readonly) NSString *adId; + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +/** + Initializes an interstitial ad. + + @param adUnitId The ad unit identifier. + */ +- (instancetype)initWithAdUnitId:(NSString *)adUnitId; + +/** + Initializes an interstitial ad with configuration. + + @param adUnitId The ad unit identifier. + @param config The ad configuration. + */ +- (instancetype)initWithAdUnitId:(NSString *)adUnitId config:(LPMInterstitialAdConfig *)config; + +/** + Sets a delegate for the ad callbacks. + The callbacks will be invoked on the main thread. + The delegate is held weakly. + + @param delegate The delegate to set. + */ +- (void)setDelegate:(id)delegate; + +/** + Loads an interstitial ad. + The delegate will send a `didLoadAdWithAdInfo:` or + `didFailToLoadAdWithAdUnitId: error:` callback. + The callbacks will be invoked on the main thread. + */ +- (void)loadAd NS_SWIFT_NAME(loadAd()); + +/** + Shows the ad. + The delegate will send a `interstitialAdDidShow:` or + `interstitialAd:didFailToShowWithError:` callback. + + @param viewController The view controller where the ad will be shown. + @param placementName The placement name for the ad. + */ +- (void)showAdWithViewController:(UIViewController *)viewController + placementName:(nullable NSString *)placementName + NS_SWIFT_NAME(showAd(viewController:placementName:)); + +/** + Checks if the ad is ready. + Showing an ad that is not ready will result in a show failure. + When calling to the show api with placement, make sure to verify that placement isn't capped via + `isPlacementCapped:`. + + @return Whether the ad is ready. + */ +- (BOOL)isAdReady; + +/** + Checks if the placement is capped. + + @param placementName The placement name to check. + @return `YES` if the placement is capped, `NO` otherwise. + */ ++ (BOOL)isPlacementCapped:(NSString *)placementName; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMInterstitialAdConfig.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMInterstitialAdConfig.h new file mode 100644 index 0000000..fdfe477 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMInterstitialAdConfig.h @@ -0,0 +1,28 @@ +// +// LPMInterstitialAdConfig.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + Class representing an interstitial ad configuration. + Use `LPMInterstitialAdConfigBuilder` to create an instance of this class. + */ +@interface LPMInterstitialAdConfig : NSObject + +/** + * A NSNumber bidding floor to be applied to the ad object. + */ +@property(nonatomic, strong, nullable, readonly) NSNumber *bidFloor; + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMInterstitialAdConfigBuilder.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMInterstitialAdConfigBuilder.h new file mode 100644 index 0000000..a580bbb --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMInterstitialAdConfigBuilder.h @@ -0,0 +1,32 @@ +// +// LPMInterstitialAdConfigBuilder.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import + +@class LPMInterstitialAdConfig; + +NS_ASSUME_NONNULL_BEGIN + +@interface LPMInterstitialAdConfigBuilder : NSObject + +/** + Set a bid floor to be applied to the ad object. + + @param bidFloor bid floor value in USD. + @returns The builder that had the setter called. + */ +- (LPMInterstitialAdConfigBuilder *)setWithBidFloor:(NSNumber *)bidFloor + NS_SWIFT_NAME(set(bidFloor:)); + +/** + @returns an interstitial ad configuration from this builder + */ +- (LPMInterstitialAdConfig *)build; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMInterstitialAdDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMInterstitialAdDelegate.h new file mode 100644 index 0000000..5d44654 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMInterstitialAdDelegate.h @@ -0,0 +1,75 @@ +// +// LPMInterstitialAdDelegate.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import "LPMAdInfo.h" + +NS_ASSUME_NONNULL_BEGIN + +@class LPMInterstitialAd; + +/** + Protocol handling interstitial ad events for `LPMInterstitialAd`. + The callbacks will be invoked on the main thread. + */ +@protocol LPMInterstitialAdDelegate + +/** + Triggered when an interstitial ad is successfully loaded. + + @param adInfo Ad info of the loaded interstitial ad. + */ +- (void)didLoadAdWithAdInfo:(LPMAdInfo *)adInfo; + +/** + Triggered when an interstitial ad fails to load. + + @param adUnitId The ad unit id of the interstitial ad that fails to load. + @param error The error that occurred during loading. + */ +- (void)didFailToLoadAdWithAdUnitId:(NSString *)adUnitId error:(NSError *)error; + +/** + Triggered when an interstitial ad is displayed. + + @param adInfo Ad info of the displayed interstitial ad. + */ +- (void)didDisplayAdWithAdInfo:(LPMAdInfo *)adInfo; + +@optional + +/** + Triggered when an interstitial ad fails to show. + + @param adInfo Ad info of the interstitial ad that failed to display. + @param error The error that occurred. + */ +- (void)didFailToDisplayAdWithAdInfo:(LPMAdInfo *)adInfo error:(NSError *)error; + +/** + Triggered when an interstitial ad is clicked. + + @param adInfo Ad info of the clicked interstitial ad. + */ +- (void)didClickAdWithAdInfo:(LPMAdInfo *)adInfo; + +/** + Triggered when an interstitial ad is closed. + + @param adInfo Ad info of the closed interstitial ad. + */ +- (void)didCloseAdWithAdInfo:(LPMAdInfo *)adInfo; + +/** + Triggered when ad was reloaded and ad info updated. + + @param adInfo The updated interstitial ad info after the reloading. + */ +- (void)didChangeAdInfo:(LPMAdInfo *)adInfo NS_SWIFT_NAME(didChangeAdInfo(_:)); + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMReward.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMReward.h new file mode 100644 index 0000000..357cd31 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMReward.h @@ -0,0 +1,33 @@ +// +// LPMReward.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + Class representing a reward for an ad. + */ +@interface LPMReward : NSObject + +/** + The amount of the reward. + */ +@property(readonly, nonatomic) NSInteger amount; + +/** + The name of the reward. + */ +@property(readonly, strong, nonatomic) NSString *name; + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; +- (instancetype)initWithName:(NSString *)name amount:(NSInteger)amount; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMRewardedAd.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMRewardedAd.h new file mode 100644 index 0000000..037d6c1 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMRewardedAd.h @@ -0,0 +1,93 @@ +// +// LPMRewardedAd.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import +#import +#import "LPMRewardedAdDelegate.h" + +@class LPMRewardedAdConfig; + +NS_ASSUME_NONNULL_BEGIN + +/** + Class responsible for handling the APIs, callbacks and overall operations of a rewarded ad. + */ +@interface LPMRewardedAd : NSObject + +/** + * A unique identifier associated with the ad object. + */ +@property(nonatomic, strong, readonly) NSString *adId; + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +/** + Initializes a rewarded ad. + + @param adUnitId The ad unit identifier. + */ +- (instancetype)initWithAdUnitId:(NSString *)adUnitId; + +/** + Initializes a rewarded ad. + + @param adUnitId The ad unit identifier. + @param config The ad configuration. + */ +- (instancetype)initWithAdUnitId:(NSString *)adUnitId config:(LPMRewardedAdConfig *)config; + +/** + Sets a delegate for the ad callbacks. + The callbacks will be invoked on the main thread. + The delegate is held weakly. + + @param delegate The delegate to set. + */ +- (void)setDelegate:(id)delegate; + +/** + Loads a rewarded ad. + The delegate will send a `didLoadAdWithAdInfo:` or + `didFailToLoadAdWithAdUnitId: error:` callback. + The callbacks will be invoked on the main thread. + */ +- (void)loadAd NS_SWIFT_NAME(loadAd()); + +/** + Shows the ad. + The delegate will send a `rewardedAdDidShow:` or + `rewardedAd:didFailToShowWithError:` callback. + + @param viewController The view controller where the ad will be shown. + @param placementName The placement name for the ad. + */ +- (void)showAdWithViewController:(UIViewController *)viewController + placementName:(nullable NSString *)placementName + NS_SWIFT_NAME(showAd(viewController:placementName:)); + +/** + Checks if the ad is ready. + Showing an ad that is not ready will result in a show failure. + When calling to the show api with placement, make sure to verify that placement isn't capped via + `isPlacementCapped:`. + + @return Whether the ad is ready. + */ +- (BOOL)isAdReady; + +/** + Checks if the placement is capped. + + @param placementName The placement name to check. + @return `YES` if the placement is capped, `NO` otherwise. + */ ++ (BOOL)isPlacementCapped:(NSString *)placementName; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMRewardedAdConfig.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMRewardedAdConfig.h new file mode 100644 index 0000000..ce72114 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMRewardedAdConfig.h @@ -0,0 +1,28 @@ +// +// LPMRewardedAdConfig.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + Class representing a rewarded ad configuration. + Use `LPMRewardedAdConfigBuilder` to create an instance of this class. + */ +@interface LPMRewardedAdConfig : NSObject + +/** + * A NSNumber bidding floor to be applied to the ad object. + */ +@property(nonatomic, strong, nullable, readonly) NSNumber *bidFloor; + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMRewardedAdConfigBuilder.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMRewardedAdConfigBuilder.h new file mode 100644 index 0000000..2cfca1a --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMRewardedAdConfigBuilder.h @@ -0,0 +1,31 @@ +// +// LPMRewardedAdConfigBuilder.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import + +@class LPMRewardedAdConfig; + +NS_ASSUME_NONNULL_BEGIN + +@interface LPMRewardedAdConfigBuilder : NSObject + +/** + Set a bid floor to be applied to the ad object. + + @param bidFloor bid floor value in USD. + @returns The builder that had the setter called. + */ +- (LPMRewardedAdConfigBuilder *)setWithBidFloor:(NSNumber *)bidFloor NS_SWIFT_NAME(set(bidFloor:)); + +/** + @returns a rewarded ad configuration from this builder + */ +- (LPMRewardedAdConfig *)build; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMRewardedAdDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMRewardedAdDelegate.h new file mode 100644 index 0000000..c08241f --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMRewardedAdDelegate.h @@ -0,0 +1,84 @@ +// +// LPMRewardedAdDelegate.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import "LPMAdInfo.h" +#import "LPMReward.h" + +NS_ASSUME_NONNULL_BEGIN + +@class LPMRewardedAd; + +/** + Protocol handling rewarded ad events for `LPMRewardedAd`. + The callbacks will be invoked on the main thread. + */ +@protocol LPMRewardedAdDelegate + +/** + Triggered when a rewarded ad is successfully loaded. + + @param adInfo Ad info of the loaded rewarded ad. + */ +- (void)didLoadAdWithAdInfo:(LPMAdInfo *)adInfo; + +/** + Triggered when a rewarded ad fails to load. + + @param adUnitId The ad unit id of the rewarded ad that fails to load. + @param error The error that occurred during loading. + */ +- (void)didFailToLoadAdWithAdUnitId:(NSString *)adUnitId error:(NSError *)error; + +/** + Triggered when a rewarded ad is displayed. + + @param adInfo Ad info of the displayed rewarded ad. + */ +- (void)didDisplayAdWithAdInfo:(LPMAdInfo *)adInfo; + +/** + Triggered when the ad reward is granted. + + @param adInfo Ad info of the displayed rewarded ad. + @param reward Reward of the displayed ad. + */ +- (void)didRewardAdWithAdInfo:(LPMAdInfo *)adInfo reward:(LPMReward *)reward; + +@optional + +/** + Triggered when a rewarded ad fails to show. + + @param adInfo Ad info of the rewarded ad that failed to display. + @param error The error that occurred. + */ +- (void)didFailToDisplayAdWithAdInfo:(LPMAdInfo *)adInfo error:(NSError *)error; + +/** + Triggered when a rewarded ad is clicked. + + @param adInfo Ad info of the clicked rewarded ad. + */ +- (void)didClickAdWithAdInfo:(LPMAdInfo *)adInfo; + +/** + Triggered when a rewarded ad is closed. + + @param adInfo Ad info of the closed rewarded ad. + */ +- (void)didCloseAdWithAdInfo:(LPMAdInfo *)adInfo; + +/** + Triggered when ad was reloaded and ad info updated. + + @param adInfo The updated rewarded ad info after the reloading. + */ +- (void)didChangeAdInfo:(LPMAdInfo *)adInfo NS_SWIFT_NAME(didChangeAdInfo(_:)); + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMSegment.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMSegment.h new file mode 100644 index 0000000..1639093 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMSegment.h @@ -0,0 +1,22 @@ +// +// LPMSegment.h +// IronSource +// +// Copyright © 2025 IronSource. All rights reserved. +// + +#import + +@interface LPMSegment : NSObject +@property(nonatomic) int level; +@property(nonatomic) double iapTotal; +@property(nonatomic) BOOL paying; +@property(nonatomic, strong) NSDate *userCreationDate; +@property(nonatomic, strong) NSString *segmentName; +@property(nonatomic, strong, readonly) NSDictionary *customKeys; + +- (void)setCustomValue:(NSString *)value forKey:(NSString *)key; + +- (NSDictionary *)getData; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LevelPlay.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LevelPlay.h new file mode 100644 index 0000000..3ef1068 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LevelPlay.h @@ -0,0 +1,153 @@ +// +// LevelPlay.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import +#import +#import "LPMConfiguration.h" +#import "LPMImpressionDataDelegate.h" +#import "LPMInitRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +@class LPMSegment; + +typedef void (^LPMInitCompletionHandler)(LPMConfiguration *_Nullable config, + NSError *_Nullable error); + +#define LEVEL_PLAY_REWARDED @"rewarded" +#define LEVEL_PLAY_INTERSTITIAL @"interstitial" +#define LEVEL_PLAY_BANNER @"banner" +#define LEVEL_PLAY_NATIVE_AD @"nativead" + +@interface LevelPlay : NSObject + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +#pragma mark - SDK Initialization + +/** + Initializes the LevelPlay SDK with the provided request parameters. + + @param request The containing initialization parameters. + @param completion A block called when the initialization process completes. It returns an + `LPMConfiguration` object if successful, or an `NSError` describing the failure. + */ + ++ (void)initWithRequest:(LPMInitRequest *)request completion:(LPMInitCompletionHandler)completion; + +#pragma mark - SDK Properties + +/** + @abstact Retrieve a string-based representation of the SDK version. + @discussion The returned value will be in the form of "..". + + @return NSString representing the current IronSource SDK version. + */ ++ (NSString *)sdkVersion; + +/** + Adds the delegate for impression data callbacks. + + @param delegate The delegate for LevelPlay to send callbacks to. + */ + ++ (void)addImpressionDataDelegate:(id)delegate; + +/** + Removes the delegate from impression data callbacks. + + @param delegate The delegate for LevelPlay to send callbacks to. + */ + ++ (void)removeImpressionDataDelegate:(id)delegate; + +/** +@abstact Sets the meta data with a key and value. +@discussion This value will be passed to the supporting ad networks. + +@param key The meta data key. +@param value The meta data value + +*/ ++ (void)setMetaDataWithKey:(NSString *)key value:(NSString *)value; + +/** + @abstact Sets the meta data with a key and values. + @discussion This value will be passed to the supporting ad networks. + + @param key The meta data key. + @param values The meta data values. + */ ++ (void)setMetaDataWithKey:(NSString *)key values:(NSMutableArray *)values; + +/** +@abstract Sets the network data according to the network key. + +@param networkKey Network identifier. +@param networkData a dictionary containing the information required by the network. + */ ++ (void)setNetworkDataWithNetworkKey:(NSString *)networkKey + andNetworkData:(NSDictionary *)networkData; + +/** + Sets a dynamic identifier for the current user. + + @param dynamicUserId Dynamic user identifier. + @return`BOOL` that indicates if the dynamic identifier is valid. + */ ++ (BOOL)setDynamicUserId:(NSString *)dynamicUserId; + +/** + Sets if LevelPlay SDK should allow ad networks debug logs. + + @param flag to allow ad networks debug logs,. + */ ++ (void)setAdaptersDebug:(BOOL)flag; + +/** + @abstract Sets a segment. + @discussion This method is used to start a session with a spesific segment. + + @param segment A segment object. + */ ++ (void)setSegment:(LPMSegment *)segment; + +#pragma mark - Test Suite + +/** + @abstract Launches the Test Suite. Mediation SDK must be initialized before calling this method. + @param viewController The UIViewController to display the Test Suite within. +*/ ++ (void)launchTestSuite:(UIViewController *)viewController; + +#pragma mark - Validate Integration + +/** + @abstract A tool to verify a successful integration of the IronSource SDK and any additional + adapters. + @discussion The Integration Helper tool portray the compatibility between the SDK and adapter + versions, and makes sure all required dependencies and frameworks were added for the various + mediated ad networks. + + Once you have finished your integration, call the 'validateIntegration' function and confirm that + everything in your integration is marked as VERIFIED. + */ + ++ (void)validateIntegration; + +/** + @abstract Sets the consent value. + @discussion Sets the consent, boolean value that indicates whether the user has granted consent for + the SDK to collect and share data. Consent is used for GDPR compliance. + @param consent value. + */ ++ (void)setConsent:(BOOL)consent; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LevelPlayBaseAdapter.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LevelPlayBaseAdapter.h new file mode 100644 index 0000000..ac8de3d --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LevelPlayBaseAdapter.h @@ -0,0 +1,23 @@ +// +// LevelPlayBaseAdapter.h +// Pods +// +// Created by Maoz Elbaz on 09/05/2025. +// + +#ifndef LevelPlayBaseAdapter_h +#define LevelPlayBaseAdapter_h + +#import "ISAdapterAdaptiveProtocol.h" +#import "ISBaseNetworkAdapter.h" +#import "ISBiddingDataProtocol.h" +NS_ASSUME_NONNULL_BEGIN + +@interface LevelPlayBaseAdapter + : ISBaseNetworkAdapter + +@end + +NS_ASSUME_NONNULL_END + +#endif /* LevelPlayBaseAdapter_h */ diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LevelPlayBaseBannerAdapter.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LevelPlayBaseBannerAdapter.h new file mode 100644 index 0000000..63c971e --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LevelPlayBaseBannerAdapter.h @@ -0,0 +1,23 @@ +// +// LevelPlayBaseBannerAdapter.h +// Pods +// +// Created by Maoz Elbaz on 09/05/2025. +// + +#ifndef LevelPlayBaseBannerAdapter_h +#define LevelPlayBaseBannerAdapter_h + +#import "ISBaseBanner.h" +#import "ISBaseBannerAdapter.h" +#import "ISBiddingDataProtocol.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface LevelPlayBaseBannerAdapter : ISBaseBanner + +@end + +NS_ASSUME_NONNULL_END + +#endif /* LevelPlayBaseBannerAdapter_h */ diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LevelPlayBaseInterstitialAdapter.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LevelPlayBaseInterstitialAdapter.h new file mode 100644 index 0000000..75d561e --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LevelPlayBaseInterstitialAdapter.h @@ -0,0 +1,21 @@ +// +// LevelPlayBaseInterstitialAdapter.h +// Pods +// +// Created by Maoz Elbaz on 09/05/2025. +// + +#ifndef LevelPlayBaseInterstitialAdapter_h +#define LevelPlayBaseInterstitialAdapter_h + +#import "ISBaseInterstitial.h" +#import "ISBiddingDataProtocol.h" +NS_ASSUME_NONNULL_BEGIN + +@interface LevelPlayBaseInterstitialAdapter : ISBaseInterstitial + +@end + +NS_ASSUME_NONNULL_END + +#endif /* LevelPlayBaseInterstitialAdapter_h */ diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LevelPlayBaseNativeAdAdapter.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LevelPlayBaseNativeAdAdapter.h new file mode 100644 index 0000000..be7a054 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LevelPlayBaseNativeAdAdapter.h @@ -0,0 +1,22 @@ +// +// LevelPlayBaseNativeAdAdapter.h +// IronSourceSDK +// +// Created by Ronit Epstein on 15/06/2025. +// + +#ifndef LevelPlayBaseNativeAdAdapter_h +#define LevelPlayBaseNativeAdAdapter_h + +#import "ISBaseNativeAd.h" +#import "ISBiddingDataProtocol.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface LevelPlayBaseNativeAdAdapter : ISBaseNativeAd + +@end + +NS_ASSUME_NONNULL_END + +#endif /* LevelPlayBaseNativeAdAdapter_h */ diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LevelPlayBaseRewardedAdapter.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LevelPlayBaseRewardedAdapter.h new file mode 100644 index 0000000..cc38a00 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LevelPlayBaseRewardedAdapter.h @@ -0,0 +1,23 @@ +// +// LevelPlayBaseRewardedAdapter.h +// Pods +// +// Created by Maoz Elbaz on 09/05/2025. +// + +#ifndef LevelPlayBaseRewardedAdapter_h +#define LevelPlayBaseRewardedAdapter_h + +#import "ISBaseRewardedVideo.h" +#import "ISBiddingDataProtocol.h" +NS_ASSUME_NONNULL_BEGIN + +@interface LevelPlayBaseRewardedAdapter : ISBaseRewardedVideo + +- (NSString *)dynamicUserId; + +@end + +NS_ASSUME_NONNULL_END + +#endif /* LevelPlayBaseRewardedAdapter_h */ diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LevelPlayMediaView.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LevelPlayMediaView.h new file mode 100644 index 0000000..7048468 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LevelPlayMediaView.h @@ -0,0 +1,13 @@ +// +// LevelPlayMediaView.h +// IronSource +// +// Created by Hadar Pur on 04/06/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +#import + +@interface LevelPlayMediaView : UIView + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LevelPlayNativeAd.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LevelPlayNativeAd.h new file mode 100644 index 0000000..f160900 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LevelPlayNativeAd.h @@ -0,0 +1,30 @@ +// +// LevelPlayNativeAd.h +// IronSource +// +// Created by Hadar Pur on 04/06/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +#import +#import "ISAdapterNativeAdViewBinder.h" +#import "ISNativeAdDataProtocol.h" +#import "LevelPlayNativeAdBuilder.h" +#import "LevelPlayNativeAdDelegate.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface LevelPlayNativeAd : NSObject + +@property(nonatomic, strong, nullable) ISAdapterNativeAdViewBinder *nativeAdViewBinder; + +- (instancetype)initWithBuilder:(LevelPlayNativeAdBuilder *)builder; + +- (void)loadAd; +- (void)destroyAd; +- (void)setDelegate:(id)delegate; +- (NSString *)getObjectId; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LevelPlayNativeAdBuilder.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LevelPlayNativeAdBuilder.h new file mode 100644 index 0000000..9990395 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LevelPlayNativeAdBuilder.h @@ -0,0 +1,28 @@ +// +// LevelPlayNativeAdBuilder.h +// IronSource +// +// Created by Maoz Elbaz on 11/07/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +#import +#import "LevelPlayNativeAdDelegate.h" + +@class LevelPlayNativeAd; + +@interface LevelPlayNativeAdBuilder : NSObject + +@property(nonatomic, strong) NSString *placementName; +@property(nonatomic, weak) id delegate; +@property(nonatomic, weak) UIViewController *viewController; + +- (LevelPlayNativeAdBuilder *)withViewController:(UIViewController *)viewController; + +- (LevelPlayNativeAdBuilder *)withPlacementName:(NSString *)placementName; + +- (LevelPlayNativeAdBuilder *)withDelegate:(id)delegate; + +- (LevelPlayNativeAd *)build; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LevelPlayNativeAdDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LevelPlayNativeAdDelegate.h new file mode 100644 index 0000000..8b1a5dc --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LevelPlayNativeAdDelegate.h @@ -0,0 +1,14 @@ +// +// LevelPlayNativeAdDelegate.h +// IronSource +// +// Created by Hadar Pur on 22/06/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +#import "ISNativeAdInteractionDelegate.h" +#import "ISNativeAdLoadDelegate.h" + +@protocol LevelPlayNativeAdDelegate + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/UIView+ISNativeView.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/UIView+ISNativeView.h new file mode 100644 index 0000000..265e84e --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/UIView+ISNativeView.h @@ -0,0 +1,18 @@ +// +// UIView+ISNativeView.h +// IronSourceSDK +// +// Copyright © 2022 IronSource. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface UIView (ISNativeView) + +- (void)addSubviewAndAdjust:(UIView *)view; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Info.plist b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Info.plist new file mode 100644 index 0000000..26ebed7 Binary files /dev/null and b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Info.plist differ diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/IronSource b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/IronSource new file mode 100644 index 0000000..93730ec Binary files /dev/null and b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/IronSource differ diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Modules/module.modulemap b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Modules/module.modulemap new file mode 100644 index 0000000..d453899 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Modules/module.modulemap @@ -0,0 +1,6 @@ +framework module IronSource { + umbrella header "IronSource.h" + + export * + module * { export * } +} diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/PrivacyInfo.xcprivacy b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..717d9e9 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/PrivacyInfo.xcprivacy @@ -0,0 +1,27 @@ + + + + + NSPrivacyCollectedDataTypes + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryDiskSpace + NSPrivacyAccessedAPITypeReasons + + E174.1 + + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + NSPrivacyAccessedAPITypeReasons + + CA92.1 + + + + + diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAAdFormat.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAAdFormat.h new file mode 100644 index 0000000..3461202 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAAdFormat.h @@ -0,0 +1,43 @@ +// +// ISAAdFormat.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + Enum representing available ad formats. + */ +typedef NS_ENUM(NSUInteger, ISAAdFormatType) { + ISAAdFormatTypeInterstitial, + ISAAdFormatTypeRewarded, + ISAAdFormatTypeBanner +}; + +/** + Class representing an ad format. + */ +@interface ISAAdFormat : NSObject + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +/** + The ad format type. + */ +@property(readonly, nonatomic) ISAAdFormatType adFormatType; + +/** + Initializes with the given ad format type. + + @param adFormatType the ad format type to represent. + */ +- (instancetype)initWithAdFormatType:(ISAAdFormatType)adFormatType; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAAdSize.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAAdSize.h new file mode 100644 index 0000000..7871c68 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAAdSize.h @@ -0,0 +1,46 @@ +// +// ISAAdSize.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + Class representing an ad size. + */ +@interface ISAAdSize : NSObject + +@property(nonatomic, readonly) CGFloat width; +@property(nonatomic, readonly) CGFloat height; +@property(nonatomic, readonly, copy) NSString *sizeDescription; + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +/** + Creates an `ISAAdSize` for a banner ad. + */ ++ (ISAAdSize *)banner; + +/** + Creates an `ISAAdSize` for a large ad. + */ ++ (ISAAdSize *)large; + +/** + Creates an `ISAAdSize` for a medium rectangle ad. + */ ++ (ISAAdSize *)mediumRectangle; + +/** + Creates an `ISAAdSize` for a leaderboard ad. + */ ++ (ISAAdSize *)leaderboard; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISABannerAdInfo.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISABannerAdInfo.h new file mode 100644 index 0000000..ff5fc2c --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISABannerAdInfo.h @@ -0,0 +1,32 @@ +// +// ISABannerAdInfo.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + Class containing information on the associated banner ad. + */ +@interface ISABannerAdInfo : NSObject + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +/** + The identifier of the network instance. + */ +@property(nonatomic, strong, readonly) NSString *instanceId; + +/** + The unique identifier of the ad. + */ +@property(nonatomic, strong, readonly) NSString *adId; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISABannerAdLoader.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISABannerAdLoader.h new file mode 100644 index 0000000..6fb52f9 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISABannerAdLoader.h @@ -0,0 +1,35 @@ +// +// ISNBannerLoader.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import "ISABannerAdLoaderDelegate.h" +#import "ISABannerAdRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + Class responsible for loading banner ads. + */ +@interface ISABannerAdLoader : NSObject + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +/** + Loads a banner ad. + The delegate will send a `bannerAdDidLoad:` or + `bannerAdDidFailToLoadWithError:` callback. + + @param adRequest The request configuration for the ad to be loaded. + @param delegate The delegate to be notified of ad loading callbacks. The callbacks will be invoked + on the main thread. The delegate is held weakly. + */ ++ (void)loadAdWithAdRequest:(ISABannerAdRequest *)adRequest + delegate:(id)delegate; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISABannerAdLoaderDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISABannerAdLoaderDelegate.h new file mode 100644 index 0000000..6dcbd39 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISABannerAdLoaderDelegate.h @@ -0,0 +1,34 @@ +// +// ISABannerAdLoaderDelegate.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import "ISABannerAdView.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + Protocol handling loading callbacks for a requested banner ad. + The callbacks will be invoked on the main thread. + */ +@protocol ISABannerAdLoaderDelegate + +/** + Called when a banner ad is successfully loaded. + + @param bannerAdView The banner ad that is loaded. + */ +- (void)bannerAdDidLoad:(ISABannerAdView *)bannerAdView; + +/** + Called when a banner ad fails to load. + + @param error The error that occurred during loading. + */ +- (void)bannerAdDidFailToLoadWithError:(NSError *)error; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISABannerAdRequest.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISABannerAdRequest.h new file mode 100644 index 0000000..5c2a8ba --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISABannerAdRequest.h @@ -0,0 +1,49 @@ +// +// ISNBannerAdRequest.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import +#import "ISAAdSize.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + Class representing a loading request for a banner ad. + Use `ISABannerAdRequestBuilder` in order to create an instance of this class. + */ +@interface ISABannerAdRequest : NSObject + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +/** + The identifier for the network instance. + */ +@property(nonatomic, strong, readonly) NSString *instanceId; + +/** + The ad markup. + */ +@property(nonatomic, strong, readonly) NSString *adm; + +/** + The ad size. + */ +@property(nonatomic, strong, readonly) ISAAdSize *size; + +/** + The view controller to show the ad on, if available. + */ +@property(nonatomic, weak, readonly, nullable) UIViewController *viewController; + +/** + Extra parameters for the ad request. + */ +@property(nonatomic, strong, readonly, nullable) NSDictionary *extraParams; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISABannerAdRequestBuilder.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISABannerAdRequestBuilder.h new file mode 100644 index 0000000..6c1bef9 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISABannerAdRequestBuilder.h @@ -0,0 +1,61 @@ +// +// ISABannerAdRequestBuilder.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import +#import "ISAAdSize.h" +#import "ISABannerAdRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + Builder class for `ISABannerAdRequest`. + */ +@interface ISABannerAdRequestBuilder : NSObject + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +/** + Initializes the builder. + + @param instanceId The identifier for the network instance. + @param adm The ad markup. + @param size The ad size. + */ +- (instancetype)initWithInstanceId:(NSString *)instanceId + adm:(NSString *)adm + size:(ISAAdSize *)size; + +/** + Sets extra parameters for the ad request. + Optional. + + @param extraParams The extra parameters dictionary. + + @return The Builder instance. + */ +- (ISABannerAdRequestBuilder *)withExtraParams:(NSDictionary *)extraParams; + +/** + Sets the view controller that will show the ad, if available. + + @param viewController The view controller that will show the ad, if available. + + @return The Builder instance. + */ +- (ISABannerAdRequestBuilder *)withViewController:(UIViewController *)viewController; + +/** + Builds the `ISABannerAdRequest` instance. + + @return The ad request instance. + */ +- (ISABannerAdRequest *)build; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISABannerAdView.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISABannerAdView.h new file mode 100644 index 0000000..6d09f2d --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISABannerAdView.h @@ -0,0 +1,26 @@ +// +// ISNBannerAdView.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import +#import +#import "ISABannerAdInfo.h" +#import "ISABannerAdViewDelegate.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface ISABannerAdView : UIView + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +@property(nonatomic, weak, nullable) id delegate; +@property(nonatomic, strong, readonly) ISABannerAdInfo* adInfo; +@property(nonatomic, weak, nullable) UIViewController* viewController; + +NS_ASSUME_NONNULL_END + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISABannerAdViewDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISABannerAdViewDelegate.h new file mode 100644 index 0000000..fb0f2af --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISABannerAdViewDelegate.h @@ -0,0 +1,34 @@ +// +// ISABannerAdViewDelegate.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +NS_ASSUME_NONNULL_BEGIN + +@class ISABannerAdView; + +/** + Protocol handling banner ad show events for `ISABannerAd`. + The callbacks will be invoked on the main thread. + */ +@protocol ISABannerAdViewDelegate + +/** + Called when a banner ad is shown. + + @param bannerAdView The banner ad that is shown. + */ +- (void)bannerAdViewDidShow:(ISABannerAdView *)bannerAdView; + +/** + Called when a banner ad is clicked. + + @param bannerAdView The banner ad that is clicked. + */ +- (void)bannerAdViewDidClick:(ISABannerAdView *)bannerAdView; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAInitRequest.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAInitRequest.h new file mode 100644 index 0000000..a26839b --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAInitRequest.h @@ -0,0 +1,45 @@ +// +// ISAInitRequest.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import +#import "ISAAdFormat.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + Enum representing the different log levels in IronSourceAds. + */ +typedef NS_ENUM(NSInteger, ISALogLevel) { ISALogLevelNone, ISALogLevelError, ISALogLevelVerbose }; + +/** + Class representing an initialization request for IronSourceAds. + Use `ISAInitRequestBuilder` to create an instance of this class. + */ +@interface ISAInitRequest : NSObject + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +/** + The application key. + */ +@property(readonly, nonatomic) NSString *appKey; + +/** + Legacy ad formats for the initialization request. + */ +@property(readonly, nonatomic) NSArray *legacyAdFormats; + +/** + Log level to use in IronSourceAds. + Default value is `ISALogLevelNone`. + */ +@property(readonly, nonatomic) ISALogLevel logLevel; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAInitRequestBuilder.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAInitRequestBuilder.h new file mode 100644 index 0000000..5938300 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAInitRequestBuilder.h @@ -0,0 +1,59 @@ +// +// ISAInitRequestBuilder.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import +#import "ISAAdFormat.h" +#import "ISAInitRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + Builder class for `ISAInitRequest`. + */ +@interface ISAInitRequestBuilder : NSObject + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +/** + Initializes the builder. + + @param appKey the application key. + */ +- (instancetype)initWithAppKey:(NSString *)appKey; + +/** + Builds the `ISAInitRequest` instance. + + @return The init request instance. + */ +- (ISAInitRequest *)build; + +/** + Sets the legacy ad formats for the initialization request. + To enable non-bidding instances, pass the relevant legacy ad formats. + For bidding instances, this is non-mandatory. + + @param legacyAdFormats The list of legacy ad formats. + + @return The Builder instance. + */ +- (ISAInitRequestBuilder *)withLegacyAdFormats:(NSArray *)legacyAdFormats; + +/** + Sets the log level for the initialization request. + Default value is `ISALogLevelNone`. + + @param logLevel The log level. + + @return The Builder instance. + */ +- (ISAInitRequestBuilder *)withLogLevel:(ISALogLevel)logLevel; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAInterstitialAd.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAInterstitialAd.h new file mode 100644 index 0000000..71aa302 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAInterstitialAd.h @@ -0,0 +1,54 @@ +// +// ISAInterstitialAd.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import +#import +#import "ISAInterstitialAdDelegate.h" +#import "ISAInterstitialAdInfo.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + Class responsible for handling the operations and callbacks of an interstitial ad. + */ +@interface ISAInterstitialAd : NSObject + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +/** + The delegate for the ad callbacks. + Set this delegate in order to receive callbacks from the ad. + The callbacks will be invoked on the main thread. + */ +@property(nonatomic, weak, nullable) id delegate; + +/** + Contains information associated with the ad. + */ +@property(nonatomic, strong, readonly) ISAInterstitialAdInfo *adInfo; + +/** + Check if the ad is ready to show. + Showing an ad that is not ready will result in a show failure. + + @return Whether the ad is ready to show. + */ +- (BOOL)isReadyToShow; + +/** + Show the ad. + The delegate will send a `interstitialAdDidShow:` or + `interstitialAd:didFailToShowWithError:` callback. + + @param viewController The view controller where the ad will be shown. + */ +- (void)showFromViewController:(UIViewController *)viewController; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAInterstitialAdDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAInterstitialAdDelegate.h new file mode 100644 index 0000000..4d3784c --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAInterstitialAdDelegate.h @@ -0,0 +1,49 @@ +// +// ISAInterstitialAdDelegate.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +NS_ASSUME_NONNULL_BEGIN + +@class ISAInterstitialAd; + +/** + Protocol handling interstitial ad show events for `ISAInterstitialAd`. + The callbacks will be invoked on the main thread. + */ +@protocol ISAInterstitialAdDelegate + +/** + Called when an interstitial ad is shown. + + @param interstitialAd The interstitial ad that is shown. + */ +- (void)interstitialAdDidShow:(ISAInterstitialAd *)interstitialAd; + +/** + Called when an interstitial ad fails to show. + + @param interstitialAd The interstitial ad that fails to show. + @param error The error that occurred. + */ +- (void)interstitialAd:(ISAInterstitialAd *)interstitialAd didFailToShowWithError:(NSError *)error; + +/** + Called when an interstitial ad is clicked. + + @param interstitialAd The interstitial ad that is clicked. + */ +- (void)interstitialAdDidClick:(ISAInterstitialAd *)interstitialAd; + +/** + Called when an interstitial ad is dismissed. + + @param interstitialAd The interstitial ad that is dismissed. + */ +- (void)interstitialAdDidDismiss:(ISAInterstitialAd *)interstitialAd; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAInterstitialAdInfo.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAInterstitialAdInfo.h new file mode 100644 index 0000000..56755df --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAInterstitialAdInfo.h @@ -0,0 +1,32 @@ +// +// ISAInterstitialAdInfo.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + Class containing information on the associated interstitial ad. + */ +@interface ISAInterstitialAdInfo : NSObject + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +/** + The identifier of the network instance. + */ +@property(nonatomic, strong, readonly) NSString *instanceId; + +/** + The unique identifier of the ad. + */ +@property(nonatomic, strong, readonly) NSString *adId; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAInterstitialAdLoader.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAInterstitialAdLoader.h new file mode 100644 index 0000000..147962f --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAInterstitialAdLoader.h @@ -0,0 +1,36 @@ +// +// ISNLoaderInterstitial.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import +#import "ISAInterstitialAdLoaderDelegate.h" +#import "ISAInterstitialAdRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + Class responsible for loading interstitial ads. + */ +@interface ISAInterstitialAdLoader : NSObject + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +/** + Loads an interstitial ad. + The delegate will send a `interstitialAdDidLoad:` or + `interstitialAdDidFailToLoadWithError:` callback. + + @param adRequest The request configuration for the ad to be loaded. + @param delegate The delegate to be notified of ad loading callbacks. The callbacks will be invoked + on the main thread. The delegate is held weakly. + */ ++ (void)loadAdWithAdRequest:(ISAInterstitialAdRequest *)adRequest + delegate:(id)delegate; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAInterstitialAdLoaderDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAInterstitialAdLoaderDelegate.h new file mode 100644 index 0000000..0bce215 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAInterstitialAdLoaderDelegate.h @@ -0,0 +1,34 @@ +// +// ISAInterstitialAdLoaderDelegate.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import "ISAInterstitialAd.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + Protocol handling loading callbacks for a requested interstitial ad. + The callbacks will be invoked on the main thread. + */ +@protocol ISAInterstitialAdLoaderDelegate + +/** + Called when an interstitial ad is successfully loaded. + + @param interstitialAd The interstitial ad that is loaded. + */ +- (void)interstitialAdDidLoad:(ISAInterstitialAd *)interstitialAd; + +/** + Called when an interstitial ad fails to load. + + @param error The error that occurred during loading. + */ +- (void)interstitialAdDidFailToLoadWithError:(NSError *)error; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAInterstitialAdRequest.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAInterstitialAdRequest.h new file mode 100644 index 0000000..bee365f --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAInterstitialAdRequest.h @@ -0,0 +1,38 @@ +// +// ISAInterstitialAdRequest.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + Class representing a loading request for an interstitial ad. + Use `ISAInterstitialAdRequestBuilder` in order to create an instance of this class. + */ +@interface ISAInterstitialAdRequest : NSObject + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +/** + The identifier for the network instance. + */ +@property(readonly, nonatomic, strong) NSString *instanceId; + +/** + The ad markup. + */ +@property(readonly, nonatomic, strong) NSString *adm; + +/** + Extra parameters for the ad request. + */ +@property(readonly, nonatomic, strong, nullable) NSDictionary *extraParams; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAInterstitialAdRequestBuilder.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAInterstitialAdRequestBuilder.h new file mode 100644 index 0000000..e9e24ae --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAInterstitialAdRequestBuilder.h @@ -0,0 +1,48 @@ +// +// ISAInterstitialAdRequestBuilder.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import +#import "ISAInterstitialAdRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + Builder class for `ISAInterstitialAdRequest`. + */ +@interface ISAInterstitialAdRequestBuilder : NSObject + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +/** + Initializes the builder. + + @param instanceId The identifier for the network instance. + @param adm The ad markup. + */ +- (instancetype)initWithInstanceId:(NSString *)instanceId adm:(NSString *)adm; + +/** + Sets extra parameters for the ad request. + Optional. + + @param extraParams The extra parameters dictionary. + + @return The Builder instance. + */ +- (ISAInterstitialAdRequestBuilder *)withExtraParams:(NSDictionary *)extraParams; + +/** + Builds the `ISAInterstitialAdRequest` instance. + + @return The ad request instance. + */ +- (ISAInterstitialAdRequest *)build; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISARewardedAd.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISARewardedAd.h new file mode 100644 index 0000000..c5939bf --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISARewardedAd.h @@ -0,0 +1,54 @@ +// +// ISARewardedAd.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import +#import +#import "ISARewardedAdDelegate.h" +#import "ISARewardedAdInfo.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + Class responsible for handling the operations and callbacks of a rewarded ad. + */ +@interface ISARewardedAd : NSObject + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +/** + The delegate for the ad callbacks. + Set this delegate in order to receive callbacks from the ad. + The callbacks will be invoked on the main thread. + */ +@property(nonatomic, weak, nullable) id delegate; + +/** + Contains information associated with the ad. + */ +@property(nonatomic, strong, readonly) ISARewardedAdInfo *adInfo; + +/** + Check if the ad is ready to show. + Showing an ad that is not ready will result in a show failure. + + @return Whether the ad is ready to show. + */ +- (BOOL)isReadyToShow; + +/** + Show the ad. + The delegate will send a `rewardedAdDidShow:` or + `rewardedAd:didFailToShowWithError:` callback. + + @param viewController The view controller where the ad will be shown. + */ +- (void)showFromViewController:(UIViewController *)viewController; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISARewardedAdDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISARewardedAdDelegate.h new file mode 100644 index 0000000..4f30afc --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISARewardedAdDelegate.h @@ -0,0 +1,56 @@ +// +// ISARewardedAdDelegate.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +NS_ASSUME_NONNULL_BEGIN + +@class ISARewardedAd; + +/** + Protocol handling rewarded ad show events for `ISARewardedAd`. + The callbacks will be invoked on the main thread. + */ +@protocol ISARewardedAdDelegate + +/** + Called when a rewarded ad is shown. + + @param rewardedAd The rewarded ad that is shown. + */ +- (void)rewardedAdDidShow:(ISARewardedAd *)rewardedAd; + +/** + Called when a rewarded ad fails to show. + + @param rewardedAd The rewarded ad that fails to show. + @param error The error that occurred. + */ +- (void)rewardedAd:(ISARewardedAd *)rewardedAd didFailToShowWithError:(NSError *)error; + +/** + Called when the user earns a reward. + + @param rewardedAd The rewarded ad that the user earns a reward from. + */ +- (void)rewardedAdDidUserEarnReward:(ISARewardedAd *)rewardedAd; + +/** + Called when a rewarded ad is clicked. + + @param rewardedAd The rewarded ad that is clicked. + */ +- (void)rewardedAdDidClick:(ISARewardedAd *)rewardedAd; + +/** + Called when a rewarded ad is dismissed. + + @param rewardedAd The rewarded ad that is dismissed. + */ +- (void)rewardedAdDidDismiss:(ISARewardedAd *)rewardedAd; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISARewardedAdInfo.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISARewardedAdInfo.h new file mode 100644 index 0000000..2a1a0bd --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISARewardedAdInfo.h @@ -0,0 +1,32 @@ +// +// ISARewardedAdInfo.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + Class containing information on the associated rewarded ad. + */ +@interface ISARewardedAdInfo : NSObject + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +/** + The identifier of the network instance. + */ +@property(nonatomic, strong, readonly) NSString *instanceId; + +/** + The unique identifier of the ad. + */ +@property(nonatomic, strong, readonly) NSString *adId; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISARewardedAdLoader.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISARewardedAdLoader.h new file mode 100644 index 0000000..2ffa26f --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISARewardedAdLoader.h @@ -0,0 +1,36 @@ +// +// ISNLoaderRewardedVideo.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import +#import "ISARewardedAdLoaderDelegate.h" +#import "ISARewardedAdRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + Class responsible for loading rewarded ads. + */ +@interface ISARewardedAdLoader : NSObject + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +/** + Loads a rewarded ad. + The delegate will send a `rewardedAdDidLoad:` or + `rewardedAdDidFailToLoadWithError:` callback. + + @param adRequest The request configuration for the ad to be loaded. + @param delegate The delegate to be notified of ad loading callbacks. The callbacks will be invoked + on the main thread. The delegate is held weakly. + */ ++ (void)loadAdWithAdRequest:(ISARewardedAdRequest *)adRequest + delegate:(id)delegate; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISARewardedAdLoaderDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISARewardedAdLoaderDelegate.h new file mode 100644 index 0000000..af3f93d --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISARewardedAdLoaderDelegate.h @@ -0,0 +1,34 @@ +// +// ISARewardedAdLoaderDelegate.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import "ISARewardedAd.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + Protocol handling loading callbacks for a requested rewarded ad. + The callbacks will be invoked on the main thread. + */ +@protocol ISARewardedAdLoaderDelegate + +/** + Called when a rewarded ad is successfully loaded. + + @param rewardedAd The rewarded ad that is loaded. + */ +- (void)rewardedAdDidLoad:(ISARewardedAd *)rewardedAd; + +/** + Called when a rewarded ad fails to load. + + @param error The error that occurred during loading. + */ +- (void)rewardedAdDidFailToLoadWithError:(NSError *)error; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISARewardedAdRequest.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISARewardedAdRequest.h new file mode 100644 index 0000000..082fb82 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISARewardedAdRequest.h @@ -0,0 +1,38 @@ +// +// ISARewardedAdRequest.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + Class representing a loading request for a rewarded ad. + Use `ISARewardedAdRequestBuilder` in order to create an instance of this class. + */ +@interface ISARewardedAdRequest : NSObject + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +/** + The identifier for the network instance. + */ +@property(readonly, nonatomic, strong) NSString *instanceId; + +/** + The ad markup. + */ +@property(readonly, nonatomic, strong) NSString *adm; + +/** + Extra parameters for the ad request. + */ +@property(readonly, nonatomic, strong, nullable) NSDictionary *extraParams; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISARewardedAdRequestBuilder.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISARewardedAdRequestBuilder.h new file mode 100644 index 0000000..05d8b27 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISARewardedAdRequestBuilder.h @@ -0,0 +1,48 @@ +// +// ISARewardedAdRequestBuilder.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import +#import "ISARewardedAdRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + Builder class for `ISARewardedAdRequest`. + */ +@interface ISARewardedAdRequestBuilder : NSObject + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +/** + Initializes the builder. + + @param instanceId The identifier for the network instance. + @param adm The ad markup. + */ +- (instancetype)initWithInstanceId:(NSString *)instanceId adm:(NSString *)adm; + +/** + Sets extra parameters for the ad request. + Optional. + + @param extraParams The extra parameters dictionary. + + @return The Builder instance. + */ +- (ISARewardedAdRequestBuilder *)withExtraParams:(NSDictionary *)extraParams; + +/** + Builds the `ISARewardedAdRequest` instance. + + @return The ad request instance. + */ +- (ISARewardedAdRequest *)build; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdData.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdData.h new file mode 100644 index 0000000..f932e92 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdData.h @@ -0,0 +1,42 @@ +// +// ISAdData.h +// IronSource +// +// Created by Yonti Makmel on 22/04/2021. +// Copyright © 2021 ironSource. All rights reserved. +// +#import +#import "ISAdapterConfig.h" +#import "ISBannerSize.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface ISAdData : NSObject + +// The server data containing the adm +@property(nonatomic, strong, readonly, nullable) NSString *serverData; + +// The server configuration +@property(nonatomic, strong, readonly) NSDictionary *configuration; + +// The configuration holding userId, banner size, ad unit data from auction response and adapter +// config +@property(nonatomic, strong, readonly, nullable) NSDictionary *adUnitData; + +- (instancetype)initWithServerData:(nullable NSString *)serverData + configuration:(NSDictionary *)configuration + adUnitData:(nullable NSDictionary *)adUnitData; + +- (nullable NSString *)getString:(NSString *)key; + +- (NSInteger)getInt:(NSString *)key; + +- (BOOL)getBoolean:(NSString *)key; + +- (nullable NSNumber *)getNumber:(NSString *)key; + +- (nullable NSDictionary *)getAdUnitData; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdInfo.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdInfo.h new file mode 100644 index 0000000..63e90fd --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdInfo.h @@ -0,0 +1,30 @@ +// +// ISAdInfo.h +// IronSource +// +// Copyright © 2022 IronSource. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface ISAdInfo : NSObject + +@property(readonly, copy) NSString* auction_id; +@property(readonly, copy) NSString* ad_network; +@property(readonly, copy) NSString* instance_name; +@property(readonly, copy) NSString* instance_id; +@property(readonly, copy) NSString* country; +@property(readonly, copy) NSNumber* revenue; +@property(readonly, copy) NSString* precision; +@property(readonly, copy) NSString* ab; +@property(readonly, copy) NSString* segment_name; +@property(readonly, copy) NSString* encrypted_cpm; +@property(readonly, copy) NSNumber* conversion_value; + +- (instancetype)init; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdOptionsPosition.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdOptionsPosition.h new file mode 100644 index 0000000..df4e5a2 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdOptionsPosition.h @@ -0,0 +1,17 @@ +// +// ISAdOptionsPosition.h +// IronSource +// +// Created by Hadar Pur on 06/07/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +// ISAdOptionsPosition +typedef NS_ENUM(NSInteger, ISAdOptionsPosition) { + ISAdOptionsPositionTopLeft, + ISAdOptionsPositionTopRight, + ISAdOptionsPositionBottomLeft, + ISAdOptionsPositionBottomRight +}; + +static NSString* const kAdOptionsPosKey = @"adOptionsPos"; diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdUnitAdapterProtocol.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdUnitAdapterProtocol.h new file mode 100644 index 0000000..c95c47a --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdUnitAdapterProtocol.h @@ -0,0 +1,12 @@ +// +// ISAdUnitAdapterProtocol.h +// IronSource +// +// Copyright © 2023 IronSource. All rights reserved. +// + +#import "ISNetworkInitCallbackProtocol.h" + +@protocol ISAdUnitAdapterProtocol + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterAdDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterAdDelegate.h new file mode 100644 index 0000000..9ae73be --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterAdDelegate.h @@ -0,0 +1,59 @@ +// +// ISAdapterAdDelegate.h +// IronSource +// +// Created by Yonti Makmel on 28/04/2021. +// Copyright © 2021 ironSource. All rights reserved. +// + +#ifndef ISAdapterAdDelegate_h +#define ISAdapterAdDelegate_h + +#import "ISAdapterErrorType.h" + +NS_ASSUME_NONNULL_BEGIN + +@protocol ISAdapterAdDelegate + +// Mandatory callbacks + +- (void)adDidLoad; +- (void)adDidLoadWithExtraData:(NSDictionary *)extraData; + +/// @param errorType the load error type, including NO_FILL +/// @param errorCode the error code if available, general ones in AdapterErrors +/// @param errorMessage the error message if available +- (void)adDidFailToLoadWithErrorType:(ISAdapterErrorType)errorType + errorCode:(NSInteger)errorCode + errorMessage:(nullable NSString *)errorMessage; + +/// @param errorType the load error type, including NO_FILL +/// @param errorCode the error code if available, general ones in AdapterErrors +/// @param errorMessage the error message if available +- (void)adDidFailToLoadWithErrorType:(ISAdapterErrorType)errorType + errorCode:(NSInteger)errorCode + errorMessage:(nullable NSString *)errorMessage + extraData:(NSDictionary *)extraData; + +- (void)adDidOpen; +- (void)adDidOpenWithExtraData:(NSDictionary *)extraData; + +/// @param errorCode the error code if available, general ones in AdapterErrors +/// @param errorMessage the error message if available +- (void)adDidFailToShowWithErrorCode:(NSInteger)errorCode + errorMessage:(nullable NSString *)errorMessage; + +/// @param errorCode the error code if available, general ones in AdapterErrors +/// @param errorMessage the error message if available +- (void)adDidFailToShowWithErrorCode:(NSInteger)errorCode + errorMessage:(nullable NSString *)errorMessage + extraData:(NSDictionary *)extraData; + +- (void)adDidClick; +- (void)adDidClickWithExtraData:(NSDictionary *)extraData; + +@end + +NS_ASSUME_NONNULL_END + +#endif /* ISAdapterAdDelegate_h */ diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterAdFullscreenProtocol.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterAdFullscreenProtocol.h new file mode 100644 index 0000000..2be571e --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterAdFullscreenProtocol.h @@ -0,0 +1,40 @@ +// +// ISAdapterAdFullscreenProtocol.h +// IronSource +// +// Copyright © 2023 IronSource. All rights reserved. +// + +#import +#import "ISAdData.h" +#import "ISAdapterAdInteractionDelegate.h" + +@protocol ISAdapterAdFullscreenProtocol + +/// load the ad +/// @param adData data containing the configuration passed from the server and other related +/// parameters passed from the publisher like userId +/// @param delegate the delegate to return mandatory callbacks based on the network - load success, +/// load failure, ad opened, ad closed, show failed optional callbacks - show success, clicked +- (void)loadAdWithAdData:(ISAdData *)adData delegate:(id)delegate; + +/// show the ad +/// @param viewController current viewController for showing the ad +/// @param adData data containing the configuration passed from the server and other related +/// parameters passed from the publisher like userId +/// @param delegate the callback listener +- (void)showAdWithViewController:(UIViewController *)viewController + adData:(ISAdData *)adData + delegate:(id)delegate; + +/// returning whether the ad is available or not +/// @param adData data containing the configuration passed from the server and other related +/// parameters passed from the publisher like userId +- (BOOL)isAdAvailableWithAdData:(ISAdData *)adData; + +/// destroy the ad +/// @param adData data containing the configuration passed from the server and other related +/// parameters passed from the publisher like userId +- (void)destroyAdWithAdData:(ISAdData *)adData; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterAdInteractionDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterAdInteractionDelegate.h new file mode 100644 index 0000000..66c2d4e --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterAdInteractionDelegate.h @@ -0,0 +1,37 @@ +// +// ISAdapterAdInteractionDelegate.h +// IronSource +// +// Created by Bar David on 21/10/2021. +// Copyright © 2021 IronSource. All rights reserved. +// + +#ifndef ISAdapterAdInteractionDelegate_h +#define ISAdapterAdInteractionDelegate_h + +#import "ISAdapterAdDelegate.h" + +NS_ASSUME_NONNULL_BEGIN + +@protocol ISAdapterAdInteractionDelegate + +// Mandatory callbacks + +- (void)adDidClose; +- (void)adDidCloseWithExtraData:(NSDictionary *)extraData; + +// Optional callbacks +- (void)adDidBecomeVisible; +- (void)adDidBecomeVisibleWithExtraData:(NSDictionary *)extraData; + +- (void)adDidStart; +- (void)adDidStartWithExtraData:(NSDictionary *)extraData; + +- (void)adDidEnd; +- (void)adDidEndWithExtraData:(NSDictionary *)extraData; + +@end + +NS_ASSUME_NONNULL_END + +#endif /* ISAdapterAdInteractionDelegate_h */ diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterAdRewardedDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterAdRewardedDelegate.h new file mode 100644 index 0000000..cd85c12 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterAdRewardedDelegate.h @@ -0,0 +1,26 @@ +// +// ISAdapterAdRewardedDelegate.h +// IronSource +// +// Created by Bar David on 21/10/2021. +// Copyright © 2021 IronSource. All rights reserved. +// + +#ifndef ISAdapterAdRewardedDelegate_h +#define ISAdapterAdRewardedDelegate_h + +#import "ISAdapterAdInteractionDelegate.h" + +NS_ASSUME_NONNULL_BEGIN + +@protocol ISAdapterAdRewardedDelegate + +// mandatory callbacks + +- (void)adRewarded; +- (void)adRewardedWithExtraData:(NSDictionary *)extraData; + +@end + +NS_ASSUME_NONNULL_END +#endif /* ISAdapterAdRewardedDelegate_h */ diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterAdViewDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterAdViewDelegate.h new file mode 100644 index 0000000..5316b21 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterAdViewDelegate.h @@ -0,0 +1,66 @@ +// +// ISAdapterAdViewDelegate.h +// IronSource +// +// Created by Guy Lis on 27/03/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +#ifndef ISAdapterAdViewDelegate_h +#define ISAdapterAdViewDelegate_h + +#import +#import "ISAdapterAdDelegate.h" + +@protocol ISAdapterAdViewDelegate + +// mandatory callbacks + +/** + * @param view the view that was loaded + */ +- (void)adDidLoadWithView:(UIView *)view; + +/** + * @param view the view that was loaded + * @param extraData custom data + */ +- (void)adDidLoadWithView:(UIView *)view extraData:(NSDictionary *)extraData; + +// optional callbacks (must be implemented in the adapter but can have empty implementation) + +/** + * This method should be invoked before the user is taken out of the application after a click + */ +- (void)adWillLeaveApplication; + +/** + * This method should be invoked before the user is taken out of the application after a click + * @param extraData custom data + */ +- (void)adWillLeaveApplicationWithExtraData:(NSDictionary *)extraData; + +/** + * This method should be invoked after the ad view presents fullscreen content + */ +- (void)adWillPresentScreen; + +/** + * This method should be invoked after the ad view presents fullscreen content + * @param extraData custom data + */ +- (void)adWillPresentScreenWithExtraData:(NSDictionary *)extraData; + +/** + * This method should be invoked after the fullscreen content is dismissed + */ +- (void)adDidDismissScreen; + +/** + * This method should be invoked after the fullscreen content is dismissed + * @param extraData custom data + */ +- (void)adDidDismissScreenWithExtraData:(NSDictionary *)extraData; +@end + +#endif /* ISAdapterAdViewDelegate_h */ diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterAdaptiveProtocol.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterAdaptiveProtocol.h new file mode 100644 index 0000000..cb58c70 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterAdaptiveProtocol.h @@ -0,0 +1,12 @@ +// +// ISAdapterAdaptiveProtocol.h +// IronSource +// + +#import + +@protocol ISAdapterAdaptiveProtocol + +- (CGFloat)getAdaptiveHeightWithWidth:(CGFloat)width; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterBannerProtocol.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterBannerProtocol.h new file mode 100644 index 0000000..6474b7e --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterBannerProtocol.h @@ -0,0 +1,41 @@ +// +// ISAdapterBannerProtocol.h +// IronSource +// +// Created by Guy Lis on 27/03/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +#import "ISAdData.h" +#import "ISBannerAdDelegate.h" +#import "ISBannerSize.h" + +@protocol ISAdapterBannerProtocol + +/** + * load the ad + * + * @param adData data containing the configuration passed from the server and other related + * parameters passed from the publisher like userId + * @param viewController the application view controller + * @param size the banner size the ad will be presented on + * @param delegate the callback listener to return + * mandatory callbacks based on the network - load success, load failure, ad opened + * optional callbacks - clicked, left application, presented, dismissed + */ +- (void)loadAdWithAdData:(nonnull ISAdData *)adData + viewController:(nonnull UIViewController *)viewController + size:(nonnull ISBannerSize *)size + delegate:(nonnull id)delegate; + +/** + * destroy the ad + * + * @param adData - data containing the configuration passed from the server and other related + * parameters passed from the publisher like userId + */ +- (void)destroyAdWithAdData:(nonnull ISAdData *)adData; + +- (BOOL)isSupportAdaptiveBanner; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterBaseProtocol.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterBaseProtocol.h new file mode 100644 index 0000000..346f63e --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterBaseProtocol.h @@ -0,0 +1,30 @@ +// +// ISAdapterBaseInterface.h +// IronSource +// +// Created by Yonti Makmel on 27/04/2021. +// Copyright © 2021 ironSource. All rights reserved. +// +#import "ISAdData.h" +#import "ISNetworkInitializationDelegate.h" + +#ifndef ISAdapterBaseProtocol_h +#define ISAdapterBaseProtocol_h + +@protocol ISAdapterBaseProtocol + +/// initializes the network +/// @param adData data containing the configuration passed from the server and other related +/// parameters passed from the publisher like userId +/// @param delegate the delegate to return whether the initialization was a success or failure +- (void)init:(ISAdData*)adData delegate:(id)delegate; + +/// returns the network SDK version +- (NSString*)networkSDKVersion; + +/// returns the adapter version +- (NSString*)adapterVersion; + +@end + +#endif /* ISAdapterBaseInterface_h */ diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterConfig.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterConfig.h new file mode 100644 index 0000000..813a0cf --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterConfig.h @@ -0,0 +1,73 @@ +// +// ISAdapterConfig.m +// IronSource +// +// Created by Gili Ariel on 8/1/15. +// Copyright (c) 2015 IronSource. All rights reserved. +// +#import + +#define DEFAULT_CAPPING_PER_DAY 99 +#define DEFAULT_CAPPING_PER_SESSION 99 +#define DEFAULT_CAPPING_PER_ITERATION 99 + +@interface ISAdapterConfig : NSObject + +@property(strong, nonatomic, readonly) NSDictionary *settings; +@property(strong, nonatomic, readonly) NSString *providerName; /* Name from waterfall */ +@property(strong, nonatomic, readonly) NSString *reflectionName; /* Name of Adapter class to load */ +@property(strong, nonatomic, readonly) NSString *name; /* name of adapter in mediation cycle' */ +@property(strong, nonatomic, readonly) NSString *requestUrl; +@property(strong, nonatomic, readonly) NSString *subAdapterId; +@property(strong, nonatomic, readonly) NSString *instanceId; +@property(strong, nonatomic, readonly) NSNumber *maxAdsPerIteration; +@property(strong, nonatomic, readonly) NSNumber *maxAdsPerSession; +@property(strong, nonatomic, readonly) NSString *instanceType; +@property(assign, nonatomic, readonly) NSInteger maxAdsPerDay; +@property(assign, nonatomic, readonly) double loadTimeOutSec; +@property(assign, nonatomic, readonly) BOOL isMultiProviderInstance; +@property(strong, nonatomic, readonly) + NSString *adSourceNameForEvent; // name from adSourceName property on init +@property(assign, nonatomic, readonly) BOOL isBidder; +@property(assign, nonatomic, readonly) BOOL shouldEarlyInit; +@property(strong, nonatomic, readonly) NSString *adFormat; +@property(strong, nonatomic, readonly) NSDictionary *appSettings; +@property(strong, nonatomic, readonly) NSDictionary *interstitialSettings; +@property(strong, nonatomic, readonly) NSDictionary *rewardedVideoSettings; +// The banner settings contains the provider configs which may be changed with the banner +// configuration during the flow, so it's not defined as readonly. +@property(strong, nonatomic) NSDictionary *bannerSettings; +@property(strong, nonatomic, readonly) NSDictionary *nativeAdSettings; + +@property(strong, nonatomic, readonly) NSString + *providerDefaultInstance; /* Name of Adapter class to load (fallback to reflectionName) */ +@property(strong, nonatomic, readonly) + NSString *providerNetworkKey; /* Name to be used in the public API (e.g. setNetworkData) */ +@property(strong, nonatomic, readonly) + NSString *customNetwork; /* name of the custom network is exists */ +@property(assign, nonatomic, readonly) + BOOL isCustomNetwork; /* whether the configuration is for a custom network*/ + +- (instancetype)initWithProviderName:(NSString *)providerName; + +- (void)setSettings:(NSDictionary *)settings; +- (void)setReflectionName:(NSString *)reflectionName; +- (void)setLoadTimeOut:(double)loadTimeOut; +- (void)setAdFormat:(NSString *)adFormat; +- (BOOL)isIronSource; +- (void)setAppSettings:(NSDictionary *)appSettings; +- (void)setInterstitialSettings:(NSDictionary *)interstitialSettings; +- (void)setRewardedVideoSettings:(NSDictionary *)rewardedVideoSettings; +- (void)setBannerSettings:(NSDictionary *)bannerSettings; +- (void)setNativeAdSettings:(NSDictionary *)nativeAdSettings; +- (void)setProviderDefaultInstance:(NSString *)providerDefaultInstance; +- (void)setIsOneFlow:(BOOL)isOneFlow; +- (NSString *_Nullable)customNetworkAdapterNameForAdFormat:(NSString *_Nullable)adFormat; +- (NSDictionary *)adUnitSettings; +- (NSString *)demandSourceName; +- (NSNumber *)isOneFlow; + +- (BOOL)hasConsentCMP; +- (BOOL)getConsentCMP; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterConsentProtocol.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterConsentProtocol.h new file mode 100644 index 0000000..3b52b4d --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterConsentProtocol.h @@ -0,0 +1,17 @@ +// +// ISAdapterConsentProtocol.h +// IronSource +// +// Created by Yonti Makmel on 16/06/2021. +// Copyright © 2021 ironSource. All rights reserved. +// +#ifndef ISAdapterConsentProtocol_h +#define ISAdapterConsentProtocol_h + +@protocol ISAdapterConsentProtocol + +- (void)setConsent:(BOOL)consent; + +@end + +#endif /* ISAdapterConsentProtocol_h */ diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterDebugProtocol.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterDebugProtocol.h new file mode 100644 index 0000000..f852338 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterDebugProtocol.h @@ -0,0 +1,17 @@ +// +// ISAdapterDebugProtocol.h +// IronSource +// +// Created by Yonti Makmel on 16/06/2021. +// Copyright © 2021 ironSource. All rights reserved. +// +#ifndef ISAdapterDebugProtocol_h +#define ISAdapterDebugProtocol_h + +@protocol ISAdapterDebugProtocol + +- (void)setAdapterDebug:(BOOL)adapterDebug; + +@end + +#endif /* ISAdapterDebugProtocol_h */ diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterErrorType.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterErrorType.h new file mode 100644 index 0000000..d0ec92d --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterErrorType.h @@ -0,0 +1,20 @@ +// +// ISAdapterErrorType.h +// IronSource +// +// Created by Guy Lis on 11/08/2021. +// Copyright © 2021 ironSource. All rights reserved. +// + +#import + +#ifndef ISAdapterErrorType_h +#define ISAdapterErrorType_h + +typedef NS_ENUM(NSInteger, ISAdapterErrorType) { + ISAdapterErrorTypeNoFill, + ISAdapterErrorTypeAdExpired, + ISAdapterErrorTypeInternal +}; + +#endif /* ISAdapterErrorType_h */ diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterErrors.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterErrors.h new file mode 100644 index 0000000..3826c1f --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterErrors.h @@ -0,0 +1,19 @@ +// +// AdapterErrors.h +// IronSource +// +// Created by Guy Lis on 05/07/2021. +// Copyright © 2021 ironSource. All rights reserved. +// + +#ifndef AdapterErrors_h +#define AdapterErrors_h + +typedef NS_ENUM(NSInteger, ISAdapterErrors) { + ISAdapterErrorInternal = 1000, // internal error + ISAdapterErrorAdExpired = 1001, // expired ad error + ISAdapterErrorMissingParams = 1002 // missing parameters error + +}; + +#endif /* AdapterErrors_h */ diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterMetaDataProtocol.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterMetaDataProtocol.h new file mode 100644 index 0000000..6efa7a6 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterMetaDataProtocol.h @@ -0,0 +1,18 @@ +// +// ISAdapterMetaDataProtocol.h +// IronSource +// +// Created by Guy Lis on 06/07/2021. +// Copyright © 2021 ironSource. All rights reserved. +// + +#ifndef ISAdapterMetaDataProtocol_h +#define ISAdapterMetaDataProtocol_h + +@protocol ISAdapterMetaDataProtocol + +- (void)setMetaDataWithKey:(NSString *)key andValues:(NSMutableArray *)values; + +@end + +#endif /* ISAdapterMetaDataProtocol_h */ diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterNativeAdData.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterNativeAdData.h new file mode 100644 index 0000000..0d53345 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterNativeAdData.h @@ -0,0 +1,18 @@ +// +// ISAdapterNativeAdData.h +// IronSource +// +// Created by Hadar Pur on 27/06/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +#import +#import "ISNativeAdDataProtocol.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface ISAdapterNativeAdData : NSObject + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterNativeAdProtocol.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterNativeAdProtocol.h new file mode 100644 index 0000000..a7b118f --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterNativeAdProtocol.h @@ -0,0 +1,36 @@ +// +// ISAdapterNativeAdProtocol.h +// IronSource +// +// Created by Hadar Pur on 28/06/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +#import "ISAdData.h" +#import "ISNativeAdDelegate.h" + +@protocol ISAdapterNativeAdProtocol + +/** + * load the ad + * + * @param adData data containing the configuration passed from the server and other related + * parameters passed from the publisher like userId + * @param viewController the application view controller + * @param delegate the callback listener to return + * mandatory callbacks based on the network - load success, load failure, ad opened + * optional callbacks - clicked, left application, presented, dismissed + */ +- (void)loadAdWithAdData:(nonnull ISAdData *)adData + viewController:(nonnull UIViewController *)viewController + delegate:(nonnull id)delegate; + +/** + * destroy the ad + * + * @param adData - data containing the configuration passed from the server and other related + * parameters passed from the publisher like userId + */ +- (void)destroyAdWithAdData:(nonnull ISAdData *)adData; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterNativeAdViewBinder.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterNativeAdViewBinder.h new file mode 100644 index 0000000..6b98eee --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterNativeAdViewBinder.h @@ -0,0 +1,16 @@ +// +// ISAdapterNativeAdViewBinder.h +// IronSource +// +// Created by Hadar Pur on 19/06/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +#import "ISAdapterNativeAdViewBinderProtocol.h" +#import "ISNativeAdViewHolder.h" + +@interface ISAdapterNativeAdViewBinder : NSObject + +@property(nonatomic, strong, nullable) ISNativeAdViewHolder *adViewHolder; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterNativeAdViewBinderProtocol.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterNativeAdViewBinderProtocol.h new file mode 100644 index 0000000..c6ebb7b --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterNativeAdViewBinderProtocol.h @@ -0,0 +1,24 @@ +// +// ISAdapterNativeAdViewBinderProtocol.h +// IronSource +// +// Created by Hadar Pur on 02/07/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +#import +#import "ISNativeAdViewBinderProtocol.h" + +NS_ASSUME_NONNULL_BEGIN + +@protocol ISAdapterNativeAdViewBinderProtocol + +@required + +@property(nonatomic, strong, nullable) UIView *networkNativeAdView; + +- (void)setNativeAdView:(UIView *_Nullable)nativeAdView; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterNetworkData.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterNetworkData.h new file mode 100644 index 0000000..8596be2 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterNetworkData.h @@ -0,0 +1,14 @@ +// +// ISAdapterNetworkData.h +// IronSourceSDK +// + +@protocol ISAdapterNetworkData + +@required + +- (NSDictionary *)allData; + +- (id)dataByKeyIgnoreCase:(NSString *)desiredKey valueType:(Class)valueType; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterNetworkDataProtocol.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterNetworkDataProtocol.h new file mode 100644 index 0000000..fe167c0 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterNetworkDataProtocol.h @@ -0,0 +1,14 @@ +// +// ISAdapterNetworkDataProtocol.h +// IronSourceSDK +// + +#import "ISAdapterNetworkData.h" + +@protocol ISAdapterNetworkDataProtocol + +@required + +- (void)setNetworkData:(id)networkData; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAppStoreErrorDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAppStoreErrorDelegate.h new file mode 100644 index 0000000..2b2a9eb --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAppStoreErrorDelegate.h @@ -0,0 +1,15 @@ +// +// ISAppStoreErrorDelegate.h +// IronSourceSDK +// +// Created by Gal Salti on 27/09/2023. +// + +#import "ISNAppStoreVCRootViewDelegate.h" + +NS_ASSUME_NONNULL_BEGIN + +@protocol ISAppStoreErrorDelegate +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBannerAdDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBannerAdDelegate.h new file mode 100644 index 0000000..01bb94c --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBannerAdDelegate.h @@ -0,0 +1,18 @@ +// +// ISBannerAdDelegate.h +// IronSource +// +// Created by Guy Lis on 27/03/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +#import "ISAdapterAdViewDelegate.h" + +#ifndef ISBannerAdDelegate_h +#define ISBannerAdDelegate_h + +@protocol ISBannerAdDelegate + +@end + +#endif /* ISBannerAdDelegate_h */ diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBannerAdapterDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBannerAdapterDelegate.h new file mode 100644 index 0000000..eeb7e81 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBannerAdapterDelegate.h @@ -0,0 +1,52 @@ +// +// ISBannerAdapterDelegate.h +// IronSource +// +// Created by Pnina Rapoport on 02/04/2017. +// Copyright © 2017 Supersonic. All rights reserved. +// + +#import +#import + +@protocol ISBannerAdapterDelegate + +@required + +- (void)adapterBannerInitSuccess; +- (void)adapterBannerInitSuccessWithExtraData:(NSDictionary *)extraData; + +- (void)adapterBannerInitFailedWithError:(NSError *)error; +- (void)adapterBannerInitFailedWithError:(NSError *)error + extraData:(NSDictionary *)extraData; + +- (void)adapterBannerDidLoad:(UIView *)bannerView; +- (void)adapterBannerDidLoad:(UIView *)bannerView + extraData:(NSDictionary *)extraData; + +- (void)adapterBannerDidFailToLoadWithError:(NSError *)error; +- (void)adapterBannerDidFailToLoadWithError:(NSError *)error + extraData:(NSDictionary *)extraData; + +- (void)adapterBannerDidClick; +- (void)adapterBannerDidClickWithExtraData:(NSDictionary *)extraData; + +#pragma mark - optional - when supported by network + +- (void)adapterBannerWillPresentScreen; +- (void)adapterBannerWillPresentScreenWithExtraData:(NSDictionary *)extraData; + +- (void)adapterBannerDidDismissScreen; +- (void)adapterBannerDidDismissScreenWithExtraData:(NSDictionary *)extraData; + +- (void)adapterBannerWillLeaveApplication; +- (void)adapterBannerWillLeaveApplicationWithExtraData:(NSDictionary *)extraData; + +- (void)adapterBannerDidShow; +- (void)adapterBannerDidShowWithExtraData:(NSDictionary *)extraData; + +- (void)adapterBannerDidFailToShowWithError:(NSError *)error; +- (void)adapterBannerDidFailToShowWithError:(NSError *)error + extraData:(NSDictionary *)extraData; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBannerAdapterProtocol.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBannerAdapterProtocol.h new file mode 100644 index 0000000..60a5638 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBannerAdapterProtocol.h @@ -0,0 +1,60 @@ +// +// ISBannerAdapterProtocol.h +// IronSource +// +// Created by Pnina Rapoport on 02/04/2017. +// Copyright © 2017 IronSource. All rights reserved. +// + +#import +#import +#import "ISAdUnitAdapterProtocol.h" +#import "ISBannerAdapterDelegate.h" +#import "ISBannerSize.h" +#import "ISBiddingDataDelegate.h" + +@class ISAdapterConfig; +@protocol ISBannerAdapterProtocol + +@optional + +#pragma mark - for bidders, non bidders and demand only + +- (void)destroyBannerWithAdapterConfig:(ISAdapterConfig *)adapterConfig; + +- (CGFloat)getAdaptiveHeightWithWidth:(CGFloat)width; + +#pragma mark - for non bidders + +- (void)initBannerWithUserId:(NSString *)userId + adapterConfig:(ISAdapterConfig *)adapterConfig + delegate:(id)delegate; + +- (void)loadBannerWithAdapterConfig:(ISAdapterConfig *)adapterConfig + adData:(NSDictionary *)adData + viewController:(UIViewController *)viewController + size:(ISBannerSize *)size + delegate:(id)delegate; + +#pragma mark - for bidders and demand only + +- (NSDictionary *)getBannerBiddingDataWithAdapterConfig:(ISAdapterConfig *)adapterConfig + adData:(NSDictionary *)adData; + +- (void)collectBannerBiddingDataWithAdapterConfig:(ISAdapterConfig *)adapterConfig + adData:(NSDictionary *)adData + delegate:(id)delegate; + +- (void)initBannerForBiddingWithUserId:(NSString *)userId + adapterConfig:(ISAdapterConfig *)adapterConfig + delegate:(id)delegate; + +// used for banner, bidders + non-bidders(one-flow) for demand only +- (void)loadBannerForBiddingWithAdapterConfig:(ISAdapterConfig *)adapterConfig + adData:(NSDictionary *)adData + serverData:(NSString *)serverData + viewController:(UIViewController *)viewController + size:(ISBannerSize *)size + delegate:(id)delegate; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBannerSize.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBannerSize.h new file mode 100644 index 0000000..5d4fd58 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBannerSize.h @@ -0,0 +1,54 @@ +// +// ISBannerSize.h +// IronSource +// +// Created by Dor Alon on 12/09/2018. +// Copyright © 2018 IronSource. All rights reserved. +// + +@class LPMAdSize; + +#import + +static NSString* const kSizeBanner = @"BANNER"; +static NSString* const kSizeLarge = @"LARGE"; +static NSString* const kSizeRectangle = @"RECTANGLE"; +static NSString* const kSizeLeaderboard = @"LEADERBOARD"; +static NSString* const kSizeSmart = @"SMART"; +static NSString* const kSizeCustom = @"CUSTOM"; + +#define ISBannerSize_BANNER \ + [[ISBannerSize alloc] initWithDescription:kSizeBanner width:320 height:50] +#define ISBannerSize_LARGE [[ISBannerSize alloc] initWithDescription:kSizeLarge width:320 height:90] +#define ISBannerSize_RECTANGLE \ + [[ISBannerSize alloc] initWithDescription:kSizeRectangle width:300 height:250] +#define ISBannerSize_SMART [[ISBannerSize alloc] initWithDescription:kSizeSmart width:0 height:0] + +@interface ISBannerSize : NSObject + +#define ISBannerSize_LEADERBOARD \ + [[ISBannerSize alloc] initWithDescription:kSizeLeaderboard width:728 height:90] + +- (instancetype)initWithWidth:(NSInteger)width andHeight:(NSInteger)height; +- (instancetype)initWithDescription:(NSString*)description + width:(NSInteger)width + height:(NSInteger)height; +- (BOOL)isSmart; +- (LPMAdSize*)toLPMAdSize; + +/** + Calculates and returns the maximum height of an adaptive banner for a given width. + + If there are no adaptive banner supporting networks, the return value will be -1. + + @param width The specified width for which the maximum height is calculated. + @return The maximal height of an adaptive banner, or -1 if no supporting networks are found. + */ ++ (CGFloat)getMaximalAdaptiveHeightWithWidth:(CGFloat)width; + +@property(readonly) NSString* sizeDescription; +@property(readonly) NSInteger width; +@property(readonly) NSInteger height; +@property(readwrite, getter=isAdaptive) BOOL adaptive; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseAdAdapter.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseAdAdapter.h new file mode 100644 index 0000000..89cbdaa --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseAdAdapter.h @@ -0,0 +1,51 @@ +// +// ISBaseAdAdapter.h +// IronSource +// +// Created by Yonti Makmel on 27/04/2021. +// Copyright © 2021 ironSource. All rights reserved. +// + +#import +#import "ISAdapterAdDelegate.h" +#import "ISAdapterBaseProtocol.h" +#import "ISAdapterConfig.h" +#import "LevelPlay.h" + +@class ISAdData; + +NS_ASSUME_NONNULL_BEGIN + +@interface ISBaseAdAdapter : NSObject + +@property(nonatomic) NSString *adFormat; +@property(nonatomic, readonly) ISAdapterConfig *adapterConfig; +@property(nonatomic, readonly, nullable) NSUUID *adUnitObjectId; + +/// @param adFormat the ad format represented by the adapter +/// @param adapterConfig the configuration relevant for the adapter instance +- (instancetype)initWithAdFormat:(NSString *)adFormat + adapterConfig:(ISAdapterConfig *)adapterConfig; + +/// @param adFormat the ad format represented by the adapter +/// @param adapterConfig the configuration relevant for the adapter instance +/// @param adUnitObjectId the object id for the ad loaded + +- (instancetype)initWithAdFormat:(NSString *)adFormat + adapterConfig:(ISAdapterConfig *)adapterConfig + adUnitObjectId:(nullable NSUUID *)adUnitObjectId; + +/// the network sdk version +- (nullable id)getNetworkAdapter; + +/** + * destroy the ad + * + * @param adData - data containing the configuration passed from the server and other related + * parameters passed from the publisher like userId + */ +- (void)destroyAdWithAdData:(ISAdData *)adData; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseAdInteractionAdapter.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseAdInteractionAdapter.h new file mode 100644 index 0000000..b5218cd --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseAdInteractionAdapter.h @@ -0,0 +1,18 @@ +// +// ISBaseAdInteractionAdapter.h +// IronSource +// +// Created by Yonti Makmel on 11/10/2021. +// Copyright © 2021 IronSource. All rights reserved. +// + +#import "ISAdapterAdFullscreenProtocol.h" +#import "ISBaseAdAdapter.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface ISBaseAdInteractionAdapter : ISBaseAdAdapter + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseAdUnitAdapter.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseAdUnitAdapter.h new file mode 100644 index 0000000..4b90cad --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseAdUnitAdapter.h @@ -0,0 +1,18 @@ +// +// ISBaseAdUnitAdapter.h +// IronSource +// +// Copyright © 2023 IronSource. All rights reserved. +// + +#import +#import "ISAdapterConfig.h" +#import "ISNetworkInitCallbackProtocol.h" + +@interface ISBaseAdUnitAdapter : NSObject + +- (NSString *)getStringValueFromAdapterConfig:(ISAdapterConfig *)adapterConfig + forKey:(NSString *)key; +- (NSString *)getMissingParamErrorStringWithKey:(NSString *)key; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseAdapter+Internal.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseAdapter+Internal.h new file mode 100644 index 0000000..79ffaec --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseAdapter+Internal.h @@ -0,0 +1,52 @@ + +// +// ISBaseAdapter+Internal.h +// IronSource +// +// Created by Yotam Ohayon on 01/03/2016. +// Copyright © 2016 IronSource. All rights reserved. +// + +#ifndef ISBaseAdapter_Internal_h +#define ISBaseAdapter_Internal_h + +#import "ISBaseAdapter.h" + +#import "ISBannerAdapterDelegate.h" +#import "ISInterstitialAdapterDelegate.h" +#import "ISNativeAdAdapterDelegate.h" +#import "ISRewardedVideoAdapterDelegate.h" + +#import "ISConfigurations.h" +#import "ISMetaDataConstants.h" +#import "ISMetaDataUtils.h" + +#import "ISConcurrentMutableDictionary.h" +#import "ISConcurrentMutableSet.h" +#import "ISError.h" +#import "ISLog.h" +#import "ISNetworkInitCallbackProtocol.h" + +#import "ISBaseBannerAdapter.h" +#import "ISBaseInterstitialAdapter.h" +#import "ISBaseNativeAdAdapter.h" +#import "ISBaseRewardedVideoAdapter.h" + +#import "ISAdapterNativeAdData.h" +#import "ISAdapterNativeAdViewBinder.h" +#import "ISNativeAdViewHolder.h" +#import "UIView+ISNativeView.h" + +@interface ISBaseAdapter () + +#pragma mark - Validation +- (BOOL)isConfigValueValid:(NSString *)value; +- (NSError *)errorForMissingCredentialFieldWithName:(NSString *)fieldName; + +#pragma mark - Private +- (UIViewController *)topMostController; +- (void)setMetaDataWithKey:(NSString *)key andValues:(NSMutableArray *)values; + +@end + +#endif /* ISBaseAdapter_Internal_h */ diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseAdapter.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseAdapter.h new file mode 100644 index 0000000..9a63c99 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseAdapter.h @@ -0,0 +1,62 @@ +// +// ISBaseAdapter.h +// IronSource +// +// Copyright (c) 2015 IronSource. All rights reserved. +// + +#import + +#import "ISAdapterConfig.h" +#import "ISAdapterNetworkDataProtocol.h" +#import "ISBannerAdapterProtocol.h" +#import "ISConcurrentMutableDictionary.h" +#import "ISInterstitialAdapterProtocol.h" +#import "ISLoadWhileShowSupportState.h" +#import "ISNativeAdAdapterProtocol.h" +#import "ISRewardedVideoAdapterProtocol.h" + +@interface ISBaseAdapter : NSObject { + @protected + ISLoadWhileShowSupportState LWSState; +} + +@property(nonatomic, strong) NSString *adapterName; +@property(nonatomic, strong) NSString *providerNetworkKey; +@property(strong, nonatomic) NSString *pluginType; +@property(strong, nonatomic) NSString *userId; +@property(strong, nonatomic) id adUnitAdapters; + +- (instancetype)initAdapter:(NSString *)name; +- (void)earlyInitWithAdapterConfig:(ISAdapterConfig *)adapterConfig; + +- (NSString *)sdkVersion; +- (NSString *)version; +- (NSString *)dynamicUserId; + +// to be used by adapters that implement each ad unit separately +- (ISLoadWhileShowSupportState)getLWSSupportState:(ISAdapterConfig *)adapterConfig; + +- (void)setNetworkData:(id)networkData; + +- (void)setRewardedVideoAdapter:(id)rewardedVideoAdapter; +- (void)setInterstitialAdapter:(id)interstitialAdapter; +- (void)setBannerAdapter:(id)bannerAdapter; +- (void)setNativeAdAdapter:(id)nativeAdAdapter; +- (void)setConsent:(BOOL)consent; + +- (id)getRewardedVideoAdapter; +- (id)getInterstitialAdapter; +- (id)getBannerAdapter; +- (id)getNativeAdAdapter; + +- (CGFloat)getAdaptiveHeightWithWidth:(CGFloat)width; + +- (void)destroyRewardedVideoAdWithAdapterConfig:(ISAdapterConfig *)adapterConfig; +- (void)destroyInterstitialAdWithAdapterConfig:(ISAdapterConfig *)adapterConfig; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseBanner.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseBanner.h new file mode 100644 index 0000000..4baba36 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseBanner.h @@ -0,0 +1,46 @@ +// +// ISBaseBanner.h +// IronSource +// +// Created by Guy Lis on 27/03/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +#import "ISAdapterAdViewDelegate.h" +#import "ISAdapterBannerProtocol.h" +#import "ISBannerAdDelegate.h" +#import "ISBaseAdAdapter.h" +NS_ASSUME_NONNULL_BEGIN + +@interface ISBaseBanner : ISBaseAdAdapter + +/// @param providerConfig the configuration relevant for the adapter instance +- (instancetype)init:(ISAdapterConfig *)providerConfig; + +/** + * load the ad + * + * @param adData data containing the configuration passed from the server and other related + * parameters passed from the publisher like userId + * @param viewController the application view controller + * @param size the banner size the ad will be presented on + * @param delegate the callback listener to return + * mandatory callbacks based on the network - load success, load failure, ad opened + * optional callbacks - clicked, left application, presented, dismissed + */ +- (void)loadAdWithAdData:(nonnull ISAdData *)adData + viewController:(nonnull UIViewController *)viewController + size:(nonnull ISBannerSize *)size + delegate:(nonnull id)delegate; + +/** + * destroy the ad + * + * @param adData - data containing the configuration passed from the server and other related + * parameters passed from the publisher like userId + */ +- (void)destroyAdWithAdData:(nonnull ISAdData *)adData; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseBannerAdapter.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseBannerAdapter.h new file mode 100644 index 0000000..8cd0524 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseBannerAdapter.h @@ -0,0 +1,13 @@ +// +// ISBaseBannerAdapter.h +// IronSource +// +// Copyright © 2023 IronSource. All rights reserved. +// + +#import "ISBannerAdapterProtocol.h" +#import "ISBaseAdUnitAdapter.h" + +@interface ISBaseBannerAdapter : ISBaseAdUnitAdapter + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseInterstitial.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseInterstitial.h new file mode 100644 index 0000000..c2c9555 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseInterstitial.h @@ -0,0 +1,41 @@ +// +// ISBaseInterstitial.h +// IronSource +// +// Created by Bar David on 24/10/2021. +// Copyright © 2021 IronSource. All rights reserved. +// + +#import "ISBaseAdInteractionAdapter.h" + +NS_ASSUME_NONNULL_BEGIN + +@protocol ISInterstitialAdDelegate + +@end + +@interface ISBaseInterstitial : ISBaseAdInteractionAdapter + +/// @param providerConfig the configuration relevant for the adapter instance +- (instancetype)init:(ISAdapterConfig *)providerConfig; + +/// load the ad +/// @param adData data containing the configuration passed from the server and other related +/// parameters passed from the publisher like userId +/// @param delegate the delegate to return mandatory callbacks based on the network - load success, +/// load failure +- (void)loadAdWithAdData:(ISAdData *)adData delegate:(id)delegate; + +/// show the ad +/// @param viewController current viewController for showing the ad +/// @param adData data containing the configuration passed from the server and other related +/// parameters passed from the publisher like userId +/// @param delegate the delegate to return mandatory callbacks based on the network - ad opened, ad +/// closed, show failed optional callbacks - show success, ad clicked +- (void)showAdWithViewController:(UIViewController *)viewController + adData:(ISAdData *)adData + delegate:(id)delegate; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseInterstitialAdapter.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseInterstitialAdapter.h new file mode 100644 index 0000000..b844e26 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseInterstitialAdapter.h @@ -0,0 +1,13 @@ +// +// ISBaseInterstitialAdapter.h +// IronSource +// +// Copyright © 2023 IronSource. All rights reserved. +// + +#import "ISBaseAdUnitAdapter.h" +#import "ISInterstitialAdapterProtocol.h" + +@interface ISBaseInterstitialAdapter : ISBaseAdUnitAdapter + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseNativeAd.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseNativeAd.h new file mode 100644 index 0000000..d92871f --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseNativeAd.h @@ -0,0 +1,53 @@ +// +// ISBaseNativeAd.h +// IronSourceSDK +// +// Created by Ronit Epstein on 15/06/2025. +// Copyright © 2025 Unity. All rights reserved. +// + +#import "ISAdapterNativeAdProtocol.h" +#import "ISBaseAdAdapter.h" + +@protocol ISNativeAdDelegate; +@class ISNativeAdProperties; + +NS_ASSUME_NONNULL_BEGIN + +@interface ISBaseNativeAd : ISBaseAdAdapter + +/// @param providerConfig the configuration relevant for the adapter instance +- (instancetype)init:(ISAdapterConfig *)providerConfig; + +/** + * load the ad + * + * @param adData data containing the configuration passed from the server and other related + * parameters passed from the publisher like userId + * @param viewController the application view controller + * @param delegate the callback listener to return + * mandatory callbacks based on the network - load success, load failure, ad opened + * optional callbacks - clicked, left application, presented, dismissed + */ +- (void)loadAdWithAdData:(nonnull ISAdData *)adData + viewController:(nonnull UIViewController *)viewController + delegate:(nonnull id)delegate; + +/** + * destroy the ad + * + * @param adData - data containing the configuration passed from the server and other related + * parameters passed from the publisher like userId + */ +- (void)destroyAdWithAdData:(nonnull ISAdData *)adData; + +/** + * Get the native ad properties from the ad data. + * + * @param adData The ad data containing the native ad information. + */ +- (ISNativeAdProperties *)getNativeAdPropertiesWithAdData:(nonnull ISAdData *)adData; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseNativeAdAdapter.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseNativeAdAdapter.h new file mode 100644 index 0000000..2d8ca18 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseNativeAdAdapter.h @@ -0,0 +1,22 @@ +// +// ISBaseNativeAdAdapter.h +// IronSource +// +// Created by Hadar Pur on 06/07/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +#import "ISBaseAdUnitAdapter.h" +#import "ISNativeAdAdapterProtocol.h" +#import "ISNativeAdProperties.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface ISBaseNativeAdAdapter : ISBaseAdUnitAdapter + +- (ISNativeAdProperties *)getNativeAdPropertiesWithAdapterConfig: + (nonnull ISAdapterConfig *)adapterConfig; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseNetworkAdapter.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseNetworkAdapter.h new file mode 100644 index 0000000..640a1eb --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseNetworkAdapter.h @@ -0,0 +1,24 @@ +// +// ISBaseNetworkAdapter.h +// IronSource +// +// Created by Guy Lis on 05/07/2021. +// Copyright © 2021 ironSource. All rights reserved. +// + +#import "ISAdapterBaseProtocol.h" +#import "ISAdapterConsentProtocol.h" +#import "ISAdapterDebugProtocol.h" +#import "ISAdapterMetaDataProtocol.h" +#import "ISAdapterNetworkDataProtocol.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface ISBaseNetworkAdapter : NSObject + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseRewardedVideo.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseRewardedVideo.h new file mode 100644 index 0000000..97218be --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseRewardedVideo.h @@ -0,0 +1,42 @@ +// +// ISBaseRewardedVideo.h +// IronSource +// +// Created by Bar David on 24/10/2021. +// Copyright © 2021 IronSource. All rights reserved. +// + +#import "ISAdapterAdRewardedDelegate.h" +#import "ISBaseAdInteractionAdapter.h" + +NS_ASSUME_NONNULL_BEGIN + +@protocol ISRewardedVideoAdDelegate + +@end + +@interface ISBaseRewardedVideo : ISBaseAdInteractionAdapter + +/// @param providerConfig the configuration relevant for the adapter instance +- (instancetype)init:(ISAdapterConfig *)providerConfig; + +/// load the ad +/// @param adData data containing the configuration passed from the server and other related +/// parameters passed from the publisher like userId +/// @param delegate the delegate to return mandatory callbacks based on the network - load success, +/// load failure +- (void)loadAdWithAdData:(ISAdData *)adData delegate:(id)delegate; + +/// show the ad +/// @param viewController current viewController for showing the ad +/// @param adData data containing the configuration passed from the server and other related +/// parameters passed from the publisher like userId +/// @param delegate the delegate to return mandatory callbacks based on the network - ad opened, ad +/// closed, show failed optional callbacks - show success, ad clicked +- (void)showAdWithViewController:(UIViewController *)viewController + adData:(ISAdData *)adData + delegate:(id)delegate; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseRewardedVideoAdapter.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseRewardedVideoAdapter.h new file mode 100644 index 0000000..7d60aa1 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseRewardedVideoAdapter.h @@ -0,0 +1,13 @@ +// +// ISBaseRewardedVideoAdapter.h +// IronSource +// +// Copyright © 2023 IronSource. All rights reserved. +// + +#import "ISBaseAdUnitAdapter.h" +#import "ISRewardedVideoAdapterProtocol.h" + +@interface ISBaseRewardedVideoAdapter : ISBaseAdUnitAdapter + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBiddingDataDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBiddingDataDelegate.h new file mode 100644 index 0000000..42595f1 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBiddingDataDelegate.h @@ -0,0 +1,18 @@ +// +// ISBiddingDataDelegate.h +// IronSource +// +// Created by Liron Matityahu on 26/12/2022. +// Copyright © 2022 IronSource. All rights reserved. +// + +#import + +@protocol ISBiddingDataDelegate + +@required + +- (void)successWithBiddingData:(NSDictionary *)biddingData; +- (void)failureWithError:(NSString *)error; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBiddingDataProtocol.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBiddingDataProtocol.h new file mode 100644 index 0000000..5a94549 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBiddingDataProtocol.h @@ -0,0 +1,25 @@ +// +// ISBiddingDataProtocol.h +// IronSource +// +// Created by Bar David on 07/02/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +#import +#import "ISAdData.h" +#import "ISBiddingDataDelegate.h" + +#ifndef ISBiddingDataProtocol_h +#define ISBiddingDataProtocol_h + +@protocol ISBiddingDataProtocol + +/// Collects bidding data for the network. The method supports non-MADU flow. It is duplicated on +/// `AdAdapterBridge` to support MADU flow. +- (void)collectBiddingDataWithAdData:(ISAdData *)adData + delegate:(id)delegate; + +@end + +#endif /* ISBiddingDataProtocol_h */ diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISConcurrentMutableArray.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISConcurrentMutableArray.h new file mode 100644 index 0000000..a93125c --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISConcurrentMutableArray.h @@ -0,0 +1,22 @@ +// +// ISConcurrentMutableArray.h +// IronSourceSDK +// +// Created by Asaf Gur on 15/12/2024. +// + +#import + +@interface ISConcurrentMutableArray<__covariant ObjectType> : NSObject + +- (instancetype)init; +- (NSUInteger)count; +- (void)addObject:(ObjectType)object; +- (ObjectType)objectAtIndex:(NSUInteger)index; +- (void)removeObjectAtIndex:(NSUInteger)index; +- (void)addObjectsFromArray:(NSArray *)array; +- (void)removeAllObjects; +- (BOOL)containsObject:(ObjectType)object; +- (NSArray *)copy; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISConcurrentMutableDictionary.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISConcurrentMutableDictionary.h new file mode 100644 index 0000000..386bd52 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISConcurrentMutableDictionary.h @@ -0,0 +1,31 @@ +// +// ISConcurrentMutableDictionary.h +// Environment +// +// Copyright © 2021 ironSource. All rights reserved. +// + +#import + +@protocol LPMThreadSafeDictionaryProtocol + +- (NSUInteger)count; + +- (id)objectForKey:(NSString *)key; +- (void)setObject:(id)object forKey:(NSString *)key; +- (BOOL)hasObjectForKey:(NSString *)key; + +- (void)removeObjectForKey:(NSString *)key; +- (void)removeAllObjects; + +- (NSArray *)allKeys; +- (NSArray *)allValues; +- (NSDictionary *)allData; + +@end + +@interface ISConcurrentMutableDictionary : NSObject + ++ (instancetype)dictionary; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISConcurrentMutableSet.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISConcurrentMutableSet.h new file mode 100644 index 0000000..be4aea7 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISConcurrentMutableSet.h @@ -0,0 +1,34 @@ +// +// ISConcurrentMutableSet.h +// Environment +// +// Copyright © 2021 ironSource. All rights reserved. +// + +#import + +@interface ISConcurrentMutableSet : NSObject + ++ (instancetype)set; ++ (instancetype)setWithSet:(id)set; + +- (instancetype)initCommon; +- (instancetype)init; +- (instancetype)initWithCapacity:(NSUInteger)numItems; +- (instancetype)initWithCoder:(NSCoder *)aDecoder; +- (instancetype)initWithSet:(NSMutableSet *)set; +- (instancetype)initWithArray:(NSArray *)array; + +- (NSUInteger)count; +- (void)addObject:(id)object; +- (void)removeObject:(id)object; +- (void)addObjectsFromArray:(NSArray *)array; +- (void)intersectSet:(NSSet *)otherSet; +- (void)minusSet:(NSSet *)otherSet; +- (void)removeAllObjects; +- (void)unionSet:(NSSet *)otherSet; +- (NSArray *)allObjects; +- (BOOL)hasObject:(id)object; +- (NSEnumerator *)objectEnumerator; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISConfigurations.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISConfigurations.h new file mode 100644 index 0000000..df38f74 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISConfigurations.h @@ -0,0 +1,48 @@ +// +// Copyright © 2017 IronSource. All rights reserved. +// + +#ifndef IRONSOURCE_CONFIGURATION_H +#define IRONSOURCE_CONFIGURATION_H + +#import + +@class LPMSegment; + +@interface ISConfigurations : NSObject + +@property(nonatomic, strong) NSString *userId; +@property(nonatomic, strong) NSString *appKey; +@property(nonatomic, strong) NSString *segmentId; +@property(nonatomic, strong) NSDictionary *customSegmentParams; +@property(nonatomic, strong) LPMSegment *segment; +@property(nonatomic, strong) NSDictionary *rewardedVideoCustomParameters; +@property(nonatomic, strong) NSString *version; +@property(nonatomic, strong) NSNumber *adapterTimeOutInSeconds; +@property(nonatomic, strong) NSNumber *maxNumOfAdaptersToLoadOnStart; +@property(nonatomic, assign) BOOL advancedLoading; +@property(nonatomic, strong) NSString *plugin; +@property(nonatomic, strong) NSString *pluginVersion; +@property(nonatomic, strong) NSString *pluginFrameworkVersion; +@property(nonatomic, strong) NSNumber *maxVideosPerIteration; +@property(nonatomic, assign) NSInteger userAge; +@property(nonatomic, assign) BOOL trackReachability; +@property(nonatomic, strong) NSString *dynamicUserId; +@property(nonatomic, assign) BOOL adaptersDebug; +@property(nonatomic, strong) NSString *mediationType; +@property(nonatomic, strong) NSNumber *serr; +@property(nonatomic, strong) NSString *abt; +@property(nonatomic, strong) NSDictionary *rvServerParams; +@property(nonatomic, assign) NSInteger consent; +@property(nonatomic, assign) BOOL didSetConsent; +@property(nonatomic, strong) NSDictionary *batchGenericParams; +@property(nonatomic, strong) NSDictionary *eventGenericParams; +@property(nonatomic, strong) NSDictionary *eventPixelParams; + ++ (ISConfigurations *)getConfigurations; + +typedef NS_ENUM(NSInteger, DebugLevel) { None, Error, Info, Verbose }; + +@end + +#endif diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISDataKeys.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISDataKeys.h new file mode 100644 index 0000000..769d3ae --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISDataKeys.h @@ -0,0 +1,26 @@ +// +// ISDataKeys.h +// IronSource +// +// Created by Yonti Makmel on 18/04/2021. +// Copyright © 2021 ironSource. All rights reserved. +// +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface ISDataKeys : NSObject + +// Keys used in AdData of the configuration + ++ (NSString *)USER_ID; + ++ (NSString *)AD_UNIT; + ++ (NSString *)AD_DATA_IS_MULTIPLE_AD_UNITS_FLOW; + ++ (NSString *)AD_UNIT_ID; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISDemandOnlyBannerDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISDemandOnlyBannerDelegate.h new file mode 100644 index 0000000..c954e84 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISDemandOnlyBannerDelegate.h @@ -0,0 +1,54 @@ +// +// ISDemandOnlyBannerDelegate.h +// IronSource +// +// Created by Jonathan Benedek on 28/10/2021. +// Copyright © 2021 IronSource. All rights reserved. +// + +#import "ISDemandOnlyBannerView.h" + +#ifndef IS_DEMAND_ONLY_BANNER_DELEGATE_H +#define IS_DEMAND_ONLY_BANNER_DELEGATE_H + +@protocol ISDemandOnlyBannerDelegate + +@required +/** + Called after a banner ad has been successfully loaded + @param bannerView The view that contains the ad. + @param instanceId The demand only instance id to be used to display the banner. + */ +- (void)bannerDidLoad:(ISDemandOnlyBannerView *)bannerView instanceId:(NSString *)instanceId; + +/** + Called after a banner has attempted to load an ad but failed. + @param error The reason for the error + @param instanceId The demand only instance id that fail to load. + */ +- (void)bannerDidFailToLoadWithError:(NSError *)error instanceId:(NSString *)instanceId; + +/** + Called when a banner was shown + @param instanceId The demand only instance id which did show. + + */ +- (void)bannerDidShow:(NSString *)instanceId; + +/** + Called after a banner has been clicked. + @param instanceId The demand only instance id which clicked. + + */ +- (void)didClickBanner:(NSString *)instanceId; + +/** + Called when a user would be taken out of the application context. + @param instanceId The demand only instance id that taken out of the application. + + */ +- (void)bannerWillLeaveApplication:(NSString *)instanceId; + +@end + +#endif /* IS_DEMAND_ONLY_BANNER_DELEGATE_H */ diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISDemandOnlyBannerView.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISDemandOnlyBannerView.h new file mode 100644 index 0000000..88f6bdf --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISDemandOnlyBannerView.h @@ -0,0 +1,17 @@ +// +// ISDemandOnlyBannerView.h +// IronSource +// +// Created by Ariel Barsheshet on 23/08/2022. +// Copyright © 2022 IronSource. All rights reserved. +// + +#import + +#ifndef ISDemandOnlyBannerView_h +#define ISDemandOnlyBannerView_h + +@interface ISDemandOnlyBannerView : UIView +@end + +#endif /* ISDemandOnlyBannerView_h */ diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISDemandOnlyInterstitialDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISDemandOnlyInterstitialDelegate.h new file mode 100644 index 0000000..073649e --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISDemandOnlyInterstitialDelegate.h @@ -0,0 +1,47 @@ +// +// Copyright © 2017 IronSource. All rights reserved. +// + +#ifndef IS_DEMAND_ONLY_INSTINTERSTITIAL_DELEGATE_H +#define IS_DEMAND_ONLY_INSTINTERSTITIAL_DELEGATE_H + +@protocol ISDemandOnlyInterstitialDelegate + +@required +/** + Called after an interstitial has been loaded + */ +- (void)interstitialDidLoad:(NSString *)instanceId; + +/** + Called after an interstitial has attempted to load but failed. + + @param error The reason for the error + */ +- (void)interstitialDidFailToLoadWithError:(NSError *)error instanceId:(NSString *)instanceId; + +/** + Called after an interstitial has been opened. + */ +- (void)interstitialDidOpen:(NSString *)instanceId; + +/** + Called after an interstitial has been dismissed. + */ +- (void)interstitialDidClose:(NSString *)instanceId; + +/** + Called after an interstitial has attempted to show but failed. + + @param error The reason for the error + */ +- (void)interstitialDidFailToShowWithError:(NSError *)error instanceId:(NSString *)instanceId; + +/** + Called after an interstitial has been clicked. + */ +- (void)didClickInterstitial:(NSString *)instanceId; + +@end + +#endif diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISDemandOnlyRewardedVideoDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISDemandOnlyRewardedVideoDelegate.h new file mode 100644 index 0000000..22679cf --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISDemandOnlyRewardedVideoDelegate.h @@ -0,0 +1,28 @@ +// +// Copyright © 2017 IronSource. All rights reserved. +// + +#ifndef IS_DEMAND_ONLY_REWARDEDVIDEO_DELEGATE_H +#define IS_DEMAND_ONLY_REWARDEDVIDEO_DELEGATE_H + +#import + +@protocol ISDemandOnlyRewardedVideoDelegate +@required +- (void)rewardedVideoDidLoad:(NSString *)instanceId; + +- (void)rewardedVideoDidFailToLoadWithError:(NSError *)error instanceId:(NSString *)instanceId; + +- (void)rewardedVideoDidOpen:(NSString *)instanceId; + +- (void)rewardedVideoDidFailToShowWithError:(NSError *)error instanceId:(NSString *)instanceId; + +- (void)rewardedVideoDidClick:(NSString *)instanceId; + +- (void)rewardedVideoAdRewarded:(NSString *)instanceId; + +- (void)rewardedVideoDidClose:(NSString *)instanceId; + +@end + +#endif diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISError.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISError.h new file mode 100644 index 0000000..c944e70 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISError.h @@ -0,0 +1,232 @@ +// +// ISError.h +// IronSource +// +// Created by Roni Parshani on 1/5/15. +// Copyright (c) 2015 IronSource. All rights reserved. +// + +#import + +static NSString *const kSSErrorsOnlyCharacterNumbers = + @"- should contain only english characters and numbers"; +static NSString *const kSSErrorsLength5to10 = @"- length should be between 5-10 characters"; +static NSString *const kSSErrorsAppKey = @"appKey"; +static NSString *const kSSErrorsUserId = @"UserId"; +static NSString *const kSSErrorsForSS = @"for IronSource"; + +static NSString *const kEmptyString = @""; + +typedef NS_ENUM(NSUInteger, ISErrorCode) { + + ERROR_CODE_DECRYPT_FAILED = 1, + ERROR_CODE_NO_ADAPTIVE_SUPPORTIVE_NETWORKS = 2, + + ERROR_CODE_NO_CONFIGURATION_AVAILABLE = 501, + ERROR_CODE_USING_CACHED_CONFIGURATION = 502, + ERROR_CODE_KEY_NOT_SET = 505, + ERROR_CODE_INVALID_KEY_VALUE = 506, + ERROR_CODE_INIT_FAILED = 508, + ERROR_CODE_NO_ADS_TO_SHOW = 509, + ERROR_CODE_GENERIC = 510, + ERROR_CODE_NO_ADS_TO_RELOAD = 519, + ERROR_NO_INTERNET_CONNECTION = 520, + ERROR_MULTIPLE_IRONSOURCE_APP_KEY = 522, + ERROR_PLACEMENT_CAPPED = 524, + ERROR_AD_FORMAT_CAPPED = 525, + ERROR_REACHED_CAP_LIMIT_PER_SESSION = 526, + ERROR_UNKNOWN_INSTANCE_ID = 527, + ERROR_SEND_EVENTS_FAILURE = 528, + ERROR_PULL_LOCAL_FAILURE_FAILURE = 529, + ERROR_AD_UNIT_CAPPED = 530, + + ERROR_BN_LOAD_AFTER_INIT_FAILED = 600, + ERROR_BN_LOAD_AFTER_LONG_INITIATION = 601, + ERROR_BN_INIT_FAILED_AFTER_LOAD = 602, + ERROR_BN_LOAD_PLACEMENT_CAPPED = 604, + ERROR_BN_LOAD_EXCEPTION = 605, + ERROR_BN_LOAD_NO_FILL = 606, + ERROR_BN_INSTANCE_INIT_TIMEOUT = 607, + ERROR_BN_INSTANCE_LOAD_TIMEOUT = 608, + ERROR_BN_INSTANCE_RELOAD_TIMEOUT = 609, + ERROR_BN_INSTANCE_LOAD_EMPTY_BANNER = 610, + ERROR_BN_INSTANCE_LOAD_EMPTY_ADAPTER = 611, + ERROR_BN_INSTANCE_INIT_EXCEPTION = 612, + ERROR_BN_RELOAD_SKIP_INVISIBLE = 613, + ERROR_BN_RELOAD_SKIP_BACKGROUND = 614, + ERROR_BN_LOAD_NO_CONFIG = 615, + ERROR_BN_UNSUPPORTED_SIZE = 616, + ERROR_DO_BN_INSTANCE_LOAD_EMPTY_SERVER_DATA = 618, + ERROR_DO_BN_LOAD_ALREADY_IN_PROGRESS = 619, + ERROR_DO_BN_LOAD_BEFORE_INIT_SUCCESS = 620, + ERROR_DO_BN_INSTANCE_LOAD_AUCTION_FAILED = 621, + ERROR_CODE_NO_AD_UNIT_SPECIFIED = 624, + ERROR_CODE_LOAD_BEFORE_INIT_SUCCESS_CALLBACK = 625, + ERROR_CODE_INVALID_AD_UNIT_ID = 626, + ERROR_CODE_LOAD_FAILED_ALREADY_CALLED = 627, + ERROR_CODE_SHOW_BEFORE_LOAD_SUCCESS_CALLBACK = 628, + ERROR_CODE_LOAD_WHILE_SHOW = 629, + ERROR_CODE_SHOW_WHILE_SHOW = 630, + ERROR_CODE_SHOW_CONTROLLER_NIL = 631, + ERROR_CODE_SHOW_VIEW_CONTROLLER_NIL = 632, + ERROR_CODE_BN_LOAD_CALLED_AFTER_DESTROY = 633, + + ERROR_NT_LOAD_AFTER_INIT_FAILED = 700, + ERROR_NT_LOAD_AFTER_LONG_INITIATION = 701, + ERROR_NT_INIT_FAILED_AFTER_LOAD = 702, + ERROR_NT_LOAD_WHILE_LONG_INITIATION = 703, + ERROR_NT_LOAD_PLACEMENT_CAPPED = 704, + ERROR_NT_LOAD_EXCEPTION = 705, + ERROR_NT_LOAD_NO_FILL = 706, + ERROR_NT_INSTANCE_INIT_TIMEOUT = 707, + ERROR_NT_INSTANCE_LOAD_TIMEOUT = 708, + ERROR_NT_INSTANCE_LOAD_EMPTY_ADAPTER = 711, + ERROR_NT_INSTANCE_INIT_EXCEPTION = 712, + ERROR_NT_LOAD_NO_CONFIG = 715, + ERROR_NT_INSTANCE_LOAD_EMPTY_SERVER_DATA = 718, + ERROR_NT_NETWORK_ADAPTER_IS_NULL = 719, + ERROR_NT_NETWORK_NATIVE_AD_PARAMS_NIL = 720, + ERROR_NT_NETWORK_NATIVE_AD_LOAD_FAILED = 721, + + AUCTION_ERROR_REQUEST = 1000, + AUCTION_ERROR_RESPONSE_CODE_NOT_VALID = 1001, + AUCTION_ERROR_PARSE = 1002, + AUCTION_ERROR_DECRYPTION = 1003, + AUCTION_ERROR_EMPTY_WATERFALL = 1004, + AUCTION_ERROR_NO_CANDIDATES = 1005, + AUCTION_ERROR_CONNECTION_TIMED_OUT = 1006, + AUCTION_ERROR_REQUEST_MISSING_PARAMS = 1007, + AUCTION_ERROR_DECOMPRESSION = 1008, + + NOTIFICATIONS_ERROR_LOADED_NOT_FOUND = 1010, + NOTIFICATIONS_ERROR_SHOWING_NOT_FOUND = 1011, + + ERROR_SESSION_KEY_ENCRYPTION_FAILURE = 1015, + + ERROR_NT_EMPTY_DEFAULT_PLACEMENT = 1018, + ERROR_IS_EMPTY_DEFAULT_PLACEMENT = 1020, + ERROR_RV_EMPTY_DEFAULT_PLACEMENT = 1021, + ERROR_RV_SHOW_CALLED_DURING_SHOW = 1022, + ERROR_RV_SHOW_CALLED_WRONG_STATE = 1023, + ERROR_RV_LOAD_FAILED_NO_CANDIDATES = 1024, + ERROR_LOAD_FAILED_TIMEOUT = 1025, + ERROR_RV_LOAD_DURING_LOAD = 1026, + ERROR_RV_LOAD_DURING_SHOW = 1027, + ERROR_RV_LOAD_SUCCESS_UNEXPECTED = 1028, + ERROR_RV_LOAD_SUCCESS_WRONG_AUCTION_ID = 1029, + ERROR_RV_LOAD_FAIL_UNEXPECTED = 1030, + ERROR_RV_LOAD_FAIL_WRONG_AUCTION_ID = 1031, + ERROR_RV_INIT_FAILED_TIMEOUT = 1032, + ERROR_RV_LOAD_FAIL_DUE_TO_INIT = 1033, + ERROR_RV_LOAD_UNEXPECTED_CALLBACK = 1034, + ERROR_IS_LOAD_FAILED_NO_CANDIDATES = 1035, + ERROR_IS_SHOW_CALLED_DURING_SHOW = 1036, + ERROR_IS_LOAD_DURING_SHOW = 1037, + ERROR_RV_SHOW_EXCEPTION = 1038, + ERROR_IS_SHOW_EXCEPTION = 1039, + ERROR_RV_INSTANCE_INIT_EXCEPTION = 1040, + ERROR_IS_INSTANCE_INIT_EXCEPTION = 1041, + ERROR_BN_LOAD_FAILED_NO_CANDIDATES = 1044, + ERROR_NT_LOAD_FAILED_NO_CANDIDATES = 1045, + + ERROR_DO_IS_LOAD_ALREADY_IN_PROGRESS = 1050, + ERROR_DO_IS_CALL_LOAD_BEFORE_SHOW = 1051, + ERROR_DO_IS_LOAD_TIMED_OUT = 1052, + ERROR_DO_RV_LOAD_ALREADY_IN_PROGRESS = 1053, + ERROR_DO_RV_SHOW_CALLED_BEFORE_LOAD = 1054, + ERROR_DO_RV_LOAD_TIMED_OUT = 1055, + ERROR_DO_RV_LOAD_DURING_SHOW = 1056, + ERROR_RV_EXPIRED_ADS = 1057, + ERROR_DO_BN_LOAD_MISSING_VIEW_CONTROLLER = 1060, + ERROR_RV_LOAD_AFTER_LONG_INITIATION = 1061, + ERROR_DO_RV_INSTANCE_LOAD_EMPTY_SERVER_DATA = 1062, + ERROR_CODE_MISSING_CONFIGURATION = 1063, + ERROR_DO_IS_SHOW_DURING_SHOW = 1064, + ERROR_DO_IS_SHOW_DURING_LOAD = 1065, + ERROR_DO_IS_SHOW_NO_AVAILABLE_ADS = 1066, + ERROR_DO_RV_SHOW_DURING_SHOW = 1067, + ERROR_DO_RV_SHOW_DURING_LOAD = 1068, + ERROR_DO_RV_SHOW_NO_AVAILABLE_ADS = 1069, + ERROR_DO_RV_INSTANCE_LOAD_AUCTION_FAILED = 1070, + ERROR_RV_LOAD_AFTER_INIT_FAILED = 1072, + + ERROR_RV_LOAD_NO_FILL = 1058, + ERROR_IS_LOAD_NO_FILL = 1158, + + ERROR_IS_LOAD_AFTER_INIT_FAILED = 1160, + ERROR_IS_LOAD_AFTER_LONG_INITIATION = 1161, + ERROR_DO_IS_INSTANCE_LOAD_EMPTY_SERVER_DATA = 1162, + ERROR_DO_IS_INSTANCE_LOAD_EMPTY_ADAPTER = 1163, + ERROR_DO_IS_INSTANCE_LOAD_AUCTION_FAILED = 1164, + + ERROR_CONSENT_VIEW_TYPE_NOT_FOUND = 1601, + ERROR_CONSENT_VIEW_DICTIONARY_NOT_FOUND = 1602, + ERROR_CONSENT_VIEW_URL_NOT_FOUND = 1603, + ERROR_CONSENT_VIEW_NOT_LOADED = 1604, + ERROR_CONSENT_VIEW_LOAD_FAILED = 1605, + ERROR_CONSENT_VIEW_SHOW_DURING_SHOW = 1606, + ERROR_CONSENT_VIEW_CANNOT_BE_OPENED = 1607, + ERROR_CONSENT_VIEW_LOAD_DURING_LOAD = 1608, + + // TestSuite error codes + ERROR_CODE_TEST_SUITE_SDK_NOT_INITIALIZED = 1721, + ERROR_CODE_TEST_SUITE_DISABLED = 1722, + ERROR_CODE_TEST_SUITE_EXCEPTION_ON_LAUNCH = 1723, + ERROR_CODE_TEST_SUITE_WEB_CONTROLLER_NOT_LOADED = 1724, + ERROR_CODE_TEST_SUITE_NO_NETWORK_CONNECTIVITY = 1725, + + // Smash TS error codes + ERROR_CODE_BIDDING_DATA_EXCEPTION = 5001, + ERROR_CODE_IS_READY_EXCEPTION = 5002, + ERROR_CODE_LOAD_IN_PROGRESS_EXCEPTION = 5003, + ERROR_CODE_SHOW_IN_PROGRESS_EXCEPTION = 5004, + ERROR_CODE_LOAD_EXCEPTION = 5005, + ERROR_CODE_SHOW_FAILED_EXCEPTION = 5006, + ERROR_CODE_INIT_SUCCESS_EXCEPTION = 5007, + ERROR_CODE_INIT_FAILED_EXCEPTION = 5008, + ERROR_CODE_AD_CLOSE_EXCEPTION = 5008, + ERROR_CODE_DESTROY_EXCEPTION = 5009, + ERROR_CODE_INTERNAL_EXCEPTION = 5010, + ERROR_CODE_SMASH_IS_NIL = 5012, + ERROR_CODE_SMASH_INSTANCE_NAME_IS_NIL = 5013, + + // Init error codes + ERROR_OLD_INIT_API_APP_KEY_NOT_VALID = 2010, + ERROR_NEW_INIT_API_ALREADY_CALLED = 2020, + ERROR_OLD_API_INIT_IN_PROGRESS = 2030, + ERROR_INIT_ALREADY_FINISHED = 2040, + ERROR_LEGACY_INIT_FAILED = 2060, + ERROR_INIT_HTTP_REQUEST_FAILED = 2070, + ERROR_INIT_INVALID_RESPONSE = 2080, + ERROR_INIT_DECRYPT_FAILED = 2090, + ERROR_INIT_NO_RESPONSE_KEY = 2100, + ERROR_OLD_INIT_API_MULTIPLE_CALLS = 2110, + ERROR_INIT_DECOMPRESS_FAILED = 2120, + ERROR_INIT_CONNECTION_ERROR = 2130, + + // Capping service error codes + ERROR_CAPPING_VALIDATION_FAILED = 3000, + ERROR_DELIVERY_CAPPING_VALIDATION_FAILED = 3001, + ERROR_CAPPING_ENABLED_FALSE = 3002, + ERROR_CAPPING_CONFIG_ADDITION_FAILED = 3003, + + // Reward + ERROR_REWARD_VALIDATION_FAILED = 3004 +}; + +@interface ISError : NSError + +@property(strong) NSString *prefix; +@property(strong) NSString *suffix; + ++ (NSError *)createError:(ISErrorCode)errorCode; ++ (NSError *)createError:(ISErrorCode)errorCode withParams:(NSArray *)params; ++ (NSError *)createError:(ISErrorCode)errorCode withMessage:(NSString *)message; ++ (NSError *)createErrorWithDomain:(NSString *)domain + code:(ISErrorCode)code + message:(NSString *)message; ++ (NSError *)appendError:(NSError *)error withPrefix:(NSString *)prefix; ++ (NSError *)appendError:(NSError *)error withSuffix:(NSString *)suffix; ++ (ISErrorCode)getCode:(ISErrorCode)errorCode; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISInterstitialAdapterDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISInterstitialAdapterDelegate.h new file mode 100644 index 0000000..26ffb3f --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISInterstitialAdapterDelegate.h @@ -0,0 +1,50 @@ +// +// ISInterstitialAdapterDelegate.h +// IronSource +// +// Created by Roni Parshani on 10/12/14. +// Copyright (c) 2014 IronSource. All rights reserved. +// + +#import + +@protocol ISInterstitialAdapterDelegate + +- (void)adapterInterstitialInitSuccess; +- (void)adapterInterstitialInitSuccessWithExtraData:(NSDictionary *)extraData; + +- (void)adapterInterstitialInitFailedWithError:(NSError *)error; +- (void)adapterInterstitialInitFailedWithError:(NSError *)error + extraData:(NSDictionary *)extraData; + +- (void)adapterInterstitialDidLoad; +- (void)adapterInterstitialDidLoadWithExtraData:(NSDictionary *)extraData; + +- (void)adapterInterstitialDidFailToLoadWithError:(NSError *)error; +- (void)adapterInterstitialDidFailToLoadWithError:(NSError *)error + extraData:(NSDictionary *)extraData; + +- (void)adapterInterstitialDidOpen; +- (void)adapterInterstitialDidOpenWithExtraData:(NSDictionary *)extraData; + +- (void)adapterInterstitialDidClose; +- (void)adapterInterstitialDidCloseWithExtraData:(NSDictionary *)extraData; + +- (void)adapterInterstitialDidShow; +- (void)adapterInterstitialDidShowWithExtraData:(NSDictionary *)extraData; + +- (void)adapterInterstitialDidFailToShowWithError:(NSError *)error; +- (void)adapterInterstitialDidFailToShowWithError:(NSError *)error + extraData:(NSDictionary *)extraData; + +#pragma mark - optional - when supported by network + +- (void)adapterInterstitialDidClick; +- (void)adapterInterstitialDidClickWithExtraData:(NSDictionary *)extraData; + +#pragma mark - relevant only for ironSource adapter + +- (void)adapterInterstitialDidBecomeVisible; +- (void)adapterInterstitialDidBecomeVisibleWithExtraData:(NSDictionary *)extraData; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISInterstitialAdapterProtocol.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISInterstitialAdapterProtocol.h new file mode 100644 index 0000000..c766696 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISInterstitialAdapterProtocol.h @@ -0,0 +1,58 @@ +// +// ISInterstitialAdapterProtocol.h +// IronSource +// +// Created by Roni Parshani on 10/12/14. +// Copyright (c) 2014 IronSource. All rights reserved. +// + +#import +#import +#import "ISAdUnitAdapterProtocol.h" +#import "ISBiddingDataDelegate.h" +#import "ISInterstitialAdapterDelegate.h" + +@class ISAdapterConfig; +@protocol ISInterstitialAdapterProtocol + +@optional + +#pragma mark - for bidders, non bidders and demand only + +- (void)showInterstitialWithViewController:(UIViewController *)viewController + adapterConfig:(ISAdapterConfig *)adapterConfig + delegate:(id)delegate; + +- (BOOL)hasInterstitialWithAdapterConfig:(ISAdapterConfig *)adapterConfig; + +- (void)destroyInterstitialAdWithAdapterConfig:(ISAdapterConfig *)adapterConfig; + +#pragma mark - for non bidders and demand only + +- (void)initInterstitialWithUserId:(NSString *)userId + adapterConfig:(ISAdapterConfig *)adapterConfig + delegate:(id)delegate; + +- (void)loadInterstitialWithAdapterConfig:(ISAdapterConfig *)adapterConfig + adData:(NSDictionary *)adData + delegate:(id)delegate; + +#pragma mark - for bidders and demand only + +- (NSDictionary *)getInterstitialBiddingDataWithAdapterConfig:(ISAdapterConfig *)adapterConfig + adData:(NSDictionary *)adData; + +- (void)collectInterstitialBiddingDataWithAdapterConfig:(ISAdapterConfig *)adapterConfig + adData:(NSDictionary *)adData + delegate:(id)delegate; + +- (void)initInterstitialForBiddingWithUserId:(NSString *)userId + adapterConfig:(ISAdapterConfig *)adapterConfig + delegate:(id)delegate; + +- (void)loadInterstitialForBiddingWithAdapterConfig:(ISAdapterConfig *)adapterConfig + adData:(NSDictionary *)adData + serverData:(NSString *)serverData + delegate:(id)delegate; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISIronSourceAdapter.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISIronSourceAdapter.h new file mode 100644 index 0000000..4cfc181 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISIronSourceAdapter.h @@ -0,0 +1,18 @@ +// +// ISIronSourceAdapter.h +// IronSource +// +// Created by Dor Alon on 07/03/2019. +// Copyright © 2019 IronSource. All rights reserved. +// + +#import +#import "ISBaseAdapter+Internal.h" + +@interface ISIronSourceAdapter : ISBaseAdapter + +- (void)initSDK:(ISAdapterConfig *)adapterConfig; + +- (NSDictionary *)createInitExtraParams; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISLoadWhileShowSupportState.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISLoadWhileShowSupportState.h new file mode 100644 index 0000000..0da3603 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISLoadWhileShowSupportState.h @@ -0,0 +1,25 @@ +// +// ISLoadWhileShowSupportState.h +// IronSource +// +// Created by Yonti Makmel on 11/10/2021. +// Copyright © 2021 IronSource. All rights reserved. +// + +#ifndef ISLoadWhileShowSupportState_h +#define ISLoadWhileShowSupportState_h + +/* +The various support states for load while show - currently used for rewarded videos +by instance - a network can load an instance while showing the same once +by network - a network can load an instance while showing a different instance +none - a network can't load an instance while showing any of its instances + */ + +typedef NS_ENUM(NSInteger, ISLoadWhileShowSupportState) { + LOAD_WHILE_SHOW_NONE = 0, + LOAD_WHILE_SHOW_BY_INSTANCE = 1, + LOAD_WHILE_SHOW_BY_NETWORK = 2 +}; + +#endif /* ISLoadWhileShowSupportState_h */ diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISLog.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISLog.h new file mode 100644 index 0000000..9327c59 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISLog.h @@ -0,0 +1,108 @@ +// +// ISLog.h +// IronSource +// +// Created by Yonti Makmel on 09/06/2020. +// Copyright © 2020 ironSource. All rights reserved. +// + +#import +#import "ISLoggerManager.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface ISLog : NSObject + +// new dynamic logs +#define logGeneric(logLevel, tag, format, ...) \ + [[ISLoggerManager sharedInstance] dynamicLog:(char *)__PRETTY_FUNCTION__ \ + message:[NSString stringWithFormat:format, ##__VA_ARGS__] \ + level:logLevel \ + withTag:tag] + +// TAG_API +#define LogApi_Internal(format, ...) logGeneric(IS_LOG_INTERNAL, TAG_API, format, ##__VA_ARGS__) +#define LogApi_Info(format, ...) logGeneric(IS_LOG_INFO, TAG_API, format, ##__VA_ARGS__) +#define LogApi_Warning(format, ...) logGeneric(IS_LOG_WARNING, TAG_API, format, ##__VA_ARGS__) +#define LogApi_Error(format, ...) logGeneric(IS_LOG_ERROR, TAG_API, format, ##__VA_ARGS__) +#define LogApi_General(format, ...) logGeneric(IS_LOG_GENERAL, TAG_API, format, ##__VA_ARGS__) + +// TAG_DELEGATE +#define LogDelegate_Internal(format, ...) \ + logGeneric(IS_LOG_INTERNAL, TAG_DELEGATE, format, ##__VA_ARGS__) +#define LogDelegate_Info(format, ...) logGeneric(IS_LOG_INFO, TAG_DELEGATE, format, ##__VA_ARGS__) +#define LogDelegate_Warning(format, ...) \ + logGeneric(IS_LOG_WARNING, TAG_DELEGATE, format, ##__VA_ARGS__) +#define LogDelegate_Error(format, ...) logGeneric(IS_LOG_ERROR, TAG_DELEGATE, format, ##__VA_ARGS__) +#define LogDelegate_General(format, ...) \ + logGeneric(IS_LOG_GENERAL, TAG_DELEGATE, format, ##__VA_ARGS__) + +// TAG_ADAPTER_API +#define LogAdapterApi_Internal(format, ...) \ + logGeneric(IS_LOG_INTERNAL, TAG_ADAPTER_API, format, ##__VA_ARGS__) +#define LogAdapterApi_Info(format, ...) \ + logGeneric(IS_LOG_INFO, TAG_ADAPTER_API, format, ##__VA_ARGS__) +#define LogAdapterApi_Warning(format, ...) \ + logGeneric(IS_LOG_WARNING, TAG_ADAPTER_API, format, ##__VA_ARGS__) +#define LogAdapterApi_Error(format, ...) \ + logGeneric(IS_LOG_ERROR, TAG_ADAPTER_API, format, ##__VA_ARGS__) +#define LogAdapterApi_General(format, ...) \ + logGeneric(IS_LOG_GENERAL, TAG_ADAPTER_API, format, ##__VA_ARGS__) + +// TAG_ADAPTER_DELEGATE +#define LogAdapterDelegate_Internal(format, ...) \ + logGeneric(IS_LOG_INTERNAL, TAG_ADAPTER_DELEGATE, format, ##__VA_ARGS__) +#define LogAdapterDelegate_Info(format, ...) \ + logGeneric(IS_LOG_INFO, TAG_ADAPTER_DELEGATE, format, ##__VA_ARGS__) +#define LogAdapterDelegate_Warning(format, ...) \ + logGeneric(IS_LOG_WARNING, TAG_ADAPTER_DELEGATE, format, ##__VA_ARGS__) +#define LogAdapterDelegate_Error(format, ...) \ + logGeneric(IS_LOG_ERROR, TAG_ADAPTER_DELEGATE, format, ##__VA_ARGS__) +#define LogAdapterDelegate_General(format, ...) \ + logGeneric(IS_LOG_GENERAL, TAG_ADAPTER_DELEGATE, format, ##__VA_ARGS__) + +// TAG_NETWORK +#define LogNetwork_Internal(format, ...) \ + logGeneric(IS_LOG_INTERNAL, TAG_NETWORK, format, ##__VA_ARGS__) +#define LogNetwork_Info(format, ...) logGeneric(IS_LOG_INFO, TAG_NETWORK, format, ##__VA_ARGS__) +#define LogNetwork_Warning(format, ...) \ + logGeneric(IS_LOG_WARNING, TAG_NETWORK, format, ##__VA_ARGS__) +#define LogNetwork_Error(format, ...) logGeneric(IS_LOG_ERROR, TAG_NETWORK, format, ##__VA_ARGS__) +#define LogNetwork_General(format, ...) \ + logGeneric(IS_LOG_GENERAL, TAG_NETWORK, format, ##__VA_ARGS__) + +// TAG_NATIVE +#define LogNative_Internal(format, ...) \ + logGeneric(IS_LOG_INTERNAL, TAG_NATIVE, format, ##__VA_ARGS__) +#define LogNative_Info(format, ...) logGeneric(IS_LOG_INFO, TAG_NATIVE, format, ##__VA_ARGS__) +#define LogNative_Warning(format, ...) logGeneric(IS_LOG_WARNING, TAG_NATIVE, format, ##__VA_ARGS__) +#define LogNative_Error(format, ...) logGeneric(IS_LOG_ERROR, TAG_NATIVE, format, ##__VA_ARGS__) +#define LogNative_General(format, ...) logGeneric(IS_LOG_GENERAL, TAG_NATIVE, format, ##__VA_ARGS__) + +// TAG_INTERNAL +#define LogInternal_Internal(format, ...) \ + logGeneric(IS_LOG_INTERNAL, TAG_INTERNAL, format, ##__VA_ARGS__) +#define LogInternal_Info(format, ...) logGeneric(IS_LOG_INFO, TAG_INTERNAL, format, ##__VA_ARGS__) +#define LogInternal_Warning(format, ...) \ + logGeneric(IS_LOG_WARNING, TAG_INTERNAL, format, ##__VA_ARGS__) +#define LogInternal_Error(format, ...) logGeneric(IS_LOG_ERROR, TAG_INTERNAL, format, ##__VA_ARGS__) +#define LogInternal_General(format, ...) \ + logGeneric(IS_LOG_GENERAL, TAG_INTERNAL, format, ##__VA_ARGS__) + +// TAG_EVENT +#define LogEvent_Internal(format, ...) logGeneric(IS_LOG_INTERNAL, TAG_EVENT, format, ##__VA_ARGS__) +#define LogEvent_Info(format, ...) logGeneric(IS_LOG_INFO, TAG_EVENT, format, ##__VA_ARGS__) +#define LogEvent_Warning(format, ...) logGeneric(IS_LOG_WARNING, TAG_EVENT, format, ##__VA_ARGS__) +#define LogEvent_Error(format, ...) logGeneric(IS_LOG_ERROR, TAG_EVENT, format, ##__VA_ARGS__) +#define LogEvent_General(format, ...) logGeneric(IS_LOG_GENERAL, TAG_EVENT, format, ##__VA_ARGS__) + +// AUTOMATION +#define LogAutomation(format, ...) \ + [[ISLoggerManager sharedInstance] \ + automationLog:[NSString stringWithFormat:format, ##__VA_ARGS__] \ + level:IS_LOG_INTERNAL \ + withTag:TAG_INTERNAL] + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISLoggerManager.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISLoggerManager.h new file mode 100644 index 0000000..8ffe2da --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISLoggerManager.h @@ -0,0 +1,68 @@ +// +// LogManager.h +// IronSource +// +// Created by Roni Parshani on 10/22/14. +// Copyright (c) 2014 IronSource. All rights reserved. +// + +#import + +typedef enum LogLevelValues { + IS_LOG_NONE = -1, + IS_LOG_INTERNAL = 0, + IS_LOG_INFO = 1, + IS_LOG_WARNING = 2, + IS_LOG_ERROR = 3, + IS_LOG_GENERAL = 4, // Publisher log level, always visible + IS_LOG_CRITICAL = 5, + +} ISLogLevel; + +typedef enum LogTagValue { + TAG_API, + TAG_DELEGATE, + TAG_ADAPTER_API, + TAG_ADAPTER_DELEGATE, + TAG_NETWORK, + TAG_NATIVE, + TAG_INTERNAL, + TAG_EVENT +} LogTag; + +#define ISLogInternal(tag2, format, ...) \ + [[ISLoggerManager sharedInstance] log:[NSString stringWithFormat:(format), ##__VA_ARGS__] \ + level:IS_LOG_INTERNAL \ + tag:tag2] +#define ISLogInfo(tag2, format, ...) \ + [[ISLoggerManager sharedInstance] log:[NSString stringWithFormat:(format), ##__VA_ARGS__] \ + level:IS_LOG_INFO \ + tag:tag2] +#define ISLogError(tag2, format, ...) \ + [[ISLoggerManager sharedInstance] log:[NSString stringWithFormat:(format), ##__VA_ARGS__] \ + level:IS_LOG_ERROR \ + tag:tag2] + +@class ISLogger; + +@interface ISLoggerManager : NSObject + ++ (ISLoggerManager *)sharedInstance; + +- (void)setLoggingLevels:(NSInteger)server + publisher:(NSInteger)publisher + console:(NSInteger)console; +- (void)log:(NSString *)message level:(ISLogLevel)logLevel tag:(LogTag)logTag; +- (void)logFromError:(NSError *)error level:(ISLogLevel)logLevel tag:(LogTag)logTag; +- (void)logFromException:(NSException *)exception level:(ISLogLevel)logLevel tag:(LogTag)logTag; +- (void)logFromException:(NSException *)exception + message:(NSString *)message + level:(ISLogLevel)logLevel + tag:(LogTag)logTag; +- (void)dynamicLog:(char *)calledFrom + message:(NSString *)message + level:(ISLogLevel)logLevel + withTag:(LogTag)logTag; +- (void)automationLog:(NSString *)message level:(ISLogLevel)logLevel withTag:(LogTag)logTag; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISMediationGlobalDataWriterFacade.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISMediationGlobalDataWriterFacade.h new file mode 100644 index 0000000..cc2da27 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISMediationGlobalDataWriterFacade.h @@ -0,0 +1,13 @@ +// +// ISMediationGlobalDataWriterFacade.h +// IronSource +// +// Created by noy.fridman on 21/03/2024. +// + +#import + +@interface ISMediationGlobalDataWriterFacade : NSObject +- (void)setGoogleWaterMark:(NSString *)waterMark; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISMetaData.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISMetaData.h new file mode 100644 index 0000000..26d6f3e --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISMetaData.h @@ -0,0 +1,31 @@ +// +// ISMetaData.h +// IronSource +// +// Created by Roi Eshel on 30/01/2020. +// Copyright © 2020 ironSource. All rights reserved. +// + +#import + +@interface ISMetaData : NSObject + +typedef NS_ENUM(NSUInteger, ISMetaDataValueTypes) { + META_DATA_VALUE_STRING, + META_DATA_VALUE_BOOL, + META_DATA_VALUE_INT, + META_DATA_VALUE_LONG, + META_DATA_VALUE_DOUBLE, + META_DATA_VALUE_FLOAT +}; + +- (instancetype)initWithKey:(NSString *)key andValues:(NSMutableArray *)values; +- (instancetype)initWithKey:(NSString *)key + values:(NSMutableArray *)values + andValuesType:(NSMutableArray *)valuesType; + +@property NSString *key; +@property NSMutableArray *values; +@property NSMutableArray *valuesType; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISMetaDataConstants.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISMetaDataConstants.h new file mode 100644 index 0000000..32e1f95 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISMetaDataConstants.h @@ -0,0 +1,21 @@ +// +// ISMetaDataConstants.h +// IronSource +// +// Created by Roi Eshel on 30/01/2020. +// Copyright © 2020 ironSource. All rights reserved. +// + +// ************* Meta Data Keys ************ + +#define kMetaDataCCPAKey @"do_not_sell" +#define kMetaDataISCOPPAKey @"is_child_directed" +#define kMetaDataTestSuiteKey @"is_test_suite" +#define kMetaDataIIQFKey @"iiqf" + +// ************* Meta Data Values ************ + +#define kMetaDataTrueValue @"true" +#define kMetaDataFalseValue @"false" +#define kMetaDataTestSuiteEnableValue @"enable" +#define kMetaDataGoogleWaterMark @"google_water_mark" diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISMetaDataUtils.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISMetaDataUtils.h new file mode 100644 index 0000000..2049083 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISMetaDataUtils.h @@ -0,0 +1,34 @@ +// +// ISMetaDataUtils.h +// IronSource +// +// Created by Roi Eshel on 30/01/2020. +// Copyright © 2020 ironSource. All rights reserved. +// + +#import +#import "ISMetaData.h" + +@interface ISMetaDataUtils : NSObject + ++ (ISMetaDataValueTypes)getValueTypeForKey:(NSString *)key; + ++ (BOOL)isKnownKey:(NSString *)key; + ++ (BOOL)isMediationOnlyKey:(NSString *)key; + ++ (NSString *)formatValue:(NSString *)value forType:(ISMetaDataValueTypes)valueType; + ++ (ISMetaData *)formatMetaDataKey:(NSString *)key andValues:(NSMutableArray *)values; + ++ (BOOL)isMetaDataKeyValid:(NSString *)key error:(NSString **)error; + ++ (BOOL)isMetaDataValuesValid:(NSMutableArray *)values error:(NSString **)error; + ++ (BOOL)isValidCCPAMetaDataWithKey:(NSString *)key andValue:(NSString *)value; + ++ (BOOL)isValidMetaDataWithKey:(NSString *)key flag:(NSString *)flag andValue:(NSString *)value; + ++ (BOOL)getMetaDataBooleanValue:(NSString *)value; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNAdViewsManagerSwiftFacade.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNAdViewsManagerSwiftFacade.h new file mode 100644 index 0000000..db65f1c --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNAdViewsManagerSwiftFacade.h @@ -0,0 +1,20 @@ +// +// ISNAdViewManagmentProtocol.h +// SSASDKXCFramework +// +// Created by Ariel Barsheshet on 27/07/2023. +// Copyright © 2023 ironSource. All rights reserved. +// + +#import + +@class UIView; + +@protocol ISNAdViewsManagerSwiftFacade + +- (UIView *)getAdViewById:(NSString *)adViewId; + +@end + +@interface ISNAdViewsManagerSwiftFacade : NSObject +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNAppStoreVCRootViewDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNAppStoreVCRootViewDelegate.h new file mode 100644 index 0000000..a1c68e9 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNAppStoreVCRootViewDelegate.h @@ -0,0 +1,16 @@ +// +// ISNAppStoreVCRootViewDelegate.h +// IronSourceSDK +// +// Created by Gal Salti on 27/09/2023. +// + +NS_ASSUME_NONNULL_BEGIN + +@protocol ISNAppStoreVCRootViewDelegate + +- (void)didReceiveOutOfAppStoreTouchWithType:(NSString *)type; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNControllerManagerSwiftFacade.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNControllerManagerSwiftFacade.h new file mode 100644 index 0000000..806974f --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNControllerManagerSwiftFacade.h @@ -0,0 +1,24 @@ +// +// ISNControllerManagerSwiftFacade.h +// SSASDKXCFramework +// +// Created by Ariel Barsheshet on 24/07/2023. +// Copyright © 2023 ironSource. All rights reserved. +// + +#import + +@class MessageToController, CallbackToNative; +@protocol ISNControllerMessageListener; + +@interface ISNControllerManagerSwiftFacade : NSObject + +- (void)sendMessage:(MessageToController *)message + callbackHandler:(void (^)(CallbackToNative *))callbackHandler; + +- (void)setControllerMessageListenerWithAdId:(NSString *)adId + listener:(id)listener; + +- (void)removeControllerMessageListenerWithAdId:(NSString *)adId; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNControllerMessageListener.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNControllerMessageListener.h new file mode 100644 index 0000000..79e8322 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNControllerMessageListener.h @@ -0,0 +1,21 @@ +// +// ISNControllerMessageListener.h +// SSASDK +// +// Created by Gal Salti on 15/08/2023. +// Copyright © 2023 ironSource. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@class MessageToNative; + +@protocol ISNControllerMessageListener + +- (void)onReceiveWithMessage:(nullable MessageToNative *)message; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNEvent.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNEvent.h new file mode 100644 index 0000000..e05c82b --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNEvent.h @@ -0,0 +1,19 @@ +// +// ISNEvent.h +// SSASDK +// +// Created by Tomer Ben-Rachel on 19/04/2020. +// Copyright © 2020 SSA Ltd. All rights reserved. +// +// This class represents an IronSourceNetwork Event with an id and a name + +#import + +@interface ISNEvent : NSObject + +@property(nonatomic, strong) NSString* eventName; +@property(nonatomic, strong) NSNumber* eventId; + +- (instancetype)initWithEventId:(NSNumber*)eventId eventName:(NSString*)eventName; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNEventTrackerInterface.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNEventTrackerInterface.h new file mode 100644 index 0000000..473e4f7 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNEventTrackerInterface.h @@ -0,0 +1,15 @@ +// +// ISNEventTrackerInterface.h +// SSASDKXCFramework +// +// Created by Ariel Barsheshet on 23/07/2023. +// Copyright © 2023 ironSource. All rights reserved. +// + +#import "ISNEvent.h" + +@protocol ISNEventTrackerInterface + +- (void)logEvent:(ISNEvent*)event data:(NSDictionary*)data; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNEventTrackerWrapper.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNEventTrackerWrapper.h new file mode 100644 index 0000000..e5af3a1 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNEventTrackerWrapper.h @@ -0,0 +1,13 @@ +// +// ISNEventTrackerWrapper.h +// ISEventsTrackerXCFramework +// +// Created by Ariel Barsheshet on 23/07/2023. +// Copyright © 2023 ironSource. All rights reserved. +// + +#import "ISNEventTrackerInterface.h" + +@interface ISNEventTrackerWrapper : NSObject + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNSupersonicAdsPublisherSwiftFacade.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNSupersonicAdsPublisherSwiftFacade.h new file mode 100644 index 0000000..20f7744 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNSupersonicAdsPublisherSwiftFacade.h @@ -0,0 +1,14 @@ +// +// ISNSupersonicAdsPublisherSwiftFacade.h +// IronSource +// +// Created by Idan Ginat on 03/01/2024. +// + +#import + +@interface ISNSupersonicAdsPublisherSwiftFacade : NSObject + +- (void)setControllerConfig:(NSString *)config; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNativeAdAdapterDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNativeAdAdapterDelegate.h new file mode 100644 index 0000000..2b7350b --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNativeAdAdapterDelegate.h @@ -0,0 +1,30 @@ +// +// ISNativeAdAdapterDelegate.h +// IronSource +// +// Created by Hadar Pur on 02/07/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +#import "ISAdapterNativeAdData.h" +#import "ISAdapterNativeAdViewBinder.h" +#import "ISError.h" + +@protocol ISNativeAdAdapterDelegate + +@required + +- (void)adapterNativeAdInitSuccess; + +- (void)adapterNativeAdInitFailedWithError:(NSError *)error; + +- (void)adapterNativeAdDidLoadWithAdData:(ISAdapterNativeAdData *)adapterNativeAdData + adViewBinder:(ISAdapterNativeAdViewBinder *)nativeAdViewBinder; + +- (void)adapterNativeAdDidFailToLoadWithError:(NSError *)error; + +- (void)adapterNativeAdDidShow; + +- (void)adapterNativeAdDidClick; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNativeAdAdapterProtocol.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNativeAdAdapterProtocol.h new file mode 100644 index 0000000..24358b7 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNativeAdAdapterProtocol.h @@ -0,0 +1,45 @@ +// +// ISNativeAdAdapterProtocol.h +// IronSource +// +// Created by Hadar Pur on 06/07/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +#import "ISAdUnitAdapterProtocol.h" +#import "ISBiddingDataDelegate.h" +#import "ISNativeAdAdapterDelegate.h" + +@protocol ISNativeAdAdapterProtocol + +@optional + +- (void)initNativeAdsWithUserId:(NSString *)userId + adapterConfig:(ISAdapterConfig *)adapterConfig + delegate:(id)delegate; + +- (void)initNativeAdForBiddingWithUserId:(NSString *)userId + adapterConfig:(ISAdapterConfig *)adapterConfig + delegate:(id)delegate; + +- (void)loadNativeAdWithAdapterConfig:(ISAdapterConfig *)adapterConfig + adData:(NSDictionary *)adData + viewController:(UIViewController *)viewController + delegate:(id)delegate; + +- (void)loadNativeAdForBiddingWithAdapterConfig:(ISAdapterConfig *)adapterConfig + adData:(NSDictionary *)adData + serverData:(NSString *)serverData + viewController:(UIViewController *)viewController + delegate:(id)delegate; + +- (void)destroyNativeAdWithAdapterConfig:(ISAdapterConfig *)adapterConfig; + +- (NSDictionary *)getNativeAdBiddingDataWithAdapterConfig:(ISAdapterConfig *)adapterConfig + adData:(NSDictionary *)adData; + +- (void)collectNativeAdBiddingDataWithAdapterConfig:(ISAdapterConfig *)adapterConfig + adData:(NSDictionary *)adData + delegate:(id)delegate; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNativeAdDataImage.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNativeAdDataImage.h new file mode 100644 index 0000000..7031de6 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNativeAdDataImage.h @@ -0,0 +1,25 @@ +// +// ISNativeAdDataImage.h +// IronSource +// +// Created by Hadar Pur on 02/07/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface ISNativeAdDataImage : NSObject + +@property(nonatomic, strong, readonly, nullable) UIImage *image; +@property(nonatomic, strong, readonly, nullable) NSURL *url; + +- (instancetype)initWithImage:(nullable UIImage *)image url:(nullable NSURL *)url; +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNativeAdDataProtocol.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNativeAdDataProtocol.h new file mode 100644 index 0000000..690a525 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNativeAdDataProtocol.h @@ -0,0 +1,21 @@ +// +// ISNativeAdDataProtocol.h +// IronSource +// +// Created by Hadar Pur on 02/07/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +#import "ISNativeAdDataImage.h" + +@protocol ISNativeAdDataProtocol + +@required + +@property(nonatomic, strong, nullable) NSString *title; +@property(nonatomic, strong, nullable) NSString *advertiser; +@property(nonatomic, strong, nullable) NSString *body; +@property(nonatomic, strong, nullable) NSString *callToAction; +@property(nonatomic, strong, nullable) ISNativeAdDataImage *icon; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNativeAdDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNativeAdDelegate.h new file mode 100644 index 0000000..e66ed0f --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNativeAdDelegate.h @@ -0,0 +1,25 @@ +// +// ISNativeAdDelegate.h +// IronSource +// +// Created by Hadar Pur on 27/06/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +#import "ISAdapterAdDelegate.h" +#import "ISAdapterNativeAdData.h" +#import "ISAdapterNativeAdViewBinder.h" + +NS_ASSUME_NONNULL_BEGIN + +@protocol ISNativeAdDelegate + +/// mandatory callbacks +/// @param adapterNativeAdData the native ad data +/// @param nativeAdViewBinder the native ad view binder +- (void)adDidLoadWithAdData:(ISAdapterNativeAdData *)adapterNativeAdData + adViewBinder:(ISAdapterNativeAdViewBinder *)nativeAdViewBinder; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNativeAdInteractionDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNativeAdInteractionDelegate.h new file mode 100644 index 0000000..14dcb1b --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNativeAdInteractionDelegate.h @@ -0,0 +1,35 @@ +// +// ISNativeAdInteractionDelegate.h +// IronSource +// +// Created by Hadar Pur on 22/06/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +#import "ISAdInfo.h" + +NS_ASSUME_NONNULL_BEGIN + +@class LevelPlayNativeAd; + +@protocol ISNativeAdInteractionDelegate + +@required + +/** + Called after a native ad impression has been recorded. + @param nativeAd Level Play native ad. + @param adInfo The info of the ad. + */ +- (void)didRecordImpression:(LevelPlayNativeAd *)nativeAd withAdInfo:(ISAdInfo *)adInfo; + +/** + Called after a native ad has been clicked. + @param nativeAd Level Play native ad. + @param adInfo The info of the ad. + */ +- (void)didClick:(LevelPlayNativeAd *)nativeAd withAdInfo:(ISAdInfo *)adInfo; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNativeAdLoadDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNativeAdLoadDelegate.h new file mode 100644 index 0000000..9016733 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNativeAdLoadDelegate.h @@ -0,0 +1,36 @@ +// +// ISNativeAdLoadDelegate.h +// IronSource +// +// Created by Hadar Pur on 22/06/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +#import "ISAdInfo.h" +#import "ISError.h" + +@class LevelPlayNativeAd; + +NS_ASSUME_NONNULL_BEGIN + +@protocol ISNativeAdLoadDelegate + +@required + +/** + Called after a native ad has been successfully loaded + @param nativeAd Level Play native ad. + @param adInfo The info of the ad. + */ +- (void)didLoad:(LevelPlayNativeAd *)nativeAd withAdInfo:(ISAdInfo *)adInfo; + +/** + Called after a native has attempted to load an ad but failed. + @param nativeAd Level Play native ad. + @param error The reason for the error + */ +- (void)didFailToLoad:(LevelPlayNativeAd *)nativeAd withError:(NSError *)error; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNativeAdProperties.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNativeAdProperties.h new file mode 100644 index 0000000..0f300c8 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNativeAdProperties.h @@ -0,0 +1,22 @@ +// +// ISNativeAdProperties.h +// IronSource +// +// Created by Hadar Pur on 06/07/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +#import +#import "ISAdOptionsPosition.h" +#import "ISAdapterConfig.h" + +@interface ISNativeAdProperties : NSObject + +@property(nonatomic, assign, readonly) ISAdOptionsPosition adOptionsPosition; + +- (instancetype)initWithAdapterConfig:(ISAdapterConfig *)adapterConfig; +- (instancetype)initWithServerConfig:(NSDictionary *)serverConfig; +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNativeAdProtocol.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNativeAdProtocol.h new file mode 100644 index 0000000..028dab1 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNativeAdProtocol.h @@ -0,0 +1,17 @@ +// +// ISNativeAdProtocol.h +// IronSource +// +// Created by Maoz Elbaz on 11/07/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +@protocol ISNativeAdProtocol + +@required + +- (void)loadAd; + +- (void)destroyAd; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNativeAdView.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNativeAdView.h new file mode 100644 index 0000000..4315282 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNativeAdView.h @@ -0,0 +1,35 @@ +// +// ISNativeAdView.h +// IronSource +// +// Created by Hadar Pur on 04/06/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +#import +#import "ISNativeAdViewBinderProtocol.h" +#import "LevelPlayMediaView.h" +#import "LevelPlayNativeAd.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface ISNativeAdView : UIView + +/// Weak reference to your ad view's icon asset view. +@property(weak, nonatomic) IBOutlet UIImageView *adAppIcon; +/// Weak reference to your ad view's headline asset view. +@property(weak, nonatomic) IBOutlet UILabel *adTitleView; +/// Weak reference to your ad view's advertiser asset view. +@property(weak, nonatomic) IBOutlet UILabel *adAdvertiserView; +/// Weak reference to your ad view's body asset view. +@property(weak, nonatomic) IBOutlet UILabel *adBodyView; +/// Weak reference to your ad view's media asset view. +@property(weak, nonatomic) IBOutlet LevelPlayMediaView *adMediaView; +/// Weak reference to your ad view's call to action asset view. +@property(weak, nonatomic) IBOutlet UIButton *adCallToActionView; + +- (void)registerNativeAdViews:(LevelPlayNativeAd *)nativeAd; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNativeAdViewBinderProtocol.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNativeAdViewBinderProtocol.h new file mode 100644 index 0000000..326ceda --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNativeAdViewBinderProtocol.h @@ -0,0 +1,23 @@ +// +// ISNativeAdViewBinderProtocol.h +// IronSource +// +// Created by Hadar Pur on 19/06/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +#import +#import "LevelPlayMediaView.h" + +@protocol ISNativeAdViewBinderProtocol + +@required + +- (void)setIconView:(UIImageView *)iconView; +- (void)setTitleView:(UILabel *)titleView; +- (void)setAdvertiserView:(UILabel *)advertiserView; +- (void)setBodyView:(UILabel *)bodyView; +- (void)setMediaView:(LevelPlayMediaView *)mediaView; +- (void)setCallToActionView:(UIButton *)callToActionView; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNativeAdViewHolder.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNativeAdViewHolder.h new file mode 100644 index 0000000..5e4d54e --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNativeAdViewHolder.h @@ -0,0 +1,21 @@ +// +// ISNativeAdViewHolder.h +// IronSource +// +// Created by Hadar Pur on 22/06/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +#import +#import "LevelPlayMediaView.h" + +@interface ISNativeAdViewHolder : NSObject + +@property(weak, nonatomic, nullable) UIImageView *iconView; +@property(weak, nonatomic, nullable) UILabel *titleView; +@property(weak, nonatomic, nullable) UILabel *advertiserView; +@property(weak, nonatomic, nullable) UILabel *bodyView; +@property(weak, nonatomic, nullable) LevelPlayMediaView *mediaView; +@property(weak, nonatomic, nullable) UIButton *callToActionView; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNetworkInitCallbackProtocol.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNetworkInitCallbackProtocol.h new file mode 100644 index 0000000..c5f7810 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNetworkInitCallbackProtocol.h @@ -0,0 +1,22 @@ +// +// ISNetworkInitCallbackDelegate.h +// IronSource +// +// Created by Yonti Makmel on 17/05/2020. +// Copyright © 2020 ironSource. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@protocol ISNetworkInitCallbackProtocol + +@optional + +- (void)onNetworkInitCallbackSuccess; +- (void)onNetworkInitCallbackFailed:(NSString *)errorMessage; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNetworkInitializationDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNetworkInitializationDelegate.h new file mode 100644 index 0000000..99d99ff --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNetworkInitializationDelegate.h @@ -0,0 +1,32 @@ +// +// ISNetworkInitializationDelegate.h +// IronSource +// +// Created by Yonti Makmel on 07/06/2021. +// Copyright © 2021 ironSource. All rights reserved. +// + +NS_ASSUME_NONNULL_BEGIN + +@protocol ISNetworkInitializationDelegate + +// mandatory callbacks + +- (void)onInitDidSucceed; +- (void)onInitDidSucceedWithExtraData:(NSDictionary *)extraData; + +/// @param errorCode the error code if available, general ones in AdapterErrors +/// @param errorMessage the error message if available +- (void)onInitDidFailWithErrorCode:(NSInteger)errorCode + errorMessage:(nullable NSString *)errorMessage; + +/// @param errorCode the error code if available, general ones in AdapterErrors +/// @param errorMessage the error message if available +/// @param extraData custom data +- (void)onInitDidFailWithErrorCode:(NSInteger)errorCode + errorMessage:(nullable NSString *)errorMessage + extraData:(NSDictionary *)extraData; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISRewardedVideoAdapterDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISRewardedVideoAdapterDelegate.h new file mode 100644 index 0000000..301d3a4 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISRewardedVideoAdapterDelegate.h @@ -0,0 +1,64 @@ +// +// ISRewardedVideoAdapterDelegate.h +// IronSource +// +// Created by Roni Parshani on 10/12/14. +// Copyright (c) 2014 IronSource. All rights reserved. +// + +#import + +@protocol ISRewardedVideoAdapterDelegate + +- (void)adapterRewardedVideoHasChangedAvailability:(BOOL)available; +- (void)adapterRewardedVideoHasChangedAvailability:(BOOL)available + extraData:(NSDictionary *)extraData; + +- (void)adapterRewardedVideoDidFailToLoadWithError:(NSError *)error; +- (void)adapterRewardedVideoDidFailToLoadWithError:(NSError *)error + extraData:(NSDictionary *)extraData; + +- (void)adapterRewardedVideoDidReceiveReward; +- (void)adapterRewardedVideoDidReceiveRewardWithExtraData:(NSDictionary *)extraData; + +- (void)adapterRewardedVideoDidFailToShowWithError:(NSError *)error; +- (void)adapterRewardedVideoDidFailToShowWithError:(NSError *)error + extraData:(NSDictionary *)extraData; + +- (void)adapterRewardedVideoDidOpen; +- (void)adapterRewardedVideoDidOpenWithExtraData:(NSDictionary *)extraData; + +- (void)adapterRewardedVideoDidClose; +- (void)adapterRewardedVideoDidCloseWithExtraData:(NSDictionary *)extraData; + +#pragma mark - demand only + +- (void)adapterRewardedVideoDidLoad; +- (void)adapterRewardedVideoDidLoadWithExtraData:(NSDictionary *)extraData; + +#pragma mark - optional - when supported by network + +- (void)adapterRewardedVideoDidClick; +- (void)adapterRewardedVideoDidClickWithExtraData:(NSDictionary *)extraData; + +- (void)adapterRewardedVideoDidStart; +- (void)adapterRewardedVideoDidStartWithExtraData:(NSDictionary *)extraData; + +- (void)adapterRewardedVideoDidEnd; +- (void)adapterRewardedVideoDidEndWithExtraData:(NSDictionary *)extraData; + +#pragma mark - relevant only for bidding + +- (void)adapterRewardedVideoInitSuccess; +- (void)adapterRewardedVideoInitSuccessWithExtraData:(NSDictionary *)extraData; + +- (void)adapterRewardedVideoInitFailed:(NSError *)error; +- (void)adapterRewardedVideoInitFailed:(NSError *)error + extraData:(NSDictionary *)extraData; + +#pragma mark - relevant only for ironSource adapter + +- (void)adapterRewardedVideoDidBecomeVisible; +- (void)adapterRewardedVideoDidBecomeVisibleWithExtraData:(NSDictionary *)extraData; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISRewardedVideoAdapterProtocol.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISRewardedVideoAdapterProtocol.h new file mode 100644 index 0000000..496ede1 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISRewardedVideoAdapterProtocol.h @@ -0,0 +1,77 @@ +// +// ISRewardedVideoAdapterProtocol.h +// IronSource +// +// Created by Roni Parshani on 10/12/14. +// Copyright (c) 2014 IronSource. All rights reserved. +// + +#import +#import +#import "ISAdUnitAdapterProtocol.h" +#import "ISBiddingDataDelegate.h" +#import "ISRewardedVideoAdapterDelegate.h" + +@class ISAdapterConfig; +@protocol ISRewardedVideoAdapterProtocol + +@optional + +#pragma mark - for bidders, non bidders and demand only + +- (BOOL)hasRewardedVideoWithAdapterConfig:(ISAdapterConfig *)adapterConfig; + +- (void)showRewardedVideoWithViewController:(UIViewController *)viewController + adapterConfig:(ISAdapterConfig *)adapterConfig + delegate:(id)delegate; + +- (void)destroyRewardedVideoAdWithAdapterConfig:(ISAdapterConfig *)adapterConfig; + +#pragma mark - shared + +- (void)initAndLoadRewardedVideoWithUserId:(NSString *)userId + adapterConfig:(ISAdapterConfig *)adapterConfig + adData:(NSDictionary *)adData + delegate:(id)delegate; + +- (void)initRewardedVideoForCallbacksWithUserId:(NSString *)userId + adapterConfig:(ISAdapterConfig *)adapterConfig + delegate:(id)delegate; + +#pragma mark - for non bidders + +- (void)loadRewardedVideoWithAdapterConfig:(ISAdapterConfig *)adapterConfig + adData:(NSDictionary *)adData + delegate:(id)delegate; + +#pragma mark - for bidders + +- (NSDictionary *)getRewardedVideoBiddingDataWithAdapterConfig:(ISAdapterConfig *)adapterConfig + adData:(NSDictionary *)adData; + +- (void)collectRewardedVideoBiddingDataWithAdapterConfig:(ISAdapterConfig *)adapterConfig + adData:(NSDictionary *)adData + delegate:(id)delegate; + +- (void)loadRewardedVideoForBiddingWithAdapterConfig:(ISAdapterConfig *)adapterConfig + adData:(NSDictionary *)adData + serverData:(NSString *)serverData + delegate:(id)delegate; + +#pragma mark - for demand only + +- (void)initRewardedVideoForDemandOnlyWithUserId:(NSString *)userId + adapterConfig:(ISAdapterConfig *)adapterConfig + delegate:(id)delegate; + +- (void)loadRewardedVideoForDemandOnlyWithAdapterConfig:(ISAdapterConfig *)adapterConfig + delegate: + (id)delegate; + +- (void)loadRewardedVideoForDemandOnlyForBiddingWithAdapterConfig:(ISAdapterConfig *)adapterConfig + serverData:(NSString *)serverData + delegate: + (id) + delegate; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISSetAPSDataProtocol.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISSetAPSDataProtocol.h new file mode 100644 index 0000000..43defcc --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISSetAPSDataProtocol.h @@ -0,0 +1,24 @@ +// +// ISSetAPSDataProtocol.h +// IronSource +// +// Created by Sveta Itskovich on 29/11/2021. +// Copyright © 2021 IronSource. All rights reserved. +// + +#ifndef ISSetAPSDataProtocol_h +#define ISSetAPSDataProtocol_h + +#import + +NS_ASSUME_NONNULL_BEGIN + +@protocol ISSetAPSDataProtocol + +- (void)setAPSDataWithAdUnit:(NSString *)adUnit apsData:(NSDictionary *)apsData; + +@end + +NS_ASSUME_NONNULL_END + +#endif /* ISSetAPSDataProtocol_h */ diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISSupersonicAdsConfiguration.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISSupersonicAdsConfiguration.h new file mode 100644 index 0000000..3c42c3a --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISSupersonicAdsConfiguration.h @@ -0,0 +1,21 @@ +// +// Copyright © 2017 IronSource. All rights reserved. +// +#import + +@interface ISSupersonicAdsConfiguration : NSObject + +@property(nonatomic, strong) NSString *language; +@property(nonatomic, strong) NSString *minimumOfferCommission; +@property(nonatomic, strong) NSDictionary *controllerConfig; +@property(nonatomic, strong) NSString *itemName; +@property(nonatomic, strong) NSString *controllerUrl; +@property(strong) NSNumber *itemCount; +@property(strong) NSNumber *maxVideoLength; +@property(nonatomic, strong) NSString *privateKey; +@property(nonatomic) BOOL debugMode; +@property(nonatomic) NSInteger debugLevel; + ++ (ISSupersonicAdsConfiguration *)configurations; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/IronSource.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/IronSource.h new file mode 100644 index 0000000..5849597 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/IronSource.h @@ -0,0 +1,230 @@ +// +// Copyright © 2017 IronSource. All rights reserved. +// + +#ifndef IRONSOURCE_H +#define IRONSOURCE_H + + +// import core classes +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import + +#import "ISABannerAdLoader.h" +#import "ISABannerAdRequestBuilder.h" +#import "ISAInitRequestBuilder.h" +#import "ISAInterstitialAdLoader.h" +#import "ISAInterstitialAdRequestBuilder.h" +#import "ISARewardedAdLoader.h" +#import "ISARewardedAdRequestBuilder.h" +#import "ISAdInfo.h" +#import "ISAdapterAdaptiveProtocol.h" +#import "ISBannerSize.h" +#import "ISConfigurations.h" +#import "ISDemandOnlyBannerDelegate.h" +#import "ISDemandOnlyInterstitialDelegate.h" +#import "ISDemandOnlyRewardedVideoDelegate.h" +#import "ISSupersonicAdsConfiguration.h" +#import "IronSourceAds.h" +#import "LPMDispatcherProtocol.h" +#import "LPMImpressionData.h" +#import "LPMImpressionDataDelegate.h" +#import "LPMSegment.h" + +// imports used for custom adapters infra +#import "ISAdapterErrors.h" +#import "ISBaseBanner.h" +#import "ISBaseInterstitial.h" +#import "ISBaseNativeAd.h" +#import "ISBaseNetworkAdapter.h" +#import "ISBaseRewardedVideo.h" +#import "ISDataKeys.h" +#import "ISSetAPSDataProtocol.h" + +// Native Ads +#import "ISNativeAdProtocol.h" +#import "ISNativeAdView.h" +#import "LevelPlayMediaView.h" +#import "LevelPlayNativeAd.h" +#import "LevelPlayNativeAdDelegate.h" + +// LevelPlay imports +#import "LPMAdInfo.h" +#import "LPMAdSize.h" +#import "LPMBannerAdView.h" +#import "LPMBannerAdViewConfig.h" +#import "LPMBannerAdViewConfigBuilder.h" +#import "LPMInitRequestBuilder.h" +#import "LPMInterstitialAd.h" +#import "LPMInterstitialAdConfig.h" +#import "LPMInterstitialAdConfigBuilder.h" +#import "LPMInterstitialAdDelegate.h" +#import "LPMRewardedAd.h" +#import "LPMRewardedAdConfig.h" +#import "LPMRewardedAdConfigBuilder.h" +#import "LPMRewardedAdDelegate.h" +#import "LevelPlay.h" + +#import "IronSourceNetworkSwiftBridge.h" + +NS_ASSUME_NONNULL_BEGIN + +#define IS_REWARDED_VIDEO @"rewardedvideo" +#define IS_INTERSTITIAL @"interstitial" +#define IS_BANNER @"banner" +#define IS_NATIVE_AD @"nativead" + +static NSString *const MEDIATION_SDK_VERSION = @"9.2.0"; +static NSString *GitHash = @"19b9775"; + +@interface IronSource : NSObject + +/** + @abstact Retrieve a string-based representation of the SDK version. + @discussion The returned value will be in the form of "..". + + @return NSString representing the current IronSource SDK version. + */ ++ (NSString *)sdkVersion DEPRECATED_MSG_ATTRIBUTE("For LevelPlay, use [LevelPlay sdkVersion]. For " + "IronSourceAds, use [IronSourceAds sdkVersion]."); + +/** + @abstract Sets a mediation type. + @discussion This method is used only for IronSource's SDK, and will be passed as a custom param. + + @param mediationType a mediation type name. Should be alphanumeric and between 1-64 chars in + length. + */ ++ (void)setMediationType:(NSString *)mediationType; + +/** +@abstact used for demand only API, return the bidding data token. +*/ ++ (NSString *)getISDemandOnlyBiddingData; + +#pragma mark - Demand Only Rewarded Video + +/** + @abstract Sets the delegate for demand only rewarded video callbacks. + @param delegate The 'ISDemandOnlyRewardedVideoDelegate' for IronSource to send callbacks to. + */ ++ (void)setISDemandOnlyRewardedVideoDelegate:(id)delegate; + +/** + @abstract Loads a demand only rewarded video for a non bidder instance. + @discussion This method will load a demand only rewarded video ad for a non bidder instance. + @param instanceId The demand only instance id to be used to display the rewarded video. + */ ++ (void)loadISDemandOnlyRewardedVideo:(NSString *)instanceId; + +/** + @abstract Shows a demand only rewarded video using the default placement. + @param viewController The UIViewController to display the rewarded video within. + @param instanceId The demand only instance id to be used to display the rewarded video. + */ ++ (void)showISDemandOnlyRewardedVideo:(UIViewController *)viewController + instanceId:(NSString *)instanceId; + +/** + @abstract Determine if a locally cached demand only rewarded video exists for an instance id. + @discussion A return value of YES here indicates that there is a cached rewarded video for the + instance id. + @param instanceId The demand only instance id to be used to display the rewarded video. + @return YES if rewarded video is ready to be played, NO otherwise. + */ ++ (BOOL)hasISDemandOnlyRewardedVideo:(NSString *)instanceId; + +#pragma mark - Demand Only Interstitial + +/** + @abstract Sets the delegate for demand only interstitial callbacks. + @param delegate The 'ISDemandOnlyInterstitialDelegate' for IronSource to send callbacks to. + */ ++ (void)setISDemandOnlyInterstitialDelegate:(id)delegate; + +/** + @abstract Loads a demand only interstitial. + @discussion This method will load a demand only interstitial ad. + @param instanceId The demand only instance id to be used to display the interstitial. + */ ++ (void)loadISDemandOnlyInterstitial:(NSString *)instanceId; + +/** + @abstract Show a demand only interstitial using the default placement. + @param viewController The UIViewController to display the interstitial within. + @param instanceId The demand only instance id to be used to display the interstitial. + */ ++ (void)showISDemandOnlyInterstitial:(UIViewController *)viewController + instanceId:(NSString *)instanceId; + +/** + @abstract Determine if a locally cached interstitial exists for a demand only instance id. + @discussion A return value of YES here indicates that there is a cached interstitial for the + instance id. + @param instanceId The demand only instance id to be used to display the interstitial. + @return YES if there is a locally cached interstitial, NO otherwise. + */ ++ (BOOL)hasISDemandOnlyInterstitial:(NSString *)instanceId; + +#pragma mark Demand Only Banner +/** + @abstract Sets the delegate for demand only Banner callbacks. + @param delegate The 'ISDemandOnlyBannerDelegate' for IronSource to send callbacks to. + @param instanceId The instance id on which the delegate will notify. + */ ++ (void)setISDemandOnlyBannerDelegate:(id)delegate + forInstanceId:(NSString *)instanceId; + +/** + @abstract Loads a demand only Banner for a non bidder instance. + @discussion This method will load a demand only Banner ad for a non bidder instance. + @param instanceId The demand only instance id to be used to display the Banner. + @param viewController The view controller on which the banner should be presented + @param size The required banner ad size + */ ++ (void)loadISDemandOnlyBannerWithInstanceId:(NSString *)instanceId + viewController:(UIViewController *)viewController + size:(ISBannerSize *)size; + +/** + @abstract Removes the banner from memory. + @param instanceId The demand only instance id of the Banner that should be destroyed. + */ ++ (void)destroyISDemandOnlyBannerWithInstanceId:(NSString *)instanceId; + +#pragma mark - Impression Data + +/** + @abstract Ad revenue data + + @param dataSource the external source id from which the impression data is sent. + @param impressionData the impression data + + */ ++ (void)setAdRevenueDataWithDataSource:(NSString *)dataSource + impressionData:(NSData *)impressionData; + +@end + +NS_ASSUME_NONNULL_END + +#endif diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/IronSourceAds.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/IronSourceAds.h new file mode 100644 index 0000000..596a890 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/IronSourceAds.h @@ -0,0 +1,89 @@ +// +// IronSourceAds.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import +#import "ISAAdFormat.h" +#import "ISAInitRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + Defines the completion callback for IronSourceAds SDK initialization. + */ +typedef void (^ISAInitCompletionHandler)(BOOL success, NSError *_Nullable error); + +/** + Object used to initialize IronSourceAds network. + */ +@interface IronSourceAds : NSObject + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +#pragma mark - SDK Initialization + +/** + Initializes IronSourceAds SDK. + + @param request The initialization request containing the necessary configurations for + initialization. + @param completion The completion for initialization. The completion will be invoked on the main + thread. + */ ++ (void)initWithRequest:(ISAInitRequest *)request completion:(ISAInitCompletionHandler)completion; + +#pragma mark - SDK Properties + +/** + @abstact Retrieve a string-based representation of the SDK version. + @discussion The returned value will be in the form of "..". + + @return NSString representing the current IronSource SDK version. + */ ++ (NSString *)sdkVersion; + +/** + @abstract Sets if IAds should allow debug logs. + @discussion This value will be passed to the IAds Network. + + Default is NO. + + @param enable YES to allow IAds Network debug logs, NO otherwise. + */ ++ (void)enableDebugMode:(BOOL)enable; + +/** +@abstact Sets the meta data with a key and value. +@discussion This value will be passed to the IronSourceAds network. + +@param key The meta data key. +@param value The meta data value + +*/ ++ (void)setMetaDataWithKey:(NSString *)key value:(NSString *)value; + +/** + @abstact Sets the meta data with a key and values. + @discussion This value will be passed to the IronSourceAds network. + + @param key The meta data key. + @param values The meta data values + + */ ++ (void)setMetaDataWithKey:(NSString *)key values:(NSMutableArray *)values; + +/** + @abstract Sets the consent value. + @discussion Sets the consent, boolean value that indicates whether the user has granted consent for + the SDK to collect and share data. Consent is used for GDPR compliance. + @param consent value. + */ ++ (void)setConsent:(BOOL)consent; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/IronSourceNetworkSwiftBridge.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/IronSourceNetworkSwiftBridge.h new file mode 100644 index 0000000..77fd27a --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/IronSourceNetworkSwiftBridge.h @@ -0,0 +1,19 @@ +// +// IronSourceNetworkBridgingHeader.h +// IronSource +// +// Created by Ariel Barsheshet on 21/08/2023. +// + +#import "ISAppStoreErrorDelegate.h" +#import "ISBaseNativeAdAdapter.h" +#import "ISIronSourceAdapter.h" +#import "ISMediationGlobalDataWriterFacade.h" +#import "ISNAdViewsManagerSwiftFacade.h" +#import "ISNAppStoreVCRootViewDelegate.h" +#import "ISNControllerManagerSwiftFacade.h" +#import "ISNControllerMessageListener.h" +#import "ISNEvent.h" +#import "ISNEventTrackerInterface.h" +#import "ISNEventTrackerWrapper.h" +#import "ISNSupersonicAdsPublisherSwiftFacade.h" diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMAdInfo.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMAdInfo.h new file mode 100644 index 0000000..72e9e72 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMAdInfo.h @@ -0,0 +1,36 @@ +// +// LPMAdInfo.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import +#import "LPMAdSize.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface LPMAdInfo : NSObject + +@property(readonly, copy, nonnull) NSString *adId; +@property(readonly, copy) NSString *adUnitId; +@property(readonly, copy) NSString *adUnitName; +@property(readonly, copy, nullable) NSString *placementName; +@property(readonly, copy, nullable) LPMAdSize *adSize; +@property(readonly, copy) NSString *adFormat; +@property(readonly, copy) NSString *auctionId; +@property(readonly, copy) NSString *country; +@property(readonly, copy) NSString *ab; +@property(readonly, copy) NSString *segmentName; +@property(readonly, copy) NSString *adNetwork; +@property(readonly, copy) NSString *instanceName; +@property(readonly, copy) NSString *instanceId; +@property(readonly, copy) NSNumber *revenue; +@property(readonly, copy) NSString *precision; +@property(readonly, copy) NSString *encryptedCPM; +@property(readonly, copy) NSNumber *conversionValue; +@property(readonly, copy) NSString *creativeId; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMAdSize.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMAdSize.h new file mode 100644 index 0000000..a307a33 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMAdSize.h @@ -0,0 +1,58 @@ +// +// LPMAdSize.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +typedef NS_ENUM(NSInteger, LPMAdSizeType) { + LPMAdSizeBanner, + LPMAdSizeLarge, + LPMAdSizeMediumRectangle, + LPMAdSizeCustom, + LPMAdSizeLeaderBoard +}; + +@interface LPMAdSize : NSObject + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +@property(nonatomic, readonly) LPMAdSizeType type; +@property(nonatomic, readonly) NSInteger width; +@property(nonatomic, readonly) NSInteger height; +@property(nonatomic, readonly, copy) NSString* sizeDescription; +@property(nonatomic, readonly) BOOL isAdaptive; + ++ (instancetype)bannerSize; ++ (instancetype)largeSize; ++ (instancetype)mediumRectangleSize; ++ (instancetype)leaderBoardSize; ++ (instancetype)customSizeWithWidth:(NSInteger)width height:(NSInteger)height; + +/** + Creates and returns an adaptive ad size for a given width. + + If the provided width is invalid (less than or equal to 0), the method uses the screen width + based on the device orientation. + + @param width The specified width for which the adaptive ad size is calculated. + @return An instance of LPMAdSize with the calculated height for the given width, or `nil` if the + SDK is not initialized. + */ ++ (nullable instancetype)createAdaptiveAdSizeWithWidth:(CGFloat)width; +/** + Creates and returns an adaptive ad size using the screen width based on the device orientation. + + @return An instance of LPMAdSize with the calculated height for the screen width, or `nil` if the + SDK is not initialized. + */ ++ (nullable instancetype)createAdaptiveAdSize; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMBannerAdView.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMBannerAdView.h new file mode 100644 index 0000000..5c34dc4 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMBannerAdView.h @@ -0,0 +1,42 @@ +// +// LPMBannerAdView.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import +#import +#import "LPMBannerAdViewDelegate.h" + +@class LPMAdSize, LPMBannerAdViewConfig; + +NS_ASSUME_NONNULL_BEGIN + +@interface LPMBannerAdView : UIView + +/** + * A unique identifier associated with the ad object. + */ +@property(nonatomic, strong, readonly) NSString *adId; + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +- (instancetype)initWithAdUnitId:(NSString *)adUnitId; + +- (instancetype)initWithAdUnitId:(NSString *)adUnitId config:(LPMBannerAdViewConfig *)config; + +- (void)setDelegate:(id)delegate; + +- (void)loadAdWithViewController:(UIViewController *)viewController; + +- (void)destroy; + +- (void)pauseAutoRefresh; + +- (void)resumeAutoRefresh; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMBannerAdViewConfig.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMBannerAdViewConfig.h new file mode 100644 index 0000000..8afbb77 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMBannerAdViewConfig.h @@ -0,0 +1,40 @@ +// +// LPMBannerAdViewConfig.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import + +@class LPMAdSize; + +NS_ASSUME_NONNULL_BEGIN + +/** + Class representing a banner ad configuration. + Use `LPMBannerAdViewConfigBuilder` to create an instance of this class. + */ +@interface LPMBannerAdViewConfig : NSObject + +/** + * An ad size to be applied to the ad object. + */ +@property(nonatomic, strong, nullable, readonly) LPMAdSize *adSize; + +/** + * A bidding floor to be applied to the ad object. + */ +@property(nonatomic, strong, nullable, readonly) NSNumber *bidFloor; + +/** + * A placement name to be applied to the ad object. + */ +@property(nonatomic, strong, nullable, readonly) NSString *placementName; + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMBannerAdViewConfigBuilder.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMBannerAdViewConfigBuilder.h new file mode 100644 index 0000000..15c5694 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMBannerAdViewConfigBuilder.h @@ -0,0 +1,49 @@ +// +// LPMBannerAdViewConfigBuilder.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import + +@class LPMBannerAdViewConfig, LPMAdSize; + +NS_ASSUME_NONNULL_BEGIN + +@interface LPMBannerAdViewConfigBuilder : NSObject + +/** + Set an ad size to be applied to the ad object. + + @param adSize an ad size. + @returns The builder that had the setter called. + */ +- (LPMBannerAdViewConfigBuilder *)setWithAdSize:(LPMAdSize *)adSize NS_SWIFT_NAME(set(adSize:)); + +/** + Set a bid floor to be applied to the ad object. + + @param bidFloor bid floor value in USD. + @returns The builder that had the setter called. + */ +- (LPMBannerAdViewConfigBuilder *)setWithBidFloor:(NSNumber *)bidFloor + NS_SWIFT_NAME(set(bidFloor:)); + +/** + Set a placement name to be applied to the ad object. + + @param placementName The placement name for the ad. + @returns The builder that had the setter called. + */ +- (LPMBannerAdViewConfigBuilder *)setWithPlacementName:(NSString *)placementName + NS_SWIFT_NAME(set(placementName:)); + +/** + @returns a banner ad configuration from this builder + */ +- (LPMBannerAdViewConfig *)build; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMBannerAdViewDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMBannerAdViewDelegate.h new file mode 100644 index 0000000..9ccb1ae --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMBannerAdViewDelegate.h @@ -0,0 +1,36 @@ +// +// LPMBannerAdViewDelegate.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +@class LPMAdInfo; + +NS_ASSUME_NONNULL_BEGIN + +@protocol LPMBannerAdViewDelegate + +@required + +- (void)didLoadAdWithAdInfo:(LPMAdInfo *)adInfo; + +- (void)didFailToLoadAdWithAdUnitId:(NSString *)adUnitId error:(NSError *)error; + +@optional + +- (void)didClickAdWithAdInfo:(LPMAdInfo *)adInfo; + +- (void)didDisplayAdWithAdInfo:(LPMAdInfo *)adInfo; + +- (void)didFailToDisplayAdWithAdInfo:(LPMAdInfo *)adInfo error:(NSError *)error; + +- (void)didLeaveAppWithAdInfo:(LPMAdInfo *)adInfo; + +- (void)didExpandAdWithAdInfo:(LPMAdInfo *)adInfo; + +- (void)didCollapseAdWithAdInfo:(LPMAdInfo *)adInfo; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMConfiguration.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMConfiguration.h new file mode 100644 index 0000000..c592864 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMConfiguration.h @@ -0,0 +1,19 @@ +// +// LPMConfiguration.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface LPMConfiguration : NSObject + +@property(nonatomic, assign) BOOL isAdQualityEnabled; +@property(nonatomic, strong, nullable) NSString *ab; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMDispatcherProtocol.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMDispatcherProtocol.h new file mode 100644 index 0000000..faeff3b --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMDispatcherProtocol.h @@ -0,0 +1,17 @@ +// +// LPMDispatcherProtocol.h +// IronSource +// +// Created by Gal Yedidovich on 16/12/2024. +// + +NS_ASSUME_NONNULL_BEGIN + +typedef void (^LPMDispatcherBlock)(void); + +@protocol LPMDispatcherProtocol + +- (void)dispatch:(LPMDispatcherBlock _Nonnull)task; +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMImpressionData.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMImpressionData.h new file mode 100644 index 0000000..e5f5068 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMImpressionData.h @@ -0,0 +1,41 @@ +// +// LPMImpressionData.h +// IronSource +// +// Copyright © 2020 ironSource. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface LPMImpressionData : NSObject + +@property(readonly, copy, nullable) NSString *auctionId; +@property(readonly, copy, nullable) NSString *mediationAdUnitName; +@property(readonly, copy, nullable) NSString *mediationAdUnitId; +@property(readonly, copy, nullable) NSString *adFormat; +@property(readonly, copy, nullable) NSString *adNetwork; +@property(readonly, copy, nullable) NSString *instanceName; +@property(readonly, copy, nullable) NSString *instanceId; +@property(readonly, copy, nullable) NSString *country; +@property(readonly, copy, nullable) NSString *placement; +@property(readonly, copy, nullable) NSNumber *revenue; +@property(readonly, copy, nullable) NSString *precision; +@property(readonly, copy, nullable) NSString *ab; +@property(readonly, copy, nullable) NSString *segmentName; +@property(readonly, copy, nullable) NSString *encryptedCpm; +@property(readonly, copy, nullable) NSNumber *conversionValue; +@property(readonly, copy, nullable) NSString *creativeId; + +@property(readonly, copy, nullable) NSDictionary *allData; + +- (instancetype)initWithDictionary:(NSDictionary *)dictionary; + +- (instancetype)initWithImpressionData:(LPMImpressionData *)impressionData; + +- (void)replacePlacementMacro:(NSString *)macro value:(NSString *)value; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMImpressionDataDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMImpressionDataDelegate.h new file mode 100644 index 0000000..08ceff0 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMImpressionDataDelegate.h @@ -0,0 +1,14 @@ +// +// LPMImpressionDataDelegate.h +// IronSource +// +// Copyright © 2020 ironSource. All rights reserved. +// + +#import "LPMImpressionData.h" + +@protocol LPMImpressionDataDelegate + +- (void)impressionDataDidSucceed:(LPMImpressionData *)impressionData; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMInitRequest.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMInitRequest.h new file mode 100644 index 0000000..60214ac --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMInitRequest.h @@ -0,0 +1,25 @@ +// +// LPMInitRequest.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface LPMInitRequest : NSObject + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +- (instancetype)initWithAppKey:(NSString *)appKey userId:(nullable NSString *)userId; + +@property(readonly, nonatomic) NSString *appKey; +@property(readonly, nonatomic) NSArray *legacyAdFormats; +@property(readonly, nonatomic, nullable) NSString *userId; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMInitRequestBuilder.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMInitRequestBuilder.h new file mode 100644 index 0000000..22deb8f --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMInitRequestBuilder.h @@ -0,0 +1,26 @@ +// +// LPMInitRequestBuilder.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import +#import "LPMInitRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface LPMInitRequestBuilder : NSObject + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +- (instancetype)initWithAppKey:(NSString *)appKey; + +- (LPMInitRequest *)build; + +- (LPMInitRequestBuilder *)withUserId:(NSString *)userId; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMInterstitialAd.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMInterstitialAd.h new file mode 100644 index 0000000..c216976 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMInterstitialAd.h @@ -0,0 +1,93 @@ +// +// LPMInterstitialAd.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import +#import +#import "LPMInterstitialAdDelegate.h" + +@class LPMInterstitialAdConfig; + +NS_ASSUME_NONNULL_BEGIN + +/** + Class responsible for handling the APIs, callbacks and overall operations of an interstitial ad. + */ +@interface LPMInterstitialAd : NSObject + +/** + * A unique identifier associated with the ad object. + */ +@property(nonatomic, strong, readonly) NSString *adId; + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +/** + Initializes an interstitial ad. + + @param adUnitId The ad unit identifier. + */ +- (instancetype)initWithAdUnitId:(NSString *)adUnitId; + +/** + Initializes an interstitial ad with configuration. + + @param adUnitId The ad unit identifier. + @param config The ad configuration. + */ +- (instancetype)initWithAdUnitId:(NSString *)adUnitId config:(LPMInterstitialAdConfig *)config; + +/** + Sets a delegate for the ad callbacks. + The callbacks will be invoked on the main thread. + The delegate is held weakly. + + @param delegate The delegate to set. + */ +- (void)setDelegate:(id)delegate; + +/** + Loads an interstitial ad. + The delegate will send a `didLoadAdWithAdInfo:` or + `didFailToLoadAdWithAdUnitId: error:` callback. + The callbacks will be invoked on the main thread. + */ +- (void)loadAd NS_SWIFT_NAME(loadAd()); + +/** + Shows the ad. + The delegate will send a `interstitialAdDidShow:` or + `interstitialAd:didFailToShowWithError:` callback. + + @param viewController The view controller where the ad will be shown. + @param placementName The placement name for the ad. + */ +- (void)showAdWithViewController:(UIViewController *)viewController + placementName:(nullable NSString *)placementName + NS_SWIFT_NAME(showAd(viewController:placementName:)); + +/** + Checks if the ad is ready. + Showing an ad that is not ready will result in a show failure. + When calling to the show api with placement, make sure to verify that placement isn't capped via + `isPlacementCapped:`. + + @return Whether the ad is ready. + */ +- (BOOL)isAdReady; + +/** + Checks if the placement is capped. + + @param placementName The placement name to check. + @return `YES` if the placement is capped, `NO` otherwise. + */ ++ (BOOL)isPlacementCapped:(NSString *)placementName; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMInterstitialAdConfig.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMInterstitialAdConfig.h new file mode 100644 index 0000000..fdfe477 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMInterstitialAdConfig.h @@ -0,0 +1,28 @@ +// +// LPMInterstitialAdConfig.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + Class representing an interstitial ad configuration. + Use `LPMInterstitialAdConfigBuilder` to create an instance of this class. + */ +@interface LPMInterstitialAdConfig : NSObject + +/** + * A NSNumber bidding floor to be applied to the ad object. + */ +@property(nonatomic, strong, nullable, readonly) NSNumber *bidFloor; + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMInterstitialAdConfigBuilder.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMInterstitialAdConfigBuilder.h new file mode 100644 index 0000000..a580bbb --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMInterstitialAdConfigBuilder.h @@ -0,0 +1,32 @@ +// +// LPMInterstitialAdConfigBuilder.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import + +@class LPMInterstitialAdConfig; + +NS_ASSUME_NONNULL_BEGIN + +@interface LPMInterstitialAdConfigBuilder : NSObject + +/** + Set a bid floor to be applied to the ad object. + + @param bidFloor bid floor value in USD. + @returns The builder that had the setter called. + */ +- (LPMInterstitialAdConfigBuilder *)setWithBidFloor:(NSNumber *)bidFloor + NS_SWIFT_NAME(set(bidFloor:)); + +/** + @returns an interstitial ad configuration from this builder + */ +- (LPMInterstitialAdConfig *)build; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMInterstitialAdDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMInterstitialAdDelegate.h new file mode 100644 index 0000000..5d44654 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMInterstitialAdDelegate.h @@ -0,0 +1,75 @@ +// +// LPMInterstitialAdDelegate.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import "LPMAdInfo.h" + +NS_ASSUME_NONNULL_BEGIN + +@class LPMInterstitialAd; + +/** + Protocol handling interstitial ad events for `LPMInterstitialAd`. + The callbacks will be invoked on the main thread. + */ +@protocol LPMInterstitialAdDelegate + +/** + Triggered when an interstitial ad is successfully loaded. + + @param adInfo Ad info of the loaded interstitial ad. + */ +- (void)didLoadAdWithAdInfo:(LPMAdInfo *)adInfo; + +/** + Triggered when an interstitial ad fails to load. + + @param adUnitId The ad unit id of the interstitial ad that fails to load. + @param error The error that occurred during loading. + */ +- (void)didFailToLoadAdWithAdUnitId:(NSString *)adUnitId error:(NSError *)error; + +/** + Triggered when an interstitial ad is displayed. + + @param adInfo Ad info of the displayed interstitial ad. + */ +- (void)didDisplayAdWithAdInfo:(LPMAdInfo *)adInfo; + +@optional + +/** + Triggered when an interstitial ad fails to show. + + @param adInfo Ad info of the interstitial ad that failed to display. + @param error The error that occurred. + */ +- (void)didFailToDisplayAdWithAdInfo:(LPMAdInfo *)adInfo error:(NSError *)error; + +/** + Triggered when an interstitial ad is clicked. + + @param adInfo Ad info of the clicked interstitial ad. + */ +- (void)didClickAdWithAdInfo:(LPMAdInfo *)adInfo; + +/** + Triggered when an interstitial ad is closed. + + @param adInfo Ad info of the closed interstitial ad. + */ +- (void)didCloseAdWithAdInfo:(LPMAdInfo *)adInfo; + +/** + Triggered when ad was reloaded and ad info updated. + + @param adInfo The updated interstitial ad info after the reloading. + */ +- (void)didChangeAdInfo:(LPMAdInfo *)adInfo NS_SWIFT_NAME(didChangeAdInfo(_:)); + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMReward.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMReward.h new file mode 100644 index 0000000..357cd31 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMReward.h @@ -0,0 +1,33 @@ +// +// LPMReward.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + Class representing a reward for an ad. + */ +@interface LPMReward : NSObject + +/** + The amount of the reward. + */ +@property(readonly, nonatomic) NSInteger amount; + +/** + The name of the reward. + */ +@property(readonly, strong, nonatomic) NSString *name; + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; +- (instancetype)initWithName:(NSString *)name amount:(NSInteger)amount; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMRewardedAd.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMRewardedAd.h new file mode 100644 index 0000000..037d6c1 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMRewardedAd.h @@ -0,0 +1,93 @@ +// +// LPMRewardedAd.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import +#import +#import "LPMRewardedAdDelegate.h" + +@class LPMRewardedAdConfig; + +NS_ASSUME_NONNULL_BEGIN + +/** + Class responsible for handling the APIs, callbacks and overall operations of a rewarded ad. + */ +@interface LPMRewardedAd : NSObject + +/** + * A unique identifier associated with the ad object. + */ +@property(nonatomic, strong, readonly) NSString *adId; + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +/** + Initializes a rewarded ad. + + @param adUnitId The ad unit identifier. + */ +- (instancetype)initWithAdUnitId:(NSString *)adUnitId; + +/** + Initializes a rewarded ad. + + @param adUnitId The ad unit identifier. + @param config The ad configuration. + */ +- (instancetype)initWithAdUnitId:(NSString *)adUnitId config:(LPMRewardedAdConfig *)config; + +/** + Sets a delegate for the ad callbacks. + The callbacks will be invoked on the main thread. + The delegate is held weakly. + + @param delegate The delegate to set. + */ +- (void)setDelegate:(id)delegate; + +/** + Loads a rewarded ad. + The delegate will send a `didLoadAdWithAdInfo:` or + `didFailToLoadAdWithAdUnitId: error:` callback. + The callbacks will be invoked on the main thread. + */ +- (void)loadAd NS_SWIFT_NAME(loadAd()); + +/** + Shows the ad. + The delegate will send a `rewardedAdDidShow:` or + `rewardedAd:didFailToShowWithError:` callback. + + @param viewController The view controller where the ad will be shown. + @param placementName The placement name for the ad. + */ +- (void)showAdWithViewController:(UIViewController *)viewController + placementName:(nullable NSString *)placementName + NS_SWIFT_NAME(showAd(viewController:placementName:)); + +/** + Checks if the ad is ready. + Showing an ad that is not ready will result in a show failure. + When calling to the show api with placement, make sure to verify that placement isn't capped via + `isPlacementCapped:`. + + @return Whether the ad is ready. + */ +- (BOOL)isAdReady; + +/** + Checks if the placement is capped. + + @param placementName The placement name to check. + @return `YES` if the placement is capped, `NO` otherwise. + */ ++ (BOOL)isPlacementCapped:(NSString *)placementName; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMRewardedAdConfig.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMRewardedAdConfig.h new file mode 100644 index 0000000..ce72114 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMRewardedAdConfig.h @@ -0,0 +1,28 @@ +// +// LPMRewardedAdConfig.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + Class representing a rewarded ad configuration. + Use `LPMRewardedAdConfigBuilder` to create an instance of this class. + */ +@interface LPMRewardedAdConfig : NSObject + +/** + * A NSNumber bidding floor to be applied to the ad object. + */ +@property(nonatomic, strong, nullable, readonly) NSNumber *bidFloor; + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMRewardedAdConfigBuilder.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMRewardedAdConfigBuilder.h new file mode 100644 index 0000000..2cfca1a --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMRewardedAdConfigBuilder.h @@ -0,0 +1,31 @@ +// +// LPMRewardedAdConfigBuilder.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import + +@class LPMRewardedAdConfig; + +NS_ASSUME_NONNULL_BEGIN + +@interface LPMRewardedAdConfigBuilder : NSObject + +/** + Set a bid floor to be applied to the ad object. + + @param bidFloor bid floor value in USD. + @returns The builder that had the setter called. + */ +- (LPMRewardedAdConfigBuilder *)setWithBidFloor:(NSNumber *)bidFloor NS_SWIFT_NAME(set(bidFloor:)); + +/** + @returns a rewarded ad configuration from this builder + */ +- (LPMRewardedAdConfig *)build; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMRewardedAdDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMRewardedAdDelegate.h new file mode 100644 index 0000000..c08241f --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMRewardedAdDelegate.h @@ -0,0 +1,84 @@ +// +// LPMRewardedAdDelegate.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import "LPMAdInfo.h" +#import "LPMReward.h" + +NS_ASSUME_NONNULL_BEGIN + +@class LPMRewardedAd; + +/** + Protocol handling rewarded ad events for `LPMRewardedAd`. + The callbacks will be invoked on the main thread. + */ +@protocol LPMRewardedAdDelegate + +/** + Triggered when a rewarded ad is successfully loaded. + + @param adInfo Ad info of the loaded rewarded ad. + */ +- (void)didLoadAdWithAdInfo:(LPMAdInfo *)adInfo; + +/** + Triggered when a rewarded ad fails to load. + + @param adUnitId The ad unit id of the rewarded ad that fails to load. + @param error The error that occurred during loading. + */ +- (void)didFailToLoadAdWithAdUnitId:(NSString *)adUnitId error:(NSError *)error; + +/** + Triggered when a rewarded ad is displayed. + + @param adInfo Ad info of the displayed rewarded ad. + */ +- (void)didDisplayAdWithAdInfo:(LPMAdInfo *)adInfo; + +/** + Triggered when the ad reward is granted. + + @param adInfo Ad info of the displayed rewarded ad. + @param reward Reward of the displayed ad. + */ +- (void)didRewardAdWithAdInfo:(LPMAdInfo *)adInfo reward:(LPMReward *)reward; + +@optional + +/** + Triggered when a rewarded ad fails to show. + + @param adInfo Ad info of the rewarded ad that failed to display. + @param error The error that occurred. + */ +- (void)didFailToDisplayAdWithAdInfo:(LPMAdInfo *)adInfo error:(NSError *)error; + +/** + Triggered when a rewarded ad is clicked. + + @param adInfo Ad info of the clicked rewarded ad. + */ +- (void)didClickAdWithAdInfo:(LPMAdInfo *)adInfo; + +/** + Triggered when a rewarded ad is closed. + + @param adInfo Ad info of the closed rewarded ad. + */ +- (void)didCloseAdWithAdInfo:(LPMAdInfo *)adInfo; + +/** + Triggered when ad was reloaded and ad info updated. + + @param adInfo The updated rewarded ad info after the reloading. + */ +- (void)didChangeAdInfo:(LPMAdInfo *)adInfo NS_SWIFT_NAME(didChangeAdInfo(_:)); + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMSegment.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMSegment.h new file mode 100644 index 0000000..1639093 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMSegment.h @@ -0,0 +1,22 @@ +// +// LPMSegment.h +// IronSource +// +// Copyright © 2025 IronSource. All rights reserved. +// + +#import + +@interface LPMSegment : NSObject +@property(nonatomic) int level; +@property(nonatomic) double iapTotal; +@property(nonatomic) BOOL paying; +@property(nonatomic, strong) NSDate *userCreationDate; +@property(nonatomic, strong) NSString *segmentName; +@property(nonatomic, strong, readonly) NSDictionary *customKeys; + +- (void)setCustomValue:(NSString *)value forKey:(NSString *)key; + +- (NSDictionary *)getData; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LevelPlay.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LevelPlay.h new file mode 100644 index 0000000..3ef1068 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LevelPlay.h @@ -0,0 +1,153 @@ +// +// LevelPlay.h +// IronSource +// +// Copyright © 2024 IronSource. All rights reserved. +// + +#import +#import +#import "LPMConfiguration.h" +#import "LPMImpressionDataDelegate.h" +#import "LPMInitRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +@class LPMSegment; + +typedef void (^LPMInitCompletionHandler)(LPMConfiguration *_Nullable config, + NSError *_Nullable error); + +#define LEVEL_PLAY_REWARDED @"rewarded" +#define LEVEL_PLAY_INTERSTITIAL @"interstitial" +#define LEVEL_PLAY_BANNER @"banner" +#define LEVEL_PLAY_NATIVE_AD @"nativead" + +@interface LevelPlay : NSObject + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +#pragma mark - SDK Initialization + +/** + Initializes the LevelPlay SDK with the provided request parameters. + + @param request The containing initialization parameters. + @param completion A block called when the initialization process completes. It returns an + `LPMConfiguration` object if successful, or an `NSError` describing the failure. + */ + ++ (void)initWithRequest:(LPMInitRequest *)request completion:(LPMInitCompletionHandler)completion; + +#pragma mark - SDK Properties + +/** + @abstact Retrieve a string-based representation of the SDK version. + @discussion The returned value will be in the form of "..". + + @return NSString representing the current IronSource SDK version. + */ ++ (NSString *)sdkVersion; + +/** + Adds the delegate for impression data callbacks. + + @param delegate The delegate for LevelPlay to send callbacks to. + */ + ++ (void)addImpressionDataDelegate:(id)delegate; + +/** + Removes the delegate from impression data callbacks. + + @param delegate The delegate for LevelPlay to send callbacks to. + */ + ++ (void)removeImpressionDataDelegate:(id)delegate; + +/** +@abstact Sets the meta data with a key and value. +@discussion This value will be passed to the supporting ad networks. + +@param key The meta data key. +@param value The meta data value + +*/ ++ (void)setMetaDataWithKey:(NSString *)key value:(NSString *)value; + +/** + @abstact Sets the meta data with a key and values. + @discussion This value will be passed to the supporting ad networks. + + @param key The meta data key. + @param values The meta data values. + */ ++ (void)setMetaDataWithKey:(NSString *)key values:(NSMutableArray *)values; + +/** +@abstract Sets the network data according to the network key. + +@param networkKey Network identifier. +@param networkData a dictionary containing the information required by the network. + */ ++ (void)setNetworkDataWithNetworkKey:(NSString *)networkKey + andNetworkData:(NSDictionary *)networkData; + +/** + Sets a dynamic identifier for the current user. + + @param dynamicUserId Dynamic user identifier. + @return`BOOL` that indicates if the dynamic identifier is valid. + */ ++ (BOOL)setDynamicUserId:(NSString *)dynamicUserId; + +/** + Sets if LevelPlay SDK should allow ad networks debug logs. + + @param flag to allow ad networks debug logs,. + */ ++ (void)setAdaptersDebug:(BOOL)flag; + +/** + @abstract Sets a segment. + @discussion This method is used to start a session with a spesific segment. + + @param segment A segment object. + */ ++ (void)setSegment:(LPMSegment *)segment; + +#pragma mark - Test Suite + +/** + @abstract Launches the Test Suite. Mediation SDK must be initialized before calling this method. + @param viewController The UIViewController to display the Test Suite within. +*/ ++ (void)launchTestSuite:(UIViewController *)viewController; + +#pragma mark - Validate Integration + +/** + @abstract A tool to verify a successful integration of the IronSource SDK and any additional + adapters. + @discussion The Integration Helper tool portray the compatibility between the SDK and adapter + versions, and makes sure all required dependencies and frameworks were added for the various + mediated ad networks. + + Once you have finished your integration, call the 'validateIntegration' function and confirm that + everything in your integration is marked as VERIFIED. + */ + ++ (void)validateIntegration; + +/** + @abstract Sets the consent value. + @discussion Sets the consent, boolean value that indicates whether the user has granted consent for + the SDK to collect and share data. Consent is used for GDPR compliance. + @param consent value. + */ ++ (void)setConsent:(BOOL)consent; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LevelPlayBaseAdapter.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LevelPlayBaseAdapter.h new file mode 100644 index 0000000..ac8de3d --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LevelPlayBaseAdapter.h @@ -0,0 +1,23 @@ +// +// LevelPlayBaseAdapter.h +// Pods +// +// Created by Maoz Elbaz on 09/05/2025. +// + +#ifndef LevelPlayBaseAdapter_h +#define LevelPlayBaseAdapter_h + +#import "ISAdapterAdaptiveProtocol.h" +#import "ISBaseNetworkAdapter.h" +#import "ISBiddingDataProtocol.h" +NS_ASSUME_NONNULL_BEGIN + +@interface LevelPlayBaseAdapter + : ISBaseNetworkAdapter + +@end + +NS_ASSUME_NONNULL_END + +#endif /* LevelPlayBaseAdapter_h */ diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LevelPlayBaseBannerAdapter.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LevelPlayBaseBannerAdapter.h new file mode 100644 index 0000000..63c971e --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LevelPlayBaseBannerAdapter.h @@ -0,0 +1,23 @@ +// +// LevelPlayBaseBannerAdapter.h +// Pods +// +// Created by Maoz Elbaz on 09/05/2025. +// + +#ifndef LevelPlayBaseBannerAdapter_h +#define LevelPlayBaseBannerAdapter_h + +#import "ISBaseBanner.h" +#import "ISBaseBannerAdapter.h" +#import "ISBiddingDataProtocol.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface LevelPlayBaseBannerAdapter : ISBaseBanner + +@end + +NS_ASSUME_NONNULL_END + +#endif /* LevelPlayBaseBannerAdapter_h */ diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LevelPlayBaseInterstitialAdapter.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LevelPlayBaseInterstitialAdapter.h new file mode 100644 index 0000000..75d561e --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LevelPlayBaseInterstitialAdapter.h @@ -0,0 +1,21 @@ +// +// LevelPlayBaseInterstitialAdapter.h +// Pods +// +// Created by Maoz Elbaz on 09/05/2025. +// + +#ifndef LevelPlayBaseInterstitialAdapter_h +#define LevelPlayBaseInterstitialAdapter_h + +#import "ISBaseInterstitial.h" +#import "ISBiddingDataProtocol.h" +NS_ASSUME_NONNULL_BEGIN + +@interface LevelPlayBaseInterstitialAdapter : ISBaseInterstitial + +@end + +NS_ASSUME_NONNULL_END + +#endif /* LevelPlayBaseInterstitialAdapter_h */ diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LevelPlayBaseNativeAdAdapter.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LevelPlayBaseNativeAdAdapter.h new file mode 100644 index 0000000..be7a054 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LevelPlayBaseNativeAdAdapter.h @@ -0,0 +1,22 @@ +// +// LevelPlayBaseNativeAdAdapter.h +// IronSourceSDK +// +// Created by Ronit Epstein on 15/06/2025. +// + +#ifndef LevelPlayBaseNativeAdAdapter_h +#define LevelPlayBaseNativeAdAdapter_h + +#import "ISBaseNativeAd.h" +#import "ISBiddingDataProtocol.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface LevelPlayBaseNativeAdAdapter : ISBaseNativeAd + +@end + +NS_ASSUME_NONNULL_END + +#endif /* LevelPlayBaseNativeAdAdapter_h */ diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LevelPlayBaseRewardedAdapter.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LevelPlayBaseRewardedAdapter.h new file mode 100644 index 0000000..cc38a00 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LevelPlayBaseRewardedAdapter.h @@ -0,0 +1,23 @@ +// +// LevelPlayBaseRewardedAdapter.h +// Pods +// +// Created by Maoz Elbaz on 09/05/2025. +// + +#ifndef LevelPlayBaseRewardedAdapter_h +#define LevelPlayBaseRewardedAdapter_h + +#import "ISBaseRewardedVideo.h" +#import "ISBiddingDataProtocol.h" +NS_ASSUME_NONNULL_BEGIN + +@interface LevelPlayBaseRewardedAdapter : ISBaseRewardedVideo + +- (NSString *)dynamicUserId; + +@end + +NS_ASSUME_NONNULL_END + +#endif /* LevelPlayBaseRewardedAdapter_h */ diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LevelPlayMediaView.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LevelPlayMediaView.h new file mode 100644 index 0000000..7048468 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LevelPlayMediaView.h @@ -0,0 +1,13 @@ +// +// LevelPlayMediaView.h +// IronSource +// +// Created by Hadar Pur on 04/06/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +#import + +@interface LevelPlayMediaView : UIView + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LevelPlayNativeAd.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LevelPlayNativeAd.h new file mode 100644 index 0000000..f160900 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LevelPlayNativeAd.h @@ -0,0 +1,30 @@ +// +// LevelPlayNativeAd.h +// IronSource +// +// Created by Hadar Pur on 04/06/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +#import +#import "ISAdapterNativeAdViewBinder.h" +#import "ISNativeAdDataProtocol.h" +#import "LevelPlayNativeAdBuilder.h" +#import "LevelPlayNativeAdDelegate.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface LevelPlayNativeAd : NSObject + +@property(nonatomic, strong, nullable) ISAdapterNativeAdViewBinder *nativeAdViewBinder; + +- (instancetype)initWithBuilder:(LevelPlayNativeAdBuilder *)builder; + +- (void)loadAd; +- (void)destroyAd; +- (void)setDelegate:(id)delegate; +- (NSString *)getObjectId; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LevelPlayNativeAdBuilder.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LevelPlayNativeAdBuilder.h new file mode 100644 index 0000000..9990395 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LevelPlayNativeAdBuilder.h @@ -0,0 +1,28 @@ +// +// LevelPlayNativeAdBuilder.h +// IronSource +// +// Created by Maoz Elbaz on 11/07/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +#import +#import "LevelPlayNativeAdDelegate.h" + +@class LevelPlayNativeAd; + +@interface LevelPlayNativeAdBuilder : NSObject + +@property(nonatomic, strong) NSString *placementName; +@property(nonatomic, weak) id delegate; +@property(nonatomic, weak) UIViewController *viewController; + +- (LevelPlayNativeAdBuilder *)withViewController:(UIViewController *)viewController; + +- (LevelPlayNativeAdBuilder *)withPlacementName:(NSString *)placementName; + +- (LevelPlayNativeAdBuilder *)withDelegate:(id)delegate; + +- (LevelPlayNativeAd *)build; + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LevelPlayNativeAdDelegate.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LevelPlayNativeAdDelegate.h new file mode 100644 index 0000000..8b1a5dc --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LevelPlayNativeAdDelegate.h @@ -0,0 +1,14 @@ +// +// LevelPlayNativeAdDelegate.h +// IronSource +// +// Created by Hadar Pur on 22/06/2023. +// Copyright © 2023 IronSource. All rights reserved. +// + +#import "ISNativeAdInteractionDelegate.h" +#import "ISNativeAdLoadDelegate.h" + +@protocol LevelPlayNativeAdDelegate + +@end diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/UIView+ISNativeView.h b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/UIView+ISNativeView.h new file mode 100644 index 0000000..265e84e --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/UIView+ISNativeView.h @@ -0,0 +1,18 @@ +// +// UIView+ISNativeView.h +// IronSourceSDK +// +// Copyright © 2022 IronSource. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface UIView (ISNativeView) + +- (void)addSubviewAndAdjust:(UIView *)view; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Info.plist b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Info.plist new file mode 100644 index 0000000..aa5ffd9 Binary files /dev/null and b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Info.plist differ diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/IronSource b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/IronSource new file mode 100644 index 0000000..144f9cc Binary files /dev/null and b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/IronSource differ diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Modules/module.modulemap b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Modules/module.modulemap new file mode 100644 index 0000000..d453899 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Modules/module.modulemap @@ -0,0 +1,6 @@ +framework module IronSource { + umbrella header "IronSource.h" + + export * + module * { export * } +} diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/PrivacyInfo.xcprivacy b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..717d9e9 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/PrivacyInfo.xcprivacy @@ -0,0 +1,27 @@ + + + + + NSPrivacyCollectedDataTypes + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryDiskSpace + NSPrivacyAccessedAPITypeReasons + + E174.1 + + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + NSPrivacyAccessedAPITypeReasons + + CA92.1 + + + + + diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/_CodeSignature/CodeDirectory b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/_CodeSignature/CodeDirectory new file mode 100644 index 0000000..9ebb195 Binary files /dev/null and b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/_CodeSignature/CodeDirectory differ diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/_CodeSignature/CodeRequirements b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/_CodeSignature/CodeRequirements new file mode 100644 index 0000000..dbf9d61 Binary files /dev/null and b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/_CodeSignature/CodeRequirements differ diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/_CodeSignature/CodeRequirements-1 b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/_CodeSignature/CodeRequirements-1 new file mode 100644 index 0000000..3849f5b Binary files /dev/null and b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/_CodeSignature/CodeRequirements-1 differ diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/_CodeSignature/CodeResources b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/_CodeSignature/CodeResources new file mode 100644 index 0000000..8882910 --- /dev/null +++ b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/_CodeSignature/CodeResources @@ -0,0 +1,2412 @@ + + + + + files + + Headers/ISAAdFormat.h + + wmVijQhgATFGx0c0TaMqvChxgmI= + + Headers/ISAAdSize.h + + CEC6aJ+CTC1PdaJb0hxwcghjGB8= + + Headers/ISABannerAdInfo.h + + cRhCQPy0T9Jy+8+5bUcrmSjZLhk= + + Headers/ISABannerAdLoader.h + + b4N+q5aUIeE3GA3r7qtd8rvyHfo= + + Headers/ISABannerAdLoaderDelegate.h + + /ZxDRN01WD1nh9dVQ83sWXUGvFM= + + Headers/ISABannerAdRequest.h + + s/FPHi/ITzePzOHuz5GiHFtrbao= + + Headers/ISABannerAdRequestBuilder.h + + 3yvcp58HYj4e87Gd04Ok6JyjOx4= + + Headers/ISABannerAdView.h + + snPTLJEUpNHCq0MgYux/lxaY8OQ= + + Headers/ISABannerAdViewDelegate.h + + 0+IyT4pc/Ax8IDpCqaSTBkDsB1w= + + Headers/ISAInitRequest.h + + fp/phEDE1zUTcdk74pDkMl0uwow= + + Headers/ISAInitRequestBuilder.h + + x19i7Zgo5/WhyTNyLepy8fXV3V8= + + Headers/ISAInterstitialAd.h + + 8wp23aDQ9/YuW+UYV/lrISJ/d1E= + + Headers/ISAInterstitialAdDelegate.h + + 7hLi1yDfx3n2icnvVspT7zzedxA= + + Headers/ISAInterstitialAdInfo.h + + cwMDSskG5nTCjRAvJnVeBb1J0+w= + + Headers/ISAInterstitialAdLoader.h + + Cl1ieV4WK3CE6lzKojVW/BdRUuI= + + Headers/ISAInterstitialAdLoaderDelegate.h + + HpVVMQ4SeSrLJfpQ/zpS4rkrwww= + + Headers/ISAInterstitialAdRequest.h + + gL6gMjNxnzlPzNIaLw/8ovwFRxs= + + Headers/ISAInterstitialAdRequestBuilder.h + + WYEBwkMg2SjIeRnBwFyHKF0ANuw= + + Headers/ISARewardedAd.h + + 3jeefI8u8dEKyXG6//Tp2E6NqhQ= + + Headers/ISARewardedAdDelegate.h + + eZng4ZpgnIWFk/g6+2zS7W72uP0= + + Headers/ISARewardedAdInfo.h + + Zuc2pgBDP0JDmPzZLlKxjUyXhEI= + + Headers/ISARewardedAdLoader.h + + acUREuiSfBPt1M0QUc7u5tmGVjA= + + Headers/ISARewardedAdLoaderDelegate.h + + W2GNkyWOvPi6xwwdPSsJ6k62UiQ= + + Headers/ISARewardedAdRequest.h + + 4i2dfS2JgMsQso5Y2lK4wZ87Sxs= + + Headers/ISARewardedAdRequestBuilder.h + + TcVBli9aEn0CCXvEf1lAbJnJPvA= + + Headers/ISAdData.h + + WwLUxclrhK6OQ6R+kDoYoobEkG8= + + Headers/ISAdInfo.h + + 68qINxSkGViYeHkNFF1tG4knku4= + + Headers/ISAdOptionsPosition.h + + rIgjNbeQPK7I+B8KwWuaxec17js= + + Headers/ISAdUnitAdapterProtocol.h + + AQ8XrsVTKjVk/yn5qcjbokdRubQ= + + Headers/ISAdapterAdDelegate.h + + YQPRiHmrNC0HITtxEZ1l+NyILrU= + + Headers/ISAdapterAdFullscreenProtocol.h + + h8r9hvlCtYUhZKSvX5u5LgXKOIo= + + Headers/ISAdapterAdInteractionDelegate.h + + 9Hq/6Y0pEAeTAfBQJShIaiNq0MM= + + Headers/ISAdapterAdRewardedDelegate.h + + hS/h8D/BTDvdYKGWGk4Kbdq371w= + + Headers/ISAdapterAdViewDelegate.h + + E/wV6fvecvN2hz9gPOsl2koQkDs= + + Headers/ISAdapterAdaptiveProtocol.h + + iwRqTEKs6cxEFFF79syw5RksDDw= + + Headers/ISAdapterBannerProtocol.h + + kHasNWQaSZOeesziOpm+g+62Vqg= + + Headers/ISAdapterBaseProtocol.h + + 6qBM9uAMciJad+uMsv5DiCFneSI= + + Headers/ISAdapterConfig.h + + 2KypSa9hMOcZDPe1N17Z2MVTI78= + + Headers/ISAdapterConsentProtocol.h + + 2e3z1LoV2AJ1DjANPk/euSg4aig= + + Headers/ISAdapterDebugProtocol.h + + YI4o7ytKGA6hdOBu9sqEvaneDvg= + + Headers/ISAdapterErrorType.h + + qG7IPW5JhOM53kdm9Sq2Yc88s6s= + + Headers/ISAdapterErrors.h + + PeCEzn8+n9Iplh8bS/4q5O79xyo= + + Headers/ISAdapterMetaDataProtocol.h + + N9PUdrrCephCZSw2KqseIe5FkT8= + + Headers/ISAdapterNativeAdData.h + + IR6dt3gWMvrHAOYQh+IbY3EvsZc= + + Headers/ISAdapterNativeAdProtocol.h + + IpqBZ4NoVOiv4z8p90nmPSJ+L50= + + Headers/ISAdapterNativeAdViewBinder.h + + Q7sjdLVv8vxp9A9K1Ayk7Kgnahw= + + Headers/ISAdapterNativeAdViewBinderProtocol.h + + M+sNIHC7rpjNZyZPquZcRFc8j0U= + + Headers/ISAdapterNetworkData.h + + VDmDD+S1bBaHBmJZ+tMZNvfd4Yk= + + Headers/ISAdapterNetworkDataProtocol.h + + +5ZuBFuBZTJJOc+GxdKvbgjeYIo= + + Headers/ISAppStoreErrorDelegate.h + + 8WbJ5wACAP+MA3Nv9OIZ4NklLic= + + Headers/ISBannerAdDelegate.h + + yUR94r7mWcU2oTPJvFwDFg5p/tI= + + Headers/ISBannerAdapterDelegate.h + + gBpuOgY/YXQYBGuwhL4XL9iO1PY= + + Headers/ISBannerAdapterProtocol.h + + 0qR3dtZcn+a1488/Nb+/XQiKjCU= + + Headers/ISBannerSize.h + + oXtDTzUWMWURfLjuCHrGf2yFc0o= + + Headers/ISBaseAdAdapter.h + + 9FM0DU1qDRV2IrUU6XFB6+urFT8= + + Headers/ISBaseAdInteractionAdapter.h + + an6XcHEaieTUwcRDHP4nv+3hhgY= + + Headers/ISBaseAdUnitAdapter.h + + 3DiYiGP6AHA4eVWgs9Cu6SMfrIc= + + Headers/ISBaseAdapter+Internal.h + + t5pjOApjxY9AF58NVbaNO49l/yE= + + Headers/ISBaseAdapter.h + + uEYIszshAheKauBCuFVbS7yeQ+4= + + Headers/ISBaseBanner.h + + FvgJt3X4ErVOnIQE36KmEltkDcs= + + Headers/ISBaseBannerAdapter.h + + 2afUe+GviVEa6th1VhiLevbfROU= + + Headers/ISBaseInterstitial.h + + 1A+4NKHjF6jsBgh4obj7VFPAGeA= + + Headers/ISBaseInterstitialAdapter.h + + 1Gy3viS2D4LQyxwVHptqfprQRlI= + + Headers/ISBaseNativeAd.h + + ILdsPTIVYPX2Mnp5QXvfWSECcbk= + + Headers/ISBaseNativeAdAdapter.h + + eBs2DgzOdfvILvKz1K5D6JfaTL8= + + Headers/ISBaseNetworkAdapter.h + + NRyHurUlJTJZqpanLjSqAKg5eRs= + + Headers/ISBaseRewardedVideo.h + + LW/O5JyyLQS8+1zoZY+EAF5rI9w= + + Headers/ISBaseRewardedVideoAdapter.h + + sns2v9SrW9IkIG+oEjdcnQOC2C8= + + Headers/ISBiddingDataDelegate.h + + lHgA77qs07HrSON5M+Idf4Y8/tU= + + Headers/ISBiddingDataProtocol.h + + hGxIppdjNBKwRlEcH4FDGr2vmiE= + + Headers/ISConcurrentMutableArray.h + + nFB9xy8U7FWlrWtgWjH4W/JDvu8= + + Headers/ISConcurrentMutableDictionary.h + + pfAfusQ7TuYlJqGiHKeEs/oqnPI= + + Headers/ISConcurrentMutableSet.h + + fOdib3TZcAKsZXFyS95C0oc4c8I= + + Headers/ISConfigurations.h + + KPZ8FpNX1Yz6KorSmH5I/HO4kJk= + + Headers/ISDataKeys.h + + socCh2ZeGuWpmK90e+2mJBDxPTE= + + Headers/ISDemandOnlyBannerDelegate.h + + cDffWCNIdX18zO/R4cFTl/Ym8XI= + + Headers/ISDemandOnlyBannerView.h + + rpIP2yDx6A8hmNRrGQLG5wTnOe4= + + Headers/ISDemandOnlyInterstitialDelegate.h + + cGS3FNoMtnS3LGjN2qpg87Fi/dY= + + Headers/ISDemandOnlyRewardedVideoDelegate.h + + LluTo4OWDjQ6LfjEMAfQ73CgFmc= + + Headers/ISError.h + + 3mhydpRV/MBcE4y1XGlwo+yLZIw= + + Headers/ISInterstitialAdapterDelegate.h + + kMkUGIxnIRiyaxmbHL03icrX6pw= + + Headers/ISInterstitialAdapterProtocol.h + + PIYQh0eVKExODk6kaDNNqZj8LHQ= + + Headers/ISIronSourceAdapter.h + + jwpu/+VjFIze4QC6TpqFz+6jxdc= + + Headers/ISLoadWhileShowSupportState.h + + tdCFxYzBA8N56m1qgcbXsrCtM50= + + Headers/ISLog.h + + U7Ex8LF1tzkYKadjlR+6byCnKBw= + + Headers/ISLoggerManager.h + + dwEXIXbndGsmQDPFl1g14nfcmoI= + + Headers/ISMediationGlobalDataWriterFacade.h + + St/+lDSvPSESb0xZSLQ+xHRuZRE= + + Headers/ISMetaData.h + + RB6Om1a4v2WpDi9CxSg030kGJug= + + Headers/ISMetaDataConstants.h + + mxf083BlQt6Xn0CiGBt4CIZ5QgE= + + Headers/ISMetaDataUtils.h + + +3zwoUpaHqEHhrsiHHXPH0Bx/dY= + + Headers/ISNAdViewsManagerSwiftFacade.h + + 82R4WWcT8q7BHAoLms9tu5TWfh4= + + Headers/ISNAppStoreVCRootViewDelegate.h + + T/KPkxVIg71IXWYkxhekGIqSuzQ= + + Headers/ISNControllerManagerSwiftFacade.h + + icBYLoGRD/O357ajvkOsxyFjehg= + + Headers/ISNControllerMessageListener.h + + xyceqcHJ1b8A78iCDu8sEXPeXsU= + + Headers/ISNEvent.h + + kW02xVLfAJgQK8KM+nPzC1MFu5s= + + Headers/ISNEventTrackerInterface.h + + UokTrA9/9s+6V00fWeNHrs3D+8w= + + Headers/ISNEventTrackerWrapper.h + + MUTYUqEqP17lOJ+KNCwOGyVeAi4= + + Headers/ISNSupersonicAdsPublisherSwiftFacade.h + + KvOkHW6O141cgX1e9rS+/vuImdk= + + Headers/ISNativeAdAdapterDelegate.h + + t3atAqTDrYYF892heLN4tUsRe9A= + + Headers/ISNativeAdAdapterProtocol.h + + 5ZjvO1JXj5alcI7dGtBvI09gMtk= + + Headers/ISNativeAdDataImage.h + + KCLCSsL+nXY+FC2mD+HVy3gQ3HA= + + Headers/ISNativeAdDataProtocol.h + + LNtbU3RJ0/efOiT2jTBTmUgzKq0= + + Headers/ISNativeAdDelegate.h + + r792Ozjt2JIg0Ba91CaY3HtH1a8= + + Headers/ISNativeAdInteractionDelegate.h + + pZ1KEMgSnMpvrccE74UD1CgcT20= + + Headers/ISNativeAdLoadDelegate.h + + ppnSd2czZuIJuX3069dgBUOs/u8= + + Headers/ISNativeAdProperties.h + + +UQEM6HcIVg9XGDj8eku6u95F8Q= + + Headers/ISNativeAdProtocol.h + + UrHwG1IbbfpMzi6XxDNU9F/p/xU= + + Headers/ISNativeAdView.h + + vgavGLZVVvS/9mjZEuuvdG5XfAU= + + Headers/ISNativeAdViewBinderProtocol.h + + 1IvRasf/IqsCuN8c22T9NC50qh0= + + Headers/ISNativeAdViewHolder.h + + j+ujH0Pw1sUl1melvotoab4Myr4= + + Headers/ISNetworkInitCallbackProtocol.h + + SP29vucp41JLLA+bpS77QcG2gqI= + + Headers/ISNetworkInitializationDelegate.h + + s/XF8EL0q0JYm6xAHjs7egvPVTg= + + Headers/ISRewardedVideoAdapterDelegate.h + + jR9j3LZQfHNwUmeMGwS1PKPG3VI= + + Headers/ISRewardedVideoAdapterProtocol.h + + H1HEFkk0SH3ybe5Mzb9GgoilWyU= + + Headers/ISSetAPSDataProtocol.h + + rnL75kdtuGIiTCUX2DW105Je/CM= + + Headers/ISSupersonicAdsConfiguration.h + + hFP+49As1f/OHTuN2GjCeBc68yQ= + + Headers/IronSource.h + + n7gYI6S6aO66wpaATozHwmGHxAE= + + Headers/IronSourceAds.h + + n6cSzeryq3V85bt7aJUcmtvEy0Q= + + Headers/IronSourceNetworkSwiftBridge.h + + zAOY97xL12P7lv8Bfj57whqKpv4= + + Headers/LPMAdInfo.h + + mvOSL6CkHv2k2K0I5lAz37HUSLI= + + Headers/LPMAdSize.h + + eqTyHmpFWoBcxg5djyaEFxQqtfY= + + Headers/LPMBannerAdView.h + + agwSu6qwrZq79jGoz9BHB0NvJFs= + + Headers/LPMBannerAdViewConfig.h + + s9iYjLmqtcpPxKuHa3uLvc1VPtw= + + Headers/LPMBannerAdViewConfigBuilder.h + + F5xyhbgkKs5/gwK+gYEPU/4lJLo= + + Headers/LPMBannerAdViewDelegate.h + + BiMNQ1bjLRKiu78oQFaMuKN3gqg= + + Headers/LPMConfiguration.h + + iUxG6pvJEA4IqGWnY02j2Xdj/5k= + + Headers/LPMDispatcherProtocol.h + + seSO62TK0wbvBmFOEAfBF7IV0t8= + + Headers/LPMImpressionData.h + + mQEQGof9ieWMuUEy6LZdDcvIo8E= + + Headers/LPMImpressionDataDelegate.h + + KrrZeolYsvITi7I4tsqD3Ikb3jc= + + Headers/LPMInitRequest.h + + 5qpk3FGZutWr1cYF/OtJyInczvY= + + Headers/LPMInitRequestBuilder.h + + nTulL3kdPuf74JLpnmWrhZJwlMw= + + Headers/LPMInterstitialAd.h + + Yh16ILJ5Yt2Fu+KLtPIvrEcPbgo= + + Headers/LPMInterstitialAdConfig.h + + ogd1b51ZsmELEky2zPZrlAfN7do= + + Headers/LPMInterstitialAdConfigBuilder.h + + oZwK6zVCY6QS7IZQET10lnDcD/4= + + Headers/LPMInterstitialAdDelegate.h + + V3Bj1CSxweu/TnLOet5273QOlX4= + + Headers/LPMReward.h + + F1gni/AMiRTjoVelMGv0Uc3r8ic= + + Headers/LPMRewardedAd.h + + GaTuWpkOgRnHhUeka0nKcfXFh/Y= + + Headers/LPMRewardedAdConfig.h + + l9Su9m9kFw89/oMus/HgL71sCyo= + + Headers/LPMRewardedAdConfigBuilder.h + + /a25csB37oUPlULbCJIn4YyGojA= + + Headers/LPMRewardedAdDelegate.h + + xaZ5cZ4Zo6C8j623oFZ2Lq4uy2k= + + Headers/LPMSegment.h + + NGkN9XPYX8CdjG9Y1+r4FVXMNVk= + + Headers/LevelPlay.h + + QVlU7/m4ZjwZqfb/ibCj3KAEAPo= + + Headers/LevelPlayBaseAdapter.h + + HnUdLW5v8JwE1qh1+0861oAchb0= + + Headers/LevelPlayBaseBannerAdapter.h + + TiyPzKv2LJaWA4kMo4hR0EpIZY4= + + Headers/LevelPlayBaseInterstitialAdapter.h + + 0llfzuFkOtJv3eH55IJ6CTGkhCI= + + Headers/LevelPlayBaseNativeAdAdapter.h + + 9Hhlk04+FUTpDyiDRkLrrxMiOIQ= + + Headers/LevelPlayBaseRewardedAdapter.h + + DyP5Ay/RG+4bdM+5SZo17YpUKtI= + + Headers/LevelPlayMediaView.h + + IRFkpkJkvHoxzr5ab0QgExRUtZg= + + Headers/LevelPlayNativeAd.h + + uWq0pqTnh7W6HSmsmUvQS+QrUMY= + + Headers/LevelPlayNativeAdBuilder.h + + CWxXHPRmFqe96j26E6+oRnBuJlQ= + + Headers/LevelPlayNativeAdDelegate.h + + 5bQGadNaEM7LZdOlCAM1KfPrXzs= + + Headers/UIView+ISNativeView.h + + 5yYHQ6BbNYO8GcsGrsIFPz940JM= + + Info.plist + + tjn5hSlD/CQZ1zWXh7uFff7HHes= + + Modules/module.modulemap + + kzGgmpCJFpUdi/nT2cuKAZIcEmo= + + PrivacyInfo.xcprivacy + + BLNjR6VVI/K82v3iQCE5o0YXgGI= + + + files2 + + Headers/ISAAdFormat.h + + hash + + wmVijQhgATFGx0c0TaMqvChxgmI= + + hash2 + + 4rAUpGOINRNpUmm8lz5xdg8fMfKZ01KNNnPlbTLD5y8= + + + Headers/ISAAdSize.h + + hash + + CEC6aJ+CTC1PdaJb0hxwcghjGB8= + + hash2 + + usN1n3M6bgTxFureNX65jx9eNfCcRLVA2k6hhsFrvRs= + + + Headers/ISABannerAdInfo.h + + hash + + cRhCQPy0T9Jy+8+5bUcrmSjZLhk= + + hash2 + + M7oiH9IvmY5I6DJDcJKaFuFWMbuPjs2ttGdpyh9GrIc= + + + Headers/ISABannerAdLoader.h + + hash + + b4N+q5aUIeE3GA3r7qtd8rvyHfo= + + hash2 + + ZLO9dDtwgvwfqJjXC3qLGTw3VNsUGqNBrEuivz1Inlg= + + + Headers/ISABannerAdLoaderDelegate.h + + hash + + /ZxDRN01WD1nh9dVQ83sWXUGvFM= + + hash2 + + o6VVzXReiB7HmdYZ/MR53aj1xh8Rtl/qWLbZFPWtk68= + + + Headers/ISABannerAdRequest.h + + hash + + s/FPHi/ITzePzOHuz5GiHFtrbao= + + hash2 + + K0KWauRUqUlguA7xzF6UNTCrLA0FYGz1pV4PBbT1Qi4= + + + Headers/ISABannerAdRequestBuilder.h + + hash + + 3yvcp58HYj4e87Gd04Ok6JyjOx4= + + hash2 + + P22x6opPgO2RRLfIyOhJuCrZ8Zz5j5OU5lcByKZkNuU= + + + Headers/ISABannerAdView.h + + hash + + snPTLJEUpNHCq0MgYux/lxaY8OQ= + + hash2 + + AFTfcEZjjvQmFHLPcrRI94d0aPSwrth1gA9DmaPdHdo= + + + Headers/ISABannerAdViewDelegate.h + + hash + + 0+IyT4pc/Ax8IDpCqaSTBkDsB1w= + + hash2 + + sa4orI54dBKyTO9RfcYbQsiPNlZioCjQRGkbCIfKSQE= + + + Headers/ISAInitRequest.h + + hash + + fp/phEDE1zUTcdk74pDkMl0uwow= + + hash2 + + tZXfqmrJNTXIpbTU0MnwWVG1OKHY/YTWZ8QhN7XlN0E= + + + Headers/ISAInitRequestBuilder.h + + hash + + x19i7Zgo5/WhyTNyLepy8fXV3V8= + + hash2 + + GbbFh5H/3S9PH31HnEzjIXsJX8xlFhba/aFaSfTL0K4= + + + Headers/ISAInterstitialAd.h + + hash + + 8wp23aDQ9/YuW+UYV/lrISJ/d1E= + + hash2 + + jZq54KQroF98WPNdslz0B+FuepXTnYz0KbTqoPZ6xME= + + + Headers/ISAInterstitialAdDelegate.h + + hash + + 7hLi1yDfx3n2icnvVspT7zzedxA= + + hash2 + + Wq2Vg2jH/Rz18XkHyCK17z4Sn10jZz4Rk3dCpfrtVfc= + + + Headers/ISAInterstitialAdInfo.h + + hash + + cwMDSskG5nTCjRAvJnVeBb1J0+w= + + hash2 + + KvksZSl1JeIg0hIzcwxeUZ0gTlC9iMs6RGVwvA890xU= + + + Headers/ISAInterstitialAdLoader.h + + hash + + Cl1ieV4WK3CE6lzKojVW/BdRUuI= + + hash2 + + Zhfe5j1Q1TVaCp4GOpUlmEW+6FAd7TUAklvLd9KjoWM= + + + Headers/ISAInterstitialAdLoaderDelegate.h + + hash + + HpVVMQ4SeSrLJfpQ/zpS4rkrwww= + + hash2 + + +Wrbluvlf0+IUzos0rV5U7dxGlQWXj+5YtrLC7GnWOw= + + + Headers/ISAInterstitialAdRequest.h + + hash + + gL6gMjNxnzlPzNIaLw/8ovwFRxs= + + hash2 + + jT1dx3zzyNuxFBXbjyG+tPQ1qX7VnFJeU5RWOk+WoAM= + + + Headers/ISAInterstitialAdRequestBuilder.h + + hash + + WYEBwkMg2SjIeRnBwFyHKF0ANuw= + + hash2 + + 07drEeNMJiwp4LDzOolhAUSN05TsCwCNHG9lqzrlQfo= + + + Headers/ISARewardedAd.h + + hash + + 3jeefI8u8dEKyXG6//Tp2E6NqhQ= + + hash2 + + v/wF249S04LbaiYEP5CVk8LKMU8HMGeFveIdXk/SVm4= + + + Headers/ISARewardedAdDelegate.h + + hash + + eZng4ZpgnIWFk/g6+2zS7W72uP0= + + hash2 + + Z0DDwPx9odFbiRlIGXrHQofs8wBqFiOcYGt66Va3Tyg= + + + Headers/ISARewardedAdInfo.h + + hash + + Zuc2pgBDP0JDmPzZLlKxjUyXhEI= + + hash2 + + qnZUgaqUj5XRCAyFE7bR4WqDLpqU8rFtlFHgvkIZKlw= + + + Headers/ISARewardedAdLoader.h + + hash + + acUREuiSfBPt1M0QUc7u5tmGVjA= + + hash2 + + XPZDNGHA4X5RPX5Q/iK1LJAw9+iDAjnALz5sJEVa9UM= + + + Headers/ISARewardedAdLoaderDelegate.h + + hash + + W2GNkyWOvPi6xwwdPSsJ6k62UiQ= + + hash2 + + fQiyHpnmhI6tNpwAO7g43Nj09UYsxGXDTp8ZZbs5kgk= + + + Headers/ISARewardedAdRequest.h + + hash + + 4i2dfS2JgMsQso5Y2lK4wZ87Sxs= + + hash2 + + JH/mEEya5Msr2Wj2eo588iAPMbVU9jqQ+y0sZZplEsQ= + + + Headers/ISARewardedAdRequestBuilder.h + + hash + + TcVBli9aEn0CCXvEf1lAbJnJPvA= + + hash2 + + LFUTiqfGVobiPuCvi7ZKiudQ2aNAg16EIV7egPNuuas= + + + Headers/ISAdData.h + + hash + + WwLUxclrhK6OQ6R+kDoYoobEkG8= + + hash2 + + pbBiFjxz830HwqCjK0ga1esimad1ehHhyR+2eEnNXl0= + + + Headers/ISAdInfo.h + + hash + + 68qINxSkGViYeHkNFF1tG4knku4= + + hash2 + + yeC0SXviW71NE6BZNmlhwNiKQqVBusin9lgWJtxkmkM= + + + Headers/ISAdOptionsPosition.h + + hash + + rIgjNbeQPK7I+B8KwWuaxec17js= + + hash2 + + dX77NBYMTC1boX/N9acpaK41lHjQ1XL66YGVETQNEp4= + + + Headers/ISAdUnitAdapterProtocol.h + + hash + + AQ8XrsVTKjVk/yn5qcjbokdRubQ= + + hash2 + + YYMujN7vxeUwDbQdubC497SBpWfqIz3E94MFEY5PJXI= + + + Headers/ISAdapterAdDelegate.h + + hash + + YQPRiHmrNC0HITtxEZ1l+NyILrU= + + hash2 + + HxqWfOrj58C6xXvatiHijLKm+ciARd89LJJH2TIWWkk= + + + Headers/ISAdapterAdFullscreenProtocol.h + + hash + + h8r9hvlCtYUhZKSvX5u5LgXKOIo= + + hash2 + + CMHq4/gB/ltRAkCLe9yUb47UsUJQ6i630D0o92mEUTk= + + + Headers/ISAdapterAdInteractionDelegate.h + + hash + + 9Hq/6Y0pEAeTAfBQJShIaiNq0MM= + + hash2 + + 29ueGfEo9iVehrIcbOrGav2+a94IuYHja9gg1NlNCLs= + + + Headers/ISAdapterAdRewardedDelegate.h + + hash + + hS/h8D/BTDvdYKGWGk4Kbdq371w= + + hash2 + + KkCn2zJRo5lF0ZG9Ms3t/6iQTZ+o2gh5aS1WQyofO5M= + + + Headers/ISAdapterAdViewDelegate.h + + hash + + E/wV6fvecvN2hz9gPOsl2koQkDs= + + hash2 + + JwsAMed3gCTSM6gGhOCDznXfrQxX1tmehjsLL/TIje0= + + + Headers/ISAdapterAdaptiveProtocol.h + + hash + + iwRqTEKs6cxEFFF79syw5RksDDw= + + hash2 + + 1usYE7tJpePxHF6rGbhVQGPAhm6KPijADGV4o2J5a/4= + + + Headers/ISAdapterBannerProtocol.h + + hash + + kHasNWQaSZOeesziOpm+g+62Vqg= + + hash2 + + o3QH1wojg32jt/iYuYxhAQvXOdeOqvwk6xc4z7LKucY= + + + Headers/ISAdapterBaseProtocol.h + + hash + + 6qBM9uAMciJad+uMsv5DiCFneSI= + + hash2 + + mg2SzwVW4W8Lu3kJYbBobJ15ONlWvOZdyg681ong61A= + + + Headers/ISAdapterConfig.h + + hash + + 2KypSa9hMOcZDPe1N17Z2MVTI78= + + hash2 + + UMuyT+CIOPUaOkGPVXmp/4gUIzWzqHiMg4XwLiwg7VE= + + + Headers/ISAdapterConsentProtocol.h + + hash + + 2e3z1LoV2AJ1DjANPk/euSg4aig= + + hash2 + + Xp7aV25jgRjzpmVEnxZMOGCvvd0YbNc6CE37OEdoDCY= + + + Headers/ISAdapterDebugProtocol.h + + hash + + YI4o7ytKGA6hdOBu9sqEvaneDvg= + + hash2 + + OkNigDqIvVIQ2H4S0GYY/fzXKtCDOu+c9I8FNREJzjI= + + + Headers/ISAdapterErrorType.h + + hash + + qG7IPW5JhOM53kdm9Sq2Yc88s6s= + + hash2 + + MYxMce0zuNFnlS648sUt8qiTjtr/qnumNyFc/5bTwLM= + + + Headers/ISAdapterErrors.h + + hash + + PeCEzn8+n9Iplh8bS/4q5O79xyo= + + hash2 + + mAepr/rxIfWAdSaTY2lW3nCB0KOS18qfak5mY50PsOU= + + + Headers/ISAdapterMetaDataProtocol.h + + hash + + N9PUdrrCephCZSw2KqseIe5FkT8= + + hash2 + + R+h5wuzkWOwHPN5pACWOcn6Ng/vLo19XrLvKvUDhZz4= + + + Headers/ISAdapterNativeAdData.h + + hash + + IR6dt3gWMvrHAOYQh+IbY3EvsZc= + + hash2 + + 23KQ2rnnGcq3irNWD6nCMO2Dp5TaMCYn8X6GGlwwexE= + + + Headers/ISAdapterNativeAdProtocol.h + + hash + + IpqBZ4NoVOiv4z8p90nmPSJ+L50= + + hash2 + + ELPteJ/usOCdWV+hssDetnOlYMHZRKRXtpmWnYc5IfY= + + + Headers/ISAdapterNativeAdViewBinder.h + + hash + + Q7sjdLVv8vxp9A9K1Ayk7Kgnahw= + + hash2 + + +HWCVUYKoRFQtlnavu2UOyDTKwuIK04wOIgG9gz8lig= + + + Headers/ISAdapterNativeAdViewBinderProtocol.h + + hash + + M+sNIHC7rpjNZyZPquZcRFc8j0U= + + hash2 + + qViJ6pDaNOXbpgczMq1922nCJzojnXOB94mxSCIXyQU= + + + Headers/ISAdapterNetworkData.h + + hash + + VDmDD+S1bBaHBmJZ+tMZNvfd4Yk= + + hash2 + + I9EvfVgMk3V+VuNE/2xg/NLW9RlMeu9wlEvEPmBNleU= + + + Headers/ISAdapterNetworkDataProtocol.h + + hash + + +5ZuBFuBZTJJOc+GxdKvbgjeYIo= + + hash2 + + 6WxA9hQ7vy7/xJ1tzogLLh15J4lTAf1K4D0jEmKusOE= + + + Headers/ISAppStoreErrorDelegate.h + + hash + + 8WbJ5wACAP+MA3Nv9OIZ4NklLic= + + hash2 + + ECeVddZ16hcVdYN/Ft5PTXJRHz8B+ynR6CV49na9Ppk= + + + Headers/ISBannerAdDelegate.h + + hash + + yUR94r7mWcU2oTPJvFwDFg5p/tI= + + hash2 + + wpzmSDty5YxSKmuLV02wGGBYad1Wv1dsyCE1YXSWPiE= + + + Headers/ISBannerAdapterDelegate.h + + hash + + gBpuOgY/YXQYBGuwhL4XL9iO1PY= + + hash2 + + kBbTiimo61TcEupEw2CXI1IrJRKyn8mKsFxIuzpXZD8= + + + Headers/ISBannerAdapterProtocol.h + + hash + + 0qR3dtZcn+a1488/Nb+/XQiKjCU= + + hash2 + + agY6eyikUcb6PlBh7TKs7oUSe7DE94gwsjqufB2Ntaw= + + + Headers/ISBannerSize.h + + hash + + oXtDTzUWMWURfLjuCHrGf2yFc0o= + + hash2 + + +NKrnJYCaYSkO885p6no6G0w+Q0tzt6gZ/7Rvr/jRlA= + + + Headers/ISBaseAdAdapter.h + + hash + + 9FM0DU1qDRV2IrUU6XFB6+urFT8= + + hash2 + + Fq6GQw2AlR5cm3cFlN9p1k0sFG3Q1PWB7zYjgp82nGY= + + + Headers/ISBaseAdInteractionAdapter.h + + hash + + an6XcHEaieTUwcRDHP4nv+3hhgY= + + hash2 + + X54fAw6BS257R6/CdadFG28/qScvEfXN6kmQ3DJFQC8= + + + Headers/ISBaseAdUnitAdapter.h + + hash + + 3DiYiGP6AHA4eVWgs9Cu6SMfrIc= + + hash2 + + 8w8fH/9HYhL//MDwIB3eMKZITYCCy/2XJOqYuA6nJ1Q= + + + Headers/ISBaseAdapter+Internal.h + + hash + + t5pjOApjxY9AF58NVbaNO49l/yE= + + hash2 + + 8ghPLnPw8szAIDFOabJBt4f4PLUROG8Nfima/1Y0al0= + + + Headers/ISBaseAdapter.h + + hash + + uEYIszshAheKauBCuFVbS7yeQ+4= + + hash2 + + s1SeZGTmRPQPaUWvu1UGo4u7hQHPgBEoawjjWdJ7rO0= + + + Headers/ISBaseBanner.h + + hash + + FvgJt3X4ErVOnIQE36KmEltkDcs= + + hash2 + + T8yNJKULv+mUeFdw2CKpyTaHlNTqzfZUvi4xD27EJ3Q= + + + Headers/ISBaseBannerAdapter.h + + hash + + 2afUe+GviVEa6th1VhiLevbfROU= + + hash2 + + q01XDEtg2p6Shoz6yteJvHFlpA6wnpSQWEOx3y6B/vc= + + + Headers/ISBaseInterstitial.h + + hash + + 1A+4NKHjF6jsBgh4obj7VFPAGeA= + + hash2 + + TPd5U/PPbC2dNlS+gxzD0ZZ6Y0iWvNuCOupWlBE0ARA= + + + Headers/ISBaseInterstitialAdapter.h + + hash + + 1Gy3viS2D4LQyxwVHptqfprQRlI= + + hash2 + + m3bILYfrgzU3a/UVzxcRVB6Apwm8l/etXxYeDlpR9mI= + + + Headers/ISBaseNativeAd.h + + hash + + ILdsPTIVYPX2Mnp5QXvfWSECcbk= + + hash2 + + rhE95/ZDw5poEijbvyfA9+3CV4PHYSje7YjnMVJRLT0= + + + Headers/ISBaseNativeAdAdapter.h + + hash + + eBs2DgzOdfvILvKz1K5D6JfaTL8= + + hash2 + + bRIx7VZxVWmeDCz0r7xTPu4Qhdx2huq6geZ1TxLN7FA= + + + Headers/ISBaseNetworkAdapter.h + + hash + + NRyHurUlJTJZqpanLjSqAKg5eRs= + + hash2 + + Qvk+fKZg7+rky3kt/TEGBO/db2nLbNMlSNovhhe2Jek= + + + Headers/ISBaseRewardedVideo.h + + hash + + LW/O5JyyLQS8+1zoZY+EAF5rI9w= + + hash2 + + 0FJU79z+K3a7OYwsM2iIdB36MEavX803itNQiw1YKSo= + + + Headers/ISBaseRewardedVideoAdapter.h + + hash + + sns2v9SrW9IkIG+oEjdcnQOC2C8= + + hash2 + + s+LyS4RpSb19eq9ZX87gMSHhzpcx2QMAJxiozOrPiHc= + + + Headers/ISBiddingDataDelegate.h + + hash + + lHgA77qs07HrSON5M+Idf4Y8/tU= + + hash2 + + 7DEJhJQZGqcR346PieLJKSUg+0E6B9f9XEJrlEIeYPk= + + + Headers/ISBiddingDataProtocol.h + + hash + + hGxIppdjNBKwRlEcH4FDGr2vmiE= + + hash2 + + wDUCt8rVpdh660bUpy/IF2PI6LXQ2nILt0xqSb1wKhY= + + + Headers/ISConcurrentMutableArray.h + + hash + + nFB9xy8U7FWlrWtgWjH4W/JDvu8= + + hash2 + + cDj2tetNKJJ1qJ3V/8S//5wunyWtwvmBTdvX+87immo= + + + Headers/ISConcurrentMutableDictionary.h + + hash + + pfAfusQ7TuYlJqGiHKeEs/oqnPI= + + hash2 + + +AezrYWTlnJ8zvW7cVtsmfNZWJkX1OiPGC0Y1tiIlgs= + + + Headers/ISConcurrentMutableSet.h + + hash + + fOdib3TZcAKsZXFyS95C0oc4c8I= + + hash2 + + U/u/GSLup6tdcDIVz9vy1yPC26Xr9Ga1QeA9sS8iljo= + + + Headers/ISConfigurations.h + + hash + + KPZ8FpNX1Yz6KorSmH5I/HO4kJk= + + hash2 + + m7vzKHV34acamu+QzU3eK94aCwaxo8YskmjlM1JZQa4= + + + Headers/ISDataKeys.h + + hash + + socCh2ZeGuWpmK90e+2mJBDxPTE= + + hash2 + + 8MAFZIu+mfB3b/KeIh75BrNFExoV7a9PNFq6WN+M4tE= + + + Headers/ISDemandOnlyBannerDelegate.h + + hash + + cDffWCNIdX18zO/R4cFTl/Ym8XI= + + hash2 + + 874ZhBpfWQn1F8Ec1aJ/aCyk/Qdn8pYP85I8WFL6y9E= + + + Headers/ISDemandOnlyBannerView.h + + hash + + rpIP2yDx6A8hmNRrGQLG5wTnOe4= + + hash2 + + 6Q9dO6qpOzVF9DBgtxoKOMrEKTdfFGgLAF6ufUISsPE= + + + Headers/ISDemandOnlyInterstitialDelegate.h + + hash + + cGS3FNoMtnS3LGjN2qpg87Fi/dY= + + hash2 + + cNDjWq/MQSyYSFttSpKkEkiR3mw9pnfzv/x1AaRPiXk= + + + Headers/ISDemandOnlyRewardedVideoDelegate.h + + hash + + LluTo4OWDjQ6LfjEMAfQ73CgFmc= + + hash2 + + 4Bv0rXIe59/EFmO2aCJlyz+6cogog6lmvw8gwvr9sQ8= + + + Headers/ISError.h + + hash + + 3mhydpRV/MBcE4y1XGlwo+yLZIw= + + hash2 + + rsOijKbrHYLiKGmonN+9ALS1NyyCiVq3olSGhC9jEy8= + + + Headers/ISInterstitialAdapterDelegate.h + + hash + + kMkUGIxnIRiyaxmbHL03icrX6pw= + + hash2 + + UooCvAamsSx6IUzCXjWB+qbvPjmQHD8B9/6ForjWUYI= + + + Headers/ISInterstitialAdapterProtocol.h + + hash + + PIYQh0eVKExODk6kaDNNqZj8LHQ= + + hash2 + + vGxJxFSIKBZkeHtp50Z4kIScOpX/hRMzzy8Ps1vtO2U= + + + Headers/ISIronSourceAdapter.h + + hash + + jwpu/+VjFIze4QC6TpqFz+6jxdc= + + hash2 + + swQ4E1c0r9lI4Znd7QNwp6b9YYP2l4oBf23Y++WfuUU= + + + Headers/ISLoadWhileShowSupportState.h + + hash + + tdCFxYzBA8N56m1qgcbXsrCtM50= + + hash2 + + KwRYeaiFz55JBvvYd8c/KTc1tQBGjSYUvM8pszL4D68= + + + Headers/ISLog.h + + hash + + U7Ex8LF1tzkYKadjlR+6byCnKBw= + + hash2 + + yi7vsIK7MJcwEts6MhT3y85ReU/p15JCV63hc5TjmmU= + + + Headers/ISLoggerManager.h + + hash + + dwEXIXbndGsmQDPFl1g14nfcmoI= + + hash2 + + 3Stk2uvS3ONt7KE3p7xIezMqnTQi+tcB1ieR6KzGTGQ= + + + Headers/ISMediationGlobalDataWriterFacade.h + + hash + + St/+lDSvPSESb0xZSLQ+xHRuZRE= + + hash2 + + /s4ZE4eSynBFq/0XGkLTk1ZnxQqzUj9kpEmRxaI9hBA= + + + Headers/ISMetaData.h + + hash + + RB6Om1a4v2WpDi9CxSg030kGJug= + + hash2 + + l+F7w8ZKqCgAwo9CN7LuGSmuOFzMvaLK7vSEJf5USTs= + + + Headers/ISMetaDataConstants.h + + hash + + mxf083BlQt6Xn0CiGBt4CIZ5QgE= + + hash2 + + uamC8ulqJcT9WIcAUOQ33K9+NuxdgA8L+SGHtIxBCf0= + + + Headers/ISMetaDataUtils.h + + hash + + +3zwoUpaHqEHhrsiHHXPH0Bx/dY= + + hash2 + + uSj+cHmqUqZuCZkgabeE55/47xDwDwC8ASqi3VGP3zE= + + + Headers/ISNAdViewsManagerSwiftFacade.h + + hash + + 82R4WWcT8q7BHAoLms9tu5TWfh4= + + hash2 + + Qssd2oow0+6IeHaIvYlHAqVIwjZdOgYUg5xFPUFDT0A= + + + Headers/ISNAppStoreVCRootViewDelegate.h + + hash + + T/KPkxVIg71IXWYkxhekGIqSuzQ= + + hash2 + + cNU+zAvAXic3Z6gNn8BNyqQxTemsebHxHlUTRhG/L+4= + + + Headers/ISNControllerManagerSwiftFacade.h + + hash + + icBYLoGRD/O357ajvkOsxyFjehg= + + hash2 + + teoFfTsFvAi4GcL5ogD8+oqNbwYL7UnUPbdqMS6zPmE= + + + Headers/ISNControllerMessageListener.h + + hash + + xyceqcHJ1b8A78iCDu8sEXPeXsU= + + hash2 + + Gr2s3J18q47mo5Pf/3AjThnrEA5c/pB8Yfg8KyHqI9k= + + + Headers/ISNEvent.h + + hash + + kW02xVLfAJgQK8KM+nPzC1MFu5s= + + hash2 + + Fl+f4CWHHZ7jIGoyZvDAXkvpFS132ymXJ57FlR2cTIY= + + + Headers/ISNEventTrackerInterface.h + + hash + + UokTrA9/9s+6V00fWeNHrs3D+8w= + + hash2 + + 11X2vToytDnbsfiQJViJiO+vuSv6ctJ9Q55NzG8cd+c= + + + Headers/ISNEventTrackerWrapper.h + + hash + + MUTYUqEqP17lOJ+KNCwOGyVeAi4= + + hash2 + + cFGNmUoOiV+CFyfX3v/IK1cyumlwhQizuv8AZ2+hjVM= + + + Headers/ISNSupersonicAdsPublisherSwiftFacade.h + + hash + + KvOkHW6O141cgX1e9rS+/vuImdk= + + hash2 + + 5NwQ4vXWBxWG3lqBnQC9lC+EXjXszauyGScLeS35F/g= + + + Headers/ISNativeAdAdapterDelegate.h + + hash + + t3atAqTDrYYF892heLN4tUsRe9A= + + hash2 + + UTToMJwNJVBcrpk9kB7FJhQRdIZukQJOJsdT7JPWb2I= + + + Headers/ISNativeAdAdapterProtocol.h + + hash + + 5ZjvO1JXj5alcI7dGtBvI09gMtk= + + hash2 + + pbZKkBxqAyUGc5FUKW/tTjBAVmk8ywn43F5bQwF0ENo= + + + Headers/ISNativeAdDataImage.h + + hash + + KCLCSsL+nXY+FC2mD+HVy3gQ3HA= + + hash2 + + gNQC+fe+j1Jf9FHnHZFVWg3QGKPxOwDS09j3TpBZNvs= + + + Headers/ISNativeAdDataProtocol.h + + hash + + LNtbU3RJ0/efOiT2jTBTmUgzKq0= + + hash2 + + Netiip2vmBNzop/NyZSYv7oKmyZfeGuusIjkTw/MJxM= + + + Headers/ISNativeAdDelegate.h + + hash + + r792Ozjt2JIg0Ba91CaY3HtH1a8= + + hash2 + + rHiIPsVjiOFhpGFKCRhJsuY4+E37eTw90gLIUgXm/b0= + + + Headers/ISNativeAdInteractionDelegate.h + + hash + + pZ1KEMgSnMpvrccE74UD1CgcT20= + + hash2 + + /QuNeNLucYd/G/VQilMfWqcbataqrZOQOCsLuD3WRp4= + + + Headers/ISNativeAdLoadDelegate.h + + hash + + ppnSd2czZuIJuX3069dgBUOs/u8= + + hash2 + + fXysgt8a8tJpkWK/hrimo1MOIz1UYIjBTZDRAB7+xvw= + + + Headers/ISNativeAdProperties.h + + hash + + +UQEM6HcIVg9XGDj8eku6u95F8Q= + + hash2 + + JixPWTp1Fq0eAOAeAvVNXBbZBpZxYgW8+NDmiv8QwJs= + + + Headers/ISNativeAdProtocol.h + + hash + + UrHwG1IbbfpMzi6XxDNU9F/p/xU= + + hash2 + + G313GcQumdyY1Jg/1z83ZTFnUZMGT8KN79XBzXElIUo= + + + Headers/ISNativeAdView.h + + hash + + vgavGLZVVvS/9mjZEuuvdG5XfAU= + + hash2 + + +gE4GqY7aKBVdcdmQQuL2VseIb76HpEY9k+OG31q37Y= + + + Headers/ISNativeAdViewBinderProtocol.h + + hash + + 1IvRasf/IqsCuN8c22T9NC50qh0= + + hash2 + + NrGzTeKFFPoiUiiXuZR3X55d8xnyXlLiSUXrwxhs21I= + + + Headers/ISNativeAdViewHolder.h + + hash + + j+ujH0Pw1sUl1melvotoab4Myr4= + + hash2 + + 9zTfXuqjn7xinCNpYoX8FHBNt80ehmo1LZdq1wye3Lk= + + + Headers/ISNetworkInitCallbackProtocol.h + + hash + + SP29vucp41JLLA+bpS77QcG2gqI= + + hash2 + + Pm58w6DfU9nJrDvZrXBU6T9nm1FOvNQIJjk4YyzOKsY= + + + Headers/ISNetworkInitializationDelegate.h + + hash + + s/XF8EL0q0JYm6xAHjs7egvPVTg= + + hash2 + + lKyn2uqgoawcirEHY5jwXcj9T4fTIaAnujIbasK5HpU= + + + Headers/ISRewardedVideoAdapterDelegate.h + + hash + + jR9j3LZQfHNwUmeMGwS1PKPG3VI= + + hash2 + + w1QC+sVRgWSKVIEytab83ZmXIJbrsj7TWZGiCwAg3wo= + + + Headers/ISRewardedVideoAdapterProtocol.h + + hash + + H1HEFkk0SH3ybe5Mzb9GgoilWyU= + + hash2 + + FglX8DBNkc4TPlYRKR/83tpEy2C2MqcPo0SoRC46MDk= + + + Headers/ISSetAPSDataProtocol.h + + hash + + rnL75kdtuGIiTCUX2DW105Je/CM= + + hash2 + + ncaN429GIfsonxZgB8dG0JxspD5wY+oBZzUYJaJed94= + + + Headers/ISSupersonicAdsConfiguration.h + + hash + + hFP+49As1f/OHTuN2GjCeBc68yQ= + + hash2 + + +ZPj2R+u2t7muU7wUOh7qHwV0Qrv+06iNuPD6F7zcMw= + + + Headers/IronSource.h + + hash + + n7gYI6S6aO66wpaATozHwmGHxAE= + + hash2 + + G6PXwCPGgsXTHp5Ct6RxzN2zxh4EA8bz3U1r+ZekgXQ= + + + Headers/IronSourceAds.h + + hash + + n6cSzeryq3V85bt7aJUcmtvEy0Q= + + hash2 + + g5bS2eeFQ434od4QAPml0JR8ckvhSDaMLqPuOJlYpVM= + + + Headers/IronSourceNetworkSwiftBridge.h + + hash + + zAOY97xL12P7lv8Bfj57whqKpv4= + + hash2 + + FLFELCSymQ/2j5aN9WUdecWJDhIMqpUWsCBfoSzCI+o= + + + Headers/LPMAdInfo.h + + hash + + mvOSL6CkHv2k2K0I5lAz37HUSLI= + + hash2 + + yjbfTaipyPI0imMrco0VOH+Bq8TCHM+z2oo/69eAYgU= + + + Headers/LPMAdSize.h + + hash + + eqTyHmpFWoBcxg5djyaEFxQqtfY= + + hash2 + + mLcGivusio7pqi5fOfkB0EiYsBiIhcDPH0YXNj4SLSo= + + + Headers/LPMBannerAdView.h + + hash + + agwSu6qwrZq79jGoz9BHB0NvJFs= + + hash2 + + DDnSM+Y4S4kWE08NqAtOzM4XUWE0ad4BWW2b+QfKjNo= + + + Headers/LPMBannerAdViewConfig.h + + hash + + s9iYjLmqtcpPxKuHa3uLvc1VPtw= + + hash2 + + fO0tRg8NeEpmR+0AXTpnLZ4bXPGObJLRpRNgztRQozg= + + + Headers/LPMBannerAdViewConfigBuilder.h + + hash + + F5xyhbgkKs5/gwK+gYEPU/4lJLo= + + hash2 + + t+ABdvHpzev3ioujgcMl8Tr1ihloPfMdJNMKkzjdESA= + + + Headers/LPMBannerAdViewDelegate.h + + hash + + BiMNQ1bjLRKiu78oQFaMuKN3gqg= + + hash2 + + V+989W2EtIovH/xSeq1O2V4PZWa/WoKvN1wwH5Km8Js= + + + Headers/LPMConfiguration.h + + hash + + iUxG6pvJEA4IqGWnY02j2Xdj/5k= + + hash2 + + //YGqySPVfkWPALsxibmoOHMGhy0BctODig85PTxWjs= + + + Headers/LPMDispatcherProtocol.h + + hash + + seSO62TK0wbvBmFOEAfBF7IV0t8= + + hash2 + + /QQ2Dy70NmRyHfy7KN21iMyWp5T2vVukdb/xV60iy1U= + + + Headers/LPMImpressionData.h + + hash + + mQEQGof9ieWMuUEy6LZdDcvIo8E= + + hash2 + + XucBg7lYVBnsmfTFUQnShgksxXOVBi1L7kWVUOcQ+5U= + + + Headers/LPMImpressionDataDelegate.h + + hash + + KrrZeolYsvITi7I4tsqD3Ikb3jc= + + hash2 + + c0XnLMixAid7wuO1igi3kh3hzmSVqsS2xvRKvBNNXhY= + + + Headers/LPMInitRequest.h + + hash + + 5qpk3FGZutWr1cYF/OtJyInczvY= + + hash2 + + 9kh9rPgr3TxCrVze+3pYLlV9dJSOsn+uy2s4sS7LwME= + + + Headers/LPMInitRequestBuilder.h + + hash + + nTulL3kdPuf74JLpnmWrhZJwlMw= + + hash2 + + 66NLDD7+Kn4jeuaEovKFnu96wmMDem6+TW6Itrnw8vo= + + + Headers/LPMInterstitialAd.h + + hash + + Yh16ILJ5Yt2Fu+KLtPIvrEcPbgo= + + hash2 + + kn7BbSAoDN2ggDOiUALyMcm+QDVnMsEQbB4/3JD4jz0= + + + Headers/LPMInterstitialAdConfig.h + + hash + + ogd1b51ZsmELEky2zPZrlAfN7do= + + hash2 + + YZeB5YbIyXU/+E5IgOL3BkVxFXM1xysDCSyHWGCcBHs= + + + Headers/LPMInterstitialAdConfigBuilder.h + + hash + + oZwK6zVCY6QS7IZQET10lnDcD/4= + + hash2 + + jVtZp3t0uWdpRnXlG5hHiXbm2UtAs1xIDTNIg653Wvw= + + + Headers/LPMInterstitialAdDelegate.h + + hash + + V3Bj1CSxweu/TnLOet5273QOlX4= + + hash2 + + HBm0XTQkA0Pct7pF7nyCzCDGupf7O3cOUMWCUQxeuYg= + + + Headers/LPMReward.h + + hash + + F1gni/AMiRTjoVelMGv0Uc3r8ic= + + hash2 + + R1YkVdcCHHF8yXIx3M+moyxzCULiZggz9zNVvFrpkf4= + + + Headers/LPMRewardedAd.h + + hash + + GaTuWpkOgRnHhUeka0nKcfXFh/Y= + + hash2 + + ziRBX/v7y6LgLLkIbs3To94yAOelHmlZ67e6sZwP3j4= + + + Headers/LPMRewardedAdConfig.h + + hash + + l9Su9m9kFw89/oMus/HgL71sCyo= + + hash2 + + w5VPUUjWlwBQ2VmaPM7uQcTwfpshOLlE+SruwoXbPLw= + + + Headers/LPMRewardedAdConfigBuilder.h + + hash + + /a25csB37oUPlULbCJIn4YyGojA= + + hash2 + + FKRz3Qc021sES5Huq7u2EKqUCC8gn6zpsMWWZofn850= + + + Headers/LPMRewardedAdDelegate.h + + hash + + xaZ5cZ4Zo6C8j623oFZ2Lq4uy2k= + + hash2 + + /dyyCXfxaBpmaoMRt+tXcQNXtZozCm4dkFOdnLZovww= + + + Headers/LPMSegment.h + + hash + + NGkN9XPYX8CdjG9Y1+r4FVXMNVk= + + hash2 + + p7nCGw6lRtywAJNJCdxmig4jJHescNiBRa9xTZmuPDk= + + + Headers/LevelPlay.h + + hash + + QVlU7/m4ZjwZqfb/ibCj3KAEAPo= + + hash2 + + SbEipf7AHqlvP03uduIzuqPMugP6GrmKB73eCRvPIXQ= + + + Headers/LevelPlayBaseAdapter.h + + hash + + HnUdLW5v8JwE1qh1+0861oAchb0= + + hash2 + + 0kVevv79RddaWNgImsV87eGE0c2T/cItjM/pmIS8SRY= + + + Headers/LevelPlayBaseBannerAdapter.h + + hash + + TiyPzKv2LJaWA4kMo4hR0EpIZY4= + + hash2 + + vrNzQvXEvfy2MtTfwDExz1HcNzwQpuFkLs8HW1V5nmc= + + + Headers/LevelPlayBaseInterstitialAdapter.h + + hash + + 0llfzuFkOtJv3eH55IJ6CTGkhCI= + + hash2 + + jQfvNLtdIqM7bzb57/pOZL8da5/CrQ1yPQU8nITqdLA= + + + Headers/LevelPlayBaseNativeAdAdapter.h + + hash + + 9Hhlk04+FUTpDyiDRkLrrxMiOIQ= + + hash2 + + Y79hqaqK06yWl+xNtywL+5FV5UCI+JY27R692FL6Rxs= + + + Headers/LevelPlayBaseRewardedAdapter.h + + hash + + DyP5Ay/RG+4bdM+5SZo17YpUKtI= + + hash2 + + /ai6lnx7Dg/402elqBK9tRhY4jXyEBhFJS/lawAlpOI= + + + Headers/LevelPlayMediaView.h + + hash + + IRFkpkJkvHoxzr5ab0QgExRUtZg= + + hash2 + + W6cZOZvQ9fwaDYlRDTFBvezT5Q4/8VnmH28H0dfAEXA= + + + Headers/LevelPlayNativeAd.h + + hash + + uWq0pqTnh7W6HSmsmUvQS+QrUMY= + + hash2 + + r59/A3Wfaei/qo3K2AJDTesBT6zvpVqEwxRW+C031go= + + + Headers/LevelPlayNativeAdBuilder.h + + hash + + CWxXHPRmFqe96j26E6+oRnBuJlQ= + + hash2 + + zL3zWiVJJIM9gRnDq7wDBk1dwgwizX6apMiVzrFvHRc= + + + Headers/LevelPlayNativeAdDelegate.h + + hash + + 5bQGadNaEM7LZdOlCAM1KfPrXzs= + + hash2 + + BRP+xOH+nJndq9toHcz/S+UwYF/TquoNAROq140kcvY= + + + Headers/UIView+ISNativeView.h + + hash + + 5yYHQ6BbNYO8GcsGrsIFPz940JM= + + hash2 + + ileU3R4S0v2JbB4WQNt1JwRmfFRdu0efTmFJBpX3alQ= + + + Modules/module.modulemap + + hash + + kzGgmpCJFpUdi/nT2cuKAZIcEmo= + + hash2 + + nRi1YddSYStSxiPAcByQG6YOxwWEF5eJUj1rnMrrSKU= + + + PrivacyInfo.xcprivacy + + hash + + BLNjR6VVI/K82v3iQCE5o0YXgGI= + + hash2 + + ES/wHPURrhqoWqlouH6JyVI5Y7FKY1pgaWMpkbPGo0E= + + + + rules + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^version.plist$ + + + rules2 + + .*\.dSYM($|/) + + weight + 11 + + ^(.*/)?\.DS_Store$ + + omit + + weight + 2000 + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^Info\.plist$ + + omit + + weight + 20 + + ^PkgInfo$ + + omit + + weight + 20 + + ^embedded\.provisionprofile$ + + weight + 20 + + ^version\.plist$ + + weight + 20 + + + + diff --git a/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/_CodeSignature/CodeSignature b/Pods/IronSourceSDK/IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/_CodeSignature/CodeSignature new file mode 100644 index 0000000..e69de29 diff --git a/Pods/Manifest.lock b/Pods/Manifest.lock new file mode 100644 index 0000000..a6ecc31 --- /dev/null +++ b/Pods/Manifest.lock @@ -0,0 +1,171 @@ +PODS: + - FirebaseAnalytics (12.7.0): + - FirebaseAnalytics/Default (= 12.7.0) + - FirebaseCore (~> 12.7.0) + - FirebaseInstallations (~> 12.7.0) + - GoogleUtilities/AppDelegateSwizzler (~> 8.1) + - GoogleUtilities/MethodSwizzler (~> 8.1) + - GoogleUtilities/Network (~> 8.1) + - "GoogleUtilities/NSData+zlib (~> 8.1)" + - nanopb (~> 3.30910.0) + - FirebaseAnalytics/Default (12.7.0): + - FirebaseCore (~> 12.7.0) + - FirebaseInstallations (~> 12.7.0) + - GoogleAppMeasurement/Default (= 12.7.0) + - GoogleUtilities/AppDelegateSwizzler (~> 8.1) + - GoogleUtilities/MethodSwizzler (~> 8.1) + - GoogleUtilities/Network (~> 8.1) + - "GoogleUtilities/NSData+zlib (~> 8.1)" + - nanopb (~> 3.30910.0) + - FirebaseCore (12.7.0): + - FirebaseCoreInternal (~> 12.7.0) + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/Logger (~> 8.1) + - FirebaseCoreExtension (12.7.0): + - FirebaseCore (~> 12.7.0) + - FirebaseCoreInternal (12.7.0): + - "GoogleUtilities/NSData+zlib (~> 8.1)" + - FirebaseCrashlytics (12.7.0): + - FirebaseCore (~> 12.7.0) + - FirebaseInstallations (~> 12.7.0) + - FirebaseRemoteConfigInterop (~> 12.7.0) + - FirebaseSessions (~> 12.7.0) + - GoogleDataTransport (~> 10.1) + - GoogleUtilities/Environment (~> 8.1) + - nanopb (~> 3.30910.0) + - PromisesObjC (~> 2.4) + - FirebaseInstallations (12.7.0): + - FirebaseCore (~> 12.7.0) + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/UserDefaults (~> 8.1) + - PromisesObjC (~> 2.4) + - FirebaseRemoteConfigInterop (12.7.0) + - FirebaseSessions (12.7.0): + - FirebaseCore (~> 12.7.0) + - FirebaseCoreExtension (~> 12.7.0) + - FirebaseInstallations (~> 12.7.0) + - GoogleDataTransport (~> 10.1) + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/UserDefaults (~> 8.1) + - nanopb (~> 3.30910.0) + - PromisesSwift (~> 2.1) + - GoogleAdsOnDeviceConversion (3.2.0): + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/Logger (~> 8.1) + - GoogleUtilities/Network (~> 8.1) + - nanopb (~> 3.30910.0) + - GoogleAppMeasurement/Core (12.7.0): + - GoogleUtilities/AppDelegateSwizzler (~> 8.1) + - GoogleUtilities/MethodSwizzler (~> 8.1) + - GoogleUtilities/Network (~> 8.1) + - "GoogleUtilities/NSData+zlib (~> 8.1)" + - nanopb (~> 3.30910.0) + - GoogleAppMeasurement/Default (12.7.0): + - GoogleAdsOnDeviceConversion (~> 3.2.0) + - GoogleAppMeasurement/Core (= 12.7.0) + - GoogleAppMeasurement/IdentitySupport (= 12.7.0) + - GoogleUtilities/AppDelegateSwizzler (~> 8.1) + - GoogleUtilities/MethodSwizzler (~> 8.1) + - GoogleUtilities/Network (~> 8.1) + - "GoogleUtilities/NSData+zlib (~> 8.1)" + - nanopb (~> 3.30910.0) + - GoogleAppMeasurement/IdentitySupport (12.7.0): + - GoogleAppMeasurement/Core (= 12.7.0) + - GoogleUtilities/AppDelegateSwizzler (~> 8.1) + - GoogleUtilities/MethodSwizzler (~> 8.1) + - GoogleUtilities/Network (~> 8.1) + - "GoogleUtilities/NSData+zlib (~> 8.1)" + - nanopb (~> 3.30910.0) + - GoogleDataTransport (10.1.0): + - nanopb (~> 3.30910.0) + - PromisesObjC (~> 2.4) + - GoogleUtilities/AppDelegateSwizzler (8.1.0): + - GoogleUtilities/Environment + - GoogleUtilities/Logger + - GoogleUtilities/Network + - GoogleUtilities/Privacy + - GoogleUtilities/Environment (8.1.0): + - GoogleUtilities/Privacy + - GoogleUtilities/Logger (8.1.0): + - GoogleUtilities/Environment + - GoogleUtilities/Privacy + - GoogleUtilities/MethodSwizzler (8.1.0): + - GoogleUtilities/Logger + - GoogleUtilities/Privacy + - GoogleUtilities/Network (8.1.0): + - GoogleUtilities/Logger + - "GoogleUtilities/NSData+zlib" + - GoogleUtilities/Privacy + - GoogleUtilities/Reachability + - "GoogleUtilities/NSData+zlib (8.1.0)": + - GoogleUtilities/Privacy + - GoogleUtilities/Privacy (8.1.0) + - GoogleUtilities/Reachability (8.1.0): + - GoogleUtilities/Logger + - GoogleUtilities/Privacy + - GoogleUtilities/UserDefaults (8.1.0): + - GoogleUtilities/Logger + - GoogleUtilities/Privacy + - IronSourceAdQualitySDK (9.1.1) + - IronSourceSDK (9.2.0.0): + - IronSourceSDK/AdQuality (= 9.2.0.0) + - IronSourceSDK/Ads (= 9.2.0.0) + - IronSourceSDK/AdQuality (9.2.0.0): + - IronSourceAdQualitySDK (~> 9.1.1) + - IronSourceSDK/Ads (9.2.0.0) + - nanopb (3.30910.0): + - nanopb/decode (= 3.30910.0) + - nanopb/encode (= 3.30910.0) + - nanopb/decode (3.30910.0) + - nanopb/encode (3.30910.0) + - PromisesObjC (2.4.0) + - PromisesSwift (2.4.0): + - PromisesObjC (= 2.4.0) + +DEPENDENCIES: + - FirebaseAnalytics + - FirebaseCrashlytics + - IronSourceSDK (= 9.2.0.0) + +SPEC REPOS: + trunk: + - FirebaseAnalytics + - FirebaseCore + - FirebaseCoreExtension + - FirebaseCoreInternal + - FirebaseCrashlytics + - FirebaseInstallations + - FirebaseRemoteConfigInterop + - FirebaseSessions + - GoogleAdsOnDeviceConversion + - GoogleAppMeasurement + - GoogleDataTransport + - GoogleUtilities + - IronSourceAdQualitySDK + - IronSourceSDK + - nanopb + - PromisesObjC + - PromisesSwift + +SPEC CHECKSUMS: + FirebaseAnalytics: e423129866107aeacf6010a280b9c9829f9ea50d + FirebaseCore: c7b57863ce0859281a66d16ca36d665c45d332b5 + FirebaseCoreExtension: 731a5744970bcd73ad95ab2a2b8a1f46353e86dd + FirebaseCoreInternal: 571a2dd8c975410966199623351db3a3265c874d + FirebaseCrashlytics: 9ce9ce4bb179e31ab91a937d0a73d302a9752d1b + FirebaseInstallations: 6d05424a046b68ca146b4de4376f05b4e9262fc3 + FirebaseRemoteConfigInterop: 0bae7d21510b3a0a79af727961c4973aac585add + FirebaseSessions: bc59e7d0ba90f96f40325fd1defbdec86ba26f20 + GoogleAdsOnDeviceConversion: d68c69dd9581a0f5da02617b6f377e5be483970f + GoogleAppMeasurement: 8f59e08efecfa1bcd57f0a56fab07d079366268c + GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7 + GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1 + IronSourceAdQualitySDK: 56314ade811a5226f76dfd377bc09aca0d6610c0 + IronSourceSDK: 66e1483cd62fb63162a965651f6f41c6b91664db + nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 + PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 + PromisesSwift: 9d77319bbe72ebf6d872900551f7eeba9bce2851 + +PODFILE CHECKSUM: d5996328bf850c1edcffa2f11870ef2026910ae0 + +COCOAPODS: 1.16.2 diff --git a/Pods/Pods.xcodeproj/project.pbxproj b/Pods/Pods.xcodeproj/project.pbxproj new file mode 100644 index 0000000..ba7b69d --- /dev/null +++ b/Pods/Pods.xcodeproj/project.pbxproj @@ -0,0 +1,8101 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 77; + objects = { + +/* Begin PBXAggregateTarget section */ + 205EFBEF86DA6E7E3D5B9BABED8872EE /* IronSourceSDK */ = { + isa = PBXAggregateTarget; + buildConfigurationList = D1E345BE40FA3FB99D76F312FDB467F1 /* Build configuration list for PBXAggregateTarget "IronSourceSDK" */; + buildPhases = ( + BD432A771BC3AE991F66E87FAC379E10 /* [CP] Copy XCFrameworks */, + ); + dependencies = ( + 16F986DB78475A7F38B1CF5CE8BA79CF /* PBXTargetDependency */, + FFFEDE03FEE5C6C3C7959B41A66D7C5D /* PBXTargetDependency */, + ); + name = IronSourceSDK; + }; + 26309F9D4DF43E362A8AF6A93B41FF6D /* GoogleAdsOnDeviceConversion */ = { + isa = PBXAggregateTarget; + buildConfigurationList = A1E4CC3AD0358552ED2D6DAF38C35EB8 /* Build configuration list for PBXAggregateTarget "GoogleAdsOnDeviceConversion" */; + buildPhases = ( + 71C738B11F24D01E484FD73DE871B01F /* [CP] Copy XCFrameworks */, + ); + dependencies = ( + 20373381B9BABD75C18951C7B1273B84 /* PBXTargetDependency */, + 1D0E375272D6399E61FD638CAC2F76C9 /* PBXTargetDependency */, + ); + name = GoogleAdsOnDeviceConversion; + }; + A2E1CD763F5748382ECFDCFBD119D430 /* IronSourceAdQualitySDK */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 8A0DE6AFDB54CEC05AA32EC699C71AC8 /* Build configuration list for PBXAggregateTarget "IronSourceAdQualitySDK" */; + buildPhases = ( + 1CF14C206992BEF41024C706A498E049 /* [CP] Copy XCFrameworks */, + ); + dependencies = ( + EE636BA91E7627BBAE7B069AD84A6A04 /* PBXTargetDependency */, + ); + name = IronSourceAdQualitySDK; + }; + B53D977A951AFC38B21751B706C1DF83 /* GoogleAppMeasurement */ = { + isa = PBXAggregateTarget; + buildConfigurationList = F62BEE46382CC31E9FE0D344B6DF4CB9 /* Build configuration list for PBXAggregateTarget "GoogleAppMeasurement" */; + buildPhases = ( + F1EE8DCC166D71E692E94B5DB424941B /* [CP] Copy XCFrameworks */, + ); + dependencies = ( + F69BE287892D6155C48BBDE95E070AA9 /* PBXTargetDependency */, + 8E193CFD3718B0470445B637D1D0D56A /* PBXTargetDependency */, + C1EC47ACC6C680CE70C8EF672D860F7B /* PBXTargetDependency */, + ); + name = GoogleAppMeasurement; + }; + C49E7A4D59E5C8BE8DE9FB1EFB150185 /* FirebaseAnalytics */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 829ACD64FCFF77F7DA5817E8CFAEBF74 /* Build configuration list for PBXAggregateTarget "FirebaseAnalytics" */; + buildPhases = ( + 8C5B5926777AB8C2838BC915F74F1BC1 /* [CP] Copy XCFrameworks */, + ); + dependencies = ( + 6A41C7DFEBA8BBD1DE9ED8EB9BB26E7D /* PBXTargetDependency */, + A410C6903786A4EC8F8343931F8A828F /* PBXTargetDependency */, + 1999B5990B3201D581D02A4852D4C081 /* PBXTargetDependency */, + 58DB6FB40B9E57559F7A6BE96B9431E9 /* PBXTargetDependency */, + B096EC4C1C370353B7DFCDB791DEE330 /* PBXTargetDependency */, + ); + name = FirebaseAnalytics; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + 008C656B9D533D0A219CA1C869E390E9 /* FIRInstallationsHTTPError.m in Sources */ = {isa = PBXBuildFile; fileRef = F810FC24EB86BB9C64EDFB77902E05BE /* FIRInstallationsHTTPError.m */; }; + 01ED96999FAECA476A6B05A5D0AB41DE /* GDTCOREndpoints.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E44829C91EC31D7CC498CFCE1823D71 /* GDTCOREndpoints.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 024C5E62C86E488BC6ED5FE2E1B8FFE3 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B193AA1062E3BDA9FD9F681F8B33A4FB /* SystemConfiguration.framework */; }; + 043936EC88DD0E9E608E573809B08BCB /* FIRFirebaseUserAgent.h in Headers */ = {isa = PBXBuildFile; fileRef = 7E072EE42C6817D97E8D699113F28148 /* FIRFirebaseUserAgent.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 05593F3B46315141F9C47A71C7815531 /* FIRStackFrame.h in Headers */ = {isa = PBXBuildFile; fileRef = 87C918E4D0BA80C4D8BA0EA103659C98 /* FIRStackFrame.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 055FCE1CE4FC9321961C1CF67117D3C1 /* FIRCLSExecutionIdentifierModel.h in Headers */ = {isa = PBXBuildFile; fileRef = E20A5B9D37ADDE907C68B5A0DF641EB2 /* FIRCLSExecutionIdentifierModel.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 057F1F07F30477EB7A8F601C8344CA15 /* GDTCOREndpoints_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 7526970C05C8ACD66297C7E2B11A458A /* GDTCOREndpoints_Private.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 059109895BDFD724CE25A633AD1031B5 /* FIRCLSFABAsyncOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 02DF0F6D77AA82B6DE41974516D77AB4 /* FIRCLSFABAsyncOperation.m */; }; + 05916C1D212E2A89693D7ACE3A4B6E58 /* FIRAppInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = D1C898C4E9DC2D4D4D1E86B5DE0A7B98 /* FIRAppInternal.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 05DD921124345B271177CBCF4FE3A6D6 /* FBLPromise+Do.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C715062998D5852EEF24EE8E49BB831 /* FBLPromise+Do.m */; }; + 062510FB2DDC2CB0E480BD9FB6B01BDF /* GDTCORTransport_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 7DCA0E4A73EF2D142A698E1C4EDD7A42 /* GDTCORTransport_Private.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 062654AFE46612A5BE3342F5018EC88C /* FIRCLSManagerData.h in Headers */ = {isa = PBXBuildFile; fileRef = 714FC804868794FC65ACC809A4BD408D /* FIRCLSManagerData.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 06AA8B5FBD868A2D0FB8384053F41DC5 /* GULReachabilityChecker.m in Sources */ = {isa = PBXBuildFile; fileRef = A11AEC0523CB4EA37262B5C3C7E50DC0 /* GULReachabilityChecker.m */; }; + 07008DA89D59E1830C774E3E61FD65D1 /* GDTCORFlatFileStorage+Promises.h in Headers */ = {isa = PBXBuildFile; fileRef = F6BAE7CFD7109C70FEFDE60137A0FB67 /* GDTCORFlatFileStorage+Promises.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 071BBC1B5F61DD0B4D006F74897A40E3 /* FIRInstallationsItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 51C8BA4480EF61CF419628A318848CBD /* FIRInstallationsItem.m */; }; + 074BD0B4C006F842EA707DE29D89F0AB /* external_prequest_context.nanopb.c in Sources */ = {isa = PBXBuildFile; fileRef = C2C26D27486D91CB1D8B04DD239959FF /* external_prequest_context.nanopb.c */; }; + 0774A2D8C20DD7B2FDACEE3466180D6F /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B193AA1062E3BDA9FD9F681F8B33A4FB /* SystemConfiguration.framework */; }; + 07CC403A047AE25FC779B64A70424FC4 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = CFD8B638DEDD95E455817CF5ACAF651E /* PrivacyInfo.xcprivacy */; }; + 08432A4869515AC4F02C4764779F7179 /* GULSceneDelegateSwizzler.m in Sources */ = {isa = PBXBuildFile; fileRef = 189D64AA8AA2FF6B5EAD8A74A61A36E5 /* GULSceneDelegateSwizzler.m */; }; + 0932CE085A9F031247976BCDDB9EEE82 /* FIRInstallationsStatus.h in Headers */ = {isa = PBXBuildFile; fileRef = E2D633E005F7F2FBF43146CE97AB035F /* FIRInstallationsStatus.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 0A1F184E81E7FF80E53B8DD81291FA12 /* FIRCLSCompactUnwind_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 7626561CCC2B0572C89B82904ACF459C /* FIRCLSCompactUnwind_Private.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 0A41B3D607C3FEACEF10A4E218996748 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B193AA1062E3BDA9FD9F681F8B33A4FB /* SystemConfiguration.framework */; }; + 0B2925EE7EE0555A0DB9A76AEED60D03 /* FIRCLSMachException.h in Headers */ = {isa = PBXBuildFile; fileRef = F0CBF52E8E78DB598F0935964191E5BE /* FIRCLSMachException.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 0B5B75DEA77EBD9393A6E4BBC9191C23 /* Pods-TastePick-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = E84090DB23A890A20DDB9D6DAC5D52C9 /* Pods-TastePick-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0B608C58D9CAF466D1270BB7E4D69E5D /* HeartbeatsBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05A64ED55B701A52C9F43F904FEB2032 /* HeartbeatsBundle.swift */; }; + 0BAFD20DEEBE51D5687822958D43C54D /* FIRCLSBinaryImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C646683231AB6053322DD656B8F08FA /* FIRCLSBinaryImage.m */; }; + 0BCCCD9FA6EE58241B4CF6B1C42D0906 /* client_metrics.nanopb.h in Headers */ = {isa = PBXBuildFile; fileRef = AAC7AFE020697B25E4865BC68EDBF18B /* client_metrics.nanopb.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 0C471FE123727890F5038C0BC3076C22 /* FIRComponentContainer.h in Headers */ = {isa = PBXBuildFile; fileRef = 9FB7C89D8ED4FC0A2D862D0BA6990DCD /* FIRComponentContainer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0C8A265B9D2DE968E2AC2119C79E9B9D /* GDTCCTNanopbHelpers.m in Sources */ = {isa = PBXBuildFile; fileRef = 98CF4046D07545106FB11F650FA2C0A7 /* GDTCCTNanopbHelpers.m */; }; + 0CA37C905B2351EC9E0F789B31116CD3 /* FIRInstallationsBackoffController.m in Sources */ = {isa = PBXBuildFile; fileRef = 233D26E7E787BC05811554037BA231FF /* FIRInstallationsBackoffController.m */; }; + 0D1926623D79C695C4524B77CFF557D3 /* SessionInitiator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 961CCB207747E50C7E7A415268E61837 /* SessionInitiator.swift */; }; + 0D5DE7BACE63707FBFCB9ECA478ED243 /* GDTCCTCompressionHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = BE8A892C61B8F435614C2F1BFE36C324 /* GDTCCTCompressionHelper.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 0D6EBF8FC2F718A12F8760F5609397C4 /* FirebaseCrashlytics.h in Headers */ = {isa = PBXBuildFile; fileRef = 4D8B8BD8FA97850F82DEACDA6D2564F7 /* FirebaseCrashlytics.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0DC0C6161D0507A2E898365F45320CED /* GDTCORTransport.m in Sources */ = {isa = PBXBuildFile; fileRef = BE2FE7C542F1105383E7C2CEC90E4D71 /* GDTCORTransport.m */; }; + 0E036C2E64B45B14232CC0FBD4F72798 /* GULNetworkInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = B7D2463CFCEAF0027801B3431CDA76F0 /* GULNetworkInternal.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 0E3A3677D667E4A6EF03BB90A42E900D /* FIRInstallationsErrorUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 37E635B883B0849C4E370D3ED1FD8C74 /* FIRInstallationsErrorUtil.m */; }; + 0E5531CA13C51FB47EA129C89493942B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 411C572D658946450319E3438E61FBCC /* Foundation.framework */; }; + 0EB3A13390A65E25588109ED1E29EC31 /* FBLPromise+Always.h in Headers */ = {isa = PBXBuildFile; fileRef = EB12CA19814BFB60018835B0B656CA3D /* FBLPromise+Always.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0F7AF811B1F25B7C36109BB6B317D91E /* GDTCOREndpoints.m in Sources */ = {isa = PBXBuildFile; fileRef = 25E01BB2192AE035461221BD497CC08E /* GDTCOREndpoints.m */; }; + 0FBC1E3378FE0502E0305891F25D3A5C /* RemoteConfigInterop.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2073DD1BEC1C356821B09FFF3D0EEFC0 /* RemoteConfigInterop.swift */; }; + 100970140F74221C358AD7555DDE6FC2 /* FBLPromise+Await.m in Sources */ = {isa = PBXBuildFile; fileRef = C17760A388DD7E59F4AF3ECFC9DE7A06 /* FBLPromise+Await.m */; }; + 1049B7F945735DA030ED6B6A89AC05AE /* GDTCORStorageMetadata.m in Sources */ = {isa = PBXBuildFile; fileRef = 289B7EC46EE1B61BBF0071115B2EAFFE /* GDTCORStorageMetadata.m */; }; + 10784DF2FF3D8C9FB8C1F46B4A62402F /* pb_common.h in Headers */ = {isa = PBXBuildFile; fileRef = A168D4D9F13E4405E8B88DF37E9798B4 /* pb_common.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 107F78620AB880CA8E8A05E77D2809D1 /* FBLPromiseError.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAF4541C5074ACD8C2905245AC70DF5 /* FBLPromiseError.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 10BABCE8D44B8A5C7C64DC420FCA25C7 /* FIRCLSHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = F16384F899915F2AB97FDC2DDC712581 /* FIRCLSHandler.m */; }; + 112883FB5F6DFF8CA1D2604D2F3D2C93 /* GULReachabilityChecker+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 0B2F16B8F2FC5B1ADD4DA7E84C395EBF /* GULReachabilityChecker+Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 117D366C2B33540C50EC57BA3EB826DA /* GDTCORMetricsMetadata.m in Sources */ = {isa = PBXBuildFile; fileRef = F0FA261A79F1E495EBA3976B173C2751 /* GDTCORMetricsMetadata.m */; }; + 11A3D6FF1465D4D84C3C2B568EB49FC0 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 411C572D658946450319E3438E61FBCC /* Foundation.framework */; }; + 120463CCF964EAEC4293AF335D4EC20D /* FIRCLSUserLogging.h in Headers */ = {isa = PBXBuildFile; fileRef = 946744B8CA3FC88BA9ECC2FA7DE8A2F5 /* FIRCLSUserLogging.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 1248703EED82292C27B270778CD0E1A0 /* GDTCORStorageSizeBytes.h in Headers */ = {isa = PBXBuildFile; fileRef = 05CE75891727610C65FC34203126DAFD /* GDTCORStorageSizeBytes.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 126C9897DB357D17669F4457EAF5379B /* Storage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E4D1EE87FA72D11176CC6321F325160 /* Storage.swift */; }; + 128FB622556D297AD5020B4CDB2467C1 /* FIRCLSRecordApplication.m in Sources */ = {isa = PBXBuildFile; fileRef = 060CC8BFD82A68361F597F34930457CD /* FIRCLSRecordApplication.m */; }; + 12D33A476302F2F61AD70AD60CA2FBDA /* FIRConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = 5723FF239BCEB6D88B9874F1440EEADA /* FIRConfiguration.m */; }; + 13D1FA43A710E67F644E2C7B7BEE56E8 /* FBLPromise+Async.h in Headers */ = {isa = PBXBuildFile; fileRef = 889BBA7CC7792F5213C9B5FEFD3AA322 /* FBLPromise+Async.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 13ED8C4B93C1CE275A2D729963588057 /* GULSwizzler.h in Headers */ = {isa = PBXBuildFile; fileRef = 7D36278F28B9386784BCB7DD696476C3 /* GULSwizzler.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 14782E5746464AA90E7821AE50E46EFF /* FIRCLSFABNetworkClient.m in Sources */ = {isa = PBXBuildFile; fileRef = DBC0A7B3EE3789BFBD83F4D00733A2C6 /* FIRCLSFABNetworkClient.m */; }; + 14DFEC76B3F76D8F2D6A08236F7F074F /* GULOriginalIMPConvenienceMacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 7F35B015EB4408E1E2CE0541A707AC9B /* GULOriginalIMPConvenienceMacros.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 14EBB23396569D24A213124C7C4B10EE /* PromisesObjC-FBLPromises_Privacy in Resources */ = {isa = PBXBuildFile; fileRef = 3F238BB22C5201CE689CAF2F766AED95 /* PromisesObjC-FBLPromises_Privacy */; }; + 1520E5AF81663189CAAC569B2D32DBA4 /* PromisesObjC-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = B5F5B453B8863EC9F159C5273DBA728D /* PromisesObjC-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 152E1979B64224C036A67A135DDC3BB3 /* FIRCLSSignal.h in Headers */ = {isa = PBXBuildFile; fileRef = C57FCD656B455BFA73C354814132DD67 /* FIRCLSSignal.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 1562BC1ED03BBFBFF8513F1DC4B72E43 /* HeartbeatsPayload.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B762B1EE7A4FF6B5CDC16D2B9D6757F /* HeartbeatsPayload.swift */; }; + 156AD13B01E18134815403FBA9ECB09C /* FIRCLSDataCollectionArbiter.m in Sources */ = {isa = PBXBuildFile; fileRef = EC4CF58626C94A37CEEE596200CF4A2E /* FIRCLSDataCollectionArbiter.m */; }; + 156CBEB855F0F55630B7A6F37F09A3D9 /* FirebaseCoreInternal-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = CFDBC5FF7914DC22737656251A2736F5 /* FirebaseCoreInternal-dummy.m */; }; + 160A0814FFA5AABEA8E757089A9C9823 /* FBLPromise+Wrap.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DE5F407E457CDBC3EC989D5EC0267CB /* FBLPromise+Wrap.m */; }; + 160C160EAEBAF3E77FD13A53AA459836 /* FIRCLSUnwind.h in Headers */ = {isa = PBXBuildFile; fileRef = 64D6422854E4C1D922D158AA82F9AF1B /* FIRCLSUnwind.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 1657E1F8898B4C8D705CB34D8B8BD059 /* Promise+All.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9567717ECA736EF17C0C480A4D10498F /* Promise+All.swift */; }; + 1797F6ACD264D50BE103569E79319EF6 /* FIRCLSLaunchMarkerModel.h in Headers */ = {isa = PBXBuildFile; fileRef = 5871D5CE9439B478C694221E60B2EDFB /* FIRCLSLaunchMarkerModel.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 17E72E17601B2DEEE9C19C1225DD7263 /* FIRCLSOnDemandModel.h in Headers */ = {isa = PBXBuildFile; fileRef = 46597EE1583194FE324E15F384F67BAD /* FIRCLSOnDemandModel.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 17FAA9E125833B53477AABA778339AFA /* GDTCCTURLSessionDataResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = E6C42248AC8B2490BCB8AEA3363C72F2 /* GDTCCTURLSessionDataResponse.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 182DCB1148B1E6A750415D05F21D5EC9 /* FIRLoggerLevel.h in Headers */ = {isa = PBXBuildFile; fileRef = FB607976AC966D4A13E86CF5E5DC2E24 /* FIRLoggerLevel.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1AC3A3FF4E9EDFB124443865D6F128B5 /* GULNetworkConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = 5CF8157DAFAAF8F34E35FE42C7A4F50C /* GULNetworkConstants.m */; }; + 1BA474695EFC108B62F2DD5B7B75BA40 /* FIRCLSRecordHost.h in Headers */ = {isa = PBXBuildFile; fileRef = C9804D05C35FF1DD291AC9C0894A5B35 /* FIRCLSRecordHost.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 1BABD89B9DE243F7853BC997A8691248 /* GDTCCTUploader.m in Sources */ = {isa = PBXBuildFile; fileRef = 3AFD59D27B0CB0B9AE20097A85658997 /* GDTCCTUploader.m */; }; + 1D0BD4847CBE978A9D5524DD1894784A /* FBLPromise+Retry.h in Headers */ = {isa = PBXBuildFile; fileRef = A15AF5BD51D7B01252F3A66B9E2FB319 /* FBLPromise+Retry.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1D1D6E58BACAC45FE741B87CBB27FFF5 /* FIRCLSNetworkResponseHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = CECA6783FA589EAB190F02D2DE8ECF5B /* FIRCLSNetworkResponseHandler.m */; }; + 1D666D284C590ECD65FA2E774BDD8CC3 /* FIRInstallationsHTTPError.h in Headers */ = {isa = PBXBuildFile; fileRef = CC0821AB11E9F2A17681AEF21C3E08A3 /* FIRInstallationsHTTPError.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 1DD6A7A4E2C5009F8E23204EC23A898D /* client_metrics.nanopb.c in Sources */ = {isa = PBXBuildFile; fileRef = E9499C8702EE3C4BA0EE46CBFC0D843E /* client_metrics.nanopb.c */; }; + 1DE3608D257DE0F803B41CD19D17F6D4 /* GDTCORProductData.h in Headers */ = {isa = PBXBuildFile; fileRef = D52720EBEE8D591811D098B131AED09A /* GDTCORProductData.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1E1CC531B7ED09DB93B66FAC450E675A /* Promise+Reduce.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F313246CE8BAAC5D514B7BC8CD37BAB /* Promise+Reduce.swift */; }; + 1E7C7DF3BEFAD49CE5CE34E3B39525D7 /* GULAppDelegateSwizzler.m in Sources */ = {isa = PBXBuildFile; fileRef = 71676436D07AD420A8D4EEB7170D0276 /* GULAppDelegateSwizzler.m */; }; + 1EC5973F4EB31D2EA33170F97B2FBF12 /* FIRTimestamp.h in Headers */ = {isa = PBXBuildFile; fileRef = E4ED531DD8427B6BEF3F72C391ED7991 /* FIRTimestamp.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1F25E108A60C7ECC0A1B9F7F16CC8FCE /* FIRCLSAllocate.h in Headers */ = {isa = PBXBuildFile; fileRef = 8D79C303AB6E2236D9B3F93915775007 /* FIRCLSAllocate.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 1F75F912151C62FBBAB8821F80D08428 /* FIRInstallationsStoredAuthToken.h in Headers */ = {isa = PBXBuildFile; fileRef = 723C7262FB570D774DAC5081A2209635 /* FIRInstallationsStoredAuthToken.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 1FD3344EA93D4E6B64820688B02B92C4 /* FIRComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 54D276171F73331F8A7575A8C2F8A24D /* FIRComponent.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2002913D5B08708080BDB305AFED98B9 /* FIRAnalyticsConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = 783F2376C80B3E144C8808271A304EA7 /* FIRAnalyticsConfiguration.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 202D701C92B114E60D25D5F653040E3C /* Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CFB31D2B6469BAFCF0D0EE83B6D6A74 /* Promise.swift */; }; + 20D76889FE59073145CE2C1793CFBE70 /* FirebaseCrashlytics-FirebaseCrashlytics_Privacy in Resources */ = {isa = PBXBuildFile; fileRef = 859AE0302B28BD8AE67A780BFCAEE082 /* FirebaseCrashlytics-FirebaseCrashlytics_Privacy */; }; + 214523E405E6318F36B42A46D8D55088 /* FIRCLSSymbolicationOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 43C1871CCE14AF1BC38FEB833AECF454 /* FIRCLSSymbolicationOperation.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 2156A3F6A0A6341B085683754093D724 /* GoogleUtilities-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 792271CCB62FDB0E606BB91279FC1F41 /* GoogleUtilities-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 222EA3C5BDEBB9C5701777D84ABDC5A2 /* Promise+Async.swift in Sources */ = {isa = PBXBuildFile; fileRef = D817BAB636451413E52543981E224726 /* Promise+Async.swift */; }; + 22361A6E93C21B375FD8F884952296BA /* GDTCORAssert.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BA86F1748E41114305A22D7B6D5A953 /* GDTCORAssert.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 2243CBBAE5FEE418621A45ACFA7670E0 /* GDTCORTransformer_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 3E5791351CAC66246499292E224E1906 /* GDTCORTransformer_Private.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 2414A0FF76268D732929851E52A2C573 /* FIRCLSUnwind_x86.h in Headers */ = {isa = PBXBuildFile; fileRef = AD703333F9B0745C2D257492FD12722A /* FIRCLSUnwind_x86.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 2422B797AC7DC3054BB10671C2E896CB /* FIRHeartbeatLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = D08502D5153E2D6ED0657435C2CDB103 /* FIRHeartbeatLogger.m */; }; + 252F285922800841EAF0FA05B8B79372 /* UnfairLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = D905CBD56E4B6F871771930498CBAEE6 /* UnfairLock.swift */; }; + 2582096CCEDC9DF084852E349AE03C25 /* FirebaseInstallations-FirebaseInstallations_Privacy in Resources */ = {isa = PBXBuildFile; fileRef = 47C581450CDB4A6111CB97EEE0711A8C /* FirebaseInstallations-FirebaseInstallations_Privacy */; }; + 25D5978720F4078ABEB8C7E10369F307 /* CrashlyticsRemoteConfigManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 319D2DB0F299ADF8C69525C6E1AA4521 /* CrashlyticsRemoteConfigManager.swift */; }; + 26027D7C3E9C906D89BBE8782910852F /* FIRInstallationsLogger.h in Headers */ = {isa = PBXBuildFile; fileRef = B8C67CC462B5F2819801881EDE84376F /* FIRInstallationsLogger.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 261385B144F85ED328EDB45E3C31F257 /* GDTCORFlatFileStorage.h in Headers */ = {isa = PBXBuildFile; fileRef = 7B6C46CA9CE820944624F07B22DB7583 /* GDTCORFlatFileStorage.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 269DB94EDA31583E5B77E25CF3987BFF /* FirebaseCoreExtension-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 78699DA54089137B6922B98CD3909C9D /* FirebaseCoreExtension-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 27E999A077388E2CF8F03789C5719C0B /* FIRCLSRecordIdentity.h in Headers */ = {isa = PBXBuildFile; fileRef = 58F9C2791E5A67647907A7133F675B29 /* FIRCLSRecordIdentity.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 288C75D6217D270AC08072113D94C5B2 /* FIRInstallationsIDController.h in Headers */ = {isa = PBXBuildFile; fileRef = 9058232C8B527D93A7FBAD5A7C2C83B4 /* FIRInstallationsIDController.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 28B05F735A29B22073D1344FD7037455 /* FIRCLSUtility.h in Headers */ = {isa = PBXBuildFile; fileRef = BAB000C6FD1E36F2F5C4B7741FC84C71 /* FIRCLSUtility.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 28D715152671D221E44DA4BDF0902980 /* FIRCLSMetricKitManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 2F347F62F3CE83D50D94207B6ECCCECA /* FIRCLSMetricKitManager.m */; }; + 29AF613F4ACECFB53B273C4EE8AEDF2D /* pb_decode.c in Sources */ = {isa = PBXBuildFile; fileRef = 49B9EA5BF9CBC4F459DC64049E1C5BC7 /* pb_decode.c */; settings = {COMPILER_FLAGS = "-fno-objc-arc -fno-objc-arc"; }; }; + 2AFD13ECCFF88FC50783E38BF7D24A14 /* FIRCLSdSYM.h in Headers */ = {isa = PBXBuildFile; fileRef = CE0BF03D61A3396FE4A7AC5CD82061FC /* FIRCLSdSYM.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 2B085124D491991AFB531924C05029F8 /* FIRInstallationsLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 971D6CC0E391046E4819851E6BAACC90 /* FIRInstallationsLogger.m */; }; + 2B5268395145D1DAB7ED2BDBA634326A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 411C572D658946450319E3438E61FBCC /* Foundation.framework */; }; + 2B5D794282006D917AAAB3C34039374B /* FIRCLSApplicationIdentifierModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 1BE1CBF8E9B5709393138ABEDF831B50 /* FIRCLSApplicationIdentifierModel.m */; }; + 2C1F76CFDD3DAFB9BFEBF30F1BC0A8A5 /* FIRCLSDwarfExpressionMachine.h in Headers */ = {isa = PBXBuildFile; fileRef = A10588C4300AC9C3D11455BE9D879450 /* FIRCLSDwarfExpressionMachine.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 2C26082FF7042AE4ED3CB01AB4F98621 /* FIRFirebaseUserAgent.m in Sources */ = {isa = PBXBuildFile; fileRef = BBBA2645EC17F90B7F28C59B969882A8 /* FIRFirebaseUserAgent.m */; }; + 2D16F164C0FC5C365223B119B859FC6D /* Promise+Catch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 022E2DE980AE2DD8B673FEF029994237 /* Promise+Catch.swift */; }; + 2D66BCA16FF51C2632D66048492B7E0A /* FIRStackFrame_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = D3EDA4CA6B3DF59B7470658EAD4A0726 /* FIRStackFrame_Private.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 2E62C7A519F3CBDCA77D9E36E0DA7CDC /* StringToHexConverter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F26F07A4A325DDC3BE1F76D2E2D21D0 /* StringToHexConverter.swift */; }; + 2E6B780535E1FBBCEA655AF6E2981F2C /* FBLPromise+Recover.h in Headers */ = {isa = PBXBuildFile; fileRef = E797EC67D6E0ACAC462ABD3CBCD0A1E6 /* FBLPromise+Recover.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2E6C7B2BACD02D0F7E2DC60C4E6F3B7F /* FBLPromise+Race.h in Headers */ = {isa = PBXBuildFile; fileRef = D2853472D88033B857940859F2869BAC /* FBLPromise+Race.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2E7CF40C448F9DDC4A7B330F4D736408 /* FIRConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = F8405023D5E7043F7EC04ED1DA688369 /* FIRConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2E7E7B7808EF5577BCD81CC459EE0487 /* FBLPromise+Reduce.h in Headers */ = {isa = PBXBuildFile; fileRef = 32489CC317F1FBF805DA321355833707 /* FBLPromise+Reduce.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2F379D418E5EE3E62BD79E0014756652 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 4E371453D1ABF2E876625E44EEDE9316 /* PrivacyInfo.xcprivacy */; }; + 2F4E7D32064886D3C5916D026BA5B74D /* FIRCLSUnwind_x86.c in Sources */ = {isa = PBXBuildFile; fileRef = 1F42A07890ACB9ABA006BAC6D7E0084D /* FIRCLSUnwind_x86.c */; }; + 301073943D4E1E25BFAB96560E974D0B /* FBLPromise+Always.m in Sources */ = {isa = PBXBuildFile; fileRef = 69BBE354CEB2BB741A3AD48391272DF5 /* FBLPromise+Always.m */; }; + 3021DE756F9928B3CF80401D95359872 /* GoogleUtilities-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = CB0183FEA633E9C900AB5ADA75F93D28 /* GoogleUtilities-dummy.m */; }; + 313B5C334AAD8CE67A03FB1D84EC4A7B /* FIRComponent.m in Sources */ = {isa = PBXBuildFile; fileRef = CBC7ABF27B4FE2B428B41107C4B1A383 /* FIRComponent.m */; }; + 3141BC7FC9D854D42F2A04DDDFAC8BDF /* GULNSData+zlib.h in Headers */ = {isa = PBXBuildFile; fileRef = 9A3760A90C91C7825D4ED94A27D07A53 /* GULNSData+zlib.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3166D6E317BAC49BB7FD87F9939BAB74 /* FIRCLSOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = E02A98982D5BB8B24B386D510226E73A /* FIRCLSOperation.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 31843A688DD8FDC2A68BEE81507C7612 /* FIRCLSByteUtility.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B1DA01E1FE7F68932E0BEE63FB99E88 /* FIRCLSByteUtility.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 3210D7FECB1DE2632A2DE15CBAA1DED5 /* FIRSESNanoPBHelpers.m in Sources */ = {isa = PBXBuildFile; fileRef = 5A05038D9FDA32819B7F732A223E07EF /* FIRSESNanoPBHelpers.m */; }; + 32D486C0379B79E8495F439CA3279A05 /* compliance.nanopb.c in Sources */ = {isa = PBXBuildFile; fileRef = 93528F9C66D1C44F701EE44CEF2B12A2 /* compliance.nanopb.c */; }; + 331BDE0E0E4A63C06A33A8090507AAD1 /* FIRCrashlyticsReport.m in Sources */ = {isa = PBXBuildFile; fileRef = 9319249E7AE5E567BAF1865989044E9F /* FIRCrashlyticsReport.m */; }; + 33E32F99DBB7D19907CAA192C566AE34 /* GoogleDataTransport+GoogleDataTransportProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = B581EE4C1FC74016885897568F1D8E87 /* GoogleDataTransport+GoogleDataTransportProtocol.swift */; }; + 34043F3DEB9E6AD7A50684DAA9A004C6 /* FIRCLSReportUploader_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 843A7D4ED9CE137645ABB91C4875BEFB /* FIRCLSReportUploader_Private.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 342FFA8F186EAC0D6C9D823C06BF8A5E /* FIRCLSExistingReportManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 617B0F345BFFAF23969A525A39D142F4 /* FIRCLSExistingReportManager.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 34533D0D914DF6EAE5224FB5C4AC1754 /* FIRCrashlytics.h in Headers */ = {isa = PBXBuildFile; fileRef = F5E12A948945215BBC2C36B65AFE1D0D /* FIRCrashlytics.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 34771C101C9A71BD0DF3ABC746689B67 /* FIRCLSLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = E96821E6404A23F47A8C3D9D9ACE11A6 /* FIRCLSLogger.m */; }; + 3486EB3CCE273B39F6133813B8017F04 /* GULSwizzler.m in Sources */ = {isa = PBXBuildFile; fileRef = E5E207080C142E38C423629AF322C22A /* GULSwizzler.m */; }; + 34E67347A7A953E9F49DE78BE92BE22A /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 21D9E6AABF6D4CF5BC663A230EF53A42 /* UIKit.framework */; }; + 35EA3E1B10279345F5D3EDAE00304C5F /* FIRCLSFile.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E489BA48F1A72A775C7E2A06FE04C54 /* FIRCLSFile.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 360A6CE0F33B5A4AAECB1C6C0CF4CD9A /* FIRCLSThreadArrayOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 5265C01DC45E528FBA0FFE4DFFE90730 /* FIRCLSThreadArrayOperation.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 372A144E6EB2B7EDFF0E83F4C1018AF4 /* FIRCLSRecordHost.m in Sources */ = {isa = PBXBuildFile; fileRef = 7BEB9DF17EBF5909321944E7CC6498C9 /* FIRCLSRecordHost.m */; }; + 3730D1693882A6026E06B0BA02FFA12A /* GULReachabilityChecker.h in Headers */ = {isa = PBXBuildFile; fileRef = 99067CFED719586F74DAD834E958E08B /* GULReachabilityChecker.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 378A4CBC32EB5FFEEC702E0AB41C0CE0 /* GDTCORPlatform.h in Headers */ = {isa = PBXBuildFile; fileRef = F233CC4228F9B498FC5158D560DF7C4C /* GDTCORPlatform.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 37B2EE8F07B91BEE5313CAB3B05B3BC6 /* GDTCOREventTransformer.h in Headers */ = {isa = PBXBuildFile; fileRef = A0C4B81B52F3550FB26F2301A4D3830F /* GDTCOREventTransformer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 37D159A64E67F5944AD7B8C9325B4A1A /* FirebaseCrashlytics-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = D12A23C9479F3872EC684FFEB7A8A9E1 /* FirebaseCrashlytics-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3896E4F06151C2DD4A83F951D9C029A2 /* FIRCLSFile.m in Sources */ = {isa = PBXBuildFile; fileRef = B4A617B11AB65681B00B3D330658907C /* FIRCLSFile.m */; }; + 393EEBCF227242DD2340C48816C8E8DE /* GDTCCTUploadOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 3EF44F3C3F4C03084F5647187712A799 /* GDTCCTUploadOperation.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 395FDBC9D0588B4F47CE8B60F2B571D1 /* FIRCrashlyticsReport.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E9152196876F701FA6A08C1E20930CE /* FIRCrashlyticsReport.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 39E0B400944C81F20DD871C526313963 /* FIRVersion.m in Sources */ = {isa = PBXBuildFile; fileRef = D8FEC6CA0C9F009A9AF67A8F28C6A04E /* FIRVersion.m */; }; + 3A1AEF20E3CCAD12A16647DEE9C9676B /* FirebaseCoreInternal-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 0CCCBC935F6C183B53EC9384AFB79535 /* FirebaseCoreInternal-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3A8D1F6B60A6E2A684C877DB6BE4FEF4 /* FIRCLSReportUploader.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D131BE371CBFE130D89867B8E064F1B /* FIRCLSReportUploader.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 3AC699C480E1AA6DD6A50B924B513985 /* GDTCORRegistrar.m in Sources */ = {isa = PBXBuildFile; fileRef = 213D31970FC3C34E21FB0E4EBFAC8239 /* GDTCORRegistrar.m */; }; + 3B6A08C5F1FBCDA5C16A87B954AF8116 /* FIRApp.m in Sources */ = {isa = PBXBuildFile; fileRef = A5BDC59CE92B5971C70A6EB248252D5A /* FIRApp.m */; }; + 3BA244DA19C9677AFBEE8E8DADD58CA5 /* FIRCLSDataCollectionToken.h in Headers */ = {isa = PBXBuildFile; fileRef = FF7D9C22D9575CAD5D16549620CF1F54 /* FIRCLSDataCollectionToken.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 3BE68DF47BBC7A0D4494B6D94BEF2F8D /* FIRCLSRecordIdentity.m in Sources */ = {isa = PBXBuildFile; fileRef = DF685DFA77326D8EAAAF2598883F56F8 /* FIRCLSRecordIdentity.m */; }; + 3C0C47835887898E0DDF2907166D3F89 /* GULNSData+zlib.m in Sources */ = {isa = PBXBuildFile; fileRef = 73F1BDC5C04B01D703D1ED3ABBBB52BA /* GULNSData+zlib.m */; }; + 3C64170837FDDD55C0089BEDBDFF07E9 /* FBLPromise+Validate.h in Headers */ = {isa = PBXBuildFile; fileRef = BA65D1AF5D006E30A4704C88E3220AE6 /* FBLPromise+Validate.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3C8122247F01D1D8FA6061CD54D48948 /* GULKeychainUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 11229AFB0FDD9883E979E40CAA70AF48 /* GULKeychainUtils.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3CB394A48027DA1961734970980AEBFA /* GULMutableDictionary.m in Sources */ = {isa = PBXBuildFile; fileRef = 87547C181401BFF63982F4F8DDB601A6 /* GULMutableDictionary.m */; }; + 3D1EEF4B54CC0DFF7CA6051D25B08AE6 /* FirebaseCoreInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 9F63BC66475319695185322AF43D4748 /* FirebaseCoreInternal.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3D789E37D949CAFF82B9285B436B396B /* FBLPromise+Delay.m in Sources */ = {isa = PBXBuildFile; fileRef = 168DAEDCFFFE16B056481C9974EA1EF1 /* FBLPromise+Delay.m */; }; + 3DADA2CFAC2C6B2CF351166A46A839C8 /* FBLPromisePrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = D1C485E07C4725266CBD932430A7F6FF /* FBLPromisePrivate.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 3E80BF7E87349B39909E4667D23481E3 /* FIRCLSContextInitData.h in Headers */ = {isa = PBXBuildFile; fileRef = F617922645413BFF8368B03C2EA0C543 /* FIRCLSContextInitData.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 3F1C71FB8A3408483D48047D6B59C8BF /* FirebaseCoreExtension-FirebaseCoreExtension_Privacy in Resources */ = {isa = PBXBuildFile; fileRef = ECAC028550A03412C51913B85686D98B /* FirebaseCoreExtension-FirebaseCoreExtension_Privacy */; }; + 40263C8C76CBE7124CF00DA29C309A59 /* NetworkInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9809547A08DFE1B868E753F01D28026 /* NetworkInfo.swift */; }; + 40D8DCCD636EE210777C5C3F57ECC80A /* FIRLibrary.h in Headers */ = {isa = PBXBuildFile; fileRef = 185E6F25949BB7762B48C7BB5ECD6418 /* FIRLibrary.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4106232EAD19C18BD2FEE0A8A68E2322 /* FIRCLSReportManager.h in Headers */ = {isa = PBXBuildFile; fileRef = B8FDE4F9BCEA63788B22E25481BE406E /* FIRCLSReportManager.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 411F843F7BA12A1394626834E0C1B941 /* FIRLogger.h in Headers */ = {isa = PBXBuildFile; fileRef = BAFB6F04EE2610139F9720EE4548FF44 /* FIRLogger.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 41603336ACB938B20BE77A3348245FDF /* FIRCLSUserDefaults.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B1FA6B3964F94D088403931F2AB55BD /* FIRCLSUserDefaults.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 41C08FE0F958CE6BB37141FF60E4269B /* SessionsSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27987ADDED8E9F81E93FAC3C85BF751D /* SessionsSettings.swift */; }; + 41D8BC323C08A701FBF964C7D359B787 /* FIRCLSBinaryImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 0D063E804BB8B39A3CEFCD3A2ECE5567 /* FIRCLSBinaryImage.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 420D13046C8191C86E960D35B85D483A /* PromiseError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89A7CB6A8C6BF03238999CD916483805 /* PromiseError.swift */; }; + 4247A00A2B8F0684E225CC36047F7DEE /* FIRHeartbeatLogger.h in Headers */ = {isa = PBXBuildFile; fileRef = 3426CA7E57D379E97C6EEC3B79A6FC1C /* FIRHeartbeatLogger.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4267AE966A8705A83DC409E1EC3E4E36 /* GDTCORClock.h in Headers */ = {isa = PBXBuildFile; fileRef = DA48B145114B81B074811930837FFB74 /* GDTCORClock.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 429816BF1F373D7808F4556979C3B3F9 /* PromisesObjC-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 70CE9B00B0C5DDF3A0264BD2D5EAAC9B /* PromisesObjC-dummy.m */; }; + 42BAB29ABAA0D0D37B6A8FB10E54A5AC /* FirebaseSessions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39647797621B506227286A3E40C9359F /* FirebaseSessions.swift */; }; + 432A8633160A66ECF85E8A7553CAA795 /* FIRCLSCodeMapping.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D3A17EE970C5C44B970AE4B5ECA4A29 /* FIRCLSCodeMapping.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 43AF89A9D73FF24A3091C2E5447643AC /* FIRCLSAsyncOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 4AB9BA7C4F288A9888D0AF459B73E388 /* FIRCLSAsyncOperation.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 45B33C5D2B040FB5B245F1EF2353DFF2 /* FIRCrashlyticsReport_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 62F3F90BEEA6A0BEA026D0F582C4BD64 /* FIRCrashlyticsReport_Private.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 45CB6307F21E7E33AD61891D6079F682 /* FirebaseInstallationsInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 016AA5BB178E30DCB042FE1CDAC73C69 /* FirebaseInstallationsInternal.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 45CDF7093DEBF0C1351FA9EB28930733 /* nanopb-nanopb_Privacy in Resources */ = {isa = PBXBuildFile; fileRef = 3227F3FC45681D7CEE5D1355A532398A /* nanopb-nanopb_Privacy */; }; + 46E5CD3AC1BB5EDB3175667EF12FED96 /* GULNetwork.m in Sources */ = {isa = PBXBuildFile; fileRef = 404E582F8FD063231A685E88402BD0E0 /* GULNetwork.m */; }; + 46F622CD7DC408AF48BE7ACEFA10DA0A /* FIRCLSUserDefaults_private.h in Headers */ = {isa = PBXBuildFile; fileRef = 8A667B8A1F9D03FB9C3E9A3A37DC1A8D /* FIRCLSUserDefaults_private.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 471BAD961F19AB1648FD51005DA77CC7 /* pb_decode.h in Headers */ = {isa = PBXBuildFile; fileRef = 055699715A5DA3DFD639B70780F4ACA5 /* pb_decode.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 475C802D1D9918C579E38211E3078886 /* FirebaseCoreInternal-FirebaseCoreInternal_Privacy in Resources */ = {isa = PBXBuildFile; fileRef = 4DB03FD262B678178A44272143846563 /* FirebaseCoreInternal-FirebaseCoreInternal_Privacy */; }; + 47A896ACF46A488708EA3F254E540802 /* GDTCCTUploader.h in Headers */ = {isa = PBXBuildFile; fileRef = C0A6374CBE0A6FC840B2CCB5BC04391E /* GDTCCTUploader.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 487B3B6A7FDAF31A2500B50C71785F23 /* PromisesSwift-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = E40E4E1B01CC4243E22B6EF5D4639C4C /* PromisesSwift-dummy.m */; }; + 48AF238CCC3514B3FF7CF777D30802AD /* FIRInstallationsSingleOperationPromiseCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A170FE629D15CDA92E90BDE57738254 /* FIRInstallationsSingleOperationPromiseCache.m */; }; + 48C6D0B6DFC547D29B35A74361290064 /* LocalOverrideSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9ABAAC92E26E20E75013B9FEA3A5878 /* LocalOverrideSettings.swift */; }; + 491A08E1B4C6A15DAACD54F162592CC2 /* FIRCLSRecordBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 2DF720DD665469A774CF01FFBAD2642E /* FIRCLSRecordBase.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 492D49CBA3F9AEEF2E46638D45DEE877 /* FIRCLSMachOSlice.m in Sources */ = {isa = PBXBuildFile; fileRef = 3D49B8237795FB0937E007E53CC2A559 /* FIRCLSMachOSlice.m */; }; + 495A3E3546D28106D30C9F033FCF89C5 /* FIROptions.m in Sources */ = {isa = PBXBuildFile; fileRef = 041237B7780A329CCAC0E5D7CC1FFC2F /* FIROptions.m */; }; + 498C3F35EEAFEC9A33F55F68EBAD2209 /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64CF6C49437B67B6EF7D4AD50B1EBA3D /* Logger.swift */; }; + 49D5645C5B253DBF5797F824E56F6BE8 /* FIRCLSFABHost.m in Sources */ = {isa = PBXBuildFile; fileRef = C21ACF77639E561FEC07A0A807061673 /* FIRCLSFABHost.m */; }; + 4A3D625141904C2FD36FF4187D5264BC /* FBLPromiseError.m in Sources */ = {isa = PBXBuildFile; fileRef = 83F0DEBBE5DE2893FAD2E42DCF6FA866 /* FBLPromiseError.m */; }; + 4A5AC3CA93AE337464541313731A7A9C /* sessions.nanopb.h in Headers */ = {isa = PBXBuildFile; fileRef = B895CB7BF5B8063D748E4CE261124320 /* sessions.nanopb.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4A939E7C7D730EAF9A056C7BF89BC4CE /* FIRCLSCompoundOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B63150A5F6E7C96E4554EE4C497BE4B /* FIRCLSCompoundOperation.m */; }; + 4B39B07721DCA778282F4F4BFEB52F8A /* FIRLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 054793BA26B427ACD14E4A67EBA444D0 /* FIRLogger.m */; }; + 4BA72B8BDB176E605A6A79063A02756F /* FIRCLSContextManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 48FA46A66247F6EEA5175CFB52550095 /* FIRCLSContextManager.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 4BF483B82FFDE4C3D2721190F917B352 /* GDTCORMetricsController.m in Sources */ = {isa = PBXBuildFile; fileRef = 43F9B2C99AC9C9CCA867629A0FF1D7E3 /* GDTCORMetricsController.m */; }; + 4D4DC0ED16223119D07DC4C7E84B0D62 /* nanopb-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 06B5066F4EFDF11927BD5974872CAA02 /* nanopb-dummy.m */; }; + 4DEAD39E3A33CCA4105A3ED225A5D5B9 /* FIRHeartbeatLogger.h in Headers */ = {isa = PBXBuildFile; fileRef = C3D7D629150C258C8C14603B1B8DEB74 /* FIRHeartbeatLogger.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 4DEF4ABC7CA070F2AEFDF261A32DF356 /* FIRComponentType.h in Headers */ = {isa = PBXBuildFile; fileRef = 2731B1A2A591BD8AA6F7A860C8DF942F /* FIRComponentType.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4E4A88A399B2DE9D5FE3FB201499B9D7 /* FIRCLSThreadState.h in Headers */ = {isa = PBXBuildFile; fileRef = 0DD073421759B00E23FB08B1F75EC155 /* FIRCLSThreadState.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 4E9FE44998F718071E47B89A67AB4774 /* FBLPromise+Any.m in Sources */ = {isa = PBXBuildFile; fileRef = 88F3652BCF8161395A5D3A8A147BD5FA /* FBLPromise+Any.m */; }; + 4ECD319370B2E1BA99D820E2E73F546E /* FIRComponentContainer.m in Sources */ = {isa = PBXBuildFile; fileRef = EC8876154B49824D7A7F836853BA4CB2 /* FIRComponentContainer.m */; }; + 4F67449A026049C3BCE5699AC327BC1B /* Promise+Validate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1AE57B2231D059EADFE6A5F5D1202BF /* Promise+Validate.swift */; }; + 4FBD013ABBDCDA7D051FFDB1D2D1855F /* GDTCORReachability_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 4EA60B96ECDE4EAAB06858C4F627CCBC /* GDTCORReachability_Private.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 51F6AEBC50F67FD1DDF27CE89DA2F50F /* GDTCORFlatFileStorage+Promises.m in Sources */ = {isa = PBXBuildFile; fileRef = 5CC1C3F46924563DD7F364E2EFD61652 /* GDTCORFlatFileStorage+Promises.m */; }; + 520FC369F2241FD6954B09A76703343B /* GULAppDelegateSwizzler_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 5E3980C1701466712484BB5AA87A843C /* GULAppDelegateSwizzler_Private.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 52336C3ACF5F55E464162040EB6B9388 /* FIRCLSException.mm in Sources */ = {isa = PBXBuildFile; fileRef = 10EC7FBA885D28D61F2A2F9826E6DB47 /* FIRCLSException.mm */; }; + 525D13DD5832540814E5616565D446C0 /* FIRVersion.h in Headers */ = {isa = PBXBuildFile; fileRef = F8EC163DDE4F2BAB0FEF9B538EC2D8DD /* FIRVersion.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 52784892B3A092F6136BD758A686070A /* FIRTimestamp.m in Sources */ = {isa = PBXBuildFile; fileRef = AC6034781E48B285E9D76832343C5FAC /* FIRTimestamp.m */; }; + 5388AA9F5579D7A9D77E2C45166E8BB8 /* GDTCORStorageEventSelector.h in Headers */ = {isa = PBXBuildFile; fileRef = 0089C0347F22CDD47F7D20F708F88D30 /* GDTCORStorageEventSelector.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 53F04602C362D6F9065B7550061F6FCC /* FIRCLSDwarfUnwindRegisters.h in Headers */ = {isa = PBXBuildFile; fileRef = 6F467609B407F926B182ACF7D04672A5 /* FIRCLSDwarfUnwindRegisters.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 540483A74F863FA83592B2BADD717E80 /* FIRInstallationsStoredAuthToken.m in Sources */ = {isa = PBXBuildFile; fileRef = ECE796880B52B02A97E21FF5B8F8CD3F /* FIRInstallationsStoredAuthToken.m */; }; + 546382F85F3C2F02FA03F36540FE99CB /* GDTCOREvent+GDTMetricsSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = D16CCFE998E05CFAE5180480E1D56DFA /* GDTCOREvent+GDTMetricsSupport.m */; }; + 54B79731BEB75E30C2DC698E564B25E3 /* FIRCLSUserDefaults.m in Sources */ = {isa = PBXBuildFile; fileRef = A23261055B8F9FB83FA551DDB4797D11 /* FIRCLSUserDefaults.m */; }; + 54E0B38E0A4B998715EBC8D32E81D33E /* GDTCORReachability.m in Sources */ = {isa = PBXBuildFile; fileRef = 76077ED823B78658850BC396CA91A52C /* GDTCORReachability.m */; }; + 54F6964123FE7FBFEFAF81B8415DAF88 /* GDTCORMetricsController.h in Headers */ = {isa = PBXBuildFile; fileRef = 623C6C791AD1AC849BD033EE3B6ACE99 /* GDTCORMetricsController.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 55316220FF36AF4675021F9CD6965CF4 /* FIRCLSCallStackTree.h in Headers */ = {isa = PBXBuildFile; fileRef = 88223842AB5E8C62E0DBBE137C7DA842 /* FIRCLSCallStackTree.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 5547E4476B4F55A67501AF62B82E28D2 /* FIRCLSUserLogging.m in Sources */ = {isa = PBXBuildFile; fileRef = 99552BF905D8E4331EFB57956A0A736D /* FIRCLSUserLogging.m */; }; + 558FBFE06C9E98E454CF04C4F57ED39A /* FBLPromise+Any.h in Headers */ = {isa = PBXBuildFile; fileRef = F9DF843F93CE66AD5D17284146E812CC /* FBLPromise+Any.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 55B1AA2B945D12A673A7D687DBCACD76 /* GDTCORUploadBatch.m in Sources */ = {isa = PBXBuildFile; fileRef = C043BF110B25F32912F5A0CC31E55881 /* GDTCORUploadBatch.m */; }; + 55C4B450EB7756B7537941B84CAE5281 /* FIRLibrary.h in Headers */ = {isa = PBXBuildFile; fileRef = 7001A63E1A9DC7FE5211C829514A4388 /* FIRLibrary.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 562B04C758A4B190229EE958FC715F7B /* FIRCLSCallStackTree.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CFAF503B3616030C48201CEEB846090 /* FIRCLSCallStackTree.m */; }; + 5693402C5FE481037EB077CD1846C12A /* FIRCLSMetricKitManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 74269A41A6C776DF12BC3E6F3A7D63E0 /* FIRCLSMetricKitManager.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 57D21A30916C67B027BB05FC22328610 /* GULNetwork.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C8E613B2FC4E42035291657D27705BE /* GULNetwork.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5897D3B3E5A97CCC5F0E098AAC8F1B93 /* GDTCOREvent+GDTCCTSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 9390BE29BAF167FEAE1E7BE6F5AC1C01 /* GDTCOREvent+GDTCCTSupport.m */; }; + 58A317419E19D1C23BA647CEB4776F85 /* FIRApp.h in Headers */ = {isa = PBXBuildFile; fileRef = AAA22AB3BDDB5122B8AE45AA82891F8A /* FIRApp.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 58BD8A7A51492CFF92BCD94220E42DD3 /* FIRCLSManagerData.m in Sources */ = {isa = PBXBuildFile; fileRef = E733897E58C3ECF71F8B593B0583C98C /* FIRCLSManagerData.m */; }; + 5960B19D2D02380A1BB29857216D16E6 /* FIRCLSAnalyticsManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 3666ABC259DA72953FE993E05E3A5531 /* FIRCLSAnalyticsManager.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 59BB1BED6211F6F86D2EF91057912CC2 /* FIRCLSHost.m in Sources */ = {isa = PBXBuildFile; fileRef = CFE0D559DCD251C38581DE47B3292AC8 /* FIRCLSHost.m */; }; + 5A883D789AEEA201D08961C95F3A03CB /* FIRCLSDataParsing.h in Headers */ = {isa = PBXBuildFile; fileRef = D5728414FB5D291F0410158BBB99515C /* FIRCLSDataParsing.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 5AB093CFAB7386AB921F8EDD61BDD453 /* FIRCLSFABAsyncOperation_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 6FD189EB7D8DAAA1B0FD1DE606EF1D5F /* FIRCLSFABAsyncOperation_Private.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 5AC2E27F5DA0F438AB8AF1D2B50FDAA4 /* FIRCLSUnwind_arch.h in Headers */ = {isa = PBXBuildFile; fileRef = 4035964C91C1B0CA76EA274AF5C93909 /* FIRCLSUnwind_arch.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 5AFA670233B0989E3D21BF6F669E2AB1 /* FIRCLSDownloadAndSaveSettingsOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 15101FAC07F75892F901C206FBD6D676 /* FIRCLSDownloadAndSaveSettingsOperation.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 5B296D3A0E6DDDDE13797730F9AA2749 /* FIRCLSURLBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = B873FAF8312CC7BC6F728E5F19A484FA /* FIRCLSURLBuilder.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 5BC3D71B6715E66A5B1701FE08AEE5B1 /* GULAppDelegateSwizzler.h in Headers */ = {isa = PBXBuildFile; fileRef = 0D45A6F0B06D69697404FA689F2C9A7C /* GULAppDelegateSwizzler.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5BEB66442C3EF989A1D975255081D660 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 411C572D658946450319E3438E61FBCC /* Foundation.framework */; }; + 5D205A42D6D52C5F1D95270C6E325200 /* GDTCCTURLSessionDataResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = A6D0C615AB1F9953AB63ED940124C908 /* GDTCCTURLSessionDataResponse.m */; }; + 5D4544BEEA2076764CF8A2AB072DAFA6 /* Promise+Timeout.swift in Sources */ = {isa = PBXBuildFile; fileRef = E355C7908673CD447EBA9E2627292044 /* Promise+Timeout.swift */; }; + 5F0966C8D041AC12FF848B277B55A2A9 /* GULNetworkInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 49C01A95AD44924B0A150B7FBF2D3C3B /* GULNetworkInfo.m */; }; + 601D54656496EC341F97E6809827D9E7 /* FIRCLSException.h in Headers */ = {isa = PBXBuildFile; fileRef = 99790E1F0014A6D9319C17A74E117E98 /* FIRCLSException.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 606ADCD7A2F53B218B09EA7FCBE60CE5 /* FIRAnalyticsConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = 928EB4F74D12F2775E1453DF6F8F5448 /* FIRAnalyticsConfiguration.m */; }; + 63AAD8A825537E5A67DF0422794222F2 /* FBLPromise+Delay.h in Headers */ = {isa = PBXBuildFile; fileRef = BA00CC7B756DA9535DFD704E1E535A2D /* FBLPromise+Delay.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 63E6A2B474008FA01DE8D4EA0BB9BAE3 /* GDTCORLogSourceMetrics.m in Sources */ = {isa = PBXBuildFile; fileRef = 6102E83195F0B1D1BB9085D6FA872D2B /* GDTCORLogSourceMetrics.m */; }; + 6420182F1011B03D77290F862B246B3F /* GULUserDefaults.h in Headers */ = {isa = PBXBuildFile; fileRef = CBB174ABF14EFF529BB3102F45D26E01 /* GULUserDefaults.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 64271735B1C773ED84408EE510F7465E /* GoogleDataTransport-GoogleDataTransport_Privacy in Resources */ = {isa = PBXBuildFile; fileRef = F73AA961F4AEFF2B46B00AE435DF6BE3 /* GoogleDataTransport-GoogleDataTransport_Privacy */; }; + 643EC004DC0A1E0FE311F6C01E8E5C4D /* FIRInstallationsAuthTokenResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 813D484D4C1D83EDA74FFFF0A4A5C2AD /* FIRInstallationsAuthTokenResult.m */; }; + 64E3CD57458B64D956DDBBCF11F7C9C2 /* HeartbeatLoggingTestUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1758B957BB4D36B3B969C7AE4E209789 /* HeartbeatLoggingTestUtils.swift */; }; + 661C69B122A9B3B1C5C95EE6CBA7DF67 /* GDTCCTNanopbHelpers.h in Headers */ = {isa = PBXBuildFile; fileRef = 1CE2D09E4A00E609BE326453FA5D543F /* GDTCCTNanopbHelpers.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 662EEBB687037E84AFD71ECD268A3925 /* FIRComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A1DB983C34B2FD725FAC923C3A37A20 /* FIRComponent.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 6695EF6A933BA33BF037AAA19A45E3F3 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 411C572D658946450319E3438E61FBCC /* Foundation.framework */; }; + 670D2C009DF2F7DB4E1EBC23080D64A8 /* FIRExceptionModel.h in Headers */ = {isa = PBXBuildFile; fileRef = 0B521A65D627501A9EBEF884958EA814 /* FIRExceptionModel.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 678048BF0B3FF61EDE3B83389EBE009A /* GDTCORTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = E5AD3E9C111C8222D721FB18E8AAC01E /* GDTCORTransformer.m */; }; + 69342F3087ABACE850E6D743204BD707 /* GULNetworkMessageCode.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E5A6981A575BBBFA0E4883EA764E8EC /* GULNetworkMessageCode.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 69A87D89994D4C494300A61DE6D9ED0B /* FIRInstallationsItem+RegisterInstallationAPI.m in Sources */ = {isa = PBXBuildFile; fileRef = E64FDC4439FB05110F702AE12290FC9D /* FIRInstallationsItem+RegisterInstallationAPI.m */; }; + 69B142955482DB2F776C9DC471D6C64F /* FIRCLSDataParsing.c in Sources */ = {isa = PBXBuildFile; fileRef = 5744EFD31B947A5BD323ABC59C4EC853 /* FIRCLSDataParsing.c */; }; + 6A370BC815C22E5318D81C7F18F191A0 /* GDTCORClock.m in Sources */ = {isa = PBXBuildFile; fileRef = D5F99A5B4CE9BD03128B9D9D3D5B484A /* GDTCORClock.m */; }; + 6B1235FFE92D37D0475C791D73F1B7DF /* FIRInstallationsStoredItem.m in Sources */ = {isa = PBXBuildFile; fileRef = CC69C8F474714A281F42229040CF232F /* FIRInstallationsStoredItem.m */; }; + 6BCF480FDDFE4E2AE7761E28929CF58F /* Promise+Race.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5052CDC463F2CA370196062659882B38 /* Promise+Race.swift */; }; + 6CFA5420733D19C97D13C61740DFA940 /* FIRCLSExistingReportManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 94BACBC372793B939CB61CECCC28F929 /* FIRCLSExistingReportManager.m */; }; + 6D2DF47A3BAF471A033D0003B76DC592 /* FIRAppInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 3896C1B7A6BF62C3D44EAA5107F8FF8C /* FIRAppInternal.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 6D4BEBCE00B561C942F57E065D56F99B /* GDTCORProductData.m in Sources */ = {isa = PBXBuildFile; fileRef = A443C138B2A4D29DE3E10FAA1EA8F004 /* GDTCORProductData.m */; }; + 6D6147FC10CA2EBF735A5C6D72C5A301 /* Heartbeat.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69A4852926E3A9DD96162FEBB238FE20 /* Heartbeat.swift */; }; + 6DAF6EFA062A3D46D387529467F6D54A /* FIRCLSConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = 45A97CCCD5706C3372CFE18761AD892C /* FIRCLSConstants.m */; }; + 6F5E51F9260DE9ACA071C0C09CE4DFB8 /* Promise+Do.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A56E90AE4FC9D8A077C40F67513262E /* Promise+Do.swift */; }; + 6F9FE607567997B9522DA349CA416B92 /* GULUserDefaults.m in Sources */ = {isa = PBXBuildFile; fileRef = 6DE47118218FE9DD48B787D2008307CD /* GULUserDefaults.m */; }; + 6FE95F0DC6FABC3ADF7E0D2DAE0190CA /* FIRCLSCompactUnwind.h in Headers */ = {isa = PBXBuildFile; fileRef = CDDF030F4A6E517F34BF2B249C03A22B /* FIRCLSCompactUnwind.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 706797A84BD0AE37CC987E1A50C4334D /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = F889FA26D580B1AFA343DEF9E5599BCD /* PrivacyInfo.xcprivacy */; }; + 708B76BFE1D16E8E96404A82E6A8BF47 /* GULAppEnvironmentUtil.h in Headers */ = {isa = PBXBuildFile; fileRef = D9AD12C8E138FD2EC14CB63C52044780 /* GULAppEnvironmentUtil.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 70E1000B1E1BA39ACEE597D36909851D /* GDTCORLifecycle.h in Headers */ = {isa = PBXBuildFile; fileRef = 9A09D4E58AE07B59FB190EEE48280AD9 /* GDTCORLifecycle.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 71EB4C84D81B48392C331BBFAE2648AA /* FBLPromises.h in Headers */ = {isa = PBXBuildFile; fileRef = 11E35FF4C7C8650A90E54825818800B5 /* FBLPromises.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 71F2D91DCF258E2459EEE9998E62740A /* Promise+Then.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F08C3B1CD07206601170D94C1BE73F0 /* Promise+Then.swift */; }; + 727B391BA00F33EB592FDB6C6E7550C4 /* GDTCORMetricsControllerProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 53E213CDE8EA6EAC06399F2176AE3D4B /* GDTCORMetricsControllerProtocol.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 73116F88F7B21E3AE68C47A42DF5D7B8 /* FIRCLSLogger.h in Headers */ = {isa = PBXBuildFile; fileRef = F5747BC30069054A7B0D60AB1E618499 /* FIRCLSLogger.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 736C8D6800E95449F224C9291CFC8050 /* FIRCLSReportManager_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 2BC672E68574FB2722DCA645BB15CBDA /* FIRCLSReportManager_Private.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 73A1CC681D985F80EF364ED59723867E /* Pods-TastePick-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 0A566D57D5C0DF1498A91010D518117A /* Pods-TastePick-dummy.m */; }; + 741733D18221B8AFFAE7A870B8C6EFB9 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 2A013903A63F0BEB08E3A00DCAAFBFB4 /* PrivacyInfo.xcprivacy */; }; + 743C6CB5CD83267D2A066EDCCBC64758 /* GULSceneDelegateSwizzler_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 212DFA72D0E2CA51B6EC619A06CCD600 /* GULSceneDelegateSwizzler_Private.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 7466E182BA226654680743A54E17E9E9 /* FIRCLSCompoundOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = CCDC0AB75D22DED4C9FC0437D2E5091D /* FIRCLSCompoundOperation.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 74AAB4190FD0E2C555DD64C2495FA6F5 /* FIRCLSRolloutsPersistenceManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 37C4832F00EE3E4DEBDBB310FAB46DA8 /* FIRCLSRolloutsPersistenceManager.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 761912A96B2D375810BC1EC80474D7E6 /* GDTCOREvent_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 82961C47312C5F33B867FA72C66A2B3B /* GDTCOREvent_Private.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 76214DE3AC8C33A0F13505465AF4D477 /* FIRCLSReportAdapter.h in Headers */ = {isa = PBXBuildFile; fileRef = A30C51E88E588C86FA1D9E8DE9779A67 /* FIRCLSReportAdapter.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 76A210958B71CAAEEABB7F4A31D544A6 /* FIRCLSRecordApplication.h in Headers */ = {isa = PBXBuildFile; fileRef = 924FE8C8660ABC321E2BE8C94A1702F1 /* FIRCLSRecordApplication.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 76BB123B5A56448868FE59685143B9C3 /* GDTCORMetricsMetadata.h in Headers */ = {isa = PBXBuildFile; fileRef = 1FFCE5CE085019AB4DF83559B2238B43 /* GDTCORMetricsMetadata.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 76F044041A4C5DE9C69F6BC69E996A8B /* GDTCORConsoleLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 9BF943E13BECF93D2A48AFEC131BBE86 /* GDTCORConsoleLogger.m */; }; + 7740D0F9A0DE4AE09E228385CCBA3E51 /* GDTCORDirectorySizeTracker.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A8322DEBCC05B27EC0F485116CB3581 /* GDTCORDirectorySizeTracker.m */; }; + 7781EBE38C5C4762D351CD85899CB3EC /* SessionsDependencies.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30939D40FD7C3A32CC6CDE85982B6520 /* SessionsDependencies.swift */; }; + 7859D7BF55E67EF873C45CA5F8BA07E9 /* FIRCrashlytics.m in Sources */ = {isa = PBXBuildFile; fileRef = 01FCE3564F910A6112B6A8394DABD2EF /* FIRCrashlytics.m */; }; + 7864BABE506E059F1A96282C38714944 /* FBLPromise+Catch.h in Headers */ = {isa = PBXBuildFile; fileRef = 3AB67A4904DEA3918B219175B34B54D1 /* FBLPromise+Catch.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7871457C6AF99AFF143EC808200BFF25 /* FIRCLSNotificationManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 3EF32FAE4E797E58A9BCD2572B05CA92 /* FIRCLSNotificationManager.m */; }; + 78E6606A265EE8EBD823053789E30D13 /* FIRCLSUtility.m in Sources */ = {isa = PBXBuildFile; fileRef = 85E3BEBDCDFBC21B3230D522B661A6EC /* FIRCLSUtility.m */; }; + 79178BCB9342BCDC272BDC3EC79E08B1 /* FIRCLSReportManager.m in Sources */ = {isa = PBXBuildFile; fileRef = A6A883C71E6CBF998A3024458645CB4D /* FIRCLSReportManager.m */; }; + 796BE8A62C71BE788EC7186E46DAEC67 /* FIRCLSAnalyticsManager.m in Sources */ = {isa = PBXBuildFile; fileRef = A526CAA2BF74CF37D01D654302BE29E1 /* FIRCLSAnalyticsManager.m */; }; + 7A56F0778424050770BFD1DFB238952A /* GDTCORMetrics+GDTCCTSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 1023E99E35C71294BD4212E31FE8D1E5 /* GDTCORMetrics+GDTCCTSupport.m */; }; + 7AD4274199ADF97A40E074B42F8E7CC7 /* GDTCORLogSourceMetrics.h in Headers */ = {isa = PBXBuildFile; fileRef = 887155058FADB78B34F55428F2D1C93E /* GDTCORLogSourceMetrics.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 7BBB4D45CDEB2E67B20A5748D6F918BC /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 411C572D658946450319E3438E61FBCC /* Foundation.framework */; }; + 7BEE5CE3066E86F9A376DFE4CDA8C54D /* FIROptionsInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 2DBF91E26611C1E7394DF3D28D3158C8 /* FIROptionsInternal.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 7BF981899794C58EC1B4ED5821379FF2 /* FirebaseSessions-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = D5F4169D3FC469172BE10FF04E507D38 /* FirebaseSessions-dummy.m */; }; + 7C519FA9E861261CE89DB368DAABA7C1 /* crashlytics.nanopb.h in Headers */ = {isa = PBXBuildFile; fileRef = 29A0E4CB79E64ABDE0215A8170CB4BD0 /* crashlytics.nanopb.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 7CE612DA64E95ED7B034D7A7AB0CBF69 /* FIRCLSDwarfExpressionMachine.c in Sources */ = {isa = PBXBuildFile; fileRef = B362261E9E8CB7A626EF723102A6C278 /* FIRCLSDwarfExpressionMachine.c */; }; + 7D8BB2B1E5341A55CA005B7E949C532D /* GDTCORConsoleLogger.h in Headers */ = {isa = PBXBuildFile; fileRef = F66DA3C2097B9D040A400036969452AF /* GDTCORConsoleLogger.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7E142D58B3D22A999D8BBC9EE70ED33A /* NanoPB+CustomStringConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D52AB19F6BCD45B3C88CDDD10AEAE79 /* NanoPB+CustomStringConvertible.swift */; }; + 7E282174A49CCADFDAD3380FF833CCDF /* FIRCLSAsyncOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 589B5CA0837902E9A2F318B4BBD29197 /* FIRCLSAsyncOperation.m */; }; + 7E2C09F497BD0129BD2E2FEAE043DD04 /* Promise+Recover.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53D6559C8FDACD17A258B29C01DDCFEA /* Promise+Recover.swift */; }; + 7E56580CA0F7FC8C87133D6754B6F9BF /* GDTCORStorageMetadata.h in Headers */ = {isa = PBXBuildFile; fileRef = DEC61A91C59056C9B0313273CF1DDFC8 /* GDTCORStorageMetadata.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 7E882523FF824824B3118C2BC413F209 /* Promise+Always.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2B5192C2DA782DD72AF3BED9062619A /* Promise+Always.swift */; }; + 7EDAEDE24C4040D859AA6F606424527A /* SettingsProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90A580880C102C87E456FD51A7F63EFF /* SettingsProvider.swift */; }; + 7EF9AF554B0FAE1A9437A579ABF8D152 /* FirebaseCoreInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 750B2D0A333C9B773C5CD112D92B9624 /* FirebaseCoreInternal.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 8062F8F2C973694735E52B4745F8A966 /* FIRCLSUUID.h in Headers */ = {isa = PBXBuildFile; fileRef = 5B7BB3434B89A73963792BF227173DD7 /* FIRCLSUUID.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 80F10E3A8823AB0C370745BEDBAFF514 /* FBLPromise+Validate.m in Sources */ = {isa = PBXBuildFile; fileRef = 70FBDF52C674C3971C4296F27117298A /* FBLPromise+Validate.m */; }; + 810807B21C3D8B0934058F3B3F7FF26B /* FIRConfigurationInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 1073A31EF35FD64DE634B90E1238EA0F /* FIRConfigurationInternal.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 8191E019D2E7D81824D6A3D39644C78F /* pb_encode.c in Sources */ = {isa = PBXBuildFile; fileRef = 51864E8172B366BB542D866EE1F50EC6 /* pb_encode.c */; settings = {COMPILER_FLAGS = "-fno-objc-arc -fno-objc-arc"; }; }; + 8373E40DEA064F2F96FAC3A65F681288 /* FBLPromise+Recover.m in Sources */ = {isa = PBXBuildFile; fileRef = CCD84BC000100B0CA5654CE3F1C3632B /* FBLPromise+Recover.m */; }; + 839F7A7877C0181041B6A83DF9ED1C8E /* FIRCLSNetworkOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = A5425E5A63F497B11099CF7643E9E208 /* FIRCLSNetworkOperation.m */; }; + 83D2170CC90A070963865D02C530D3C3 /* FIRAnalyticsInteropListener.h in Headers */ = {isa = PBXBuildFile; fileRef = C50377907868482D35E746056BEBEE31 /* FIRAnalyticsInteropListener.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 844F7C9361AEB77302090187DB0618F4 /* FIRComponentType.h in Headers */ = {isa = PBXBuildFile; fileRef = 603A3741C764ED8E33FFA78791103DC7 /* FIRComponentType.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 845FC9D1F56ED31BE92DFBAFAB8D680D /* FirebaseCore.h in Headers */ = {isa = PBXBuildFile; fileRef = C701DD6907FF92F7694F74D6DA235DDF /* FirebaseCore.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 84850D7DE71FC7F3383583C06BF25B85 /* Installations+InstallationsProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA2E3B3981C2F0727AB450DC21490B78 /* Installations+InstallationsProtocol.swift */; }; + 8507B85853224FD0370564907686121C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 411C572D658946450319E3438E61FBCC /* Foundation.framework */; }; + 853758D54BACE73D5DAC0F15202C2868 /* FIRCLSCodeMapping.m in Sources */ = {isa = PBXBuildFile; fileRef = B81BDC2643BA56A17EF26F3DB83AAB43 /* FIRCLSCodeMapping.m */; }; + 85A56A56CCA523362D3F03D3E553796F /* FIRComponentType.m in Sources */ = {isa = PBXBuildFile; fileRef = D54022AE451161DCBDEE4F8EDA350F8E /* FIRComponentType.m */; }; + 85AE2B72D317CBF5D34B80893CD7E72E /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 9E8F94C9DA5672FB0856CAC5A159B1E1 /* PrivacyInfo.xcprivacy */; }; + 85FAD6E88C9D435ADAA1015F92FF6914 /* GULNetworkLoggerProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 84ECD3166786E3B251EB4673A8B36282 /* GULNetworkLoggerProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 86F0E3136DAEC762E5A0DD7D7D11961B /* GULNetworkConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = AAE4E23513CFA47883CD490EB8B09BBC /* GULNetworkConstants.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8732A6466542F7DCE56208F554D1DD9B /* FIRCLSSignal.c in Sources */ = {isa = PBXBuildFile; fileRef = F241586E839BA67D4272890DC9FF1F7F /* FIRCLSSignal.c */; }; + 87F3E164D6180CFCC344816B29EB9D43 /* GoogleDataTransport-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F0D98674D9D210C0A8B28B6FE55F6CCA /* GoogleDataTransport-dummy.m */; }; + 88448E30E8E4933F4818F18DB513E10A /* FIRCLSMachO.h in Headers */ = {isa = PBXBuildFile; fileRef = 26CD1818E4B5E4B04A89C9F8C537A485 /* FIRCLSMachO.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 88AA4C4396EE322933DA943F150B5860 /* cct.nanopb.c in Sources */ = {isa = PBXBuildFile; fileRef = E814CF17C18B86D7848AB28D353970F2 /* cct.nanopb.c */; }; + 892F81A054898BBC6D4356C5837A630B /* FIRCLSSettings.m in Sources */ = {isa = PBXBuildFile; fileRef = A4FD66189E78011EBD505204D5031AA3 /* FIRCLSSettings.m */; }; + 8A585C217645847AF19FE9DBF155316B /* FIRCLSNotificationManager.h in Headers */ = {isa = PBXBuildFile; fileRef = DA94A176C9DDF93FD794B8CACD5B0CD3 /* FIRCLSNotificationManager.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 8A5DE634040AD655252C5DABB8E480F1 /* FBLPromise+Reduce.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A3E90F23E0540C1E1A787A0100E6930 /* FBLPromise+Reduce.m */; }; + 8A7D639E50EACE32177B7FECF0D6B06C /* GULKeychainStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = 26D2C03BACF911A34C8F878660B53C2C /* GULKeychainStorage.m */; }; + 8AF2CBF1E6FDDCE63E0B55BA98C9224D /* Promise+Await.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D124D2E1ADCFB2A1B40A9770344F845 /* Promise+Await.swift */; }; + 8B50F612BB38DC1643FC8F4AD307FF22 /* pb_common.c in Sources */ = {isa = PBXBuildFile; fileRef = 42FB737570CE3DFC7CF25181D7DECD36 /* pb_common.c */; settings = {COMPILER_FLAGS = "-fno-objc-arc -fno-objc-arc -fno-objc-arc"; }; }; + 8C3D041C63F2CE2D2AAA1980E3F53E3F /* FIRCLSMachException.c in Sources */ = {isa = PBXBuildFile; fileRef = 28EE3935B708ADB28BB2F7CFA8DBEA8F /* FIRCLSMachException.c */; }; + 8C4DADB96458B23183E3B32405631885 /* FIRCLSGlobals.h in Headers */ = {isa = PBXBuildFile; fileRef = 5AAE37425AE59D987BC8415EE3B4E94A /* FIRCLSGlobals.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 8C67F4AE832D052C9A7AC3FF30D2D608 /* FIRCLSInternalReport.m in Sources */ = {isa = PBXBuildFile; fileRef = C5F74FE5F6CC393C95E29DF392D5DEF7 /* FIRCLSInternalReport.m */; }; + 8C6BEE1247E4766A0003D344B0119E3F /* FIRLibrary.h in Headers */ = {isa = PBXBuildFile; fileRef = E6194471CC7D7B3811785D6FB35C5E9B /* FIRLibrary.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 8CEE645869AED50003E0CA1661EA29C2 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = D579B4328A248F1CCE7D5515604A338B /* PrivacyInfo.xcprivacy */; }; + 8DB713CD29673A4921FD7AEA1B082F1C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 411C572D658946450319E3438E61FBCC /* Foundation.framework */; }; + 8DFEEDD448D06939AE7BF9AFF73B1672 /* FIRComponentContainerInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C68A091AE9AFC6675997908F065AD15 /* FIRComponentContainerInternal.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 8E235264B19BB39546A286DA29C53D3A /* FIRComponentType.h in Headers */ = {isa = PBXBuildFile; fileRef = CAC4AF12CEDA6145D2B5533F756AE5EF /* FIRComponentType.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 8E24AFFBEBDA0BFD6D9D401893A880F9 /* FBLPromise+Testing.m in Sources */ = {isa = PBXBuildFile; fileRef = 2E4BE348118E6A15F9012F41C1EEE40F /* FBLPromise+Testing.m */; }; + 8F4FBDF827D51F1E5B1C73CCB948081E /* FIRCLSReportAdapter_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = A99271F36551C1652FF3C85759D7CB13 /* FIRCLSReportAdapter_Private.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 8F79A7CAD74BA3B7FFB15D5283732346 /* GULApplication.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B0287C57BE7DCF9619AC7D86755E6B9 /* GULApplication.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8FA0A46DAE1C8A5BFA7A9FB03B54D71B /* GoogleDataTransport-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = C756CB0A0B0B5E40A7ABD0FB2408ACF9 /* GoogleDataTransport-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 903F6BDA7007338C73C9BEA3959D27F5 /* FIRCLSRecordBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 68A8AAB178F233C0B13967A06044250D /* FIRCLSRecordBase.m */; }; + 903FA111987E3F837641E29D14C53DAC /* FIRCLSLaunchMarkerModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 116852A1A1333FCDE65458FC8EFCE21B /* FIRCLSLaunchMarkerModel.m */; }; + 907E2EEADC3885EDB50AFFADE2A48D6F /* GDTCORPlatform.m in Sources */ = {isa = PBXBuildFile; fileRef = DEBDFBFD60419C6875B4145D83150FBE /* GDTCORPlatform.m */; }; + 90D5A7A71FB4963A14D363A668F0F78E /* FIRComponentContainer.h in Headers */ = {isa = PBXBuildFile; fileRef = E167981B8A73B538FE546347C153A501 /* FIRComponentContainer.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 90F9256DC310D10FE5C7FFA0F585FB5C /* FIRInstallationsStore.m in Sources */ = {isa = PBXBuildFile; fileRef = DE6686D5E66D53F23A55FC0B89A76436 /* FIRInstallationsStore.m */; }; + 91F4C14A683E9A6B7929D0AAF906CA98 /* FirebaseCore-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BEC5C7C53878CAC1940693EB61EE496 /* FirebaseCore-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 921B06126E5934CC3CDD75E847C0E03A /* FIRCLSApplicationIdentifierModel.h in Headers */ = {isa = PBXBuildFile; fileRef = 93993DDFB096B20356E0FCA54A271A85 /* FIRCLSApplicationIdentifierModel.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 923D3678D40FDAC598A52A954C12E252 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 411C572D658946450319E3438E61FBCC /* Foundation.framework */; }; + 92B5515DD16C72A1903B97537E441B74 /* dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = E69C2479672DEE9632C64C294E1CE2BB /* dummy.m */; }; + 92EB309DD97645E4978C3793BDB38AEF /* FIRCLSCrashedMarkerFile.c in Sources */ = {isa = PBXBuildFile; fileRef = D9AA670608CFCFA05E52A55B4EB8F5CF /* FIRCLSCrashedMarkerFile.c */; }; + 9435656D731BAD32451630A2B5FCBBDB /* FIRCLSFileManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 57C8765FACA5923A29B9B3E6549BAC57 /* FIRCLSFileManager.m */; }; + 94AF1546C8B8A9161A1A6E97426F6252 /* FIRComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = D6AC87ED55C906B755326408B858A632 /* FIRComponent.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 94C9BB4C44974A180536169E8257CD3D /* FBLPromise+Race.m in Sources */ = {isa = PBXBuildFile; fileRef = DBEAE374FB2BBD2DC600894306116762 /* FBLPromise+Race.m */; }; + 950E10804AB46A6A4F977687E0E022CD /* FIRCLSRolloutsPersistenceManager.m in Sources */ = {isa = PBXBuildFile; fileRef = C71474454F728EC2F1503A467235BFD1 /* FIRCLSRolloutsPersistenceManager.m */; }; + 95410CBA1A1745DD2841C2367B46D6A1 /* FIRCLSByteUtility.m in Sources */ = {isa = PBXBuildFile; fileRef = AC93949D8A77E4A30500EF08D24DD5AF /* FIRCLSByteUtility.m */; }; + 957FEBF524624E2CCF8F21924BF505D6 /* FIRCLSProcessReportOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 046E5D36AC65413A5A781F4E1D7C6261 /* FIRCLSProcessReportOperation.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 9637A55E8D666CF881D4505DDF7AA584 /* FIRCLSDefines.h in Headers */ = {isa = PBXBuildFile; fileRef = 828EE3550DD2B792458BF1F9C9D0859E /* FIRCLSDefines.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 9688E9B84D7C8D7A36CA05C0F4016DF0 /* FIRLogger.h in Headers */ = {isa = PBXBuildFile; fileRef = 9282DF3214C3EE0A2E1219D9E7A701FA /* FIRLogger.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 96A664DD04C7E6CB38BB11050DD72045 /* FIRCLSMachO.m in Sources */ = {isa = PBXBuildFile; fileRef = 4510828D4ED1A91B7DC48E597A6ABF69 /* FIRCLSMachO.m */; }; + 96D2A7562648D47FC9D8E8B443C8CA22 /* GDTCORUploadCoordinator.h in Headers */ = {isa = PBXBuildFile; fileRef = BB764ECF294A5117628B17E3D8BBA5F8 /* GDTCORUploadCoordinator.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 96D64AB4C30AF4EF8A84884FFF22BC85 /* GDTCORMetrics.m in Sources */ = {isa = PBXBuildFile; fileRef = 22B8D50B74DE97D7A1516169B05859A4 /* GDTCORMetrics.m */; }; + 96FFD1472FDF26503BA6F48981D7B757 /* GULKeychainUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 6B429F7B704C639EAB90CA4BAEF50C4C /* GULKeychainUtils.m */; }; + 97EDA437FB2DB6311C81DFC580DB45FD /* FIRCLSContext.m in Sources */ = {isa = PBXBuildFile; fileRef = 3252DF1406BC2146B50B4840FD6FBA04 /* FIRCLSContext.m */; }; + 9810B7094A01A6900FAB9BE07463F29D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 411C572D658946450319E3438E61FBCC /* Foundation.framework */; }; + 98981CD6423980FC27F111532601E235 /* FirebaseInstallations-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 46474726596AE39D0A76F938E0A80E6A /* FirebaseInstallations-dummy.m */; }; + 98FE404F1DA5E5F7F4C15FC437336C08 /* GDTCORDirectorySizeTracker.h in Headers */ = {isa = PBXBuildFile; fileRef = F48D0F5CB15141F4F307D622FDB9D83C /* GDTCORDirectorySizeTracker.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 99604CD663C8707DFDFDC76C2421F3B1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 411C572D658946450319E3438E61FBCC /* Foundation.framework */; }; + 99C5518A17183B5BBD6D9443AE165839 /* nanopb-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 05CE57F2A3FD17DD25DB8EF61DC3306D /* nanopb-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9B49E51CB5D1E67E1B8678D192A6CC78 /* EventGDTLogger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BCBA30428742D1C599371299B07C4DF /* EventGDTLogger.swift */; }; + 9BD78DA7C373ABC6BDF39EE1D9FC927E /* FIRCurrentDateProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = A4463B80D4074271B9828C77B9161130 /* FIRCurrentDateProvider.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 9C5A83F954FE0B386A7B89F029255F1E /* FirebaseCore-FirebaseCore_Privacy in Resources */ = {isa = PBXBuildFile; fileRef = 8BB937B1C0DFFCF92F41861C2BC54DDA /* FirebaseCore-FirebaseCore_Privacy */; }; + 9CD5BD94DEDA4FCCF19E7EC08FA4A1F3 /* GULNetworkURLSession.m in Sources */ = {isa = PBXBuildFile; fileRef = DA1607C2079B334D339DE217E8D52992 /* GULNetworkURLSession.m */; }; + 9D1CB8F7AD4288C505953FED072ACBD2 /* GULSceneDelegateSwizzler.h in Headers */ = {isa = PBXBuildFile; fileRef = 1255AFC3E86546B3312D04714D8F2C86 /* GULSceneDelegateSwizzler.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9D8154DA1A40BFB0826D439419880896 /* FIRBundleUtil.h in Headers */ = {isa = PBXBuildFile; fileRef = 0DEA1F94A33613AE4F30F7F2AC3187C4 /* FIRBundleUtil.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 9DB10F62601D45317249D366B2CEE378 /* FIRInstallationsIIDTokenStore.m in Sources */ = {isa = PBXBuildFile; fileRef = 764FD3B73F706CB98739ECB8504FC38B /* FIRInstallationsIIDTokenStore.m */; }; + 9E42D0DCD9D25FF02F7AE47080883218 /* FIRInstallationsSingleOperationPromiseCache.h in Headers */ = {isa = PBXBuildFile; fileRef = D30B5C733BE395B9290BF66EF07B47D8 /* FIRInstallationsSingleOperationPromiseCache.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 9E4301FDEAD6BFFE5CBBF4BABBD89D3F /* FIRInstallationsErrors.h in Headers */ = {isa = PBXBuildFile; fileRef = 2C8E3DDC3FDC1CDB26E0AEFF7902B4CE /* FIRInstallationsErrors.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A00B3C0EAD7285D062ADE742FB70203D /* FIRCLSDwarfUnwind.c in Sources */ = {isa = PBXBuildFile; fileRef = 342FA6FC6FF29FD9ED11AA3C0C030E1B /* FIRCLSDwarfUnwind.c */; }; + A0AC77ED57C19174948779C90E845AC4 /* GDTCORTransformer.h in Headers */ = {isa = PBXBuildFile; fileRef = 2F63566A90B8B15BB252B732D8FC2944 /* GDTCORTransformer.h */; settings = {ATTRIBUTES = (Project, ); }; }; + A10A5D8F81F20C322B8AE87F9820BAC9 /* GDTCORUploadCoordinator.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C63286B4E589B8B7276886332C71CA1 /* GDTCORUploadCoordinator.m */; }; + A1DE49510A0F5FE30C8C1A2271E5CBA6 /* FIRCLSDownloadAndSaveSettingsOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = FFF0E62BD9FA88413042F0BCBD7031F2 /* FIRCLSDownloadAndSaveSettingsOperation.m */; }; + A27BB0FA1B994DA32D2CE5C748A8253B /* RolloutsStateSubscriber.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88EEAAC0E812A8FDAFC91E692A057B74 /* RolloutsStateSubscriber.swift */; }; + A282EB350472E6592E4567C3BF2D8E31 /* GULLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 1DA040D8D1944A547F2CE9CEB368B983 /* GULLogger.m */; }; + A2FA722779F4D3C5937240D7AB5241AF /* FIRCLSFABNetworkClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BA1A5F567A5A56048407845D0A0D76B /* FIRCLSFABNetworkClient.h */; settings = {ATTRIBUTES = (Project, ); }; }; + A39E8B78626BBD47EFA9483879C21A39 /* FIRCLSURLBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 7EE640A447F7A826C01D825C868E41C9 /* FIRCLSURLBuilder.m */; }; + A3E74331F9232CA71B783072A72ED085 /* GULAppEnvironmentUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = EB3640A53E23EBAA29760656C05BC864 /* GULAppEnvironmentUtil.m */; }; + A4A8D478E91AD41B2F73A03F089AD067 /* FIRCLSMachOSlice.h in Headers */ = {isa = PBXBuildFile; fileRef = 434E8926C8AD43CA9F81CBA38ABE052E /* FIRCLSMachOSlice.h */; settings = {ATTRIBUTES = (Project, ); }; }; + A5A42D4935209BCAEF68858EB72BD4F6 /* FIRCLSSymbolResolver.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FD002B29C0EB41C532916678D2C2308 /* FIRCLSSymbolResolver.h */; settings = {ATTRIBUTES = (Project, ); }; }; + A5D189FBBABB2C21CC5E9D6D7E257BDD /* crashlytics.nanopb.c in Sources */ = {isa = PBXBuildFile; fileRef = A7FE293EA89F6DA186AA827D6959534C /* crashlytics.nanopb.c */; }; + A61C9CEABC2BD9CDE10CF7CE4800D7E9 /* FIRCLSDataCollectionToken.m in Sources */ = {isa = PBXBuildFile; fileRef = CC97D9CD7CBD9878F6316ABC729054EC /* FIRCLSDataCollectionToken.m */; }; + A6A480CC48505EBECC2B62C2EA13430C /* FBLPromise+Do.h in Headers */ = {isa = PBXBuildFile; fileRef = 2667A19A553EFAE25C536FD28C56B5E1 /* FBLPromise+Do.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A6A5335CC4712103CE1F38EE239F96D8 /* GULNetworkInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 85407414E799656985846E4B52CA9B0E /* GULNetworkInfo.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A6DFB4B904231EC684C43E2F00F97312 /* FIRInstallationsStore.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F55D58A85A745DCC23FC647F2E05FA6 /* FIRInstallationsStore.h */; settings = {ATTRIBUTES = (Project, ); }; }; + A6F3421F005F855880FAF68557A717F9 /* FIRAppInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = F171CB55C4DBA6415F005DEAB04C9068 /* FIRAppInternal.h */; settings = {ATTRIBUTES = (Project, ); }; }; + A8B30F6F9D78E88DEDB024F7DB39A947 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 417AD7AF3A1ABD80AD36ABBB64A02D20 /* PrivacyInfo.xcprivacy */; }; + A8E354927585F4787B2AF9EB70D8E095 /* FIRCLSSettingsManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 32E65117318E5B38802ACB90B12EABC5 /* FIRCLSSettingsManager.m */; }; + A8F5DB2062B75C76F6D18C2D4DCD456F /* FIRComponentContainer.h in Headers */ = {isa = PBXBuildFile; fileRef = 9CDB2DEADAF8AE9B512CF1689B83B605 /* FIRComponentContainer.h */; settings = {ATTRIBUTES = (Project, ); }; }; + A9293AC9565AFC6759E66545CF6B01F5 /* FirebaseCore-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F22C18A0CA273B8861C3083DECB42701 /* FirebaseCore-dummy.m */; }; + A958A7EDCE3199EAB4C443C0CE8F8D27 /* HeartbeatController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EF8F75D03A0EB7CCDC0627E68E587553 /* HeartbeatController.swift */; }; + A9883A7D6D2F6E331DD1125C39515F15 /* FirebaseInstallationsInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 3D4CFAD3D4543185148C01387890F561 /* FirebaseInstallationsInternal.h */; settings = {ATTRIBUTES = (Project, ); }; }; + A99C0B633C8AAA68FC18E650229D3430 /* PromisesSwift-Promises_Privacy in Resources */ = {isa = PBXBuildFile; fileRef = 067CED0F0662BBE6DC889AEC6DAB3049 /* PromisesSwift-Promises_Privacy */; }; + A9D5A5F686D42A4B32622F26659CE75F /* CoreTelephony.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3C0783D1DCE2D70C01DE8F66368E3525 /* CoreTelephony.framework */; }; + AA4FAD29657AB8347F1081BCF7E93B71 /* cct.nanopb.h in Headers */ = {isa = PBXBuildFile; fileRef = B1E166BF8ADCC0AB4F5C5A65FDFE11CF /* cct.nanopb.h */; settings = {ATTRIBUTES = (Project, ); }; }; + AB4DFAF9E31C90C10D762E058C3B5FA7 /* ApplicationInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9964DE206F7E0A4807E94C5A5A3C077D /* ApplicationInfo.swift */; }; + AB6B258C84B14272FE111C6A9EBFFD6D /* FIRCLSFABAsyncOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = FDB288710A5819DDAF867AD51CB7C8BA /* FIRCLSFABAsyncOperation.h */; settings = {ATTRIBUTES = (Project, ); }; }; + AB6FD8CF1194EEF96E05F07A081E5ACD /* HeartbeatStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27053A773E2AD151CD813EDCB8E648B1 /* HeartbeatStorage.swift */; }; + ABB588101D6413968489A2B7B38709FD /* DevEventConsoleLogger.swift in Sources */ = {isa = PBXBuildFile; fileRef = E7176FC3E8C82A6D42D00E8741C604A3 /* DevEventConsoleLogger.swift */; }; + ABC150185072B24CB5A3B047D7E6805A /* GDTCORMetrics.h in Headers */ = {isa = PBXBuildFile; fileRef = 23F60C0F834C7294C4181CFC6FC52A9F /* GDTCORMetrics.h */; settings = {ATTRIBUTES = (Project, ); }; }; + AC2699FC73240A1F3D3F4D202FE8FE9D /* FIRCLSdSYM.m in Sources */ = {isa = PBXBuildFile; fileRef = 9AFDD3E443E85EECC92CC116A9716863 /* FIRCLSdSYM.m */; }; + AC419D8184161CD92F445524E70A161A /* FBLPromise+Wrap.h in Headers */ = {isa = PBXBuildFile; fileRef = A2A7063DD7E760FC088F71B3C13B072B /* FBLPromise+Wrap.h */; settings = {ATTRIBUTES = (Public, ); }; }; + AC599175C89ABA571244021574902E3F /* FIRCLSProcessReportOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 61DE5AAEAE501D74076AF93A500EDB32 /* FIRCLSProcessReportOperation.m */; }; + AC722BBE56CB33A94E72D20BC40A1006 /* Promise+Retry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7FFEBF54D10E73D8168D9C5FD2C3F6F1 /* Promise+Retry.swift */; }; + AC8CF44BC0193A573F4CE196220D0499 /* GDTCORStorageEventSelector.m in Sources */ = {isa = PBXBuildFile; fileRef = 0BD2DC1F13BE67B61E77456AFEDBF204 /* GDTCORStorageEventSelector.m */; }; + ACAA53257411877CE561FB476AB066A5 /* FIRAnalyticsInterop.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CF8C434D2863D02CE45275CA3243C18 /* FIRAnalyticsInterop.h */; settings = {ATTRIBUTES = (Project, ); }; }; + AD1ABF91892AA15DE03D894602D882F0 /* FIRInstallationsAuthTokenResult.h in Headers */ = {isa = PBXBuildFile; fileRef = E3C1820AFC9A8D3151C19139F6BBBB96 /* FIRInstallationsAuthTokenResult.h */; settings = {ATTRIBUTES = (Public, ); }; }; + AD90FFA4D3EDC86651E2D54F6F751E91 /* GDTCORStorageProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 8CFC8F1F8999E22D3BDE4B506CD86B3E /* GDTCORStorageProtocol.h */; settings = {ATTRIBUTES = (Project, ); }; }; + ADB12F9782FD023812EACE261C7BDED7 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = D0BE4174B095C9D224D3C446BDF9263F /* PrivacyInfo.xcprivacy */; }; + AF01834E8D7122B994C48CBCB660AB85 /* SettingsProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9D25724806D45122402178B747AE6D5 /* SettingsProtocol.swift */; }; + AF1D4A20BD9F99FCEDB2E117B070E932 /* SessionStartEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = E468EC8047B85253A3F8865A433CBDF5 /* SessionStartEvent.swift */; }; + B096BB997A3AB0265B843B3F7DD2C1CE /* FIRCLSReportUploader.m in Sources */ = {isa = PBXBuildFile; fileRef = 18F7AFFCBB981A5B6010FB86D232D553 /* FIRCLSReportUploader.m */; }; + B2507D86D9C718BD571B2C235D937401 /* GDTCOREvent.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A0F94D6EF56BEC681DF7ED04CD8DB5F /* GDTCOREvent.m */; }; + B2A8B64BBEBEA27713A702AB7DCEE0AF /* GDTCORFlatFileStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = 7705F842EADF3AF5994BB27C1F4EDCEB /* GDTCORFlatFileStorage.m */; }; + B2BE7696FEC99184B2D953DEB9704E93 /* FIRCLSOnDemandModel_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 5498B35700C70EF67D8D2393D70B227E /* FIRCLSOnDemandModel_Private.h */; settings = {ATTRIBUTES = (Project, ); }; }; + B339ECE81D227F0A2BD41B6F07E62D57 /* external_privacy_context.nanopb.c in Sources */ = {isa = PBXBuildFile; fileRef = F6D312C64B38571DC21E8F9A57E23BC2 /* external_privacy_context.nanopb.c */; }; + B35DFBDB89DFDC118AB1177B71FEEA83 /* FIRCLSDemangleOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = E87FCB761D062C05C7C44413916A46C2 /* FIRCLSDemangleOperation.h */; settings = {ATTRIBUTES = (Project, ); }; }; + B46CC333BED069A7365B7831B7BEAA17 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 411C572D658946450319E3438E61FBCC /* Foundation.framework */; }; + B4B888E4F1A8B14A944AE4CC8656C556 /* WeakContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 71A7D5A7EA6A59D1467FEAB5392F46A5 /* WeakContainer.swift */; }; + B4E5A3B187AD55E00F1CD85AAC23E8C8 /* FIRCLSNetworkOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 85933203B5A2100972719926F7272D99 /* FIRCLSNetworkOperation.h */; settings = {ATTRIBUTES = (Project, ); }; }; + B57162BB3649BD2BB97029D08C705E19 /* FirebaseSessions-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 15ABC8AE36399535577898CA8432E164 /* FirebaseSessions-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B5FE2A5AEEBDAFF7BC4F02F2677F0DCE /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 619E6A45528E9255637879488FB26EDF /* Security.framework */; }; + B619CB521D8C6E6BFC1A10063ECD06F2 /* GDTCORReachability.h in Headers */ = {isa = PBXBuildFile; fileRef = 08105A73A76E1C926DE8ABFB274329C5 /* GDTCORReachability.h */; settings = {ATTRIBUTES = (Project, ); }; }; + B6E39097F5842A205D36E12A278580CA /* FIRCLSDemangleOperation.mm in Sources */ = {isa = PBXBuildFile; fileRef = 43635576C595B52CD10CBDCAAF2582A9 /* FIRCLSDemangleOperation.mm */; }; + B73F323E869CC5EEF30BBF61193CA448 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 42AD263E90CFB2730F35106BAEA86DAA /* PrivacyInfo.xcprivacy */; }; + B76C1FA257183B17B76CAD30ADBA7065 /* Promise+Wrap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 814F15E776B7574CC9CFD92A4EA9D982 /* Promise+Wrap.swift */; }; + B85D750662D7E40EF29DD08AB00E3929 /* GDTCOREvent+GDTMetricsSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = B9521C0C3DEB6B0A3CB8AEB4D34BD281 /* GDTCOREvent+GDTMetricsSupport.h */; settings = {ATTRIBUTES = (Project, ); }; }; + B89E58AAA80E228AF70F10A47D82090A /* GDTCORRegistrar.h in Headers */ = {isa = PBXBuildFile; fileRef = 80AB68E0240AA5FC233F16FBB3EFA199 /* GDTCORRegistrar.h */; settings = {ATTRIBUTES = (Project, ); }; }; + B8DA6EBE31492BB2C21E1FE868828371 /* FIRCLSReportAdapter.m in Sources */ = {isa = PBXBuildFile; fileRef = 814C6F9EC0C621F3CE4C609C316FFDDE /* FIRCLSReportAdapter.m */; }; + B90D31C255FBD297D6FFAC7AA30AEBCE /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = B4FC404DBDCF212DDC60060CF5D047C4 /* PrivacyInfo.xcprivacy */; }; + B9BF0F0B3DDD6C1B86EF3221AB9C1B5C /* GDTCORLifecycle.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BB4CA31F7DE998710ABCE65AA36AA77 /* GDTCORLifecycle.m */; }; + BBA0883AC96B78C1306EAFE4B4FC2285 /* FIRLogger.h in Headers */ = {isa = PBXBuildFile; fileRef = 405A27AA81B7BAD6FB4DEE0CF6DA5DD7 /* FIRLogger.h */; settings = {ATTRIBUTES = (Project, ); }; }; + BBC78E187B4246D27AB0CDAD6348A415 /* FIRCLSConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = A457DFA45654B3D1C0EA9565B2811B97 /* FIRCLSConstants.h */; settings = {ATTRIBUTES = (Project, ); }; }; + BBFD72C68DC588218C5BF7B088985778 /* FBLPromise+Catch.m in Sources */ = {isa = PBXBuildFile; fileRef = BD69F3E097F350F66676D92EA232D4EE /* FBLPromise+Catch.m */; }; + BC248F24375838DEEEDC25471C3E0252 /* FIRInstallationsAuthTokenResultInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF4E73A914FD06A61DC68D60806B05D /* FIRInstallationsAuthTokenResultInternal.h */; settings = {ATTRIBUTES = (Project, ); }; }; + BC65CAF9073F1E8C94B1CE22E34DF9DA /* FIRHeartbeatLogger.h in Headers */ = {isa = PBXBuildFile; fileRef = 07A40BB09AB8BA963D4F2C0E6D52ED80 /* FIRHeartbeatLogger.h */; settings = {ATTRIBUTES = (Project, ); }; }; + BCDB8F9DEB39E43A15DA06DF60854478 /* GDTCORUploadBatch.h in Headers */ = {isa = PBXBuildFile; fileRef = E81048105F15BD6D03DCAD86C4DF41EB /* GDTCORUploadBatch.h */; settings = {ATTRIBUTES = (Project, ); }; }; + BD591A368424B18143A83ECD6C35FA4C /* RemoteConfigConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7DCE9F08C6622DCED9A2D3899A8A4F8A /* RemoteConfigConstants.swift */; }; + BDCE6106F40DB1C0FD6946F930B6864E /* GDTCORTargets.h in Headers */ = {isa = PBXBuildFile; fileRef = C0563836D0790B15FD3F7D2C1158652A /* GDTCORTargets.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BE06C2F35DD79E93083E4900F1B2FFCA /* FIRCLSAsyncOperation_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = F064E9645A9CE6DABD7C6FCEB9B64BC1 /* FIRCLSAsyncOperation_Private.h */; settings = {ATTRIBUTES = (Project, ); }; }; + BE4B3385AC375EE06559BE988F853C11 /* Time.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBCCC4A3D65B7FB65B4F76FAA082C371 /* Time.swift */; }; + BE4CD650F1DD0A5B6D235C313ECCBD64 /* FBLPromise+Await.h in Headers */ = {isa = PBXBuildFile; fileRef = 0512EB7FA415200AAB243C0ADFE21930 /* FBLPromise+Await.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BE59BCF4E78D2054D022D96E5D1D3FB3 /* FIRCLSThreadArrayOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F1393803DCB326B4FAA0DC80356DF7D /* FIRCLSThreadArrayOperation.m */; }; + BE775B47CC9A673C86241D85FB9164C5 /* EncodedRolloutAssignment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BDBD876705B47F9B901833DA8212529 /* EncodedRolloutAssignment.swift */; }; + BFC13BFF16CA927D57B84110566226B9 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 619E6A45528E9255637879488FB26EDF /* Security.framework */; }; + C03D9768A05ECDD7831D3F0B4D95BBC5 /* GDTCCTCompressionHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CE156EDC12BD8E274F2EE03CECE7641 /* GDTCCTCompressionHelper.m */; }; + C0D8F6C7FC4ADF881BD47CDD09FD6F78 /* SessionCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8135B6E93577320E09B1461F350D6897 /* SessionCoordinator.swift */; }; + C183322903177EA59850B20F94D97CB8 /* FirebaseInstallations.h in Headers */ = {isa = PBXBuildFile; fileRef = 3E9FBDDA48E48B547C7C0727E2294D88 /* FirebaseInstallations.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C1C3C33281A565AA925AD9037AEF50A7 /* FIRInstallationsBackoffController.h in Headers */ = {isa = PBXBuildFile; fileRef = FA066B48AB9828479114868B51D5FCB5 /* FIRInstallationsBackoffController.h */; settings = {ATTRIBUTES = (Project, ); }; }; + C1CA132E0CBF72384291054E1CA2AEBD /* FIRBundleUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = DD78237C3212BBFE1C92D8C64700F363 /* FIRBundleUtil.m */; }; + C2E5F9421D107C19DADFBC625A9A3339 /* GDTCOREvent.h in Headers */ = {isa = PBXBuildFile; fileRef = 9BA693F5FC03A8325517A09E3C4D1493 /* GDTCOREvent.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C3E222FE768F475273899C65CB7282A6 /* sessions.nanopb.c in Sources */ = {isa = PBXBuildFile; fileRef = C0DD38F422EEE1A5E8A79935AB1AA169 /* sessions.nanopb.c */; }; + C42F45102AB280B4CA9255F1549626AE /* FIRInstallationsAPIService.h in Headers */ = {isa = PBXBuildFile; fileRef = D17C5993C3025211E5829910536ABC30 /* FIRInstallationsAPIService.h */; settings = {ATTRIBUTES = (Project, ); }; }; + C737825926984F0CF47C0B0F189FDF87 /* GoogleUtilities-GoogleUtilities_Privacy in Resources */ = {isa = PBXBuildFile; fileRef = 44E291D18340EAC3F761346198515323 /* GoogleUtilities-GoogleUtilities_Privacy */; }; + C73AA099611ACD9C596C2A0BA1F91CA3 /* FIRInteropEventNames.h in Headers */ = {isa = PBXBuildFile; fileRef = 017F5BFF2516DEAE325B5310B6A7C52B /* FIRInteropEventNames.h */; settings = {ATTRIBUTES = (Project, ); }; }; + C9591B01A97199177CE1C5244345FFD6 /* FIRCLSContextInitData.m in Sources */ = {isa = PBXBuildFile; fileRef = D9E10F2DE71DAC0176088B4BD7AAAF40 /* FIRCLSContextInitData.m */; }; + C974441E3088753CA0052B09C36C2FD8 /* FIRCLSFeatures.h in Headers */ = {isa = PBXBuildFile; fileRef = A51C7180F539F77E2D031E2EA01DD503 /* FIRCLSFeatures.h */; settings = {ATTRIBUTES = (Project, ); }; }; + CA594015447F28227A955E5FCE88C4C1 /* FirebaseSessionsError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D9D9A9AE6965458892201A240625ACD /* FirebaseSessionsError.swift */; }; + CAFFAF927A515064D7FC8F1668CE0844 /* FirebaseInstallations-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = D0A345A32D6751F30E85551315CE72F4 /* FirebaseInstallations-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CC85673A36DB9EC976AF7443ABA44DF2 /* SessionGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AAF8D43168DE149305848C3B443685D /* SessionGenerator.swift */; }; + CCE6750E1B50DA5E5D32E7B258A66BD0 /* SettingsCacheClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03333240DE76A905DBD22FCD540869A9 /* SettingsCacheClient.swift */; }; + CD25622DF8C812C65BF6E7FEE1CDB832 /* FIRInstallationsStoredItem.h in Headers */ = {isa = PBXBuildFile; fileRef = EB966C4A2F7D24BB8E0E875535E70D1C /* FIRInstallationsStoredItem.h */; settings = {ATTRIBUTES = (Project, ); }; }; + CD2B03D02B22C5547E0EB1028DB31970 /* IsAppEncrypted.m in Sources */ = {isa = PBXBuildFile; fileRef = 3ED2C548E8AF0C8CF19C444FAAA9E1F5 /* IsAppEncrypted.m */; }; + CDECB5D1ED07F5624019A85CCC1E29C8 /* FirebaseCoreExtension-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = DDCF1D3203DC57B5D9103D0F15379868 /* FirebaseCoreExtension-dummy.m */; }; + CEC2B3E4DC18511BF86E251EB8FC74E5 /* FirebaseCoreInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 8C4C6536679FF5808BEE94412E4735F6 /* FirebaseCoreInternal.h */; settings = {ATTRIBUTES = (Project, ); }; }; + CF1175A05670DB5293660C30F26223BC /* GULReachabilityMessageCode.h in Headers */ = {isa = PBXBuildFile; fileRef = EBBC7C64FA0F8C32203AC58709DC182B /* GULReachabilityMessageCode.h */; settings = {ATTRIBUTES = (Project, ); }; }; + CFB16F56A7D7186D601BFFF5B4E39D61 /* GULNetworkURLSession.h in Headers */ = {isa = PBXBuildFile; fileRef = FF5C90394FFA709E28101D1185CB62A7 /* GULNetworkURLSession.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D0C50DB9F9ECDA1E3FE4D704838D485A /* IsAppEncrypted.h in Headers */ = {isa = PBXBuildFile; fileRef = CFEAEBE26866A8878F06A26FF49B5831 /* IsAppEncrypted.h */; settings = {ATTRIBUTES = (Project, ); }; }; + D0F6BBBA252A0E0155EF6EB0CB5F09C4 /* GDTCOREventDataObject.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C8D3D0BDAA8FB49A5D4E2C21B23881D /* GDTCOREventDataObject.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D14517641061AC41A694AD3264FE4041 /* FIRInstallations.h in Headers */ = {isa = PBXBuildFile; fileRef = EB90473E82103B7D0EF1396D1445EDA6 /* FIRInstallations.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D146E1C62F26E6DD90E2697CBB37A8BF /* GULKeychainStorage.h in Headers */ = {isa = PBXBuildFile; fileRef = F713A3A781624E48724F66E707E2984D /* GULKeychainStorage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D17C0839652445A6173073FE0D6C5337 /* FIRCLSUnwind.c in Sources */ = {isa = PBXBuildFile; fileRef = AE8FF765072302853E758B7BE874C87A /* FIRCLSUnwind.c */; }; + D1CD3A6817E5A9FC89055DCDF71F26AB /* Promise+Testing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 595434D29B28CB61FFFE7415233145DD /* Promise+Testing.swift */; }; + D2322362B88E43084653CE0C1ED6AFA5 /* _ObjC_HeartbeatsPayload.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7FDF38235B4F6D889DB018F7596B27C /* _ObjC_HeartbeatsPayload.swift */; }; + D2CF4520FE42CD0C57C0F17A190EE8D2 /* RolloutAssignment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68CF38C58D90C2F94CCA4118B4C034CC /* RolloutAssignment.swift */; }; + D2D746617C80038D4FC7B7E70E13BBD2 /* Promise+Any.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6EA2E08F7B2B7C8266C021F934BB764 /* Promise+Any.swift */; }; + D3A0FEC8AEAC6CAEC38EB86AB2A30F1C /* FIRCLSThreadState.c in Sources */ = {isa = PBXBuildFile; fileRef = 12F21DBE304707FF6CE2EAF4CE7A4EF8 /* FIRCLSThreadState.c */; }; + D3ACF29E7ED1ADD11C3468216E7CE09C /* FIRCLSSerializeSymbolicatedFramesOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = BD4A67DEF8B578F26F206004B017DEA3 /* FIRCLSSerializeSymbolicatedFramesOperation.h */; settings = {ATTRIBUTES = (Project, ); }; }; + D4F55174024B0A87671B1E75E20E578C /* FBLPromise.m in Sources */ = {isa = PBXBuildFile; fileRef = FB5A222454C158DFF4282699459141CA /* FBLPromise.m */; }; + D590FE30FAAE24BF46B44EF2DA5634AF /* StorageFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F7F89196A1000F92ED359A936B94564 /* StorageFactory.swift */; }; + D5B2C527D261870C0B319388FECC53DD /* FIRCLSCrashedMarkerFile.h in Headers */ = {isa = PBXBuildFile; fileRef = C5D9AA0D80C027A086260C9A65AF5191 /* FIRCLSCrashedMarkerFile.h */; settings = {ATTRIBUTES = (Project, ); }; }; + D6163F73BC0B2776F5D46A1A32A47B32 /* FIRCLSInstallIdentifierModel.m in Sources */ = {isa = PBXBuildFile; fileRef = B21C17A0C7530C3AC5A41DCFD7232B69 /* FIRCLSInstallIdentifierModel.m */; }; + D67BDC6DBFCB5E79D45575B2A715F194 /* compliance.nanopb.h in Headers */ = {isa = PBXBuildFile; fileRef = 566D45DD6426EDBEE7BA301FD8383537 /* compliance.nanopb.h */; settings = {ATTRIBUTES = (Project, ); }; }; + D778204FA9C39D3CD284AE34D9C57561 /* FIRCLSApplication.m in Sources */ = {isa = PBXBuildFile; fileRef = DEC0CBFF3AEC373BCF6CE57E7513755A /* FIRCLSApplication.m */; }; + D7C455295388AAEBFEAA7259900C4AD7 /* SessionsProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 623D13AE11D7ADBF6E124D5F2F6A0102 /* SessionsProvider.swift */; }; + D7E998FB582BCB3C5A0B17BCDD0E0C8A /* Promise+Delay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3707E61A67EC8D0959FEED9B3939A5FC /* Promise+Delay.swift */; }; + D8034B6F59B5C62FB53866C337D40880 /* FIRCLSFileManager.h in Headers */ = {isa = PBXBuildFile; fileRef = B63B8E13FA9721DBEE5E31F976C20935 /* FIRCLSFileManager.h */; settings = {ATTRIBUTES = (Project, ); }; }; + D811F3A64399C00CCFF5DFB774502EF7 /* GULMutableDictionary.h in Headers */ = {isa = PBXBuildFile; fileRef = 626F5919EC4E5EA22A0ED424E151A745 /* GULMutableDictionary.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D83C33087921CA88A4184D7E752C9B7A /* FIRCLSCompactUnwind.c in Sources */ = {isa = PBXBuildFile; fileRef = 7CD1A0A0766F6DCBD1A7C5490746BD0F /* FIRCLSCompactUnwind.c */; }; + D9145A28576376B4403FC0AC0DD26704 /* FIRCLSSymbolResolver.m in Sources */ = {isa = PBXBuildFile; fileRef = FFC6EADF4B6C2CC4616BEE1E42AEF5A4 /* FIRCLSSymbolResolver.m */; }; + D97B5FCA31078C5FA63D0D1363F8793E /* external_prequest_context.nanopb.h in Headers */ = {isa = PBXBuildFile; fileRef = 533A1C390C27BFCA44BDC78888B6C6A9 /* external_prequest_context.nanopb.h */; settings = {ATTRIBUTES = (Project, ); }; }; + D9C802FC5E931B7CD4DC40497F3DCA17 /* FirebaseRemoteConfigInterop-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 62762D87583BCC32FEFB6F9972282910 /* FirebaseRemoteConfigInterop-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DA3ECF9B0B0387D0D866D17C8A9921D0 /* FBLPromise+All.h in Headers */ = {isa = PBXBuildFile; fileRef = 2D3BFB61D14A873B97B65B981C8A1E27 /* FBLPromise+All.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DAF67810EB208F691AF76E40C87C148B /* FIRSESNanoPBHelpers.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB4B9D4457810F91752A8B8397D1004 /* FIRSESNanoPBHelpers.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DB36A6680516D5D15A64397D87CA4F2F /* SessionsSubscriber.swift in Sources */ = {isa = PBXBuildFile; fileRef = 227EB971EFD84A9CB75C423F9C85FFCB /* SessionsSubscriber.swift */; }; + DBAE0767EBF4DF98F21A123B8E97CEFA /* FIRCLSNetworkResponseHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 93AD81543696806262AD4DE414D50B3C /* FIRCLSNetworkResponseHandler.h */; settings = {ATTRIBUTES = (Project, ); }; }; + DBF255B0F6FB75012B26271370517880 /* FIRInstallationsItem.h in Headers */ = {isa = PBXBuildFile; fileRef = 52683691D0E142C39D15CA2DA8D5E237 /* FIRInstallationsItem.h */; settings = {ATTRIBUTES = (Project, ); }; }; + DC1A6C258524398E4050A82953AA73D8 /* FirebaseRemoteConfigInterop-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 0C3B2FBA5A25BA631AE76607BCEC0FF8 /* FirebaseRemoteConfigInterop-dummy.m */; }; + DCC1D914B8635153EF79671172B0F9D4 /* FIRCLSUnwind_arm.c in Sources */ = {isa = PBXBuildFile; fileRef = 5B01756129B6690A81409AE25328118D /* FIRCLSUnwind_arm.c */; }; + DD32A03DDA9BA8B44788950A70D31423 /* FIRCLSContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 6E77A4773E824C1D7A5DC5B725A71C00 /* FIRCLSContext.h */; settings = {ATTRIBUTES = (Project, ); }; }; + DD34A2100E0A2750F0BD2A9C280F374D /* GDTCORTransport.h in Headers */ = {isa = PBXBuildFile; fileRef = B6CC975F9C0616F8F8A37C42A76CB016 /* GDTCORTransport.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DD6B443181389B19CB9732744E40C6D0 /* FIRCLSSymbolicationOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 5E80B7130BC2F64202AB13497088153E /* FIRCLSSymbolicationOperation.m */; }; + DD88079D1AAB7534AF8926BBF6169337 /* FBLPromise+Async.m in Sources */ = {isa = PBXBuildFile; fileRef = 27A34803725F8490A9C6BD206E0206F0 /* FBLPromise+Async.m */; }; + DE28E0B4B0688F862B79B8083D10A51A /* GULLoggerLevel.h in Headers */ = {isa = PBXBuildFile; fileRef = C9316FE183C97664C3C149529E5C07F5 /* GULLoggerLevel.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DEC410E13A113AEC0A26D97BAE90F8DA /* FIRComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 73F2669B8E97E07B1E986EEDDCD1E20F /* FIRComponent.h */; settings = {ATTRIBUTES = (Project, ); }; }; + DF10BD3B1246EC7E21A2802C4234F85A /* FIRCLSSerializeSymbolicatedFramesOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 7F76AAD62A4A84BFE0581D0C7BEE8E7F /* FIRCLSSerializeSymbolicatedFramesOperation.m */; }; + DF19D2C784FD3B352765E99ADF612F6F /* FIRHeartbeatLogger.h in Headers */ = {isa = PBXBuildFile; fileRef = 8555E7FB469BD55854B5C570D91A9260 /* FIRHeartbeatLogger.h */; settings = {ATTRIBUTES = (Project, ); }; }; + DF21EF2EA3BB8AC586DA00B67794D96E /* GoogleDataTransport.h in Headers */ = {isa = PBXBuildFile; fileRef = C2F589B34C8A36EB6A6FD8C5BE6C91B0 /* GoogleDataTransport.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DF598F7A905E1A185FCE93A095C67E2B /* FIRInstallations.m in Sources */ = {isa = PBXBuildFile; fileRef = 42214B91DB94A8BCA9AAB752EC20709C /* FIRInstallations.m */; }; + E02952277C6FF8D868D1FC389D399291 /* FBLPromise+Then.m in Sources */ = {isa = PBXBuildFile; fileRef = 32F3BA2F0DB35120F3D33522356ED250 /* FBLPromise+Then.m */; }; + E032DC89486E8C04F9018D6DB76C6675 /* FIRInstallationsIDController.m in Sources */ = {isa = PBXBuildFile; fileRef = 490E7AB6DEADBE4BCBF1E69C4ACD9309 /* FIRInstallationsIDController.m */; }; + E038F7B639D0E56F4CB91590A7C882AA /* FIRCLSProcess.c in Sources */ = {isa = PBXBuildFile; fileRef = 0C0E1B45CC38811401D3E98AC998434C /* FIRCLSProcess.c */; }; + E1253F2DD86DFEC475F68CE8EF40925F /* GDTCOREvent+GDTCCTSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = 786BBAD049118554013D53C283077CE3 /* GDTCOREvent+GDTCCTSupport.h */; settings = {ATTRIBUTES = (Project, ); }; }; + E169350B7F0E6EFA584A2D4C9A79DC1E /* FIRInstallationsIIDStore.m in Sources */ = {isa = PBXBuildFile; fileRef = 745DF6128BC6D033E47AC4CB341C6742 /* FIRInstallationsIIDStore.m */; }; + E1E195E36CF477D73E68053A2C5D23FA /* FIRLibrary.h in Headers */ = {isa = PBXBuildFile; fileRef = EA41D8F1297358F48A5C6FE9595C51F2 /* FIRLibrary.h */; settings = {ATTRIBUTES = (Project, ); }; }; + E242BC13FA8E04EA832E80A69C2B9670 /* FIRCLSSettings.h in Headers */ = {isa = PBXBuildFile; fileRef = 087E8D30407214C477A95FDD49C95C30 /* FIRCLSSettings.h */; settings = {ATTRIBUTES = (Project, ); }; }; + E2DE213ABB0254BB85C90BA3A68E057E /* FBLPromise+Timeout.h in Headers */ = {isa = PBXBuildFile; fileRef = 515E118D1F0F59CF24FADB24403C9AFF /* FBLPromise+Timeout.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E2E9BC8C14A384472C03365A45122F83 /* pb_encode.h in Headers */ = {isa = PBXBuildFile; fileRef = C5FAE066E74E99A94391144BF5040B24 /* pb_encode.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E319C831EC32D784B9593FC12FA4E635 /* FIRCLSProcess.h in Headers */ = {isa = PBXBuildFile; fileRef = C59A87359F467A1852B31CCDA105CB12 /* FIRCLSProcess.h */; settings = {ATTRIBUTES = (Project, ); }; }; + E3497EDC2DD0B95E3348C1D59C06AE89 /* FIRCLSSettingsManager.h in Headers */ = {isa = PBXBuildFile; fileRef = B1A4DD032645B1162F1AEC5E2E58CD69 /* FIRCLSSettingsManager.h */; settings = {ATTRIBUTES = (Project, ); }; }; + E390A9111C88164B23CE0069B5B1345F /* FIRCLSAllocate.c in Sources */ = {isa = PBXBuildFile; fileRef = B1235FF6E9EE36FD4108C0DF39A741E5 /* FIRCLSAllocate.c */; }; + E3E686B96E4FCEA44AA6661AD68B60FF /* FIRTimestampInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = A8A4062D929DD42279DA66A4A0621294 /* FIRTimestampInternal.h */; settings = {ATTRIBUTES = (Project, ); }; }; + E3F9D76A23BDE62F4611166C5B0F5F7A /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 023C0146F2CA1C566C550E62B5481D96 /* PrivacyInfo.xcprivacy */; }; + E62B299A966ECA0BD129F1F559928C76 /* GDTCORUploader.h in Headers */ = {isa = PBXBuildFile; fileRef = 810642D4AD0BBAEA549774F189FC6441 /* GDTCORUploader.h */; settings = {ATTRIBUTES = (Project, ); }; }; + E6D7B43252FB4812983E40F804ECD3E1 /* FIRCLSContextManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 616B8035F222994177E84AC8B8809C60 /* FIRCLSContextManager.m */; }; + E7006B811D42800A2C1154B3BF097678 /* FIRInstallationsErrorUtil.h in Headers */ = {isa = PBXBuildFile; fileRef = 941CD9B8673FA1E83DDB725CB3913B3A /* FIRInstallationsErrorUtil.h */; settings = {ATTRIBUTES = (Project, ); }; }; + E7CA7E4F874F4B8A5737223269786B7E /* FirebaseCrashlytics-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F10AD0456E498087BA6D047684341AB /* FirebaseCrashlytics-dummy.m */; }; + E817877B92E3179F9F06DBE84190F48D /* FIRCLSDwarfUnwind.h in Headers */ = {isa = PBXBuildFile; fileRef = 28A5D30FD1E238696F83B0BB00289AB8 /* FIRCLSDwarfUnwind.h */; settings = {ATTRIBUTES = (Project, ); }; }; + E915EA73D04CC6A43ABF1E247D29F8F8 /* GULLoggerCodes.h in Headers */ = {isa = PBXBuildFile; fileRef = D863620CC96C7E1234821949251F1F55 /* GULLoggerCodes.h */; settings = {ATTRIBUTES = (Project, ); }; }; + E96B5291AEC756610D220D4814FDE62D /* FIRCLSExistingReportManager_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = AA8C68D02D19733F5151B2C8F193944E /* FIRCLSExistingReportManager_Private.h */; settings = {ATTRIBUTES = (Project, ); }; }; + E9945D7AC33F2F715442F8555A508658 /* FIRCLSOnDemandModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 7699E36A6CA8F5B111B31CF18A31EE6D /* FIRCLSOnDemandModel.m */; }; + EB06F2FD948319F611E0D5227F13E941 /* FIRCLSHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 4ADC1FD14195B521394962C3B98DD910 /* FIRCLSHandler.h */; settings = {ATTRIBUTES = (Project, ); }; }; + EB5DDE117AE54AF4193A66EDAEFC8595 /* FIRStackFrame.m in Sources */ = {isa = PBXBuildFile; fileRef = 84FC089496B0A9AB12314969A2DE2B5E /* FIRStackFrame.m */; }; + EB766AF23A9FE7A967742B7017FCECD1 /* FIRCLSInstallIdentifierModel.h in Headers */ = {isa = PBXBuildFile; fileRef = 23FD42DA48CB04E5A2EC2FCAD6972449 /* FIRCLSInstallIdentifierModel.h */; settings = {ATTRIBUTES = (Project, ); }; }; + EBD1C33D9B1037D13D181CA0025C77A9 /* FirebaseCoreInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = E9E0EA70CA46474BC6ACFCF4EEC7478A /* FirebaseCoreInternal.h */; settings = {ATTRIBUTES = (Project, ); }; }; + EBDD860E99D8088AD4206F8A841A0FD8 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 619E6A45528E9255637879488FB26EDF /* Security.framework */; }; + EC48E1AAF6D4E9A8CFF82BD4F9EFCC46 /* FIRComponentContainer.h in Headers */ = {isa = PBXBuildFile; fileRef = B6F49F6EF0F81B01765B056A8B012A04 /* FIRComponentContainer.h */; settings = {ATTRIBUTES = (Project, ); }; }; + ECAFFCFC9C1FEC1677D6B64965C13ED2 /* FIRCLSDataCollectionArbiter.h in Headers */ = {isa = PBXBuildFile; fileRef = C2ED107AE0C240089F516E47ED83A3F8 /* FIRCLSDataCollectionArbiter.h */; settings = {ATTRIBUTES = (Project, ); }; }; + ECDF258DA8B84CE3808644F0727DB770 /* FIRInteropParameterNames.h in Headers */ = {isa = PBXBuildFile; fileRef = 93C37CDFEB5DFF48E588D628FC88FA86 /* FIRInteropParameterNames.h */; settings = {ATTRIBUTES = (Project, ); }; }; + ED349D74640C5EE5D50D7BDBEFA99745 /* FBLPromise+Then.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C459FCCE5F0DF8A0314184C5409BBF8 /* FBLPromise+Then.h */; settings = {ATTRIBUTES = (Public, ); }; }; + ED54C348808DAD6561E4A3C3FB631127 /* PromisesSwift-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 402886C04939EE92BEDD4A62AAB68BE7 /* PromisesSwift-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EDF3828C5D3E008F81017AA539235EB8 /* RemoteSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25B6C2F45A00178B8E1249CB254B52F9 /* RemoteSettings.swift */; }; + EE40FD76E243F55312A38EEB6448E91A /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 8AD7EDA47090667D1A46D0D6BA5EB7B2 /* PrivacyInfo.xcprivacy */; }; + EE5D6707A915C51EAD35CAF633F1775E /* FIRInstallationsIIDStore.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A2FC9AB94A757BD3026F9151C2D7D4 /* FIRInstallationsIIDStore.h */; settings = {ATTRIBUTES = (Project, ); }; }; + EEDD21FF5A34E37638F282D2B80489EA /* FIRComponentType.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C5753C964A382D2D4AC757CC424DFC2 /* FIRComponentType.h */; settings = {ATTRIBUTES = (Project, ); }; }; + EF051DF029EE9A12141757B7005F89F5 /* GDTCORAssert.m in Sources */ = {isa = PBXBuildFile; fileRef = A193BD55A0E7F7CA562C12F3F5D93A5F /* GDTCORAssert.m */; }; + EFC214036F5502CDEF96C5A542B16104 /* external_privacy_context.nanopb.h in Headers */ = {isa = PBXBuildFile; fileRef = 24F6C0552D85DB8F55623B2943F64F15 /* external_privacy_context.nanopb.h */; settings = {ATTRIBUTES = (Project, ); }; }; + EFDAAADC763677CAD9004F5DE3AA1852 /* FIRCLSInternalReport.h in Headers */ = {isa = PBXBuildFile; fileRef = B51E7D729DB4FC403626769772BDBEC4 /* FIRCLSInternalReport.h */; settings = {ATTRIBUTES = (Project, ); }; }; + F0386024A3443A322BF2A809531E0B7B /* FBLPromise+All.m in Sources */ = {isa = PBXBuildFile; fileRef = B388B00DA719EF2544EA91FDDA94FB2E /* FBLPromise+All.m */; }; + F060A9FDF787A8A912899DF9B1097F03 /* FIRCLSMachOBinary.h in Headers */ = {isa = PBXBuildFile; fileRef = FAEB7FD705F633027F8EFC2ADAB11A8D /* FIRCLSMachOBinary.h */; settings = {ATTRIBUTES = (Project, ); }; }; + F0A5403D4B384C4CB473292E076BA6BA /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 411C572D658946450319E3438E61FBCC /* Foundation.framework */; }; + F0D1FF998A997FBBB5449B21D1D978FA /* _ObjC_HeartbeatController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32DD5F8C87EC0D61474350BF65B77615 /* _ObjC_HeartbeatController.swift */; }; + F0DFF5AE65382BD85FE6077D353C3296 /* GDTCOREventDropReason.h in Headers */ = {isa = PBXBuildFile; fileRef = 2CD17B881E8A2BFAFDF09FF663B3EFED /* GDTCOREventDropReason.h */; settings = {ATTRIBUTES = (Project, ); }; }; + F116EB3DF8F9D8BC3F097E54650B735A /* FIROptions.h in Headers */ = {isa = PBXBuildFile; fileRef = D463F5B89599530250694EBA7C8A4277 /* FIROptions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F15DBB9C08A202BAF0F591CF639A8B72 /* FIRAppInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 026ABAC768ADF6EFAE52F6EB231566C8 /* FIRAppInternal.h */; settings = {ATTRIBUTES = (Project, ); }; }; + F1BEA81550E77F6730B861A768778A34 /* FIRCLSApplication.h in Headers */ = {isa = PBXBuildFile; fileRef = 8CABCB98EE7D2FF1C51B2CFD2805562C /* FIRCLSApplication.h */; settings = {ATTRIBUTES = (Project, ); }; }; + F2375C10EF8FE2CCF181212D6907FE04 /* FBLPromise.h in Headers */ = {isa = PBXBuildFile; fileRef = B553EF71B83E67C6F54E7914C48BD838 /* FBLPromise.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F2CE87A578929DC63B552E6589FDE075 /* FIRInstallationsItem+RegisterInstallationAPI.h in Headers */ = {isa = PBXBuildFile; fileRef = 6DD5E6DDDEDC478DF62822EB79509201 /* FIRInstallationsItem+RegisterInstallationAPI.h */; settings = {ATTRIBUTES = (Project, ); }; }; + F31756354D6ACB5D3C57890158B81F39 /* GULLogger.h in Headers */ = {isa = PBXBuildFile; fileRef = 9AD0850C0803DAB13E0E081B07845B91 /* GULLogger.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F37872903354C07DA3F20A9362722793 /* dwarf.h in Headers */ = {isa = PBXBuildFile; fileRef = DB7B79608541CAA0781D104C2AE25E04 /* dwarf.h */; settings = {ATTRIBUTES = (Project, ); }; }; + F4269AA43900D81CA10CDBF088EEC0A0 /* FBLPromise+Retry.m in Sources */ = {isa = PBXBuildFile; fileRef = 0FE91634D96250807ECE1F66622CFAC2 /* FBLPromise+Retry.m */; }; + F4610468A7F9259FB21E9A01D280CF32 /* GDTCORMetrics+GDTCCTSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = 758F93EFBC31D5CA2CBB4CF6B2C95B64 /* GDTCORMetrics+GDTCCTSupport.h */; settings = {ATTRIBUTES = (Project, ); }; }; + F4A1FBED4F8F44C71E662D93AFE49DF6 /* FIRInstallationsAPIService.m in Sources */ = {isa = PBXBuildFile; fileRef = D4C5CBE11163C6511EE7ED28D41665C5 /* FIRInstallationsAPIService.m */; }; + F58544FB78423DB5F260CB3044A99216 /* FIRCLSFABHost.h in Headers */ = {isa = PBXBuildFile; fileRef = 8438C9207D6070E9DCBB4B51309E2444 /* FIRCLSFABHost.h */; settings = {ATTRIBUTES = (Project, ); }; }; + F5BE05EAEA0D5EEA5209007E85D90E99 /* FIRLogger.h in Headers */ = {isa = PBXBuildFile; fileRef = 095526FC8C58547FC9AFAC3FA4146344 /* FIRLogger.h */; settings = {ATTRIBUTES = (Project, ); }; }; + F5DE3E5DB7C696843303CBD8BE0BB404 /* SettingsDownloadClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74050BBEB3A02EC7C964E0F4B4AFC8BA /* SettingsDownloadClient.swift */; }; + F75685672CFC912E487C2119F546DC5C /* SDKDefaultSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = E057788A986B47B316A6357ED7BED020 /* SDKDefaultSettings.swift */; }; + F7F3F6F640D39624FE05900C638BACC1 /* FIRCLSInternalLogging.c in Sources */ = {isa = PBXBuildFile; fileRef = A355F7EDA13E66D7A11FD7439E6D6A46 /* FIRCLSInternalLogging.c */; }; + F800A27E336628B2A3641D67EE4E4072 /* GDTCORRegistrar_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 71212E335B1881ECF4D260EEE26D4B47 /* GDTCORRegistrar_Private.h */; settings = {ATTRIBUTES = (Project, ); }; }; + F98E0FE3355BEE76FD800160FD4EE623 /* FIRCLSHost.h in Headers */ = {isa = PBXBuildFile; fileRef = A07E589DAAD31FFCB8DED3973BDCD21A /* FIRCLSHost.h */; settings = {ATTRIBUTES = (Project, ); }; }; + F9D0D939B0B060EDB5310CA8AF5BC207 /* FIRExceptionModel_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = D805237EFA8EF328F3B519266FCC9303 /* FIRExceptionModel_Private.h */; settings = {ATTRIBUTES = (Project, ); }; }; + F9E8A9F92603218E90595781D812D62E /* FIRExceptionModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 0DF97D07B88A1545D907FC37F67BA03A /* FIRExceptionModel.m */; }; + FB40F36CF9AE1EE8AD1CB84C74E5E738 /* FIRCLSMachOBinary.m in Sources */ = {isa = PBXBuildFile; fileRef = 6080C60B399A25A3911D15626DCF7711 /* FIRCLSMachOBinary.m */; }; + FBC6536B77183CAEC13BB4D8046C6F5C /* FIRInstallationsIIDTokenStore.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BE07EBFBD81CBB624867A6C2E75F4E1 /* FIRInstallationsIIDTokenStore.h */; settings = {ATTRIBUTES = (Project, ); }; }; + FD1B82372596048BB72D331926612A01 /* pb.h in Headers */ = {isa = PBXBuildFile; fileRef = F125DFC32618A9F8EFBE762F2951FF73 /* pb.h */; settings = {ATTRIBUTES = (Public, ); }; }; + FD2802682A4EA92638132BBBFA0B6465 /* FBLPromise+Timeout.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E5E160DA2A9DBD0F56F8046A8C6F028 /* FBLPromise+Timeout.m */; }; + FDADB1EE603BEE6C32355B424A9F321F /* FBLPromise+Testing.h in Headers */ = {isa = PBXBuildFile; fileRef = 0066C3DB56B36BFF30DB7B69F2804ED7 /* FBLPromise+Testing.h */; settings = {ATTRIBUTES = (Public, ); }; }; + FDD5E68F33BFCA7297075A004E0EAE0E /* FIRCLSInternalLogging.h in Headers */ = {isa = PBXBuildFile; fileRef = 6A0B50CC9CF04507E15EF2B57B633B13 /* FIRCLSInternalLogging.h */; settings = {ATTRIBUTES = (Project, ); }; }; + FE71DB58F4375D97D495A63AF0B5725C /* FIRCurrentDateProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 589A8A9E3F768B680487BE8916448D53 /* FIRCurrentDateProvider.m */; }; + FEB57B84C5166970116A8EB05AABDCE4 /* FIRCLSUUID.m in Sources */ = {isa = PBXBuildFile; fileRef = DB2BBA62CE19F6A33D6577F5944804CF /* FIRCLSUUID.m */; }; + FEEA3BF7DA87224644F9C075ED1897D2 /* RingBuffer.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC5F74E6FC92E4C96BD36A86654F80CC /* RingBuffer.swift */; }; + FEEB7F71C661C61D1B8A0F7305DAD1E3 /* GDTCCTUploadOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 2EC2D87E8B7BC61C65FE126377760DC0 /* GDTCCTUploadOperation.m */; }; + FF75A39D43BC6A9B308425FB5F2AD962 /* FIRCLSExecutionIdentifierModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 26FE2F6DAF58997316C13CC97978F5AD /* FIRCLSExecutionIdentifierModel.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 018E01B46A8AB95046DED9CB7352FFAF /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 4402AFF83DBDC4DD07E198685FDC2DF2; + remoteInfo = FirebaseCore; + }; + 090D3560E9D11997273A0D2B8DBD18B7 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 205EFBEF86DA6E7E3D5B9BABED8872EE; + remoteInfo = IronSourceSDK; + }; + 0AEDC7695709B14C07E66DFD8EB75C25 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 25E9E9A17BC3F670357D7385C521E48E; + remoteInfo = FirebaseCoreInternal; + }; + 0E9B78B542E98D758FCBD0BDD3016DB7 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 1BFBEDBF7E03729D43C96530EE190825; + remoteInfo = "PromisesObjC-FBLPromises_Privacy"; + }; + 10DAD9144B329B3D3AF0964E83849F46 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 2BBF7206D7FAC92C82A042A99C4A98F8; + remoteInfo = PromisesObjC; + }; + 112847E7D8245D4EB7F65A88A3FAA128 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 230F5EE18ECBB227C09ED2C571AFA319; + remoteInfo = "PromisesSwift-Promises_Privacy"; + }; + 118A1B042C57A03055FC1105A4220933 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 3EB14444A17F9D4F1F697F7C1FF32245; + remoteInfo = "FirebaseInstallations-FirebaseInstallations_Privacy"; + }; + 131E63DB9275F52AB6083117D780D1A9 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = DD0D41A9315A48004E57F4F0E54095F1; + remoteInfo = "GoogleDataTransport-GoogleDataTransport_Privacy"; + }; + 165CE7B3574CADAAD0790C1D0C78E34B /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = D2B5E7DCCBBFB32341D857D01211A1A3; + remoteInfo = nanopb; + }; + 168347FFF9CC0ABAB0B4FE426F0E0489 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 2949783F7EDB27AD4666B5427B63DC79; + remoteInfo = "FirebaseCoreInternal-FirebaseCoreInternal_Privacy"; + }; + 16A19C5501F6933759A8F2A7C680DF7B /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = D2B5E7DCCBBFB32341D857D01211A1A3; + remoteInfo = nanopb; + }; + 1A39224268B72A68C99502673F451DED /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = D2B5E7DCCBBFB32341D857D01211A1A3; + remoteInfo = nanopb; + }; + 1AD63F727A8ED947A7D9D53C90A531CF /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 55522A91938FF505CFEBEAD2DD85AE2D; + remoteInfo = "nanopb-nanopb_Privacy"; + }; + 1C30E3061C61AE5E62891AC0A19FB3B9 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 2BBF7206D7FAC92C82A042A99C4A98F8; + remoteInfo = PromisesObjC; + }; + 215D2B6EC1914B0CD3ACDCDEA8933340 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = FE1DE31D91C32501251AE9687CDC2E0F; + remoteInfo = FirebaseCoreExtension; + }; + 248C7027C24F088EDB1F7CB3B266D8EB /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 17CBCC6221F62B870268E935098B7D7D; + remoteInfo = "FirebaseCrashlytics-FirebaseCrashlytics_Privacy"; + }; + 26F18CBCD231DEA3718060810BF89B18 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 2BBF7206D7FAC92C82A042A99C4A98F8; + remoteInfo = PromisesObjC; + }; + 2C6CD346A33BBCE1181D5E6AEB7E0CA8 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = A2E1CD763F5748382ECFDCFBD119D430; + remoteInfo = IronSourceAdQualitySDK; + }; + 334007B11B4B2010CDA4139860A1AEA5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = A979F9D3632CD5F2F7518F9A362CBAE3; + remoteInfo = PromisesSwift; + }; + 35490FDFC77A9C2677D10528B900587A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 87803597EB3F20FC46472B85392EC4FD; + remoteInfo = FirebaseInstallations; + }; + 384B5A4E87D37200982EF4C9F8297B3C /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 4402AFF83DBDC4DD07E198685FDC2DF2; + remoteInfo = FirebaseCore; + }; + 3CCE50973982D90C58D623CAC6DAEC8E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 2BBF7206D7FAC92C82A042A99C4A98F8; + remoteInfo = PromisesObjC; + }; + 3E6931CB0F943CC68E1F279C4A443F5A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 8D7F5D5DD528D21A72DC87ADA5B12E2D; + remoteInfo = GoogleUtilities; + }; + 417B7FE84E917D047F7B19051330EEB6 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 26309F9D4DF43E362A8AF6A93B41FF6D; + remoteInfo = GoogleAdsOnDeviceConversion; + }; + 442C72C1DF5C7E2DA7861DC0441050AD /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 4317F1CA49C4682E275F7D8FF912FAD2; + remoteInfo = "IronSourceAdQualitySDK-IronSourceAdQualityPrivacyInfo"; + }; + 44521A4A53B13D382C6474279F165CEA /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 8D7F5D5DD528D21A72DC87ADA5B12E2D; + remoteInfo = GoogleUtilities; + }; + 4703F08886E699BBD457E8784A953A23 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = C49E7A4D59E5C8BE8DE9FB1EFB150185; + remoteInfo = FirebaseAnalytics; + }; + 4B2E72074A2C0203AFD32D9C2988FE08 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 526C4398D095B3704EB933DADBC30093; + remoteInfo = FirebaseCrashlytics; + }; + 4DDBFC47370FB5E5DBBCFA9D9730D78C /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = B53D977A951AFC38B21751B706C1DF83; + remoteInfo = GoogleAppMeasurement; + }; + 4DEAD30847DFA1371EA8028BB5DC465B /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 4402AFF83DBDC4DD07E198685FDC2DF2; + remoteInfo = FirebaseCore; + }; + 5080A78383408B47D9ABACBA5EEFBA6E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = A979F9D3632CD5F2F7518F9A362CBAE3; + remoteInfo = PromisesSwift; + }; + 572951F34C407CA98B317105770EE8D8 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 8D7F5D5DD528D21A72DC87ADA5B12E2D; + remoteInfo = GoogleUtilities; + }; + 5D67FE3F614F8618A9222511F30FB52B /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = B53D977A951AFC38B21751B706C1DF83; + remoteInfo = GoogleAppMeasurement; + }; + 5DDAA350440DA03BF994E987753013B2 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = D2B5E7DCCBBFB32341D857D01211A1A3; + remoteInfo = nanopb; + }; + 5ECC3C7C666FC1E215484E3F77D1E04F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 4402AFF83DBDC4DD07E198685FDC2DF2; + remoteInfo = FirebaseCore; + }; + 62A06F8508A7670635A04652CF34C1B1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 1001C16510D946B47CFF8B19DBC0B787; + remoteInfo = "FirebaseCore-FirebaseCore_Privacy"; + }; + 653871C14A97AB4FD09D70364EC3EF4A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 5FF1A58DEEC5DB749FCD6C120B97CC82; + remoteInfo = "GoogleUtilities-GoogleUtilities_Privacy"; + }; + 68BB89BFE02AC2BEBFB6A44157B89DF8 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 8D7F5D5DD528D21A72DC87ADA5B12E2D; + remoteInfo = GoogleUtilities; + }; + 6BAA1D6F714068ECE90C9D49D4B52E82 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 8D7F5D5DD528D21A72DC87ADA5B12E2D; + remoteInfo = GoogleUtilities; + }; + 71A86E040A2659303BD18DD1BCE8D70D /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 8D7F5D5DD528D21A72DC87ADA5B12E2D; + remoteInfo = GoogleUtilities; + }; + 71C3C5732BC0A09CE002BCA40899E7C4 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 87803597EB3F20FC46472B85392EC4FD; + remoteInfo = FirebaseInstallations; + }; + 7D64F063559BAA34DFCF95AB21B82ADC /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 2BBF7206D7FAC92C82A042A99C4A98F8; + remoteInfo = PromisesObjC; + }; + 7DFF17BCCB325A34320936B74C9989A9 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = FE1DE31D91C32501251AE9687CDC2E0F; + remoteInfo = FirebaseCoreExtension; + }; + 7FE5137DAADBB0B4EC15AE9B8AA729F1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = D2B5E7DCCBBFB32341D857D01211A1A3; + remoteInfo = nanopb; + }; + 8C2AD4323BC01E2D9EDEDB04B66066DC /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 328CC04F43300C6CAB81659260A3799D; + remoteInfo = FirebaseRemoteConfigInterop; + }; + 91055FDE681B27AB781A92EF9A7A2834 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 87803597EB3F20FC46472B85392EC4FD; + remoteInfo = FirebaseInstallations; + }; + 93551147FF9A8F2E6D4C742E79912CEF /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 3F8EC37C78673149F2B94E8BD9AA8737; + remoteInfo = FirebaseSessions; + }; + 9CA4F0741A4ABBBDB838D0245BC74A91 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = D2B5E7DCCBBFB32341D857D01211A1A3; + remoteInfo = nanopb; + }; + A0F11355AE8C469EEF42274EA874A108 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 26309F9D4DF43E362A8AF6A93B41FF6D; + remoteInfo = GoogleAdsOnDeviceConversion; + }; + A1D3D7A640D47B5B2F44D553C7AE1541 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 8D7F5D5DD528D21A72DC87ADA5B12E2D; + remoteInfo = GoogleUtilities; + }; + A4217FA86749E034DBEB0F211AB34696 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 5C0371EE948D0357B8EE0E34ABB44BF0; + remoteInfo = GoogleDataTransport; + }; + A69632337C3BECBFF68ABC70AD3EC3B4 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 4402AFF83DBDC4DD07E198685FDC2DF2; + remoteInfo = FirebaseCore; + }; + B507DFD3C894D9C8185B5F1FFDA748EF /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 87803597EB3F20FC46472B85392EC4FD; + remoteInfo = FirebaseInstallations; + }; + B928DE7571902239FD44F557C68D3E45 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = D2B5E7DCCBBFB32341D857D01211A1A3; + remoteInfo = nanopb; + }; + BD0170F52406791A521FAA6BB540E818 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 4402AFF83DBDC4DD07E198685FDC2DF2; + remoteInfo = FirebaseCore; + }; + C9610F2F6181F6F9BB7694459615C138 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 5C0371EE948D0357B8EE0E34ABB44BF0; + remoteInfo = GoogleDataTransport; + }; + D124A14AE0BAE75FFDF2FDF5A4FD5A1B /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = A2E1CD763F5748382ECFDCFBD119D430; + remoteInfo = IronSourceAdQualitySDK; + }; + E19335BDB606ED164438697978DEE71B /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 25E9E9A17BC3F670357D7385C521E48E; + remoteInfo = FirebaseCoreInternal; + }; + E48E1DC06C1609E1E69CB4BAAF24F578 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 8D7F5D5DD528D21A72DC87ADA5B12E2D; + remoteInfo = GoogleUtilities; + }; + F89B95AABF292BEA8C300B526CF431AE /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 8D7F5D5DD528D21A72DC87ADA5B12E2D; + remoteInfo = GoogleUtilities; + }; + F8B5149875BC42AFC76EE6821174E496 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = AF4066D13B4DC667FB970ABF861B2B47; + remoteInfo = "IronSourceSDK-IronSourcePrivacyInfo"; + }; + FD068D6ADAD061FF04AE1453D76E7030 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 9C4575D64B2B6264CF6AB60FB03302AA; + remoteInfo = "FirebaseCoreExtension-FirebaseCoreExtension_Privacy"; + }; + FD33298F6D9D1E054EA5913A12A12246 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 328CC04F43300C6CAB81659260A3799D; + remoteInfo = FirebaseRemoteConfigInterop; + }; + FE4048AEA7B2A318B63438FABCD4F8C3 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 3F8EC37C78673149F2B94E8BD9AA8737; + remoteInfo = FirebaseSessions; + }; + FEFF157E534C552F7ACF2437E46C1964 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 5C0371EE948D0357B8EE0E34ABB44BF0; + remoteInfo = GoogleDataTransport; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 0066C3DB56B36BFF30DB7B69F2804ED7 /* FBLPromise+Testing.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBLPromise+Testing.h"; path = "Sources/FBLPromises/include/FBLPromise+Testing.h"; sourceTree = ""; }; + 00800A06EB6FD9B53DF581224C977BD4 /* GoogleAdsOnDeviceConversion-xcframeworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "GoogleAdsOnDeviceConversion-xcframeworks.sh"; sourceTree = ""; }; + 0089C0347F22CDD47F7D20F708F88D30 /* GDTCORStorageEventSelector.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCORStorageEventSelector.h; path = GoogleDataTransport/GDTCORLibrary/Internal/GDTCORStorageEventSelector.h; sourceTree = ""; }; + 016AA5BB178E30DCB042FE1CDAC73C69 /* FirebaseInstallationsInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FirebaseInstallationsInternal.h; path = FirebaseInstallations/Source/Library/Private/FirebaseInstallationsInternal.h; sourceTree = ""; }; + 0177C215A932EBA5B41D62132D0A85E1 /* ISAdQualityCustomMediationRevenue.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdQualityCustomMediationRevenue.h; path = "IronSourceAdQualitySDK.xcframework/ios-arm64_x86_64-simulator/Headers/ISAdQualityCustomMediationRevenue.h"; sourceTree = ""; }; + 017F5BFF2516DEAE325B5310B6A7C52B /* FIRInteropEventNames.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRInteropEventNames.h; path = Interop/Analytics/Public/FIRInteropEventNames.h; sourceTree = ""; }; + 01BE6518C2AD1460E0506FBAB69A3241 /* ISDataKeys.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISDataKeys.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISDataKeys.h"; sourceTree = ""; }; + 01FB650F7813CF1CA7B53199751B13B0 /* FirebaseInstallations.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FirebaseInstallations.debug.xcconfig; sourceTree = ""; }; + 01FCE3564F910A6112B6A8394DABD2EF /* FIRCrashlytics.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCrashlytics.m; path = Crashlytics/Crashlytics/FIRCrashlytics.m; sourceTree = ""; }; + 022DF419536E5D2A4D01CFDA9325FFC2 /* ISAdapterDebugProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdapterDebugProtocol.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterDebugProtocol.h"; sourceTree = ""; }; + 022E2DE980AE2DD8B673FEF029994237 /* Promise+Catch.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Promise+Catch.swift"; path = "Sources/Promises/Promise+Catch.swift"; sourceTree = ""; }; + 0234AC42621394D3FA2051F577E15D15 /* ISAdapterNativeAdViewBinderProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdapterNativeAdViewBinderProtocol.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterNativeAdViewBinderProtocol.h"; sourceTree = ""; }; + 023C0146F2CA1C566C550E62B5481D96 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = Sources/Promises/Resources/PrivacyInfo.xcprivacy; sourceTree = ""; }; + 026ABAC768ADF6EFAE52F6EB231566C8 /* FIRAppInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRAppInternal.h; path = FirebaseCore/Extension/FIRAppInternal.h; sourceTree = ""; }; + 02BFF2A39FF4CF48F68BA0268F057AEB /* ISAdapterAdFullscreenProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdapterAdFullscreenProtocol.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterAdFullscreenProtocol.h"; sourceTree = ""; }; + 02DF0F6D77AA82B6DE41974516D77AB4 /* FIRCLSFABAsyncOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSFABAsyncOperation.m; path = Crashlytics/Shared/FIRCLSOperation/FIRCLSFABAsyncOperation.m; sourceTree = ""; }; + 031B7146CF4EA8F9D4F9D9FA1FD13D69 /* Pods-TastePick.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-TastePick.modulemap"; sourceTree = ""; }; + 03333240DE76A905DBD22FCD540869A9 /* SettingsCacheClient.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SettingsCacheClient.swift; path = FirebaseSessions/Sources/Settings/SettingsCacheClient.swift; sourceTree = ""; }; + 03A320D06C7E14E66AA09D82F3AB12EB /* LevelPlayBaseBannerAdapter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LevelPlayBaseBannerAdapter.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LevelPlayBaseBannerAdapter.h"; sourceTree = ""; }; + 041237B7780A329CCAC0E5D7CC1FFC2F /* FIROptions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIROptions.m; path = FirebaseCore/Sources/FIROptions.m; sourceTree = ""; }; + 0421F34945387E49E17344CC8E327433 /* ISAdapterConsentProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdapterConsentProtocol.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterConsentProtocol.h"; sourceTree = ""; }; + 044DDBCD76EBDBF5A72F2E61B3F235DA /* LPMRewardedAdDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LPMRewardedAdDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMRewardedAdDelegate.h"; sourceTree = ""; }; + 046E5D36AC65413A5A781F4E1D7C6261 /* FIRCLSProcessReportOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSProcessReportOperation.h; path = Crashlytics/Crashlytics/Operations/Reports/FIRCLSProcessReportOperation.h; sourceTree = ""; }; + 04CE4B3AAD7F874D08FB7FF1F21EBAC5 /* GoogleUtilities.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GoogleUtilities.release.xcconfig; sourceTree = ""; }; + 0512EB7FA415200AAB243C0ADFE21930 /* FBLPromise+Await.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBLPromise+Await.h"; path = "Sources/FBLPromises/include/FBLPromise+Await.h"; sourceTree = ""; }; + 052520EECF51C1651FBAA6D4FEC30309 /* ISABannerAdView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISABannerAdView.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISABannerAdView.h"; sourceTree = ""; }; + 0535539685F361B16EA0CDB6BB4FD2AA /* ISNEvent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISNEvent.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNEvent.h"; sourceTree = ""; }; + 054793BA26B427ACD14E4A67EBA444D0 /* FIRLogger.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRLogger.m; path = FirebaseCore/Sources/FIRLogger.m; sourceTree = ""; }; + 055699715A5DA3DFD639B70780F4ACA5 /* pb_decode.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = pb_decode.h; sourceTree = ""; }; + 05A64ED55B701A52C9F43F904FEB2032 /* HeartbeatsBundle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HeartbeatsBundle.swift; path = FirebaseCore/Internal/Sources/HeartbeatLogging/HeartbeatsBundle.swift; sourceTree = ""; }; + 05CE57F2A3FD17DD25DB8EF61DC3306D /* nanopb-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "nanopb-umbrella.h"; sourceTree = ""; }; + 05CE75891727610C65FC34203126DAFD /* GDTCORStorageSizeBytes.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCORStorageSizeBytes.h; path = GoogleDataTransport/GDTCORLibrary/Internal/GDTCORStorageSizeBytes.h; sourceTree = ""; }; + 05D0BBB93A9164AF0B3981F9274D3CA9 /* ISARewardedAdInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISARewardedAdInfo.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISARewardedAdInfo.h"; sourceTree = ""; }; + 05EFAFE4DC81653A8A7823602E3B1733 /* GoogleDataTransport-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "GoogleDataTransport-Info.plist"; sourceTree = ""; }; + 060CC8BFD82A68361F597F34930457CD /* FIRCLSRecordApplication.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSRecordApplication.m; path = Crashlytics/Crashlytics/Models/Record/FIRCLSRecordApplication.m; sourceTree = ""; }; + 065FBC1ACC54DED4C4527824E8CEE40E /* ISAdQualityMediationNetwork.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdQualityMediationNetwork.h; path = "IronSourceAdQualitySDK.xcframework/ios-arm64/Headers/ISAdQualityMediationNetwork.h"; sourceTree = ""; }; + 067CED0F0662BBE6DC889AEC6DAB3049 /* PromisesSwift-Promises_Privacy */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "PromisesSwift-Promises_Privacy"; path = Promises_Privacy.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + 06B5066F4EFDF11927BD5974872CAA02 /* nanopb-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "nanopb-dummy.m"; sourceTree = ""; }; + 06E3FC2328F0EC9A7185DBE42FEE661D /* ISAInterstitialAdDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAInterstitialAdDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAInterstitialAdDelegate.h"; sourceTree = ""; }; + 06FC5C9CF96D60C50FCD47D339C91951 /* nanopb */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = nanopb; path = nanopb.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 07A40BB09AB8BA963D4F2C0E6D52ED80 /* FIRHeartbeatLogger.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRHeartbeatLogger.h; path = FirebaseCore/Extension/FIRHeartbeatLogger.h; sourceTree = ""; }; + 080A8F1D6B86F529419ACFE8A4686284 /* ISAInitRequestBuilder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAInitRequestBuilder.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAInitRequestBuilder.h"; sourceTree = ""; }; + 08105A73A76E1C926DE8ABFB274329C5 /* GDTCORReachability.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCORReachability.h; path = GoogleDataTransport/GDTCORLibrary/Internal/GDTCORReachability.h; sourceTree = ""; }; + 087E8D30407214C477A95FDD49C95C30 /* FIRCLSSettings.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSSettings.h; path = Crashlytics/Crashlytics/Models/FIRCLSSettings.h; sourceTree = ""; }; + 08DFEAAA1901B9FF8345827FDA56939E /* IronSourceSDK-IronSourcePrivacyInfo */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "IronSourceSDK-IronSourcePrivacyInfo"; path = IronSourcePrivacyInfo.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + 08E1BDF8B6EAFE5058EC6462AFC098C5 /* ISAdData.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdData.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdData.h"; sourceTree = ""; }; + 095526FC8C58547FC9AFAC3FA4146344 /* FIRLogger.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRLogger.h; path = FirebaseCore/Extension/FIRLogger.h; sourceTree = ""; }; + 0990016A8D67E4A41853CEC6119FEDEC /* GoogleUtilities.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = GoogleUtilities.modulemap; sourceTree = ""; }; + 0A566D57D5C0DF1498A91010D518117A /* Pods-TastePick-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-TastePick-dummy.m"; sourceTree = ""; }; + 0AAF8D43168DE149305848C3B443685D /* SessionGenerator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionGenerator.swift; path = FirebaseSessions/Sources/SessionGenerator.swift; sourceTree = ""; }; + 0B2F16B8F2FC5B1ADD4DA7E84C395EBF /* GULReachabilityChecker+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "GULReachabilityChecker+Internal.h"; path = "GoogleUtilities/Reachability/GULReachabilityChecker+Internal.h"; sourceTree = ""; }; + 0B521A65D627501A9EBEF884958EA814 /* FIRExceptionModel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRExceptionModel.h; path = Crashlytics/Crashlytics/Public/FirebaseCrashlytics/FIRExceptionModel.h; sourceTree = ""; }; + 0BD2DC1F13BE67B61E77456AFEDBF204 /* GDTCORStorageEventSelector.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GDTCORStorageEventSelector.m; path = GoogleDataTransport/GDTCORLibrary/GDTCORStorageEventSelector.m; sourceTree = ""; }; + 0C0E1B45CC38811401D3E98AC998434C /* FIRCLSProcess.c */ = {isa = PBXFileReference; includeInIndex = 1; name = FIRCLSProcess.c; path = Crashlytics/Crashlytics/Components/FIRCLSProcess.c; sourceTree = ""; }; + 0C3B2FBA5A25BA631AE76607BCEC0FF8 /* FirebaseRemoteConfigInterop-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "FirebaseRemoteConfigInterop-dummy.m"; sourceTree = ""; }; + 0CC79ADC8590141A9D21787675E2E63F /* ISBannerAdDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISBannerAdDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBannerAdDelegate.h"; sourceTree = ""; }; + 0CCCBC935F6C183B53EC9384AFB79535 /* FirebaseCoreInternal-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FirebaseCoreInternal-umbrella.h"; sourceTree = ""; }; + 0CD8072432B2F4BED7A8D604D0083504 /* ISARewardedAd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISARewardedAd.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISARewardedAd.h"; sourceTree = ""; }; + 0D063E804BB8B39A3CEFCD3A2ECE5567 /* FIRCLSBinaryImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSBinaryImage.h; path = Crashlytics/Crashlytics/Components/FIRCLSBinaryImage.h; sourceTree = ""; }; + 0D45A6F0B06D69697404FA689F2C9A7C /* GULAppDelegateSwizzler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GULAppDelegateSwizzler.h; path = GoogleUtilities/AppDelegateSwizzler/Public/GoogleUtilities/GULAppDelegateSwizzler.h; sourceTree = ""; }; + 0D606C6FB706D29E45E6A321DE83E10C /* ISConcurrentMutableArray.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISConcurrentMutableArray.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISConcurrentMutableArray.h"; sourceTree = ""; }; + 0DD073421759B00E23FB08B1F75EC155 /* FIRCLSThreadState.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSThreadState.h; path = Crashlytics/Crashlytics/Helpers/FIRCLSThreadState.h; sourceTree = ""; }; + 0DEA1F94A33613AE4F30F7F2AC3187C4 /* FIRBundleUtil.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRBundleUtil.h; path = FirebaseCore/Sources/FIRBundleUtil.h; sourceTree = ""; }; + 0DF97D07B88A1545D907FC37F67BA03A /* FIRExceptionModel.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRExceptionModel.m; path = Crashlytics/Crashlytics/FIRExceptionModel.m; sourceTree = ""; }; + 0EE8FD6E5D338AA401912585E96760EF /* ISNativeAdProperties.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISNativeAdProperties.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNativeAdProperties.h"; sourceTree = ""; }; + 0F04E23F87840C519D069AD94974B407 /* ISBaseRewardedVideo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISBaseRewardedVideo.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseRewardedVideo.h"; sourceTree = ""; }; + 0F14347526A0216442848950B9ACCE19 /* ISNativeAdInteractionDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISNativeAdInteractionDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNativeAdInteractionDelegate.h"; sourceTree = ""; }; + 0F55D58A85A745DCC23FC647F2E05FA6 /* FIRInstallationsStore.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRInstallationsStore.h; path = FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStore.h; sourceTree = ""; }; + 0FD002B29C0EB41C532916678D2C2308 /* FIRCLSSymbolResolver.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSSymbolResolver.h; path = Crashlytics/Crashlytics/Models/FIRCLSSymbolResolver.h; sourceTree = ""; }; + 0FE91634D96250807ECE1F66622CFAC2 /* FBLPromise+Retry.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "FBLPromise+Retry.m"; path = "Sources/FBLPromises/FBLPromise+Retry.m"; sourceTree = ""; }; + 1023E99E35C71294BD4212E31FE8D1E5 /* GDTCORMetrics+GDTCCTSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "GDTCORMetrics+GDTCCTSupport.m"; path = "GoogleDataTransport/GDTCCTLibrary/GDTCORMetrics+GDTCCTSupport.m"; sourceTree = ""; }; + 1024EEC68266A80A50CA12A0FFA93CBD /* ISAppStoreErrorDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAppStoreErrorDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAppStoreErrorDelegate.h"; sourceTree = ""; }; + 1073A31EF35FD64DE634B90E1238EA0F /* FIRConfigurationInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRConfigurationInternal.h; path = FirebaseCore/Sources/FIRConfigurationInternal.h; sourceTree = ""; }; + 10EC7FBA885D28D61F2A2F9826E6DB47 /* FIRCLSException.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = FIRCLSException.mm; path = Crashlytics/Crashlytics/Handlers/FIRCLSException.mm; sourceTree = ""; }; + 10ECA953DB3E716502A5DDC3BCA52F3E /* ISBaseBannerAdapter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISBaseBannerAdapter.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseBannerAdapter.h"; sourceTree = ""; }; + 11229AFB0FDD9883E979E40CAA70AF48 /* GULKeychainUtils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GULKeychainUtils.h; path = GoogleUtilities/Environment/Public/GoogleUtilities/GULKeychainUtils.h; sourceTree = ""; }; + 116852A1A1333FCDE65458FC8EFCE21B /* FIRCLSLaunchMarkerModel.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSLaunchMarkerModel.m; path = Crashlytics/Crashlytics/Models/FIRCLSLaunchMarkerModel.m; sourceTree = ""; }; + 116D56DBB173D6A02AA0C886B9F2B827 /* ISABannerAdRequestBuilder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISABannerAdRequestBuilder.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISABannerAdRequestBuilder.h"; sourceTree = ""; }; + 11E35FF4C7C8650A90E54825818800B5 /* FBLPromises.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBLPromises.h; path = Sources/FBLPromises/include/FBLPromises.h; sourceTree = ""; }; + 124E4A4D74A46B3B6F8D6FC1DE580A11 /* ISBannerAdapterDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISBannerAdapterDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBannerAdapterDelegate.h"; sourceTree = ""; }; + 1254D52A09DDBA845FDF18E3CDB1C2C6 /* LPMAdInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LPMAdInfo.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMAdInfo.h"; sourceTree = ""; }; + 1255AFC3E86546B3312D04714D8F2C86 /* GULSceneDelegateSwizzler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GULSceneDelegateSwizzler.h; path = GoogleUtilities/AppDelegateSwizzler/Public/GoogleUtilities/GULSceneDelegateSwizzler.h; sourceTree = ""; }; + 129C4B35961C8DF66361828972FAF22A /* ISAInterstitialAdRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAInterstitialAdRequest.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAInterstitialAdRequest.h"; sourceTree = ""; }; + 12DB3B857AE6A39AE3DE9D25D89251B3 /* LPMRewardedAdConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LPMRewardedAdConfig.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMRewardedAdConfig.h"; sourceTree = ""; }; + 12F21DBE304707FF6CE2EAF4CE7A4EF8 /* FIRCLSThreadState.c */ = {isa = PBXFileReference; includeInIndex = 1; name = FIRCLSThreadState.c; path = Crashlytics/Crashlytics/Helpers/FIRCLSThreadState.c; sourceTree = ""; }; + 12F32E83FAF22F6ED4F55E92708CFD15 /* ISIronSourceAdapter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISIronSourceAdapter.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISIronSourceAdapter.h"; sourceTree = ""; }; + 13379C781586050E65FBB300DA112FA7 /* ISBaseAdAdapter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISBaseAdAdapter.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseAdAdapter.h"; sourceTree = ""; }; + 13C8C8B254851998F9289F71229B28A2 /* FirebaseInstallations */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = FirebaseInstallations; path = FirebaseInstallations.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 13F0A082BBB3988A8530ACF6C3D6D45A /* ISDataKeys.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISDataKeys.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISDataKeys.h"; sourceTree = ""; }; + 142890E49EB8F36DE49A468137C44DDD /* GoogleAdsOnDeviceConversion.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GoogleAdsOnDeviceConversion.debug.xcconfig; sourceTree = ""; }; + 148D0F9E8C7373FEAF40D800FC5F1BAA /* FirebaseCoreInternal */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = FirebaseCoreInternal; path = FirebaseCoreInternal.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 15101FAC07F75892F901C206FBD6D676 /* FIRCLSDownloadAndSaveSettingsOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSDownloadAndSaveSettingsOperation.h; path = Crashlytics/Crashlytics/Settings/Operations/FIRCLSDownloadAndSaveSettingsOperation.h; sourceTree = ""; }; + 15ABC8AE36399535577898CA8432E164 /* FirebaseSessions-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FirebaseSessions-umbrella.h"; sourceTree = ""; }; + 168DAEDCFFFE16B056481C9974EA1EF1 /* FBLPromise+Delay.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "FBLPromise+Delay.m"; path = "Sources/FBLPromises/FBLPromise+Delay.m"; sourceTree = ""; }; + 16CBA1DBAA3AEF704450849D746C63D2 /* ISAdQualityAdType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdQualityAdType.h; path = "IronSourceAdQualitySDK.xcframework/ios-arm64/Headers/ISAdQualityAdType.h"; sourceTree = ""; }; + 1758B957BB4D36B3B969C7AE4E209789 /* HeartbeatLoggingTestUtils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HeartbeatLoggingTestUtils.swift; path = FirebaseCore/Internal/Sources/HeartbeatLogging/HeartbeatLoggingTestUtils.swift; sourceTree = ""; }; + 185E6F25949BB7762B48C7BB5ECD6418 /* FIRLibrary.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRLibrary.h; path = FirebaseCore/Extension/FIRLibrary.h; sourceTree = ""; }; + 18864872DA5BE81A02648F68AB92EA3B /* ISAdapterNetworkData.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdapterNetworkData.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterNetworkData.h"; sourceTree = ""; }; + 189D64AA8AA2FF6B5EAD8A74A61A36E5 /* GULSceneDelegateSwizzler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GULSceneDelegateSwizzler.m; path = GoogleUtilities/AppDelegateSwizzler/GULSceneDelegateSwizzler.m; sourceTree = ""; }; + 18D90DAC7117F0FAA9F2BE0BE29EA40B /* ISAdOptionsPosition.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdOptionsPosition.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdOptionsPosition.h"; sourceTree = ""; }; + 18F7AFFCBB981A5B6010FB86D232D553 /* FIRCLSReportUploader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSReportUploader.m; path = Crashlytics/Crashlytics/Controllers/FIRCLSReportUploader.m; sourceTree = ""; }; + 1958DE73828BDFA7A975378E216171AE /* ISError.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISError.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISError.h"; sourceTree = ""; }; + 197116361CAE65ACB9526C14C557AC49 /* GoogleAppMeasurement.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GoogleAppMeasurement.release.xcconfig; sourceTree = ""; }; + 1A1DB983C34B2FD725FAC923C3A37A20 /* FIRComponent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRComponent.h; path = FirebaseCore/Extension/FIRComponent.h; sourceTree = ""; }; + 1AE2DDA9E2DB7DB2B4A53B457668348D /* FirebaseInstallations.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FirebaseInstallations.release.xcconfig; sourceTree = ""; }; + 1B304109378D7BE663BDB66843D276FD /* FirebaseCoreExtension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FirebaseCoreExtension.debug.xcconfig; sourceTree = ""; }; + 1B762B1EE7A4FF6B5CDC16D2B9D6757F /* HeartbeatsPayload.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HeartbeatsPayload.swift; path = FirebaseCore/Internal/Sources/HeartbeatLogging/HeartbeatsPayload.swift; sourceTree = ""; }; + 1BE1CBF8E9B5709393138ABEDF831B50 /* FIRCLSApplicationIdentifierModel.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSApplicationIdentifierModel.m; path = Crashlytics/Crashlytics/Settings/Models/FIRCLSApplicationIdentifierModel.m; sourceTree = ""; }; + 1C20C35ACB116D3A0CA67FFED6FE6035 /* ResourceBundle-nanopb_Privacy-nanopb-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-nanopb_Privacy-nanopb-Info.plist"; sourceTree = ""; }; + 1C715062998D5852EEF24EE8E49BB831 /* FBLPromise+Do.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "FBLPromise+Do.m"; path = "Sources/FBLPromises/FBLPromise+Do.m"; sourceTree = ""; }; + 1C8763A191CD6E08D45D20340159C9EB /* ISBaseAdUnitAdapter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISBaseAdUnitAdapter.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseAdUnitAdapter.h"; sourceTree = ""; }; + 1C8E613B2FC4E42035291657D27705BE /* GULNetwork.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GULNetwork.h; path = GoogleUtilities/Network/Public/GoogleUtilities/GULNetwork.h; sourceTree = ""; }; + 1CE2D09E4A00E609BE326453FA5D543F /* GDTCCTNanopbHelpers.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCCTNanopbHelpers.h; path = GoogleDataTransport/GDTCCTLibrary/Private/GDTCCTNanopbHelpers.h; sourceTree = ""; }; + 1DA040D8D1944A547F2CE9CEB368B983 /* GULLogger.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GULLogger.m; path = GoogleUtilities/Logger/GULLogger.m; sourceTree = ""; }; + 1DBBFF835BF2265C902672A1EF99D52D /* ISNEventTrackerInterface.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISNEventTrackerInterface.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNEventTrackerInterface.h"; sourceTree = ""; }; + 1E31FB3734C782C16ADDBB447B495FF9 /* ResourceBundle-IronSourceAdQualityPrivacyInfo-IronSourceAdQualitySDK-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-IronSourceAdQualityPrivacyInfo-IronSourceAdQualitySDK-Info.plist"; sourceTree = ""; }; + 1E5E160DA2A9DBD0F56F8046A8C6F028 /* FBLPromise+Timeout.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "FBLPromise+Timeout.m"; path = "Sources/FBLPromises/FBLPromise+Timeout.m"; sourceTree = ""; }; + 1F42A07890ACB9ABA006BAC6D7E0084D /* FIRCLSUnwind_x86.c */ = {isa = PBXFileReference; includeInIndex = 1; name = FIRCLSUnwind_x86.c; path = Crashlytics/Crashlytics/Unwind/FIRCLSUnwind_x86.c; sourceTree = ""; }; + 1F622514FF218CDC29E7F9451401B2A3 /* ISNativeAdViewBinderProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISNativeAdViewBinderProtocol.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNativeAdViewBinderProtocol.h"; sourceTree = ""; }; + 1FFCE5CE085019AB4DF83559B2238B43 /* GDTCORMetricsMetadata.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCORMetricsMetadata.h; path = GoogleDataTransport/GDTCORLibrary/Private/GDTCORMetricsMetadata.h; sourceTree = ""; }; + 2073DD1BEC1C356821B09FFF3D0EEFC0 /* RemoteConfigInterop.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RemoteConfigInterop.swift; path = FirebaseRemoteConfig/Interop/RemoteConfigInterop.swift; sourceTree = ""; }; + 207CB937631F3C27B2979F3A8D5F2637 /* ISConfigurations.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISConfigurations.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISConfigurations.h"; sourceTree = ""; }; + 20A90CD99CAEAB8AA0B618803C43361C /* ISNControllerManagerSwiftFacade.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISNControllerManagerSwiftFacade.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNControllerManagerSwiftFacade.h"; sourceTree = ""; }; + 20D77B4B14F2405656CD489AEDA89031 /* GoogleUtilities-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "GoogleUtilities-Info.plist"; sourceTree = ""; }; + 212DFA72D0E2CA51B6EC619A06CCD600 /* GULSceneDelegateSwizzler_Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GULSceneDelegateSwizzler_Private.h; path = GoogleUtilities/AppDelegateSwizzler/Internal/GULSceneDelegateSwizzler_Private.h; sourceTree = ""; }; + 213D31970FC3C34E21FB0E4EBFAC8239 /* GDTCORRegistrar.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GDTCORRegistrar.m; path = GoogleDataTransport/GDTCORLibrary/GDTCORRegistrar.m; sourceTree = ""; }; + 21D9E6AABF6D4CF5BC663A230EF53A42 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; + 2256396D0A0B6791FDBF8F17D8AB3C08 /* ISARewardedAdRequestBuilder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISARewardedAdRequestBuilder.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISARewardedAdRequestBuilder.h"; sourceTree = ""; }; + 227EB971EFD84A9CB75C423F9C85FFCB /* SessionsSubscriber.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionsSubscriber.swift; path = FirebaseSessions/Sources/Public/SessionsSubscriber.swift; sourceTree = ""; }; + 22B8D50B74DE97D7A1516169B05859A4 /* GDTCORMetrics.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GDTCORMetrics.m; path = GoogleDataTransport/GDTCORLibrary/GDTCORMetrics.m; sourceTree = ""; }; + 233D26E7E787BC05811554037BA231FF /* FIRInstallationsBackoffController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRInstallationsBackoffController.m; path = FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsBackoffController.m; sourceTree = ""; }; + 23F60C0F834C7294C4181CFC6FC52A9F /* GDTCORMetrics.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCORMetrics.h; path = GoogleDataTransport/GDTCORLibrary/Private/GDTCORMetrics.h; sourceTree = ""; }; + 23FD42DA48CB04E5A2EC2FCAD6972449 /* FIRCLSInstallIdentifierModel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSInstallIdentifierModel.h; path = Crashlytics/Crashlytics/Models/FIRCLSInstallIdentifierModel.h; sourceTree = ""; }; + 24F6C0552D85DB8F55623B2943F64F15 /* external_privacy_context.nanopb.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = external_privacy_context.nanopb.h; path = GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/external_privacy_context.nanopb.h; sourceTree = ""; }; + 254372CEB1BA1F5EF6EA42678BCB0ED3 /* ISARewardedAdInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISARewardedAdInfo.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISARewardedAdInfo.h"; sourceTree = ""; }; + 25B6C2F45A00178B8E1249CB254B52F9 /* RemoteSettings.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RemoteSettings.swift; path = FirebaseSessions/Sources/Settings/RemoteSettings.swift; sourceTree = ""; }; + 25E01BB2192AE035461221BD497CC08E /* GDTCOREndpoints.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GDTCOREndpoints.m; path = GoogleDataTransport/GDTCORLibrary/GDTCOREndpoints.m; sourceTree = ""; }; + 25F102FED69D1D269849E007B4D9F68E /* ISABannerAdRequestBuilder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISABannerAdRequestBuilder.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISABannerAdRequestBuilder.h"; sourceTree = ""; }; + 261513B7300CC9683FDC6E197EFB59FE /* ISAdapterBannerProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdapterBannerProtocol.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterBannerProtocol.h"; sourceTree = ""; }; + 265303350DEFB1E52CEA4D56AACF5557 /* PromisesSwift.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = PromisesSwift.debug.xcconfig; sourceTree = ""; }; + 2667A19A553EFAE25C536FD28C56B5E1 /* FBLPromise+Do.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBLPromise+Do.h"; path = "Sources/FBLPromises/include/FBLPromise+Do.h"; sourceTree = ""; }; + 26CD1818E4B5E4B04A89C9F8C537A485 /* FIRCLSMachO.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSMachO.h; path = Crashlytics/Shared/FIRCLSMachO/FIRCLSMachO.h; sourceTree = ""; }; + 26D2C03BACF911A34C8F878660B53C2C /* GULKeychainStorage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GULKeychainStorage.m; path = GoogleUtilities/Environment/SecureStorage/GULKeychainStorage.m; sourceTree = ""; }; + 26FE2F6DAF58997316C13CC97978F5AD /* FIRCLSExecutionIdentifierModel.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSExecutionIdentifierModel.m; path = Crashlytics/Crashlytics/Models/FIRCLSExecutionIdentifierModel.m; sourceTree = ""; }; + 27053A773E2AD151CD813EDCB8E648B1 /* HeartbeatStorage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HeartbeatStorage.swift; path = FirebaseCore/Internal/Sources/HeartbeatLogging/HeartbeatStorage.swift; sourceTree = ""; }; + 272EDD333F2C9C1FA3E0E2B1E395CA78 /* ISBaseInterstitialAdapter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISBaseInterstitialAdapter.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseInterstitialAdapter.h"; sourceTree = ""; }; + 2731B1A2A591BD8AA6F7A860C8DF942F /* FIRComponentType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRComponentType.h; path = FirebaseCore/Extension/FIRComponentType.h; sourceTree = ""; }; + 27987ADDED8E9F81E93FAC3C85BF751D /* SessionsSettings.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionsSettings.swift; path = FirebaseSessions/Sources/Settings/SessionsSettings.swift; sourceTree = ""; }; + 27A34803725F8490A9C6BD206E0206F0 /* FBLPromise+Async.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "FBLPromise+Async.m"; path = "Sources/FBLPromises/FBLPromise+Async.m"; sourceTree = ""; }; + 27D7A2D305B306421389DFF86CE86C98 /* ISAdData.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdData.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdData.h"; sourceTree = ""; }; + 289B7EC46EE1B61BBF0071115B2EAFFE /* GDTCORStorageMetadata.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GDTCORStorageMetadata.m; path = GoogleDataTransport/GDTCORLibrary/GDTCORStorageMetadata.m; sourceTree = ""; }; + 28A5D30FD1E238696F83B0BB00289AB8 /* FIRCLSDwarfUnwind.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSDwarfUnwind.h; path = Crashlytics/Crashlytics/Unwind/Dwarf/FIRCLSDwarfUnwind.h; sourceTree = ""; }; + 28EE3935B708ADB28BB2F7CFA8DBEA8F /* FIRCLSMachException.c */ = {isa = PBXFileReference; includeInIndex = 1; name = FIRCLSMachException.c; path = Crashlytics/Crashlytics/Handlers/FIRCLSMachException.c; sourceTree = ""; }; + 29A0E4CB79E64ABDE0215A8170CB4BD0 /* crashlytics.nanopb.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = crashlytics.nanopb.h; path = Crashlytics/Protogen/nanopb/crashlytics.nanopb.h; sourceTree = ""; }; + 2A013903A63F0BEB08E3A00DCAAFBFB4 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = spm_resources/PrivacyInfo.xcprivacy; sourceTree = ""; }; + 2A0F94D6EF56BEC681DF7ED04CD8DB5F /* GDTCOREvent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GDTCOREvent.m; path = GoogleDataTransport/GDTCORLibrary/GDTCOREvent.m; sourceTree = ""; }; + 2A2FECEA4904D1C3B04BCC1C3E193EE8 /* LPMDispatcherProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LPMDispatcherProtocol.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMDispatcherProtocol.h"; sourceTree = ""; }; + 2A64B80409F164E3803844301FB17174 /* LevelPlayBaseRewardedAdapter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LevelPlayBaseRewardedAdapter.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LevelPlayBaseRewardedAdapter.h"; sourceTree = ""; }; + 2AAE67FCC2B77A6B7236BC1CB5E54F9A /* FirebaseCore-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "FirebaseCore-Info.plist"; sourceTree = ""; }; + 2ADA46F267FE7957F1038448DCE9D9B4 /* IronSourceSDK-xcframeworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "IronSourceSDK-xcframeworks.sh"; sourceTree = ""; }; + 2BBB8DFD683B5B6C4F28B48F19F7C1E1 /* ISAInterstitialAdLoaderDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAInterstitialAdLoaderDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAInterstitialAdLoaderDelegate.h"; sourceTree = ""; }; + 2BC672E68574FB2722DCA645BB15CBDA /* FIRCLSReportManager_Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSReportManager_Private.h; path = Crashlytics/Crashlytics/Controllers/FIRCLSReportManager_Private.h; sourceTree = ""; }; + 2C6420DBFA78FE8E465FB2FE373896E5 /* ISMetaDataConstants.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISMetaDataConstants.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISMetaDataConstants.h"; sourceTree = ""; }; + 2C64F6C4B8FEB07E9A6D018E9936B5BD /* FirebaseRemoteConfigInterop.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FirebaseRemoteConfigInterop.debug.xcconfig; sourceTree = ""; }; + 2C8E3DDC3FDC1CDB26E0AEFF7902B4CE /* FIRInstallationsErrors.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRInstallationsErrors.h; path = FirebaseInstallations/Source/Library/Public/FirebaseInstallations/FIRInstallationsErrors.h; sourceTree = ""; }; + 2CD17B881E8A2BFAFDF09FF663B3EFED /* GDTCOREventDropReason.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCOREventDropReason.h; path = GoogleDataTransport/GDTCORLibrary/Internal/GDTCOREventDropReason.h; sourceTree = ""; }; + 2CFB75EBE8AF8A68A95C33463466B708 /* ISBaseAdInteractionAdapter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISBaseAdInteractionAdapter.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseAdInteractionAdapter.h"; sourceTree = ""; }; + 2D3BFB61D14A873B97B65B981C8A1E27 /* FBLPromise+All.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBLPromise+All.h"; path = "Sources/FBLPromises/include/FBLPromise+All.h"; sourceTree = ""; }; + 2DBF91E26611C1E7394DF3D28D3158C8 /* FIROptionsInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIROptionsInternal.h; path = FirebaseCore/Sources/FIROptionsInternal.h; sourceTree = ""; }; + 2DF720DD665469A774CF01FFBAD2642E /* FIRCLSRecordBase.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSRecordBase.h; path = Crashlytics/Crashlytics/Models/Record/FIRCLSRecordBase.h; sourceTree = ""; }; + 2E4BE348118E6A15F9012F41C1EEE40F /* FBLPromise+Testing.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "FBLPromise+Testing.m"; path = "Sources/FBLPromises/FBLPromise+Testing.m"; sourceTree = ""; }; + 2EADCBC90D011F5463776B50E0C8335D /* ISLoadWhileShowSupportState.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISLoadWhileShowSupportState.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISLoadWhileShowSupportState.h"; sourceTree = ""; }; + 2EC2D87E8B7BC61C65FE126377760DC0 /* GDTCCTUploadOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GDTCCTUploadOperation.m; path = GoogleDataTransport/GDTCCTLibrary/GDTCCTUploadOperation.m; sourceTree = ""; }; + 2ED0E73562BB974FCC7C5F3510134686 /* ISDemandOnlyInterstitialDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISDemandOnlyInterstitialDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISDemandOnlyInterstitialDelegate.h"; sourceTree = ""; }; + 2F313246CE8BAAC5D514B7BC8CD37BAB /* Promise+Reduce.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Promise+Reduce.swift"; path = "Sources/Promises/Promise+Reduce.swift"; sourceTree = ""; }; + 2F347F62F3CE83D50D94207B6ECCCECA /* FIRCLSMetricKitManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSMetricKitManager.m; path = Crashlytics/Crashlytics/Controllers/FIRCLSMetricKitManager.m; sourceTree = ""; }; + 2F3F443A69F12C8FC5069D2F16BDAF87 /* GoogleDataTransport.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GoogleDataTransport.release.xcconfig; sourceTree = ""; }; + 2F63566A90B8B15BB252B732D8FC2944 /* GDTCORTransformer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCORTransformer.h; path = GoogleDataTransport/GDTCORLibrary/Private/GDTCORTransformer.h; sourceTree = ""; }; + 2F74B4E5D770A752C21BB6967568A3AF /* ISARewardedAd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISARewardedAd.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISARewardedAd.h"; sourceTree = ""; }; + 2F7F89196A1000F92ED359A936B94564 /* StorageFactory.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StorageFactory.swift; path = FirebaseCore/Internal/Sources/HeartbeatLogging/StorageFactory.swift; sourceTree = ""; }; + 2F9EB19D0EBA6513681DF5691004A9E1 /* ISSupersonicAdsConfiguration.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISSupersonicAdsConfiguration.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISSupersonicAdsConfiguration.h"; sourceTree = ""; }; + 2FE31925E3FB2582F1EEDD28B06BDA1C /* ISNativeAdDataProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISNativeAdDataProtocol.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNativeAdDataProtocol.h"; sourceTree = ""; }; + 2FFD8037315718314E2641EA5027512F /* ISAdapterAdViewDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdapterAdViewDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterAdViewDelegate.h"; sourceTree = ""; }; + 30939D40FD7C3A32CC6CDE85982B6520 /* SessionsDependencies.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionsDependencies.swift; path = FirebaseSessions/Sources/Public/SessionsDependencies.swift; sourceTree = ""; }; + 319D2DB0F299ADF8C69525C6E1AA4521 /* CrashlyticsRemoteConfigManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CrashlyticsRemoteConfigManager.swift; path = Crashlytics/Crashlytics/Rollouts/CrashlyticsRemoteConfigManager.swift; sourceTree = ""; }; + 31E2C311C21CF05614BD095C6689C450 /* LevelPlayNativeAdBuilder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LevelPlayNativeAdBuilder.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LevelPlayNativeAdBuilder.h"; sourceTree = ""; }; + 320664D59D6FEE7224D3B503B842956D /* PromisesObjC.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = PromisesObjC.debug.xcconfig; sourceTree = ""; }; + 3227F3FC45681D7CEE5D1355A532398A /* nanopb-nanopb_Privacy */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "nanopb-nanopb_Privacy"; path = nanopb_Privacy.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + 32489CC317F1FBF805DA321355833707 /* FBLPromise+Reduce.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBLPromise+Reduce.h"; path = "Sources/FBLPromises/include/FBLPromise+Reduce.h"; sourceTree = ""; }; + 3252DF1406BC2146B50B4840FD6FBA04 /* FIRCLSContext.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSContext.m; path = Crashlytics/Crashlytics/Components/FIRCLSContext.m; sourceTree = ""; }; + 32DD5F8C87EC0D61474350BF65B77615 /* _ObjC_HeartbeatController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = _ObjC_HeartbeatController.swift; path = FirebaseCore/Internal/Sources/HeartbeatLogging/_ObjC_HeartbeatController.swift; sourceTree = ""; }; + 32E65117318E5B38802ACB90B12EABC5 /* FIRCLSSettingsManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSSettingsManager.m; path = Crashlytics/Crashlytics/Settings/FIRCLSSettingsManager.m; sourceTree = ""; }; + 32F3BA2F0DB35120F3D33522356ED250 /* FBLPromise+Then.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "FBLPromise+Then.m"; path = "Sources/FBLPromises/FBLPromise+Then.m"; sourceTree = ""; }; + 32F68DDEFB50821F4FF6B68D8B7CABDA /* LPMRewardedAd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LPMRewardedAd.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMRewardedAd.h"; sourceTree = ""; }; + 3347A1AB6546F0A3977529B8F199DC41 /* PromisesObjC */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = PromisesObjC; path = FBLPromises.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 33502EBB0395C1D1D2DD36EF0B27B1A4 /* ISAdapterAdRewardedDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdapterAdRewardedDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterAdRewardedDelegate.h"; sourceTree = ""; }; + 3426CA7E57D379E97C6EEC3B79A6FC1C /* FIRHeartbeatLogger.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRHeartbeatLogger.h; path = FirebaseCore/Extension/FIRHeartbeatLogger.h; sourceTree = ""; }; + 342FA6FC6FF29FD9ED11AA3C0C030E1B /* FIRCLSDwarfUnwind.c */ = {isa = PBXFileReference; includeInIndex = 1; name = FIRCLSDwarfUnwind.c; path = Crashlytics/Crashlytics/Unwind/Dwarf/FIRCLSDwarfUnwind.c; sourceTree = ""; }; + 351A6091DC2E46903B363CD58DEDB54C /* ISARewardedAdDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISARewardedAdDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISARewardedAdDelegate.h"; sourceTree = ""; }; + 355D567D921F620CFA16BA43C68835AC /* LPMInitRequestBuilder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LPMInitRequestBuilder.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMInitRequestBuilder.h"; sourceTree = ""; }; + 357F73D9C74F084B234F11244058351F /* ISAdapterBannerProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdapterBannerProtocol.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterBannerProtocol.h"; sourceTree = ""; }; + 35FCB2AC8AF8B9D0325ED932A9F17FA0 /* LPMReward.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LPMReward.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMReward.h"; sourceTree = ""; }; + 361B15D754CA3EEB0EC554E81E00109B /* LevelPlayNativeAd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LevelPlayNativeAd.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LevelPlayNativeAd.h"; sourceTree = ""; }; + 36370E10C2901987B9E7ED1691F72A42 /* ISBiddingDataDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISBiddingDataDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBiddingDataDelegate.h"; sourceTree = ""; }; + 3666ABC259DA72953FE993E05E3A5531 /* FIRCLSAnalyticsManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSAnalyticsManager.h; path = Crashlytics/Crashlytics/Controllers/FIRCLSAnalyticsManager.h; sourceTree = ""; }; + 369C32AFC4456AD8F92EA6E65B941D43 /* GoogleAppMeasurement-xcframeworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "GoogleAppMeasurement-xcframeworks.sh"; sourceTree = ""; }; + 36AB8A9692EBD7F8701BE4FC9B8EB91D /* LPMImpressionDataDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LPMImpressionDataDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMImpressionDataDelegate.h"; sourceTree = ""; }; + 36B73A9E37BAF99AFC87F01CFF4D8E2F /* LPMRewardedAdDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LPMRewardedAdDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMRewardedAdDelegate.h"; sourceTree = ""; }; + 3707E61A67EC8D0959FEED9B3939A5FC /* Promise+Delay.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Promise+Delay.swift"; path = "Sources/Promises/Promise+Delay.swift"; sourceTree = ""; }; + 370DBA7034E52103E80C57EC5A6CE880 /* ISAdapterAdaptiveProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdapterAdaptiveProtocol.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterAdaptiveProtocol.h"; sourceTree = ""; }; + 379E5319BC6B4AE5613DFF7EEEAA6905 /* PromisesSwift */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = PromisesSwift; path = Promises.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 37C4832F00EE3E4DEBDBB310FAB46DA8 /* FIRCLSRolloutsPersistenceManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSRolloutsPersistenceManager.h; path = Crashlytics/Crashlytics/Controllers/FIRCLSRolloutsPersistenceManager.h; sourceTree = ""; }; + 37E635B883B0849C4E370D3ED1FD8C74 /* FIRInstallationsErrorUtil.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRInstallationsErrorUtil.m; path = FirebaseInstallations/Source/Library/Errors/FIRInstallationsErrorUtil.m; sourceTree = ""; }; + 38805ADA2E2590CEA84764CCEFC3AA65 /* LPMInitRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LPMInitRequest.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMInitRequest.h"; sourceTree = ""; }; + 3896C1B7A6BF62C3D44EAA5107F8FF8C /* FIRAppInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRAppInternal.h; path = FirebaseCore/Extension/FIRAppInternal.h; sourceTree = ""; }; + 39068D7FF3135809CAF855DF1FAF3801 /* FirebaseInstallations-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "FirebaseInstallations-Info.plist"; sourceTree = ""; }; + 3938ED45F1467366B3FA597B3F178900 /* ISDemandOnlyRewardedVideoDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISDemandOnlyRewardedVideoDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISDemandOnlyRewardedVideoDelegate.h"; sourceTree = ""; }; + 39647797621B506227286A3E40C9359F /* FirebaseSessions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FirebaseSessions.swift; path = FirebaseSessions/Sources/FirebaseSessions.swift; sourceTree = ""; }; + 3A8322DEBCC05B27EC0F485116CB3581 /* GDTCORDirectorySizeTracker.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GDTCORDirectorySizeTracker.m; path = GoogleDataTransport/GDTCORLibrary/GDTCORDirectorySizeTracker.m; sourceTree = ""; }; + 3A91C934BAEC312F67127315E8B807D8 /* ISAInterstitialAdInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAInterstitialAdInfo.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAInterstitialAdInfo.h"; sourceTree = ""; }; + 3AB67A4904DEA3918B219175B34B54D1 /* FBLPromise+Catch.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBLPromise+Catch.h"; path = "Sources/FBLPromises/include/FBLPromise+Catch.h"; sourceTree = ""; }; + 3AFD59D27B0CB0B9AE20097A85658997 /* GDTCCTUploader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GDTCCTUploader.m; path = GoogleDataTransport/GDTCCTLibrary/GDTCCTUploader.m; sourceTree = ""; }; + 3B0287C57BE7DCF9619AC7D86755E6B9 /* GULApplication.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GULApplication.h; path = GoogleUtilities/AppDelegateSwizzler/Public/GoogleUtilities/GULApplication.h; sourceTree = ""; }; + 3B3D7B7CA466BD22A4230BEB5E680643 /* ISNEvent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISNEvent.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNEvent.h"; sourceTree = ""; }; + 3B8A18906655083C6E6009ECAE485D58 /* ISARewardedAdLoaderDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISARewardedAdLoaderDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISARewardedAdLoaderDelegate.h"; sourceTree = ""; }; + 3BB4CA31F7DE998710ABCE65AA36AA77 /* GDTCORLifecycle.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GDTCORLifecycle.m; path = GoogleDataTransport/GDTCORLibrary/GDTCORLifecycle.m; sourceTree = ""; }; + 3BD1A4A6145E74116D4527695B3A5431 /* ISSupersonicAdsConfiguration.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISSupersonicAdsConfiguration.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISSupersonicAdsConfiguration.h"; sourceTree = ""; }; + 3BDBD876705B47F9B901833DA8212529 /* EncodedRolloutAssignment.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EncodedRolloutAssignment.swift; path = Crashlytics/Crashlytics/Rollouts/EncodedRolloutAssignment.swift; sourceTree = ""; }; + 3C0783D1DCE2D70C01DE8F66368E3525 /* CoreTelephony.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreTelephony.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/CoreTelephony.framework; sourceTree = DEVELOPER_DIR; }; + 3C5C331533FF8D5E3FFF134859FABE1C /* ISNativeAdDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISNativeAdDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNativeAdDelegate.h"; sourceTree = ""; }; + 3CB25E55E21EC087E604202C5DAE567D /* ISMediationGlobalDataWriterFacade.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISMediationGlobalDataWriterFacade.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISMediationGlobalDataWriterFacade.h"; sourceTree = ""; }; + 3CB3BCF1390F1406B03BC8DB4735D727 /* FirebaseRemoteConfigInterop */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = FirebaseRemoteConfigInterop; path = FirebaseRemoteConfigInterop.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 3CB4451DCD86D42BA70DBDF67A7F10D4 /* ISLoadWhileShowSupportState.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISLoadWhileShowSupportState.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISLoadWhileShowSupportState.h"; sourceTree = ""; }; + 3CBB41DE6E4A3C2D4DB7CEC6C56E333F /* ISAAdSize.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAAdSize.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAAdSize.h"; sourceTree = ""; }; + 3CC4B3529FCD44548F7E2A50B3AED707 /* ISBaseAdapter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISBaseAdapter.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseAdapter.h"; sourceTree = ""; }; + 3D0E393DCD0512A23E694CD935872093 /* ISNControllerMessageListener.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISNControllerMessageListener.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNControllerMessageListener.h"; sourceTree = ""; }; + 3D374DF11FD5A62F7DC500C33C411BE0 /* LevelPlayNativeAdBuilder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LevelPlayNativeAdBuilder.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LevelPlayNativeAdBuilder.h"; sourceTree = ""; }; + 3D49B3D6C4005A54E1C34DCAF8E014F4 /* LPMAdSize.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LPMAdSize.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMAdSize.h"; sourceTree = ""; }; + 3D49B8237795FB0937E007E53CC2A559 /* FIRCLSMachOSlice.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSMachOSlice.m; path = Crashlytics/Shared/FIRCLSMachO/FIRCLSMachOSlice.m; sourceTree = ""; }; + 3D4CFAD3D4543185148C01387890F561 /* FirebaseInstallationsInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FirebaseInstallationsInternal.h; path = FirebaseInstallations/Source/Library/Private/FirebaseInstallationsInternal.h; sourceTree = ""; }; + 3D52AB19F6BCD45B3C88CDDD10AEAE79 /* NanoPB+CustomStringConvertible.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NanoPB+CustomStringConvertible.swift"; path = "FirebaseSessions/Sources/Development/NanoPB+CustomStringConvertible.swift"; sourceTree = ""; }; + 3D8A77D85454CB49401809664EF31849 /* ISARewardedAdRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISARewardedAdRequest.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISARewardedAdRequest.h"; sourceTree = ""; }; + 3D95656E223DD06A79CA577665D93B9D /* ISAdapterErrors.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdapterErrors.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterErrors.h"; sourceTree = ""; }; + 3E183627684F28D7E2F87BE57638D081 /* FirebaseCoreInternal.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FirebaseCoreInternal.release.xcconfig; sourceTree = ""; }; + 3E5791351CAC66246499292E224E1906 /* GDTCORTransformer_Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCORTransformer_Private.h; path = GoogleDataTransport/GDTCORLibrary/Private/GDTCORTransformer_Private.h; sourceTree = ""; }; + 3E9FBDDA48E48B547C7C0727E2294D88 /* FirebaseInstallations.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FirebaseInstallations.h; path = FirebaseInstallations/Source/Library/Public/FirebaseInstallations/FirebaseInstallations.h; sourceTree = ""; }; + 3ED2C548E8AF0C8CF19C444FAAA9E1F5 /* IsAppEncrypted.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IsAppEncrypted.m; path = third_party/IsAppEncrypted/IsAppEncrypted.m; sourceTree = ""; }; + 3EF32FAE4E797E58A9BCD2572B05CA92 /* FIRCLSNotificationManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSNotificationManager.m; path = Crashlytics/Crashlytics/Controllers/FIRCLSNotificationManager.m; sourceTree = ""; }; + 3EF44F3C3F4C03084F5647187712A799 /* GDTCCTUploadOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCCTUploadOperation.h; path = GoogleDataTransport/GDTCCTLibrary/Private/GDTCCTUploadOperation.h; sourceTree = ""; }; + 3F10AD0456E498087BA6D047684341AB /* FirebaseCrashlytics-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "FirebaseCrashlytics-dummy.m"; sourceTree = ""; }; + 3F1393803DCB326B4FAA0DC80356DF7D /* FIRCLSThreadArrayOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSThreadArrayOperation.m; path = Crashlytics/Crashlytics/Operations/Symbolication/FIRCLSThreadArrayOperation.m; sourceTree = ""; }; + 3F238BB22C5201CE689CAF2F766AED95 /* PromisesObjC-FBLPromises_Privacy */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "PromisesObjC-FBLPromises_Privacy"; path = FBLPromises_Privacy.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + 3F31A2F0A43504AAABD2A50BA2F955B8 /* ISAdapterDebugProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdapterDebugProtocol.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterDebugProtocol.h"; sourceTree = ""; }; + 3F6B793E900414B3F8274C246135F8EC /* LPMBannerAdView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LPMBannerAdView.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMBannerAdView.h"; sourceTree = ""; }; + 402886C04939EE92BEDD4A62AAB68BE7 /* PromisesSwift-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "PromisesSwift-umbrella.h"; sourceTree = ""; }; + 4035964C91C1B0CA76EA274AF5C93909 /* FIRCLSUnwind_arch.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSUnwind_arch.h; path = Crashlytics/Crashlytics/Unwind/FIRCLSUnwind_arch.h; sourceTree = ""; }; + 404E582F8FD063231A685E88402BD0E0 /* GULNetwork.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GULNetwork.m; path = GoogleUtilities/Network/GULNetwork.m; sourceTree = ""; }; + 405A27AA81B7BAD6FB4DEE0CF6DA5DD7 /* FIRLogger.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRLogger.h; path = FirebaseCore/Extension/FIRLogger.h; sourceTree = ""; }; + 411C572D658946450319E3438E61FBCC /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + 41676492598EFDE552A3AE32E4C034C2 /* ISAdapterNativeAdViewBinderProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdapterNativeAdViewBinderProtocol.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterNativeAdViewBinderProtocol.h"; sourceTree = ""; }; + 417AD7AF3A1ABD80AD36ABBB64A02D20 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = FirebaseCore/Internal/Sources/Resources/PrivacyInfo.xcprivacy; sourceTree = ""; }; + 42214B91DB94A8BCA9AAB752EC20709C /* FIRInstallations.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRInstallations.m; path = FirebaseInstallations/Source/Library/FIRInstallations.m; sourceTree = ""; }; + 42AD263E90CFB2730F35106BAEA86DAA /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = Resources/PrivacyInfo.xcprivacy; sourceTree = ""; }; + 42FB737570CE3DFC7CF25181D7DECD36 /* pb_common.c */ = {isa = PBXFileReference; includeInIndex = 1; path = pb_common.c; sourceTree = ""; }; + 432F4CB22E95568406C879D494702FCE /* ISMetaData.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISMetaData.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISMetaData.h"; sourceTree = ""; }; + 434E8926C8AD43CA9F81CBA38ABE052E /* FIRCLSMachOSlice.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSMachOSlice.h; path = Crashlytics/Shared/FIRCLSMachO/FIRCLSMachOSlice.h; sourceTree = ""; }; + 4353BC9AA91F31FEF0A5F70D8CF69875 /* FirebaseCrashlytics.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FirebaseCrashlytics.release.xcconfig; sourceTree = ""; }; + 43635576C595B52CD10CBDCAAF2582A9 /* FIRCLSDemangleOperation.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = FIRCLSDemangleOperation.mm; path = Crashlytics/Crashlytics/Operations/Symbolication/FIRCLSDemangleOperation.mm; sourceTree = ""; }; + 43C1871CCE14AF1BC38FEB833AECF454 /* FIRCLSSymbolicationOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSSymbolicationOperation.h; path = Crashlytics/Crashlytics/Operations/Symbolication/FIRCLSSymbolicationOperation.h; sourceTree = ""; }; + 43F9B2C99AC9C9CCA867629A0FF1D7E3 /* GDTCORMetricsController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GDTCORMetricsController.m; path = GoogleDataTransport/GDTCORLibrary/GDTCORMetricsController.m; sourceTree = ""; }; + 44E291D18340EAC3F761346198515323 /* GoogleUtilities-GoogleUtilities_Privacy */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "GoogleUtilities-GoogleUtilities_Privacy"; path = GoogleUtilities_Privacy.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + 44ECD413E08EF414A0AA8CC76B82B3E5 /* IronSourceAdQualitySDK-xcframeworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "IronSourceAdQualitySDK-xcframeworks.sh"; sourceTree = ""; }; + 4510828D4ED1A91B7DC48E597A6ABF69 /* FIRCLSMachO.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSMachO.m; path = Crashlytics/Shared/FIRCLSMachO/FIRCLSMachO.m; sourceTree = ""; }; + 453C58087E42DCEE7C64008C6269927E /* ISAdapterConsentProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdapterConsentProtocol.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterConsentProtocol.h"; sourceTree = ""; }; + 45A97CCCD5706C3372CFE18761AD892C /* FIRCLSConstants.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSConstants.m; path = Crashlytics/Shared/FIRCLSConstants.m; sourceTree = ""; }; + 46474726596AE39D0A76F938E0A80E6A /* FirebaseInstallations-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "FirebaseInstallations-dummy.m"; sourceTree = ""; }; + 4658139A2C368DC99EAC558629B8C9DD /* ISLog.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISLog.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISLog.h"; sourceTree = ""; }; + 46597EE1583194FE324E15F384F67BAD /* FIRCLSOnDemandModel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSOnDemandModel.h; path = Crashlytics/Crashlytics/Models/FIRCLSOnDemandModel.h; sourceTree = ""; }; + 469FB7F1902EBDB01D9AFC76CA5AFFEA /* ISNativeAdProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISNativeAdProtocol.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNativeAdProtocol.h"; sourceTree = ""; }; + 47501895B5CBD9CE9F44D79EE948C9BA /* ISNativeAdDataProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISNativeAdDataProtocol.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNativeAdDataProtocol.h"; sourceTree = ""; }; + 47716F8006C67DDB72C6F7EBF750F8F4 /* ISIronSourceAdapter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISIronSourceAdapter.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISIronSourceAdapter.h"; sourceTree = ""; }; + 47C581450CDB4A6111CB97EEE0711A8C /* FirebaseInstallations-FirebaseInstallations_Privacy */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "FirebaseInstallations-FirebaseInstallations_Privacy"; path = FirebaseInstallations_Privacy.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + 487FB63FFB9821CEE76EDDC66E533D28 /* ISBannerAdapterProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISBannerAdapterProtocol.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBannerAdapterProtocol.h"; sourceTree = ""; }; + 48FA46A66247F6EEA5175CFB52550095 /* FIRCLSContextManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSContextManager.h; path = Crashlytics/Crashlytics/Controllers/FIRCLSContextManager.h; sourceTree = ""; }; + 490E7AB6DEADBE4BCBF1E69C4ACD9309 /* FIRInstallationsIDController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRInstallationsIDController.m; path = FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsIDController.m; sourceTree = ""; }; + 49855E912FB731CEB8B03D4DDBDB8841 /* ISInterstitialAdapterProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISInterstitialAdapterProtocol.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISInterstitialAdapterProtocol.h"; sourceTree = ""; }; + 49B9EA5BF9CBC4F459DC64049E1C5BC7 /* pb_decode.c */ = {isa = PBXFileReference; includeInIndex = 1; path = pb_decode.c; sourceTree = ""; }; + 49C01A95AD44924B0A150B7FBF2D3C3B /* GULNetworkInfo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GULNetworkInfo.m; path = GoogleUtilities/Environment/NetworkInfo/GULNetworkInfo.m; sourceTree = ""; }; + 4A170FE629D15CDA92E90BDE57738254 /* FIRInstallationsSingleOperationPromiseCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRInstallationsSingleOperationPromiseCache.m; path = FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsSingleOperationPromiseCache.m; sourceTree = ""; }; + 4A3E90F23E0540C1E1A787A0100E6930 /* FBLPromise+Reduce.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "FBLPromise+Reduce.m"; path = "Sources/FBLPromises/FBLPromise+Reduce.m"; sourceTree = ""; }; + 4AB9BA7C4F288A9888D0AF459B73E388 /* FIRCLSAsyncOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSAsyncOperation.h; path = Crashlytics/Crashlytics/Operations/FIRCLSAsyncOperation.h; sourceTree = ""; }; + 4ADC1FD14195B521394962C3B98DD910 /* FIRCLSHandler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSHandler.h; path = Crashlytics/Crashlytics/Handlers/FIRCLSHandler.h; sourceTree = ""; }; + 4AFF614C103C40256E50FAD2D33AD893 /* ISNativeAdLoadDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISNativeAdLoadDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNativeAdLoadDelegate.h"; sourceTree = ""; }; + 4BA1A5F567A5A56048407845D0A0D76B /* FIRCLSFABNetworkClient.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSFABNetworkClient.h; path = Crashlytics/Shared/FIRCLSNetworking/FIRCLSFABNetworkClient.h; sourceTree = ""; }; + 4BA86F1748E41114305A22D7B6D5A953 /* GDTCORAssert.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCORAssert.h; path = GoogleDataTransport/GDTCORLibrary/Internal/GDTCORAssert.h; sourceTree = ""; }; + 4BEC5C7C53878CAC1940693EB61EE496 /* FirebaseCore-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FirebaseCore-umbrella.h"; sourceTree = ""; }; + 4C24D264760CA17033685161F6DC207D /* ISNativeAdInteractionDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISNativeAdInteractionDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNativeAdInteractionDelegate.h"; sourceTree = ""; }; + 4C459FCCE5F0DF8A0314184C5409BBF8 /* FBLPromise+Then.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBLPromise+Then.h"; path = "Sources/FBLPromises/include/FBLPromise+Then.h"; sourceTree = ""; }; + 4C824A6865EAFD8A3D7EA439CF5D4F84 /* ISDemandOnlyBannerView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISDemandOnlyBannerView.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISDemandOnlyBannerView.h"; sourceTree = ""; }; + 4CF8C434D2863D02CE45275CA3243C18 /* FIRAnalyticsInterop.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRAnalyticsInterop.h; path = Interop/Analytics/Public/FIRAnalyticsInterop.h; sourceTree = ""; }; + 4D8B8BD8FA97850F82DEACDA6D2564F7 /* FirebaseCrashlytics.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FirebaseCrashlytics.h; path = Crashlytics/Crashlytics/Public/FirebaseCrashlytics/FirebaseCrashlytics.h; sourceTree = ""; }; + 4DB03FD262B678178A44272143846563 /* FirebaseCoreInternal-FirebaseCoreInternal_Privacy */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "FirebaseCoreInternal-FirebaseCoreInternal_Privacy"; path = FirebaseCoreInternal_Privacy.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + 4E1394293C18E2CFDF5A3072F9E2A667 /* nanopb.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = nanopb.release.xcconfig; sourceTree = ""; }; + 4E371453D1ABF2E876625E44EEDE9316 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = FirebaseInstallations/Source/Library/Resources/PrivacyInfo.xcprivacy; sourceTree = ""; }; + 4E44829C91EC31D7CC498CFCE1823D71 /* GDTCOREndpoints.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCOREndpoints.h; path = GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCOREndpoints.h; sourceTree = ""; }; + 4E5A6981A575BBBFA0E4883EA764E8EC /* GULNetworkMessageCode.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GULNetworkMessageCode.h; path = GoogleUtilities/Network/Public/GoogleUtilities/GULNetworkMessageCode.h; sourceTree = ""; }; + 4E8659A517690143F31B05CB9335DD83 /* ISNativeAdDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISNativeAdDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNativeAdDelegate.h"; sourceTree = ""; }; + 4EA60B96ECDE4EAAB06858C4F627CCBC /* GDTCORReachability_Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCORReachability_Private.h; path = GoogleDataTransport/GDTCORLibrary/Private/GDTCORReachability_Private.h; sourceTree = ""; }; + 4F4FC2F5CD235F506EBE68B517162E5F /* ISAdapterMetaDataProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdapterMetaDataProtocol.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterMetaDataProtocol.h"; sourceTree = ""; }; + 504585617C72E3E4F046B4166D73584E /* FirebaseCoreExtension-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FirebaseCoreExtension-prefix.pch"; sourceTree = ""; }; + 5052CDC463F2CA370196062659882B38 /* Promise+Race.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Promise+Race.swift"; path = "Sources/Promises/Promise+Race.swift"; sourceTree = ""; }; + 51161A3571E1AD2CF433C165BD74315D /* FirebaseRemoteConfigInterop-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "FirebaseRemoteConfigInterop-Info.plist"; sourceTree = ""; }; + 515E118D1F0F59CF24FADB24403C9AFF /* FBLPromise+Timeout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBLPromise+Timeout.h"; path = "Sources/FBLPromises/include/FBLPromise+Timeout.h"; sourceTree = ""; }; + 51864E8172B366BB542D866EE1F50EC6 /* pb_encode.c */ = {isa = PBXFileReference; includeInIndex = 1; path = pb_encode.c; sourceTree = ""; }; + 51C8BA4480EF61CF419628A318848CBD /* FIRInstallationsItem.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRInstallationsItem.m; path = FirebaseInstallations/Source/Library/FIRInstallationsItem.m; sourceTree = ""; }; + 5265C01DC45E528FBA0FFE4DFFE90730 /* FIRCLSThreadArrayOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSThreadArrayOperation.h; path = Crashlytics/Crashlytics/Operations/Symbolication/FIRCLSThreadArrayOperation.h; sourceTree = ""; }; + 52683691D0E142C39D15CA2DA8D5E237 /* FIRInstallationsItem.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRInstallationsItem.h; path = FirebaseInstallations/Source/Library/FIRInstallationsItem.h; sourceTree = ""; }; + 52D5DE1F2A8D1741B87270EDD460C90F /* FirebaseAnalytics.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FirebaseAnalytics.release.xcconfig; sourceTree = ""; }; + 53080976EEC1F9A13D6491BED7A22D58 /* ISARewardedAdLoader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISARewardedAdLoader.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISARewardedAdLoader.h"; sourceTree = ""; }; + 533A1C390C27BFCA44BDC78888B6C6A9 /* external_prequest_context.nanopb.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = external_prequest_context.nanopb.h; path = GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/external_prequest_context.nanopb.h; sourceTree = ""; }; + 53D6559C8FDACD17A258B29C01DDCFEA /* Promise+Recover.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Promise+Recover.swift"; path = "Sources/Promises/Promise+Recover.swift"; sourceTree = ""; }; + 53E213CDE8EA6EAC06399F2176AE3D4B /* GDTCORMetricsControllerProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCORMetricsControllerProtocol.h; path = GoogleDataTransport/GDTCORLibrary/Internal/GDTCORMetricsControllerProtocol.h; sourceTree = ""; }; + 5498B35700C70EF67D8D2393D70B227E /* FIRCLSOnDemandModel_Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSOnDemandModel_Private.h; path = Crashlytics/Crashlytics/Private/FIRCLSOnDemandModel_Private.h; sourceTree = ""; }; + 54D276171F73331F8A7575A8C2F8A24D /* FIRComponent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRComponent.h; path = FirebaseCore/Extension/FIRComponent.h; sourceTree = ""; }; + 55AA7890286F39C592241ADFBA093A56 /* ISNetworkInitCallbackProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISNetworkInitCallbackProtocol.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNetworkInitCallbackProtocol.h"; sourceTree = ""; }; + 561E20D5F8638D118A0C9F79A9C30BFD /* FirebaseRemoteConfigInterop.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = FirebaseRemoteConfigInterop.modulemap; sourceTree = ""; }; + 564837C27D8B07B449946E93DAE05505 /* ISAdapterAdInteractionDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdapterAdInteractionDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterAdInteractionDelegate.h"; sourceTree = ""; }; + 566D45DD6426EDBEE7BA301FD8383537 /* compliance.nanopb.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = compliance.nanopb.h; path = GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/compliance.nanopb.h; sourceTree = ""; }; + 568E5E09718BB4CB7242B53D62516E69 /* ISAdapterNetworkData.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdapterNetworkData.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterNetworkData.h"; sourceTree = ""; }; + 5723FF239BCEB6D88B9874F1440EEADA /* FIRConfiguration.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRConfiguration.m; path = FirebaseCore/Sources/FIRConfiguration.m; sourceTree = ""; }; + 572BE6A604DA19F19734B0FD32EC784E /* ISNEventTrackerWrapper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISNEventTrackerWrapper.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNEventTrackerWrapper.h"; sourceTree = ""; }; + 5744EFD31B947A5BD323ABC59C4EC853 /* FIRCLSDataParsing.c */ = {isa = PBXFileReference; includeInIndex = 1; name = FIRCLSDataParsing.c; path = Crashlytics/Crashlytics/Unwind/Dwarf/FIRCLSDataParsing.c; sourceTree = ""; }; + 57719B363CDEFEBE2083CC146C9D265A /* nanopb.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = nanopb.modulemap; sourceTree = ""; }; + 57821EE1A6C56AE10782479C1E3F30D2 /* ISARewardedAdRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISARewardedAdRequest.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISARewardedAdRequest.h"; sourceTree = ""; }; + 57C8765FACA5923A29B9B3E6549BAC57 /* FIRCLSFileManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSFileManager.m; path = Crashlytics/Crashlytics/Models/FIRCLSFileManager.m; sourceTree = ""; }; + 58337BFD677DD26E6D5E319263AAD22A /* ISBaseNativeAd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISBaseNativeAd.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseNativeAd.h"; sourceTree = ""; }; + 5854BE56E064339C5DDDC1EFFE5B5BB6 /* ResourceBundle-FirebaseCrashlytics_Privacy-FirebaseCrashlytics-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-FirebaseCrashlytics_Privacy-FirebaseCrashlytics-Info.plist"; sourceTree = ""; }; + 5871D5CE9439B478C694221E60B2EDFB /* FIRCLSLaunchMarkerModel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSLaunchMarkerModel.h; path = Crashlytics/Crashlytics/Models/FIRCLSLaunchMarkerModel.h; sourceTree = ""; }; + 589A8A9E3F768B680487BE8916448D53 /* FIRCurrentDateProvider.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCurrentDateProvider.m; path = FirebaseInstallations/Source/Library/InstallationsIDController/FIRCurrentDateProvider.m; sourceTree = ""; }; + 589B5CA0837902E9A2F318B4BBD29197 /* FIRCLSAsyncOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSAsyncOperation.m; path = Crashlytics/Crashlytics/Operations/FIRCLSAsyncOperation.m; sourceTree = ""; }; + 58F9C2791E5A67647907A7133F675B29 /* FIRCLSRecordIdentity.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSRecordIdentity.h; path = Crashlytics/Crashlytics/Models/Record/FIRCLSRecordIdentity.h; sourceTree = ""; }; + 595434D29B28CB61FFFE7415233145DD /* Promise+Testing.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Promise+Testing.swift"; path = "Sources/Promises/Promise+Testing.swift"; sourceTree = ""; }; + 5A05038D9FDA32819B7F732A223E07EF /* FIRSESNanoPBHelpers.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRSESNanoPBHelpers.m; path = FirebaseSessions/SourcesObjC/NanoPB/FIRSESNanoPBHelpers.m; sourceTree = ""; }; + 5A2B8BEBEFA214E361C111AF3D8B7D68 /* LPMImpressionData.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LPMImpressionData.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMImpressionData.h"; sourceTree = ""; }; + 5A5E4CCB8F1B211F932AB6ABE9F6FC83 /* ISABannerAdLoaderDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISABannerAdLoaderDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISABannerAdLoaderDelegate.h"; sourceTree = ""; }; + 5A8E4348AFB7C692C5BF589183AF6DD0 /* ISNativeAdAdapterProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISNativeAdAdapterProtocol.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNativeAdAdapterProtocol.h"; sourceTree = ""; }; + 5AAE37425AE59D987BC8415EE3B4E94A /* FIRCLSGlobals.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSGlobals.h; path = Crashlytics/Crashlytics/Components/FIRCLSGlobals.h; sourceTree = ""; }; + 5B01756129B6690A81409AE25328118D /* FIRCLSUnwind_arm.c */ = {isa = PBXFileReference; includeInIndex = 1; name = FIRCLSUnwind_arm.c; path = Crashlytics/Crashlytics/Unwind/FIRCLSUnwind_arm.c; sourceTree = ""; }; + 5B7BB3434B89A73963792BF227173DD7 /* FIRCLSUUID.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSUUID.h; path = Crashlytics/Shared/FIRCLSUUID.h; sourceTree = ""; }; + 5C07E83DBD3F3C1232005521D4188C03 /* ISNativeAdAdapterProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISNativeAdAdapterProtocol.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNativeAdAdapterProtocol.h"; sourceTree = ""; }; + 5C6A689BFDDB937948874F7CD01C2618 /* ISNSupersonicAdsPublisherSwiftFacade.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISNSupersonicAdsPublisherSwiftFacade.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNSupersonicAdsPublisherSwiftFacade.h"; sourceTree = ""; }; + 5CC1C3F46924563DD7F364E2EFD61652 /* GDTCORFlatFileStorage+Promises.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "GDTCORFlatFileStorage+Promises.m"; path = "GoogleDataTransport/GDTCORLibrary/GDTCORFlatFileStorage+Promises.m"; sourceTree = ""; }; + 5CF8157DAFAAF8F34E35FE42C7A4F50C /* GULNetworkConstants.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GULNetworkConstants.m; path = GoogleUtilities/Network/GULNetworkConstants.m; sourceTree = ""; }; + 5D131BE371CBFE130D89867B8E064F1B /* FIRCLSReportUploader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSReportUploader.h; path = Crashlytics/Crashlytics/Controllers/FIRCLSReportUploader.h; sourceTree = ""; }; + 5D1B48F5E2F6A4D5924505DDAADEF8EC /* LevelPlayBaseBannerAdapter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LevelPlayBaseBannerAdapter.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LevelPlayBaseBannerAdapter.h"; sourceTree = ""; }; + 5D84DC7476095566AF1272CB9D4DCEDF /* LevelPlayMediaView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LevelPlayMediaView.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LevelPlayMediaView.h"; sourceTree = ""; }; + 5DE5F407E457CDBC3EC989D5EC0267CB /* FBLPromise+Wrap.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "FBLPromise+Wrap.m"; path = "Sources/FBLPromises/FBLPromise+Wrap.m"; sourceTree = ""; }; + 5E3980C1701466712484BB5AA87A843C /* GULAppDelegateSwizzler_Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GULAppDelegateSwizzler_Private.h; path = GoogleUtilities/AppDelegateSwizzler/Internal/GULAppDelegateSwizzler_Private.h; sourceTree = ""; }; + 5E7EE5479D37A87F2D4D493403098EF9 /* LPMDispatcherProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LPMDispatcherProtocol.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMDispatcherProtocol.h"; sourceTree = ""; }; + 5E80B7130BC2F64202AB13497088153E /* FIRCLSSymbolicationOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSSymbolicationOperation.m; path = Crashlytics/Crashlytics/Operations/Symbolication/FIRCLSSymbolicationOperation.m; sourceTree = ""; }; + 5E95A02FFCE48CD8F72CC9B4E7C30470 /* ISABannerAdView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISABannerAdView.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISABannerAdView.h"; sourceTree = ""; }; + 5EE7B9C176F062188973EE2872E7198C /* ISAInterstitialAdRequestBuilder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAInterstitialAdRequestBuilder.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAInterstitialAdRequestBuilder.h"; sourceTree = ""; }; + 5FA09508B0C5C707B32E6E6342F4595F /* ISDemandOnlyRewardedVideoDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISDemandOnlyRewardedVideoDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISDemandOnlyRewardedVideoDelegate.h"; sourceTree = ""; }; + 5FB478C108C790F1E8E7C4EFF64EDAE7 /* ISBaseNativeAdAdapter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISBaseNativeAdAdapter.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseNativeAdAdapter.h"; sourceTree = ""; }; + 603A3741C764ED8E33FFA78791103DC7 /* FIRComponentType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRComponentType.h; path = FirebaseCore/Extension/FIRComponentType.h; sourceTree = ""; }; + 607C000C9834FAA4793FD988672602AE /* ISConcurrentMutableArray.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISConcurrentMutableArray.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISConcurrentMutableArray.h"; sourceTree = ""; }; + 6080C60B399A25A3911D15626DCF7711 /* FIRCLSMachOBinary.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSMachOBinary.m; path = Crashlytics/Shared/FIRCLSMachO/FIRCLSMachOBinary.m; sourceTree = ""; }; + 6102E83195F0B1D1BB9085D6FA872D2B /* GDTCORLogSourceMetrics.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GDTCORLogSourceMetrics.m; path = GoogleDataTransport/GDTCORLibrary/GDTCORLogSourceMetrics.m; sourceTree = ""; }; + 6108FF09AFEBC89E23350E0AB0EC0442 /* ISAdapterBaseProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdapterBaseProtocol.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterBaseProtocol.h"; sourceTree = ""; }; + 616B8035F222994177E84AC8B8809C60 /* FIRCLSContextManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSContextManager.m; path = Crashlytics/Crashlytics/Controllers/FIRCLSContextManager.m; sourceTree = ""; }; + 616FE9D1DE2A47CAA4135257B698B7FA /* ISAdapterConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdapterConfig.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterConfig.h"; sourceTree = ""; }; + 617ACE93F66B8FA1030C58ADF45E4536 /* IronSourceAdQuality.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IronSourceAdQuality.h; path = "IronSourceAdQualitySDK.xcframework/ios-arm64_x86_64-simulator/Headers/IronSourceAdQuality.h"; sourceTree = ""; }; + 617B0F345BFFAF23969A525A39D142F4 /* FIRCLSExistingReportManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSExistingReportManager.h; path = Crashlytics/Crashlytics/Controllers/FIRCLSExistingReportManager.h; sourceTree = ""; }; + 619E6A45528E9255637879488FB26EDF /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/Security.framework; sourceTree = DEVELOPER_DIR; }; + 61DE5AAEAE501D74076AF93A500EDB32 /* FIRCLSProcessReportOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSProcessReportOperation.m; path = Crashlytics/Crashlytics/Operations/Reports/FIRCLSProcessReportOperation.m; sourceTree = ""; }; + 61F9D482780BEC32124EC2E2BB6C54CF /* FirebaseCoreInternal-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FirebaseCoreInternal-prefix.pch"; sourceTree = ""; }; + 623C6C791AD1AC849BD033EE3B6ACE99 /* GDTCORMetricsController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCORMetricsController.h; path = GoogleDataTransport/GDTCORLibrary/Private/GDTCORMetricsController.h; sourceTree = ""; }; + 623D13AE11D7ADBF6E124D5F2F6A0102 /* SessionsProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionsProvider.swift; path = FirebaseSessions/Sources/Public/SessionsProvider.swift; sourceTree = ""; }; + 626F5919EC4E5EA22A0ED424E151A745 /* GULMutableDictionary.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GULMutableDictionary.h; path = GoogleUtilities/Network/Public/GoogleUtilities/GULMutableDictionary.h; sourceTree = ""; }; + 62762D87583BCC32FEFB6F9972282910 /* FirebaseRemoteConfigInterop-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FirebaseRemoteConfigInterop-umbrella.h"; sourceTree = ""; }; + 62D61BFFD9EF25F636F9EB01DFB06FCE /* ISConcurrentMutableDictionary.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISConcurrentMutableDictionary.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISConcurrentMutableDictionary.h"; sourceTree = ""; }; + 62F3F90BEEA6A0BEA026D0F582C4BD64 /* FIRCrashlyticsReport_Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCrashlyticsReport_Private.h; path = Crashlytics/Crashlytics/Private/FIRCrashlyticsReport_Private.h; sourceTree = ""; }; + 6327E28AF763E513DA6E86C88C092DE8 /* GoogleDataTransport.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GoogleDataTransport.debug.xcconfig; sourceTree = ""; }; + 63B31B728F9FB1F9DC0C62F8F6B24C7E /* ISMetaDataConstants.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISMetaDataConstants.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISMetaDataConstants.h"; sourceTree = ""; }; + 63E23B67F9D4DC249E1E10A949508119 /* nanopb-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "nanopb-Info.plist"; sourceTree = ""; }; + 646E8D078967D76A11EC2E76AB6DED34 /* LPMBannerAdViewDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LPMBannerAdViewDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMBannerAdViewDelegate.h"; sourceTree = ""; }; + 647765B7BD512ED2B40B53C3C093B64F /* ISBaseNativeAd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISBaseNativeAd.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseNativeAd.h"; sourceTree = ""; }; + 64CA801972BFE45B5D3152199C278C34 /* ISConcurrentMutableDictionary.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISConcurrentMutableDictionary.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISConcurrentMutableDictionary.h"; sourceTree = ""; }; + 64CF6C49437B67B6EF7D4AD50B1EBA3D /* Logger.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Logger.swift; path = FirebaseSessions/Sources/Logger.swift; sourceTree = ""; }; + 64D6422854E4C1D922D158AA82F9AF1B /* FIRCLSUnwind.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSUnwind.h; path = Crashlytics/Crashlytics/Unwind/FIRCLSUnwind.h; sourceTree = ""; }; + 64E7663603F5D0190EA8E49F05B42F7E /* ISAdQualityCustomMediationRevenue.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdQualityCustomMediationRevenue.h; path = "IronSourceAdQualitySDK.xcframework/ios-arm64/Headers/ISAdQualityCustomMediationRevenue.h"; sourceTree = ""; }; + 6539A9F9D46CC31AC70EDA246A6C1147 /* ISAInterstitialAdRequestBuilder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAInterstitialAdRequestBuilder.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAInterstitialAdRequestBuilder.h"; sourceTree = ""; }; + 65726C9516CC9C543ECABF2CDF025C93 /* IronSource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IronSource.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/IronSource.h"; sourceTree = ""; }; + 65A3DC7E3CF8C652EA16ACBA12E5B578 /* ISMediationGlobalDataWriterFacade.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISMediationGlobalDataWriterFacade.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISMediationGlobalDataWriterFacade.h"; sourceTree = ""; }; + 65CA2C3429DDA663555FB02A1B75E201 /* ISAdQualitySegment.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdQualitySegment.h; path = "IronSourceAdQualitySDK.xcframework/ios-arm64_x86_64-simulator/Headers/ISAdQualitySegment.h"; sourceTree = ""; }; + 663DE0794483C88A411B7BDA41B2DD0B /* LPMBannerAdView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LPMBannerAdView.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMBannerAdView.h"; sourceTree = ""; }; + 6749A4C1F2DECB3AF85B79A3312D52BB /* FirebaseRemoteConfigInterop.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FirebaseRemoteConfigInterop.release.xcconfig; sourceTree = ""; }; + 684FCD89E8BA4550A0A6F1653CEB9245 /* ISAdapterAdDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdapterAdDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterAdDelegate.h"; sourceTree = ""; }; + 6874005D1E88242410692FD05721312F /* LPMInterstitialAdConfigBuilder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LPMInterstitialAdConfigBuilder.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMInterstitialAdConfigBuilder.h"; sourceTree = ""; }; + 68A8AAB178F233C0B13967A06044250D /* FIRCLSRecordBase.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSRecordBase.m; path = Crashlytics/Crashlytics/Models/Record/FIRCLSRecordBase.m; sourceTree = ""; }; + 68CF38C58D90C2F94CCA4118B4C034CC /* RolloutAssignment.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RolloutAssignment.swift; path = FirebaseRemoteConfig/Interop/RolloutAssignment.swift; sourceTree = ""; }; + 691B9911C691A543A1AA8C1FA5BFCD6B /* LPMInterstitialAd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LPMInterstitialAd.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMInterstitialAd.h"; sourceTree = ""; }; + 69202D147DBF6F3A28227F730DEC1482 /* ISMetaData.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISMetaData.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISMetaData.h"; sourceTree = ""; }; + 6935C3A678069F263360FDF0A3D88776 /* ISMetaDataUtils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISMetaDataUtils.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISMetaDataUtils.h"; sourceTree = ""; }; + 69A2FC9AB94A757BD3026F9151C2D7D4 /* FIRInstallationsIIDStore.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRInstallationsIIDStore.h; path = FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDStore.h; sourceTree = ""; }; + 69A4852926E3A9DD96162FEBB238FE20 /* Heartbeat.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Heartbeat.swift; path = FirebaseCore/Internal/Sources/HeartbeatLogging/Heartbeat.swift; sourceTree = ""; }; + 69BBE354CEB2BB741A3AD48391272DF5 /* FBLPromise+Always.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "FBLPromise+Always.m"; path = "Sources/FBLPromises/FBLPromise+Always.m"; sourceTree = ""; }; + 6A0B50CC9CF04507E15EF2B57B633B13 /* FIRCLSInternalLogging.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSInternalLogging.h; path = Crashlytics/Crashlytics/Helpers/FIRCLSInternalLogging.h; sourceTree = ""; }; + 6A432EE11DA9A5233EA7E827EE18CE91 /* ISARewardedAdDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISARewardedAdDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISARewardedAdDelegate.h"; sourceTree = ""; }; + 6B1DA01E1FE7F68932E0BEE63FB99E88 /* FIRCLSByteUtility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSByteUtility.h; path = Crashlytics/Shared/FIRCLSByteUtility.h; sourceTree = ""; }; + 6B429F7B704C639EAB90CA4BAEF50C4C /* GULKeychainUtils.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GULKeychainUtils.m; path = GoogleUtilities/Environment/SecureStorage/GULKeychainUtils.m; sourceTree = ""; }; + 6BA4D2C15705196CA3438238C0424374 /* ISAAdFormat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAAdFormat.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAAdFormat.h"; sourceTree = ""; }; + 6C54F1E417AC67735075D965F9F416E1 /* PromisesSwift-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "PromisesSwift-Info.plist"; sourceTree = ""; }; + 6C8D3D0BDAA8FB49A5D4E2C21B23881D /* GDTCOREventDataObject.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCOREventDataObject.h; path = GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCOREventDataObject.h; sourceTree = ""; }; + 6CF7C2897A3776BA972C140A9DEE6DB8 /* ISNAppStoreVCRootViewDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISNAppStoreVCRootViewDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNAppStoreVCRootViewDelegate.h"; sourceTree = ""; }; + 6CFB31D2B6469BAFCF0D0EE83B6D6A74 /* Promise.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Promise.swift; path = Sources/Promises/Promise.swift; sourceTree = ""; }; + 6D3CA506E1A546D42FDF3E6448C106C8 /* IronSourceSDK.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IronSourceSDK.release.xcconfig; sourceTree = ""; }; + 6D9B49C53DB400504CB1D49494E84061 /* LPMBannerAdViewConfigBuilder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LPMBannerAdViewConfigBuilder.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMBannerAdViewConfigBuilder.h"; sourceTree = ""; }; + 6DD5E6DDDEDC478DF62822EB79509201 /* FIRInstallationsItem+RegisterInstallationAPI.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FIRInstallationsItem+RegisterInstallationAPI.h"; path = "FirebaseInstallations/Source/Library/InstallationsAPI/FIRInstallationsItem+RegisterInstallationAPI.h"; sourceTree = ""; }; + 6DE47118218FE9DD48B787D2008307CD /* GULUserDefaults.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GULUserDefaults.m; path = GoogleUtilities/UserDefaults/GULUserDefaults.m; sourceTree = ""; }; + 6E254AD732AA56E2233033B0F596DE44 /* ISABannerAdLoader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISABannerAdLoader.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISABannerAdLoader.h"; sourceTree = ""; }; + 6E44F078D0A8BF84F02C552F62EBC7AC /* IronSourceAdQualitySDK.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IronSourceAdQualitySDK.debug.xcconfig; sourceTree = ""; }; + 6E77A4773E824C1D7A5DC5B725A71C00 /* FIRCLSContext.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSContext.h; path = Crashlytics/Crashlytics/Components/FIRCLSContext.h; sourceTree = ""; }; + 6F08C3B1CD07206601170D94C1BE73F0 /* Promise+Then.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Promise+Then.swift"; path = "Sources/Promises/Promise+Then.swift"; sourceTree = ""; }; + 6F467609B407F926B182ACF7D04672A5 /* FIRCLSDwarfUnwindRegisters.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSDwarfUnwindRegisters.h; path = Crashlytics/Crashlytics/Unwind/Dwarf/FIRCLSDwarfUnwindRegisters.h; sourceTree = ""; }; + 6FA5E72A6A534C74AB25E6353E27A299 /* ISError.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISError.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISError.h"; sourceTree = ""; }; + 6FD189EB7D8DAAA1B0FD1DE606EF1D5F /* FIRCLSFABAsyncOperation_Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSFABAsyncOperation_Private.h; path = Crashlytics/Shared/FIRCLSOperation/FIRCLSFABAsyncOperation_Private.h; sourceTree = ""; }; + 7001A63E1A9DC7FE5211C829514A4388 /* FIRLibrary.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRLibrary.h; path = FirebaseCore/Extension/FIRLibrary.h; sourceTree = ""; }; + 70CE9B00B0C5DDF3A0264BD2D5EAAC9B /* PromisesObjC-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "PromisesObjC-dummy.m"; sourceTree = ""; }; + 70FBDF52C674C3971C4296F27117298A /* FBLPromise+Validate.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "FBLPromise+Validate.m"; path = "Sources/FBLPromises/FBLPromise+Validate.m"; sourceTree = ""; }; + 71212E335B1881ECF4D260EEE26D4B47 /* GDTCORRegistrar_Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCORRegistrar_Private.h; path = GoogleDataTransport/GDTCORLibrary/Private/GDTCORRegistrar_Private.h; sourceTree = ""; }; + 714FC804868794FC65ACC809A4BD408D /* FIRCLSManagerData.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSManagerData.h; path = Crashlytics/Crashlytics/Controllers/FIRCLSManagerData.h; sourceTree = ""; }; + 71676436D07AD420A8D4EEB7170D0276 /* GULAppDelegateSwizzler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GULAppDelegateSwizzler.m; path = GoogleUtilities/AppDelegateSwizzler/GULAppDelegateSwizzler.m; sourceTree = ""; }; + 71A7D5A7EA6A59D1467FEAB5392F46A5 /* WeakContainer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WeakContainer.swift; path = FirebaseCore/Internal/Sources/HeartbeatLogging/WeakContainer.swift; sourceTree = ""; }; + 723C7262FB570D774DAC5081A2209635 /* FIRInstallationsStoredAuthToken.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRInstallationsStoredAuthToken.h; path = FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStoredAuthToken.h; sourceTree = ""; }; + 73F1BDC5C04B01D703D1ED3ABBBB52BA /* GULNSData+zlib.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "GULNSData+zlib.m"; path = "GoogleUtilities/NSData+zlib/GULNSData+zlib.m"; sourceTree = ""; }; + 73F2669B8E97E07B1E986EEDDCD1E20F /* FIRComponent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRComponent.h; path = FirebaseCore/Extension/FIRComponent.h; sourceTree = ""; }; + 74050BBEB3A02EC7C964E0F4B4AFC8BA /* SettingsDownloadClient.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SettingsDownloadClient.swift; path = FirebaseSessions/Sources/Settings/SettingsDownloadClient.swift; sourceTree = ""; }; + 740DF2224353145EB5C2BC97D089377C /* ISAdapterErrorType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdapterErrorType.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterErrorType.h"; sourceTree = ""; }; + 74269A41A6C776DF12BC3E6F3A7D63E0 /* FIRCLSMetricKitManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSMetricKitManager.h; path = Crashlytics/Crashlytics/Controllers/FIRCLSMetricKitManager.h; sourceTree = ""; }; + 745DF6128BC6D033E47AC4CB341C6742 /* FIRInstallationsIIDStore.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRInstallationsIIDStore.m; path = FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDStore.m; sourceTree = ""; }; + 748429F418DBBA8D955BD971DFF1ADAD /* ISInterstitialAdapterProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISInterstitialAdapterProtocol.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISInterstitialAdapterProtocol.h"; sourceTree = ""; }; + 750B2D0A333C9B773C5CD112D92B9624 /* FirebaseCoreInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FirebaseCoreInternal.h; path = FirebaseCore/Extension/FirebaseCoreInternal.h; sourceTree = ""; }; + 7526970C05C8ACD66297C7E2B11A458A /* GDTCOREndpoints_Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCOREndpoints_Private.h; path = GoogleDataTransport/GDTCORLibrary/Private/GDTCOREndpoints_Private.h; sourceTree = ""; }; + 75336B1CE3D1511D5E74D941916F139D /* LevelPlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LevelPlay.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LevelPlay.h"; sourceTree = ""; }; + 758F93EFBC31D5CA2CBB4CF6B2C95B64 /* GDTCORMetrics+GDTCCTSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "GDTCORMetrics+GDTCCTSupport.h"; path = "GoogleDataTransport/GDTCCTLibrary/Private/GDTCORMetrics+GDTCCTSupport.h"; sourceTree = ""; }; + 7598137A247E471F3F68F82D668DF53B /* GoogleAppMeasurement.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; name = GoogleAppMeasurement.xcframework; path = Frameworks/GoogleAppMeasurement.xcframework; sourceTree = ""; }; + 75F7B6ACDDA3C90CDC50423C5B8BB512 /* ISSetAPSDataProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISSetAPSDataProtocol.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISSetAPSDataProtocol.h"; sourceTree = ""; }; + 76077ED823B78658850BC396CA91A52C /* GDTCORReachability.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GDTCORReachability.m; path = GoogleDataTransport/GDTCORLibrary/GDTCORReachability.m; sourceTree = ""; }; + 7626561CCC2B0572C89B82904ACF459C /* FIRCLSCompactUnwind_Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSCompactUnwind_Private.h; path = Crashlytics/Crashlytics/Unwind/Compact/FIRCLSCompactUnwind_Private.h; sourceTree = ""; }; + 7635C4E0C35785A69D609681EEDFD49C /* Pods-TastePick-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-TastePick-Info.plist"; sourceTree = ""; }; + 764FD3B73F706CB98739ECB8504FC38B /* FIRInstallationsIIDTokenStore.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRInstallationsIIDTokenStore.m; path = FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDTokenStore.m; sourceTree = ""; }; + 765604E2111ABE566CAE69768847EAB8 /* ISAInterstitialAdLoader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAInterstitialAdLoader.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAInterstitialAdLoader.h"; sourceTree = ""; }; + 7699E36A6CA8F5B111B31CF18A31EE6D /* FIRCLSOnDemandModel.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSOnDemandModel.m; path = Crashlytics/Crashlytics/Models/FIRCLSOnDemandModel.m; sourceTree = ""; }; + 76B37D610250B5FE141D4A203254B012 /* LPMReward.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LPMReward.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMReward.h"; sourceTree = ""; }; + 7705F842EADF3AF5994BB27C1F4EDCEB /* GDTCORFlatFileStorage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GDTCORFlatFileStorage.m; path = GoogleDataTransport/GDTCORLibrary/GDTCORFlatFileStorage.m; sourceTree = ""; }; + 77BAA74E5C55F0DAF3E9673B8B4348C9 /* ISBaseBanner.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISBaseBanner.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseBanner.h"; sourceTree = ""; }; + 780C95611F350E9839C019EC1F45D64B /* ISAAdSize.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAAdSize.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAAdSize.h"; sourceTree = ""; }; + 783F2376C80B3E144C8808271A304EA7 /* FIRAnalyticsConfiguration.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRAnalyticsConfiguration.h; path = FirebaseCore/Sources/FIRAnalyticsConfiguration.h; sourceTree = ""; }; + 78699DA54089137B6922B98CD3909C9D /* FirebaseCoreExtension-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FirebaseCoreExtension-umbrella.h"; sourceTree = ""; }; + 786BBAD049118554013D53C283077CE3 /* GDTCOREvent+GDTCCTSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "GDTCOREvent+GDTCCTSupport.h"; path = "GoogleDataTransport/GDTCCTLibrary/Public/GDTCOREvent+GDTCCTSupport.h"; sourceTree = ""; }; + 7889DBBE3161B40749D0EF6EF19B209F /* LevelPlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LevelPlay.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LevelPlay.h"; sourceTree = ""; }; + 79151FB773373872B30DBD699D878ACA /* IronSourceAdQualitySDK.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; path = IronSourceAdQualitySDK.xcframework; sourceTree = ""; }; + 792271CCB62FDB0E606BB91279FC1F41 /* GoogleUtilities-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "GoogleUtilities-umbrella.h"; sourceTree = ""; }; + 798F562C47DA0B47E689EDC894A4C0A4 /* FirebaseCore.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = FirebaseCore.modulemap; sourceTree = ""; }; + 79F6B356FF2D607008AD74FD27FE419B /* ISARewardedAdRequestBuilder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISARewardedAdRequestBuilder.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISARewardedAdRequestBuilder.h"; sourceTree = ""; }; + 7A6041B634788DB96C3D5FF9D303DDC9 /* ISBannerSize.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISBannerSize.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBannerSize.h"; sourceTree = ""; }; + 7B6C46CA9CE820944624F07B22DB7583 /* GDTCORFlatFileStorage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCORFlatFileStorage.h; path = GoogleDataTransport/GDTCORLibrary/Private/GDTCORFlatFileStorage.h; sourceTree = ""; }; + 7BE07EBFBD81CBB624867A6C2E75F4E1 /* FIRInstallationsIIDTokenStore.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRInstallationsIIDTokenStore.h; path = FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDTokenStore.h; sourceTree = ""; }; + 7BEB9DF17EBF5909321944E7CC6498C9 /* FIRCLSRecordHost.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSRecordHost.m; path = Crashlytics/Crashlytics/Models/Record/FIRCLSRecordHost.m; sourceTree = ""; }; + 7C5753C964A382D2D4AC757CC424DFC2 /* FIRComponentType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRComponentType.h; path = FirebaseCore/Extension/FIRComponentType.h; sourceTree = ""; }; + 7CD1A0A0766F6DCBD1A7C5490746BD0F /* FIRCLSCompactUnwind.c */ = {isa = PBXFileReference; includeInIndex = 1; name = FIRCLSCompactUnwind.c; path = Crashlytics/Crashlytics/Unwind/Compact/FIRCLSCompactUnwind.c; sourceTree = ""; }; + 7CD9AA954E5BD38685BBB4D6D3DAFA2A /* ISNativeAdViewBinderProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISNativeAdViewBinderProtocol.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNativeAdViewBinderProtocol.h"; sourceTree = ""; }; + 7D36278F28B9386784BCB7DD696476C3 /* GULSwizzler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GULSwizzler.h; path = GoogleUtilities/MethodSwizzler/Public/GoogleUtilities/GULSwizzler.h; sourceTree = ""; }; + 7D8DCC63E0E16A5128E9FE8F96B419EE /* PromisesSwift-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "PromisesSwift-prefix.pch"; sourceTree = ""; }; + 7D9C08BB6EFFDE773DC361593DC7495F /* ISNativeAdView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISNativeAdView.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNativeAdView.h"; sourceTree = ""; }; + 7D9D9A9AE6965458892201A240625ACD /* FirebaseSessionsError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FirebaseSessionsError.swift; path = FirebaseSessions/Sources/FirebaseSessionsError.swift; sourceTree = ""; }; + 7DA2E93913312C6089D29243E7364376 /* ISNativeAdView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISNativeAdView.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNativeAdView.h"; sourceTree = ""; }; + 7DADCF34E477641C9E6F47942A5F211A /* ISDemandOnlyBannerView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISDemandOnlyBannerView.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISDemandOnlyBannerView.h"; sourceTree = ""; }; + 7DAF8A52BB7568429BA3F8C182BC7232 /* ISConcurrentMutableSet.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISConcurrentMutableSet.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISConcurrentMutableSet.h"; sourceTree = ""; }; + 7DCA0E4A73EF2D142A698E1C4EDD7A42 /* GDTCORTransport_Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCORTransport_Private.h; path = GoogleDataTransport/GDTCORLibrary/Private/GDTCORTransport_Private.h; sourceTree = ""; }; + 7DCE9F08C6622DCED9A2D3899A8A4F8A /* RemoteConfigConstants.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RemoteConfigConstants.swift; path = FirebaseRemoteConfig/Interop/RemoteConfigConstants.swift; sourceTree = ""; }; + 7E072EE42C6817D97E8D699113F28148 /* FIRFirebaseUserAgent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRFirebaseUserAgent.h; path = FirebaseCore/Sources/FIRFirebaseUserAgent.h; sourceTree = ""; }; + 7EC8A4FDDFCBBF77F5E6444388C01A38 /* ISBiddingDataDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISBiddingDataDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBiddingDataDelegate.h"; sourceTree = ""; }; + 7EE640A447F7A826C01D825C868E41C9 /* FIRCLSURLBuilder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSURLBuilder.m; path = Crashlytics/Shared/FIRCLSNetworking/FIRCLSURLBuilder.m; sourceTree = ""; }; + 7F26F07A4A325DDC3BE1F76D2E2D21D0 /* StringToHexConverter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StringToHexConverter.swift; path = Crashlytics/Crashlytics/Rollouts/StringToHexConverter.swift; sourceTree = ""; }; + 7F35B015EB4408E1E2CE0541A707AC9B /* GULOriginalIMPConvenienceMacros.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GULOriginalIMPConvenienceMacros.h; path = GoogleUtilities/MethodSwizzler/Public/GoogleUtilities/GULOriginalIMPConvenienceMacros.h; sourceTree = ""; }; + 7F6428B15EAB7FEF0E33573A967DEE43 /* Pods-TastePick.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-TastePick.debug.xcconfig"; sourceTree = ""; }; + 7F76AAD62A4A84BFE0581D0C7BEE8E7F /* FIRCLSSerializeSymbolicatedFramesOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSSerializeSymbolicatedFramesOperation.m; path = Crashlytics/Crashlytics/Operations/Symbolication/FIRCLSSerializeSymbolicatedFramesOperation.m; sourceTree = ""; }; + 7FEEB0D1A0BD20DB97E8A30DB4E5DE85 /* ISMetaDataUtils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISMetaDataUtils.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISMetaDataUtils.h"; sourceTree = ""; }; + 7FFEBF54D10E73D8168D9C5FD2C3F6F1 /* Promise+Retry.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Promise+Retry.swift"; path = "Sources/Promises/Promise+Retry.swift"; sourceTree = ""; }; + 80A49CF3B148607199B055DD15A525A8 /* ISAdOptionsPosition.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdOptionsPosition.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdOptionsPosition.h"; sourceTree = ""; }; + 80AB68E0240AA5FC233F16FBB3EFA199 /* GDTCORRegistrar.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCORRegistrar.h; path = GoogleDataTransport/GDTCORLibrary/Internal/GDTCORRegistrar.h; sourceTree = ""; }; + 8102DDB913C3C212560EE5CAAAA7A87F /* ISNativeAdLoadDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISNativeAdLoadDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNativeAdLoadDelegate.h"; sourceTree = ""; }; + 810642D4AD0BBAEA549774F189FC6441 /* GDTCORUploader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCORUploader.h; path = GoogleDataTransport/GDTCORLibrary/Internal/GDTCORUploader.h; sourceTree = ""; }; + 8135B6E93577320E09B1461F350D6897 /* SessionCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionCoordinator.swift; path = FirebaseSessions/Sources/SessionCoordinator.swift; sourceTree = ""; }; + 813D484D4C1D83EDA74FFFF0A4A5C2AD /* FIRInstallationsAuthTokenResult.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRInstallationsAuthTokenResult.m; path = FirebaseInstallations/Source/Library/FIRInstallationsAuthTokenResult.m; sourceTree = ""; }; + 814C6F9EC0C621F3CE4C609C316FFDDE /* FIRCLSReportAdapter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSReportAdapter.m; path = Crashlytics/Crashlytics/Models/Record/FIRCLSReportAdapter.m; sourceTree = ""; }; + 814F15E776B7574CC9CFD92A4EA9D982 /* Promise+Wrap.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Promise+Wrap.swift"; path = "Sources/Promises/Promise+Wrap.swift"; sourceTree = ""; }; + 828EE3550DD2B792458BF1F9C9D0859E /* FIRCLSDefines.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSDefines.h; path = Crashlytics/Crashlytics/Helpers/FIRCLSDefines.h; sourceTree = ""; }; + 82961C47312C5F33B867FA72C66A2B3B /* GDTCOREvent_Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCOREvent_Private.h; path = GoogleDataTransport/GDTCORLibrary/Private/GDTCOREvent_Private.h; sourceTree = ""; }; + 82A4A50C7EA6B6072B7BA12DC9E8EB47 /* ISAdapterNativeAdData.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdapterNativeAdData.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterNativeAdData.h"; sourceTree = ""; }; + 83F0DEBBE5DE2893FAD2E42DCF6FA866 /* FBLPromiseError.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBLPromiseError.m; path = Sources/FBLPromises/FBLPromiseError.m; sourceTree = ""; }; + 83F5CCB22EE126A829F2A8820798DC8D /* FirebaseSessions */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = FirebaseSessions; path = FirebaseSessions.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 8438C9207D6070E9DCBB4B51309E2444 /* FIRCLSFABHost.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSFABHost.h; path = Crashlytics/Shared/FIRCLSFABHost.h; sourceTree = ""; }; + 843A7D4ED9CE137645ABB91C4875BEFB /* FIRCLSReportUploader_Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSReportUploader_Private.h; path = Crashlytics/Crashlytics/Controllers/FIRCLSReportUploader_Private.h; sourceTree = ""; }; + 84ECD3166786E3B251EB4673A8B36282 /* GULNetworkLoggerProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GULNetworkLoggerProtocol.h; path = GoogleUtilities/Network/Public/GoogleUtilities/GULNetworkLoggerProtocol.h; sourceTree = ""; }; + 84FC089496B0A9AB12314969A2DE2B5E /* FIRStackFrame.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRStackFrame.m; path = Crashlytics/Crashlytics/FIRStackFrame.m; sourceTree = ""; }; + 84FF7E5F437D2B7E88183003E3A6C178 /* ISBaseNetworkAdapter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISBaseNetworkAdapter.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseNetworkAdapter.h"; sourceTree = ""; }; + 8522B1420EACB03F8E43FEADDB8633AD /* LPMBannerAdViewConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LPMBannerAdViewConfig.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMBannerAdViewConfig.h"; sourceTree = ""; }; + 85407414E799656985846E4B52CA9B0E /* GULNetworkInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GULNetworkInfo.h; path = GoogleUtilities/Environment/Public/GoogleUtilities/GULNetworkInfo.h; sourceTree = ""; }; + 8555E7FB469BD55854B5C570D91A9260 /* FIRHeartbeatLogger.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRHeartbeatLogger.h; path = FirebaseCore/Extension/FIRHeartbeatLogger.h; sourceTree = ""; }; + 85602912DEE3932346960C77755A56C9 /* ResourceBundle-FirebaseCoreExtension_Privacy-FirebaseCoreExtension-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-FirebaseCoreExtension_Privacy-FirebaseCoreExtension-Info.plist"; sourceTree = ""; }; + 856B5CD56F194FAD26EA91620B66D614 /* GoogleDataTransport */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = GoogleDataTransport; path = GoogleDataTransport.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 85933203B5A2100972719926F7272D99 /* FIRCLSNetworkOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSNetworkOperation.h; path = Crashlytics/Crashlytics/Settings/Operations/FIRCLSNetworkOperation.h; sourceTree = ""; }; + 859AE0302B28BD8AE67A780BFCAEE082 /* FirebaseCrashlytics-FirebaseCrashlytics_Privacy */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "FirebaseCrashlytics-FirebaseCrashlytics_Privacy"; path = FirebaseCrashlytics_Privacy.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + 85BAD4FEE1FEACBF268C4398A0BB43B3 /* IronSourceAds.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IronSourceAds.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/IronSourceAds.h"; sourceTree = ""; }; + 85E3BEBDCDFBC21B3230D522B661A6EC /* FIRCLSUtility.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSUtility.m; path = Crashlytics/Crashlytics/Helpers/FIRCLSUtility.m; sourceTree = ""; }; + 86375444C196BA272DDBB8165BF64A15 /* FirebaseCrashlytics */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = FirebaseCrashlytics; path = FirebaseCrashlytics.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 86F3A8E4B8F9344894158C5F5A3D3D04 /* ISBaseRewardedVideoAdapter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISBaseRewardedVideoAdapter.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseRewardedVideoAdapter.h"; sourceTree = ""; }; + 86F9B46500F65B7B1E05E6184DCF8A1B /* IronSourceAdQuality.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IronSourceAdQuality.h; path = "IronSourceAdQualitySDK.xcframework/ios-arm64/Headers/IronSourceAdQuality.h"; sourceTree = ""; }; + 87030F8AC3EDC19A2886F3EA674BDB64 /* PromisesObjC.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = PromisesObjC.release.xcconfig; sourceTree = ""; }; + 87087B8F1DB87F298CB188456C5D94E9 /* ISNativeAdDataImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISNativeAdDataImage.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNativeAdDataImage.h"; sourceTree = ""; }; + 87547C181401BFF63982F4F8DDB601A6 /* GULMutableDictionary.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GULMutableDictionary.m; path = GoogleUtilities/Network/GULMutableDictionary.m; sourceTree = ""; }; + 875B7272AE723F328A70CA6B55CC169F /* LPMInterstitialAdConfigBuilder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LPMInterstitialAdConfigBuilder.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMInterstitialAdConfigBuilder.h"; sourceTree = ""; }; + 87C918E4D0BA80C4D8BA0EA103659C98 /* FIRStackFrame.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRStackFrame.h; path = Crashlytics/Crashlytics/Public/FirebaseCrashlytics/FIRStackFrame.h; sourceTree = ""; }; + 87D28C873F6250CE24E4FF580D1EFB6A /* LevelPlayBaseNativeAdAdapter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LevelPlayBaseNativeAdAdapter.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LevelPlayBaseNativeAdAdapter.h"; sourceTree = ""; }; + 87E2CB0838307AD504DB6E27B4DCC32F /* FirebaseSessions.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = FirebaseSessions.modulemap; sourceTree = ""; }; + 87FB573ED4C920CAA2168B53BEA21C6E /* ISAdInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdInfo.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdInfo.h"; sourceTree = ""; }; + 88092C8778FA79CF13885A52979196FB /* ISAdapterBaseProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdapterBaseProtocol.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterBaseProtocol.h"; sourceTree = ""; }; + 88223842AB5E8C62E0DBBE137C7DA842 /* FIRCLSCallStackTree.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSCallStackTree.h; path = Crashlytics/Crashlytics/Helpers/FIRCLSCallStackTree.h; sourceTree = ""; }; + 887155058FADB78B34F55428F2D1C93E /* GDTCORLogSourceMetrics.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCORLogSourceMetrics.h; path = GoogleDataTransport/GDTCORLibrary/Private/GDTCORLogSourceMetrics.h; sourceTree = ""; }; + 889BBA7CC7792F5213C9B5FEFD3AA322 /* FBLPromise+Async.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBLPromise+Async.h"; path = "Sources/FBLPromises/include/FBLPromise+Async.h"; sourceTree = ""; }; + 88AD9A5A20918C0D9CABCF967A0CACAF /* FirebaseSessions.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FirebaseSessions.release.xcconfig; sourceTree = ""; }; + 88C3C2AB35E6D0E9E7E2BAA6F77A1472 /* GoogleAdsOnDeviceConversion.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GoogleAdsOnDeviceConversion.release.xcconfig; sourceTree = ""; }; + 88EEAAC0E812A8FDAFC91E692A057B74 /* RolloutsStateSubscriber.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RolloutsStateSubscriber.swift; path = FirebaseRemoteConfig/Interop/RolloutsStateSubscriber.swift; sourceTree = ""; }; + 88F3652BCF8161395A5D3A8A147BD5FA /* FBLPromise+Any.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "FBLPromise+Any.m"; path = "Sources/FBLPromises/FBLPromise+Any.m"; sourceTree = ""; }; + 89297C7BC38242650740653E02AF6561 /* ResourceBundle-IronSourcePrivacyInfo-IronSourceSDK-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-IronSourcePrivacyInfo-IronSourceSDK-Info.plist"; sourceTree = ""; }; + 898C58C55EA2D600C78FD34B23E20374 /* LPMConfiguration.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LPMConfiguration.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMConfiguration.h"; sourceTree = ""; }; + 89A7CB6A8C6BF03238999CD916483805 /* PromiseError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PromiseError.swift; path = Sources/Promises/PromiseError.swift; sourceTree = ""; }; + 8A0AA9F2C3B51633419321E43977A03E /* Pods-TastePick */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-TastePick"; path = Pods_TastePick.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 8A667B8A1F9D03FB9C3E9A3A37DC1A8D /* FIRCLSUserDefaults_private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSUserDefaults_private.h; path = Crashlytics/Crashlytics/FIRCLSUserDefaults/FIRCLSUserDefaults_private.h; sourceTree = ""; }; + 8AD7EDA47090667D1A46D0D6BA5EB7B2 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = Sources/FBLPromises/Resources/PrivacyInfo.xcprivacy; sourceTree = ""; }; + 8BB937B1C0DFFCF92F41861C2BC54DDA /* FirebaseCore-FirebaseCore_Privacy */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "FirebaseCore-FirebaseCore_Privacy"; path = FirebaseCore_Privacy.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + 8BCBA30428742D1C599371299B07C4DF /* EventGDTLogger.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EventGDTLogger.swift; path = FirebaseSessions/Sources/EventGDTLogger.swift; sourceTree = ""; }; + 8BF9D7E0F91A35C8E3D8D4B080CB2DAF /* ISAdapterNetworkDataProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdapterNetworkDataProtocol.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterNetworkDataProtocol.h"; sourceTree = ""; }; + 8C4C6536679FF5808BEE94412E4735F6 /* FirebaseCoreInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FirebaseCoreInternal.h; path = FirebaseCore/Extension/FirebaseCoreInternal.h; sourceTree = ""; }; + 8C63286B4E589B8B7276886332C71CA1 /* GDTCORUploadCoordinator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GDTCORUploadCoordinator.m; path = GoogleDataTransport/GDTCORLibrary/GDTCORUploadCoordinator.m; sourceTree = ""; }; + 8C646683231AB6053322DD656B8F08FA /* FIRCLSBinaryImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSBinaryImage.m; path = Crashlytics/Crashlytics/Components/FIRCLSBinaryImage.m; sourceTree = ""; }; + 8CABCB98EE7D2FF1C51B2CFD2805562C /* FIRCLSApplication.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSApplication.h; path = Crashlytics/Crashlytics/Components/FIRCLSApplication.h; sourceTree = ""; }; + 8CC9F0AEC4BDB9261B03A05DA163E688 /* ISARewardedAdLoader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISARewardedAdLoader.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISARewardedAdLoader.h"; sourceTree = ""; }; + 8CE156EDC12BD8E274F2EE03CECE7641 /* GDTCCTCompressionHelper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GDTCCTCompressionHelper.m; path = GoogleDataTransport/GDTCCTLibrary/GDTCCTCompressionHelper.m; sourceTree = ""; }; + 8CFAF503B3616030C48201CEEB846090 /* FIRCLSCallStackTree.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSCallStackTree.m; path = Crashlytics/Crashlytics/Helpers/FIRCLSCallStackTree.m; sourceTree = ""; }; + 8CFC8F1F8999E22D3BDE4B506CD86B3E /* GDTCORStorageProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCORStorageProtocol.h; path = GoogleDataTransport/GDTCORLibrary/Internal/GDTCORStorageProtocol.h; sourceTree = ""; }; + 8D06CE494F74C6DF16EC6E3A146A412E /* ISRewardedVideoAdapterDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISRewardedVideoAdapterDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISRewardedVideoAdapterDelegate.h"; sourceTree = ""; }; + 8D124D2E1ADCFB2A1B40A9770344F845 /* Promise+Await.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Promise+Await.swift"; path = "Sources/Promises/Promise+Await.swift"; sourceTree = ""; }; + 8D79C303AB6E2236D9B3F93915775007 /* FIRCLSAllocate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSAllocate.h; path = Crashlytics/Crashlytics/Helpers/FIRCLSAllocate.h; sourceTree = ""; }; + 8D97CA13CD9F41BB59ED02675F54F325 /* GoogleAppMeasurement.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GoogleAppMeasurement.debug.xcconfig; sourceTree = ""; }; + 8DB547D1F18937EA5C859BCDC14B131C /* LPMSegment.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LPMSegment.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMSegment.h"; sourceTree = ""; }; + 8DC41149D0050E028D28EFE2A1D42CE9 /* ISConcurrentMutableSet.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISConcurrentMutableSet.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISConcurrentMutableSet.h"; sourceTree = ""; }; + 8E489BA48F1A72A775C7E2A06FE04C54 /* FIRCLSFile.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSFile.h; path = Crashlytics/Crashlytics/Helpers/FIRCLSFile.h; sourceTree = ""; }; + 8E9298A227F92C31B2AD2F9A1FB3130A /* ResourceBundle-FBLPromises_Privacy-PromisesObjC-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-FBLPromises_Privacy-PromisesObjC-Info.plist"; sourceTree = ""; }; + 8FD5BE8A0683B732C3AC8790F1E2279D /* ISABannerAdRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISABannerAdRequest.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISABannerAdRequest.h"; sourceTree = ""; }; + 901A456DAB2612E1AC407171CA304EE0 /* ISAdQualityConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdQualityConfig.h; path = "IronSourceAdQualitySDK.xcframework/ios-arm64/Headers/ISAdQualityConfig.h"; sourceTree = ""; }; + 9058232C8B527D93A7FBAD5A7C2C83B4 /* FIRInstallationsIDController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRInstallationsIDController.h; path = FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsIDController.h; sourceTree = ""; }; + 90A580880C102C87E456FD51A7F63EFF /* SettingsProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SettingsProvider.swift; path = FirebaseSessions/Sources/Settings/SettingsProvider.swift; sourceTree = ""; }; + 916CC42B928D4C76034EB015065255E6 /* ISInterstitialAdapterDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISInterstitialAdapterDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISInterstitialAdapterDelegate.h"; sourceTree = ""; }; + 9172C03B641A8030C566A6704E14EE6F /* ISBaseAdapter+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "ISBaseAdapter+Internal.h"; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseAdapter+Internal.h"; sourceTree = ""; }; + 92344B6513717814C137F88DE7D88A62 /* ISBaseAdapter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISBaseAdapter.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseAdapter.h"; sourceTree = ""; }; + 924FE8C8660ABC321E2BE8C94A1702F1 /* FIRCLSRecordApplication.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSRecordApplication.h; path = Crashlytics/Crashlytics/Models/Record/FIRCLSRecordApplication.h; sourceTree = ""; }; + 92628FE4D416ED06ABE5E9B01288452D /* ISAdapterNetworkDataProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdapterNetworkDataProtocol.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterNetworkDataProtocol.h"; sourceTree = ""; }; + 9282DF3214C3EE0A2E1219D9E7A701FA /* FIRLogger.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRLogger.h; path = FirebaseCore/Extension/FIRLogger.h; sourceTree = ""; }; + 928EB4F74D12F2775E1453DF6F8F5448 /* FIRAnalyticsConfiguration.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRAnalyticsConfiguration.m; path = FirebaseCore/Sources/FIRAnalyticsConfiguration.m; sourceTree = ""; }; + 92BFA548537D5DE5EA8044A119B4E140 /* LPMImpressionData.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LPMImpressionData.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMImpressionData.h"; sourceTree = ""; }; + 92CD93B7791AA549AA821D32500C2271 /* FirebaseCore.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FirebaseCore.release.xcconfig; sourceTree = ""; }; + 9319249E7AE5E567BAF1865989044E9F /* FIRCrashlyticsReport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCrashlyticsReport.m; path = Crashlytics/Crashlytics/FIRCrashlyticsReport.m; sourceTree = ""; }; + 93528F9C66D1C44F701EE44CEF2B12A2 /* compliance.nanopb.c */ = {isa = PBXFileReference; includeInIndex = 1; name = compliance.nanopb.c; path = GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/compliance.nanopb.c; sourceTree = ""; }; + 9390BE29BAF167FEAE1E7BE6F5AC1C01 /* GDTCOREvent+GDTCCTSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "GDTCOREvent+GDTCCTSupport.m"; path = "GoogleDataTransport/GDTCCTLibrary/GDTCOREvent+GDTCCTSupport.m"; sourceTree = ""; }; + 93993DDFB096B20356E0FCA54A271A85 /* FIRCLSApplicationIdentifierModel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSApplicationIdentifierModel.h; path = Crashlytics/Crashlytics/Settings/Models/FIRCLSApplicationIdentifierModel.h; sourceTree = ""; }; + 93A76444F68A5E7237A6DBACA7F5DD90 /* ISAdQualityConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdQualityConfig.h; path = "IronSourceAdQualitySDK.xcframework/ios-arm64_x86_64-simulator/Headers/ISAdQualityConfig.h"; sourceTree = ""; }; + 93AD81543696806262AD4DE414D50B3C /* FIRCLSNetworkResponseHandler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSNetworkResponseHandler.h; path = Crashlytics/Shared/FIRCLSNetworking/FIRCLSNetworkResponseHandler.h; sourceTree = ""; }; + 93C37CDFEB5DFF48E588D628FC88FA86 /* FIRInteropParameterNames.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRInteropParameterNames.h; path = Interop/Analytics/Public/FIRInteropParameterNames.h; sourceTree = ""; }; + 941CD9B8673FA1E83DDB725CB3913B3A /* FIRInstallationsErrorUtil.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRInstallationsErrorUtil.h; path = FirebaseInstallations/Source/Library/Errors/FIRInstallationsErrorUtil.h; sourceTree = ""; }; + 946744B8CA3FC88BA9ECC2FA7DE8A2F5 /* FIRCLSUserLogging.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSUserLogging.h; path = Crashlytics/Crashlytics/Components/FIRCLSUserLogging.h; sourceTree = ""; }; + 94A357B79517847580403D7F0E5174B0 /* ISBaseInterstitial.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISBaseInterstitial.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseInterstitial.h"; sourceTree = ""; }; + 94BACBC372793B939CB61CECCC28F929 /* FIRCLSExistingReportManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSExistingReportManager.m; path = Crashlytics/Crashlytics/Controllers/FIRCLSExistingReportManager.m; sourceTree = ""; }; + 94D834E2269BF89223DBC7F642A09AE4 /* ISBaseAdInteractionAdapter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISBaseAdInteractionAdapter.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseAdInteractionAdapter.h"; sourceTree = ""; }; + 9567717ECA736EF17C0C480A4D10498F /* Promise+All.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Promise+All.swift"; path = "Sources/Promises/Promise+All.swift"; sourceTree = ""; }; + 961CCB207747E50C7E7A415268E61837 /* SessionInitiator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionInitiator.swift; path = FirebaseSessions/Sources/SessionInitiator.swift; sourceTree = ""; }; + 968E38844B23C97F29587487B97A53DC /* ISAdapterConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdapterConfig.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterConfig.h"; sourceTree = ""; }; + 96E03229B2FAAB792E2255559129942C /* ISAInterstitialAdDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAInterstitialAdDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAInterstitialAdDelegate.h"; sourceTree = ""; }; + 971D6CC0E391046E4819851E6BAACC90 /* FIRInstallationsLogger.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRInstallationsLogger.m; path = FirebaseInstallations/Source/Library/FIRInstallationsLogger.m; sourceTree = ""; }; + 98CF4046D07545106FB11F650FA2C0A7 /* GDTCCTNanopbHelpers.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GDTCCTNanopbHelpers.m; path = GoogleDataTransport/GDTCCTLibrary/GDTCCTNanopbHelpers.m; sourceTree = ""; }; + 98E3D463204F4172A295C5BF34B0E2A6 /* LPMInterstitialAdConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LPMInterstitialAdConfig.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMInterstitialAdConfig.h"; sourceTree = ""; }; + 99067CFED719586F74DAD834E958E08B /* GULReachabilityChecker.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GULReachabilityChecker.h; path = GoogleUtilities/Reachability/Public/GoogleUtilities/GULReachabilityChecker.h; sourceTree = ""; }; + 99552BF905D8E4331EFB57956A0A736D /* FIRCLSUserLogging.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSUserLogging.m; path = Crashlytics/Crashlytics/Components/FIRCLSUserLogging.m; sourceTree = ""; }; + 9964DE206F7E0A4807E94C5A5A3C077D /* ApplicationInfo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ApplicationInfo.swift; path = FirebaseSessions/Sources/ApplicationInfo.swift; sourceTree = ""; }; + 99790E1F0014A6D9319C17A74E117E98 /* FIRCLSException.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSException.h; path = Crashlytics/Crashlytics/Handlers/FIRCLSException.h; sourceTree = ""; }; + 99A7830E0392501B4768FE316DFDAB40 /* ISAInitRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAInitRequest.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAInitRequest.h"; sourceTree = ""; }; + 9A09D4E58AE07B59FB190EEE48280AD9 /* GDTCORLifecycle.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCORLifecycle.h; path = GoogleDataTransport/GDTCORLibrary/Internal/GDTCORLifecycle.h; sourceTree = ""; }; + 9A3760A90C91C7825D4ED94A27D07A53 /* GULNSData+zlib.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "GULNSData+zlib.h"; path = "GoogleUtilities/NSData+zlib/Public/GoogleUtilities/GULNSData+zlib.h"; sourceTree = ""; }; + 9A56E90AE4FC9D8A077C40F67513262E /* Promise+Do.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Promise+Do.swift"; path = "Sources/Promises/Promise+Do.swift"; sourceTree = ""; }; + 9AD0850C0803DAB13E0E081B07845B91 /* GULLogger.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GULLogger.h; path = GoogleUtilities/Logger/Public/GoogleUtilities/GULLogger.h; sourceTree = ""; }; + 9AFDD3E443E85EECC92CC116A9716863 /* FIRCLSdSYM.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSdSYM.m; path = Crashlytics/Shared/FIRCLSMachO/FIRCLSdSYM.m; sourceTree = ""; }; + 9B1FA6B3964F94D088403931F2AB55BD /* FIRCLSUserDefaults.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSUserDefaults.h; path = Crashlytics/Crashlytics/FIRCLSUserDefaults/FIRCLSUserDefaults.h; sourceTree = ""; }; + 9B63150A5F6E7C96E4554EE4C497BE4B /* FIRCLSCompoundOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSCompoundOperation.m; path = Crashlytics/Shared/FIRCLSOperation/FIRCLSCompoundOperation.m; sourceTree = ""; }; + 9BA693F5FC03A8325517A09E3C4D1493 /* GDTCOREvent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCOREvent.h; path = GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCOREvent.h; sourceTree = ""; }; + 9BF943E13BECF93D2A48AFEC131BBE86 /* GDTCORConsoleLogger.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GDTCORConsoleLogger.m; path = GoogleDataTransport/GDTCORLibrary/GDTCORConsoleLogger.m; sourceTree = ""; }; + 9C576F5978069C1CD4794E7AE2223FAF /* ISNativeAdAdapterDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISNativeAdAdapterDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNativeAdAdapterDelegate.h"; sourceTree = ""; }; + 9C68A091AE9AFC6675997908F065AD15 /* FIRComponentContainerInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRComponentContainerInternal.h; path = FirebaseCore/Sources/FIRComponentContainerInternal.h; sourceTree = ""; }; + 9CDB2DEADAF8AE9B512CF1689B83B605 /* FIRComponentContainer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRComponentContainer.h; path = FirebaseCore/Extension/FIRComponentContainer.h; sourceTree = ""; }; + 9D3A17EE970C5C44B970AE4B5ECA4A29 /* FIRCLSCodeMapping.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSCodeMapping.h; path = Crashlytics/Shared/FIRCLSMachO/FIRCLSCodeMapping.h; 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; }; + 9E4D1EE87FA72D11176CC6321F325160 /* Storage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Storage.swift; path = FirebaseCore/Internal/Sources/HeartbeatLogging/Storage.swift; sourceTree = ""; }; + 9E8F94C9DA5672FB0856CAC5A159B1E1 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = GoogleUtilities/Privacy/Resources/PrivacyInfo.xcprivacy; sourceTree = ""; }; + 9E9152196876F701FA6A08C1E20930CE /* FIRCrashlyticsReport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCrashlyticsReport.h; path = Crashlytics/Crashlytics/Public/FirebaseCrashlytics/FIRCrashlyticsReport.h; sourceTree = ""; }; + 9F63BC66475319695185322AF43D4748 /* FirebaseCoreInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FirebaseCoreInternal.h; path = FirebaseCore/Extension/FirebaseCoreInternal.h; sourceTree = ""; }; + 9F644AD6B6A720E1346552D61EF0AD70 /* ISAdapterNativeAdProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdapterNativeAdProtocol.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterNativeAdProtocol.h"; sourceTree = ""; }; + 9FB7C89D8ED4FC0A2D862D0BA6990DCD /* FIRComponentContainer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRComponentContainer.h; path = FirebaseCore/Extension/FIRComponentContainer.h; sourceTree = ""; }; + A07E589DAAD31FFCB8DED3973BDCD21A /* FIRCLSHost.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSHost.h; path = Crashlytics/Crashlytics/Components/FIRCLSHost.h; sourceTree = ""; }; + A0C4B81B52F3550FB26F2301A4D3830F /* GDTCOREventTransformer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCOREventTransformer.h; path = GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCOREventTransformer.h; sourceTree = ""; }; + A10588C4300AC9C3D11455BE9D879450 /* FIRCLSDwarfExpressionMachine.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSDwarfExpressionMachine.h; path = Crashlytics/Crashlytics/Unwind/Dwarf/FIRCLSDwarfExpressionMachine.h; sourceTree = ""; }; + A11AEC0523CB4EA37262B5C3C7E50DC0 /* GULReachabilityChecker.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GULReachabilityChecker.m; path = GoogleUtilities/Reachability/GULReachabilityChecker.m; sourceTree = ""; }; + A15AF5BD51D7B01252F3A66B9E2FB319 /* FBLPromise+Retry.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBLPromise+Retry.h"; path = "Sources/FBLPromises/include/FBLPromise+Retry.h"; sourceTree = ""; }; + A168D4D9F13E4405E8B88DF37E9798B4 /* pb_common.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = pb_common.h; sourceTree = ""; }; + A193BD55A0E7F7CA562C12F3F5D93A5F /* GDTCORAssert.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GDTCORAssert.m; path = GoogleDataTransport/GDTCORLibrary/GDTCORAssert.m; sourceTree = ""; }; + A1D4165830B490CF0F383E9EDDDCCA0B /* ISRewardedVideoAdapterDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISRewardedVideoAdapterDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISRewardedVideoAdapterDelegate.h"; sourceTree = ""; }; + A1DFF164E0D7FB58E6CB7B00A1D486A7 /* ISAdapterNativeAdViewBinder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdapterNativeAdViewBinder.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterNativeAdViewBinder.h"; sourceTree = ""; }; + A23261055B8F9FB83FA551DDB4797D11 /* FIRCLSUserDefaults.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSUserDefaults.m; path = Crashlytics/Crashlytics/FIRCLSUserDefaults/FIRCLSUserDefaults.m; sourceTree = ""; }; + A238D1646D4E98F3F3766A4A1CA75F2B /* LPMInterstitialAdConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LPMInterstitialAdConfig.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMInterstitialAdConfig.h"; sourceTree = ""; }; + A2A7063DD7E760FC088F71B3C13B072B /* FBLPromise+Wrap.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBLPromise+Wrap.h"; path = "Sources/FBLPromises/include/FBLPromise+Wrap.h"; sourceTree = ""; }; + A2A7B9A7FA2A0DF8665BA841ABF788A2 /* ISBaseNetworkAdapter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISBaseNetworkAdapter.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseNetworkAdapter.h"; sourceTree = ""; }; + A30C51E88E588C86FA1D9E8DE9779A67 /* FIRCLSReportAdapter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSReportAdapter.h; path = Crashlytics/Crashlytics/Models/Record/FIRCLSReportAdapter.h; sourceTree = ""; }; + A355F7EDA13E66D7A11FD7439E6D6A46 /* FIRCLSInternalLogging.c */ = {isa = PBXFileReference; includeInIndex = 1; name = FIRCLSInternalLogging.c; path = Crashlytics/Crashlytics/Helpers/FIRCLSInternalLogging.c; sourceTree = ""; }; + A35D99B5BD952647B3F6DCB42B0A2F8E /* ISAdQualitySegment.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdQualitySegment.h; path = "IronSourceAdQualitySDK.xcframework/ios-arm64/Headers/ISAdQualitySegment.h"; sourceTree = ""; }; + A381EB858DC35D4FF5B2A13B56465CC1 /* ISRewardedVideoAdapterProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISRewardedVideoAdapterProtocol.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISRewardedVideoAdapterProtocol.h"; sourceTree = ""; }; + A38C9B57A39A6D6B791F8EFEB7DA5669 /* ISAdapterErrors.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdapterErrors.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterErrors.h"; sourceTree = ""; }; + A443C138B2A4D29DE3E10FAA1EA8F004 /* GDTCORProductData.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GDTCORProductData.m; path = GoogleDataTransport/GDTCORLibrary/GDTCORProductData.m; sourceTree = ""; }; + A4463B80D4074271B9828C77B9161130 /* FIRCurrentDateProvider.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCurrentDateProvider.h; path = FirebaseInstallations/Source/Library/InstallationsIDController/FIRCurrentDateProvider.h; sourceTree = ""; }; + A457DFA45654B3D1C0EA9565B2811B97 /* FIRCLSConstants.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSConstants.h; path = Crashlytics/Shared/FIRCLSConstants.h; sourceTree = ""; }; + A4FD66189E78011EBD505204D5031AA3 /* FIRCLSSettings.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSSettings.m; path = Crashlytics/Crashlytics/Models/FIRCLSSettings.m; sourceTree = ""; }; + A51C7180F539F77E2D031E2EA01DD503 /* FIRCLSFeatures.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSFeatures.h; path = Crashlytics/Crashlytics/Helpers/FIRCLSFeatures.h; sourceTree = ""; }; + A526CAA2BF74CF37D01D654302BE29E1 /* FIRCLSAnalyticsManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSAnalyticsManager.m; path = Crashlytics/Crashlytics/Controllers/FIRCLSAnalyticsManager.m; sourceTree = ""; }; + A5425E5A63F497B11099CF7643E9E208 /* FIRCLSNetworkOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSNetworkOperation.m; path = Crashlytics/Crashlytics/Settings/Operations/FIRCLSNetworkOperation.m; sourceTree = ""; }; + A5635638C0BBBDF646C9AB83D02300BB /* IronSource.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; name = IronSource.xcframework; path = IronSource/IronSource.xcframework; sourceTree = ""; }; + A58551067FAC2CAC6CB5D3AF6692027E /* LPMSegment.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LPMSegment.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMSegment.h"; sourceTree = ""; }; + A5BDC59CE92B5971C70A6EB248252D5A /* FIRApp.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRApp.m; path = FirebaseCore/Sources/FIRApp.m; sourceTree = ""; }; + A5CBBD74105B8D307714D0466F6A1D7D /* ISAdapterNativeAdProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdapterNativeAdProtocol.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterNativeAdProtocol.h"; sourceTree = ""; }; + A6A862027BC5082250B95334A12258EF /* UIView+ISNativeView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+ISNativeView.h"; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/UIView+ISNativeView.h"; sourceTree = ""; }; + A6A883C71E6CBF998A3024458645CB4D /* FIRCLSReportManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSReportManager.m; path = Crashlytics/Crashlytics/Controllers/FIRCLSReportManager.m; sourceTree = ""; }; + A6D0C615AB1F9953AB63ED940124C908 /* GDTCCTURLSessionDataResponse.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GDTCCTURLSessionDataResponse.m; path = GoogleDataTransport/GDTCCTLibrary/GDTCCTURLSessionDataResponse.m; sourceTree = ""; }; + A74D0B4C2DCEDD2395612EF72C9DD8BD /* ResourceBundle-FirebaseCoreInternal_Privacy-FirebaseCoreInternal-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-FirebaseCoreInternal_Privacy-FirebaseCoreInternal-Info.plist"; sourceTree = ""; }; + A7503C9F9BC44E7DF1DC58C827279D88 /* LPMImpressionDataDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LPMImpressionDataDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMImpressionDataDelegate.h"; sourceTree = ""; }; + A7FE293EA89F6DA186AA827D6959534C /* crashlytics.nanopb.c */ = {isa = PBXFileReference; includeInIndex = 1; name = crashlytics.nanopb.c; path = Crashlytics/Protogen/nanopb/crashlytics.nanopb.c; sourceTree = ""; }; + A813AE00639CE175E01B23568C922EFA /* ISNativeAdProperties.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISNativeAdProperties.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNativeAdProperties.h"; sourceTree = ""; }; + A8A4062D929DD42279DA66A4A0621294 /* FIRTimestampInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRTimestampInternal.h; path = FirebaseCore/Sources/FIRTimestampInternal.h; sourceTree = ""; }; + A8ECE32C49C8E3253E919C28428C9B20 /* ISAInterstitialAdRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAInterstitialAdRequest.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAInterstitialAdRequest.h"; sourceTree = ""; }; + A9809547A08DFE1B868E753F01D28026 /* NetworkInfo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkInfo.swift; path = FirebaseSessions/Sources/NetworkInfo.swift; sourceTree = ""; }; + A99271F36551C1652FF3C85759D7CB13 /* FIRCLSReportAdapter_Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSReportAdapter_Private.h; path = Crashlytics/Crashlytics/Models/Record/FIRCLSReportAdapter_Private.h; sourceTree = ""; }; + A9ABAAC92E26E20E75013B9FEA3A5878 /* LocalOverrideSettings.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LocalOverrideSettings.swift; path = FirebaseSessions/Sources/Settings/LocalOverrideSettings.swift; sourceTree = ""; }; + A9D25724806D45122402178B747AE6D5 /* SettingsProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SettingsProtocol.swift; path = FirebaseSessions/Sources/Settings/SettingsProtocol.swift; sourceTree = ""; }; + AA8C68D02D19733F5151B2C8F193944E /* FIRCLSExistingReportManager_Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSExistingReportManager_Private.h; path = Crashlytics/Crashlytics/Private/FIRCLSExistingReportManager_Private.h; sourceTree = ""; }; + AAA22AB3BDDB5122B8AE45AA82891F8A /* FIRApp.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRApp.h; path = FirebaseCore/Sources/Public/FirebaseCore/FIRApp.h; sourceTree = ""; }; + AAC7AFE020697B25E4865BC68EDBF18B /* client_metrics.nanopb.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = client_metrics.nanopb.h; path = GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/client_metrics.nanopb.h; sourceTree = ""; }; + AAE4E23513CFA47883CD490EB8B09BBC /* GULNetworkConstants.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GULNetworkConstants.h; path = GoogleUtilities/Network/Public/GoogleUtilities/GULNetworkConstants.h; sourceTree = ""; }; + AB0BA2B8ADE49661B0832B40AAC81B25 /* Pods-TastePick-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-TastePick-resources.sh"; sourceTree = ""; }; + AC194B9B90BCCBDB031A0D4089F4B064 /* ISInterstitialAdapterDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISInterstitialAdapterDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISInterstitialAdapterDelegate.h"; sourceTree = ""; }; + AC3C5D276A13926740CDC383A7452CA9 /* LevelPlayBaseInterstitialAdapter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LevelPlayBaseInterstitialAdapter.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LevelPlayBaseInterstitialAdapter.h"; sourceTree = ""; }; + AC6034781E48B285E9D76832343C5FAC /* FIRTimestamp.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRTimestamp.m; path = FirebaseCore/Sources/FIRTimestamp.m; sourceTree = ""; }; + AC8C76E2670B571A134C0A71FAB87FA9 /* Pods-TastePick.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-TastePick.release.xcconfig"; sourceTree = ""; }; + AC93949D8A77E4A30500EF08D24DD5AF /* FIRCLSByteUtility.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSByteUtility.m; path = Crashlytics/Shared/FIRCLSByteUtility.m; sourceTree = ""; }; + AD703333F9B0745C2D257492FD12722A /* FIRCLSUnwind_x86.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSUnwind_x86.h; path = Crashlytics/Crashlytics/Unwind/FIRCLSUnwind_x86.h; sourceTree = ""; }; + AD93B176CF28FE028AC766576C5896CA /* LPMBannerAdViewDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LPMBannerAdViewDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMBannerAdViewDelegate.h"; sourceTree = ""; }; + AE2445804A048D10716759FA2216F2C0 /* ISAInitRequestBuilder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAInitRequestBuilder.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAInitRequestBuilder.h"; sourceTree = ""; }; + AE8FF765072302853E758B7BE874C87A /* FIRCLSUnwind.c */ = {isa = PBXFileReference; includeInIndex = 1; name = FIRCLSUnwind.c; path = Crashlytics/Crashlytics/Unwind/FIRCLSUnwind.c; sourceTree = ""; }; + AED4256906BC72F68D203E4E14478F58 /* ISNativeAdViewHolder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISNativeAdViewHolder.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNativeAdViewHolder.h"; sourceTree = ""; }; + AEF1DC80F0EB62580B81D18786BAF924 /* FirebaseCoreExtension */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = FirebaseCoreExtension; path = FirebaseCoreExtension.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + AFC3B1DB52D11E0A0DAAA89A04A78C44 /* GoogleAppMeasurementIdentitySupport.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; name = GoogleAppMeasurementIdentitySupport.xcframework; path = Frameworks/GoogleAppMeasurementIdentitySupport.xcframework; sourceTree = ""; }; + B1235FF6E9EE36FD4108C0DF39A741E5 /* FIRCLSAllocate.c */ = {isa = PBXFileReference; includeInIndex = 1; name = FIRCLSAllocate.c; path = Crashlytics/Crashlytics/Helpers/FIRCLSAllocate.c; sourceTree = ""; }; + B1249F9F649088F4E116CAA11B9D5D2F /* FirebaseInstallations.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = FirebaseInstallations.modulemap; sourceTree = ""; }; + B16ED7EEE0B074135F2AE87E7F9C2DC4 /* ISBaseInterstitial.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISBaseInterstitial.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseInterstitial.h"; sourceTree = ""; }; + B18E90AC908B19200928A5CAB4E25EF2 /* ISAdapterAdViewDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdapterAdViewDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterAdViewDelegate.h"; sourceTree = ""; }; + B193AA1062E3BDA9FD9F681F8B33A4FB /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/SystemConfiguration.framework; sourceTree = DEVELOPER_DIR; }; + B19877D75F441EA46145FC561954B989 /* PromisesSwift.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = PromisesSwift.release.xcconfig; sourceTree = ""; }; + B1A4DD032645B1162F1AEC5E2E58CD69 /* FIRCLSSettingsManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSSettingsManager.h; path = Crashlytics/Crashlytics/Settings/FIRCLSSettingsManager.h; sourceTree = ""; }; + B1E166BF8ADCC0AB4F5C5A65FDFE11CF /* cct.nanopb.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = cct.nanopb.h; path = GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/cct.nanopb.h; sourceTree = ""; }; + B21C17A0C7530C3AC5A41DCFD7232B69 /* FIRCLSInstallIdentifierModel.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSInstallIdentifierModel.m; path = Crashlytics/Crashlytics/Models/FIRCLSInstallIdentifierModel.m; sourceTree = ""; }; + B21D0FDBB3441A34955CC39DE5E38E13 /* ISAInterstitialAdLoaderDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAInterstitialAdLoaderDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAInterstitialAdLoaderDelegate.h"; sourceTree = ""; }; + B2562FA75F60B5D572F17F5EC9514C93 /* Pods-TastePick-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-TastePick-frameworks.sh"; sourceTree = ""; }; + B2734F44A87F56A06480F572EF36AC02 /* LevelPlayBaseNativeAdAdapter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LevelPlayBaseNativeAdAdapter.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LevelPlayBaseNativeAdAdapter.h"; sourceTree = ""; }; + B2A431B7F89541CC6A680ED5D92913D5 /* LevelPlayNativeAdDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LevelPlayNativeAdDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LevelPlayNativeAdDelegate.h"; sourceTree = ""; }; + B362261E9E8CB7A626EF723102A6C278 /* FIRCLSDwarfExpressionMachine.c */ = {isa = PBXFileReference; includeInIndex = 1; name = FIRCLSDwarfExpressionMachine.c; path = Crashlytics/Crashlytics/Unwind/Dwarf/FIRCLSDwarfExpressionMachine.c; sourceTree = ""; }; + B388B00DA719EF2544EA91FDDA94FB2E /* FBLPromise+All.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "FBLPromise+All.m"; path = "Sources/FBLPromises/FBLPromise+All.m"; sourceTree = ""; }; + B43874C6CBB50E7134FBEC24BABFE14F /* GoogleUtilities */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = GoogleUtilities; path = GoogleUtilities.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B4A617B11AB65681B00B3D330658907C /* FIRCLSFile.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSFile.m; path = Crashlytics/Crashlytics/Helpers/FIRCLSFile.m; sourceTree = ""; }; + B4C9F429D6E40FC1BCFA34117532C4AD /* ISRewardedVideoAdapterProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISRewardedVideoAdapterProtocol.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISRewardedVideoAdapterProtocol.h"; sourceTree = ""; }; + B4FC404DBDCF212DDC60060CF5D047C4 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = FirebaseCore/Extension/Resources/PrivacyInfo.xcprivacy; sourceTree = ""; }; + B51E7D729DB4FC403626769772BDBEC4 /* FIRCLSInternalReport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSInternalReport.h; path = Crashlytics/Crashlytics/Models/FIRCLSInternalReport.h; sourceTree = ""; }; + B553EF71B83E67C6F54E7914C48BD838 /* FBLPromise.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBLPromise.h; path = Sources/FBLPromises/include/FBLPromise.h; sourceTree = ""; }; + B581EE4C1FC74016885897568F1D8E87 /* GoogleDataTransport+GoogleDataTransportProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "GoogleDataTransport+GoogleDataTransportProtocol.swift"; path = "FirebaseSessions/Sources/GoogleDataTransport+GoogleDataTransportProtocol.swift"; sourceTree = ""; }; + B59C54B12F3A241635BBE00204AF44E8 /* ISAdapterAdDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdapterAdDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterAdDelegate.h"; sourceTree = ""; }; + B5F5B453B8863EC9F159C5273DBA728D /* PromisesObjC-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "PromisesObjC-umbrella.h"; sourceTree = ""; }; + B63B8E13FA9721DBEE5E31F976C20935 /* FIRCLSFileManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSFileManager.h; path = Crashlytics/Crashlytics/Models/FIRCLSFileManager.h; sourceTree = ""; }; + B6ADF39B0F8B2D8E2F53267C6D66340A /* IronSourceAdQualitySDK.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IronSourceAdQualitySDK.release.xcconfig; sourceTree = ""; }; + B6CC975F9C0616F8F8A37C42A76CB016 /* GDTCORTransport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCORTransport.h; path = GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORTransport.h; sourceTree = ""; }; + B6EA2E08F7B2B7C8266C021F934BB764 /* Promise+Any.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Promise+Any.swift"; path = "Sources/Promises/Promise+Any.swift"; sourceTree = ""; }; + B6F49F6EF0F81B01765B056A8B012A04 /* FIRComponentContainer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRComponentContainer.h; path = FirebaseCore/Extension/FIRComponentContainer.h; sourceTree = ""; }; + B6F819A71F0F8D189B1548146901DFD0 /* ISNAdViewsManagerSwiftFacade.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISNAdViewsManagerSwiftFacade.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNAdViewsManagerSwiftFacade.h"; sourceTree = ""; }; + B734BCC41556BC500B23A5B1976E588F /* ISAppStoreErrorDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAppStoreErrorDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAppStoreErrorDelegate.h"; sourceTree = ""; }; + B7D2463CFCEAF0027801B3431CDA76F0 /* GULNetworkInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GULNetworkInternal.h; path = GoogleUtilities/Network/GULNetworkInternal.h; sourceTree = ""; }; + B7FDF38235B4F6D889DB018F7596B27C /* _ObjC_HeartbeatsPayload.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = _ObjC_HeartbeatsPayload.swift; path = FirebaseCore/Internal/Sources/HeartbeatLogging/_ObjC_HeartbeatsPayload.swift; sourceTree = ""; }; + B81BDC2643BA56A17EF26F3DB83AAB43 /* FIRCLSCodeMapping.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSCodeMapping.m; path = Crashlytics/Shared/FIRCLSMachO/FIRCLSCodeMapping.m; sourceTree = ""; }; + B873FAF8312CC7BC6F728E5F19A484FA /* FIRCLSURLBuilder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSURLBuilder.h; path = Crashlytics/Shared/FIRCLSNetworking/FIRCLSURLBuilder.h; sourceTree = ""; }; + B895CB7BF5B8063D748E4CE261124320 /* sessions.nanopb.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = sessions.nanopb.h; path = FirebaseSessions/SourcesObjC/Protogen/nanopb/sessions.nanopb.h; sourceTree = ""; }; + B8C67CC462B5F2819801881EDE84376F /* FIRInstallationsLogger.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRInstallationsLogger.h; path = FirebaseInstallations/Source/Library/FIRInstallationsLogger.h; sourceTree = ""; }; + B8FDE4F9BCEA63788B22E25481BE406E /* FIRCLSReportManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSReportManager.h; path = Crashlytics/Crashlytics/Controllers/FIRCLSReportManager.h; sourceTree = ""; }; + B91A0C0BCF2E431684BDAE758D7B40E0 /* ISBaseBanner.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISBaseBanner.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseBanner.h"; sourceTree = ""; }; + B94CEF504C790B1E1E90380A23D3078F /* GoogleAdsOnDeviceConversion.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; name = GoogleAdsOnDeviceConversion.xcframework; path = Frameworks/GoogleAdsOnDeviceConversion.xcframework; sourceTree = ""; }; + B9521C0C3DEB6B0A3CB8AEB4D34BD281 /* GDTCOREvent+GDTMetricsSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "GDTCOREvent+GDTMetricsSupport.h"; path = "GoogleDataTransport/GDTCCTLibrary/Private/GDTCOREvent+GDTMetricsSupport.h"; sourceTree = ""; }; + B9D552C2F2775868502A67B3ABAC477C /* ISBannerAdDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISBannerAdDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBannerAdDelegate.h"; sourceTree = ""; }; + BA00CC7B756DA9535DFD704E1E535A2D /* FBLPromise+Delay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBLPromise+Delay.h"; path = "Sources/FBLPromises/include/FBLPromise+Delay.h"; sourceTree = ""; }; + BA65D1AF5D006E30A4704C88E3220AE6 /* FBLPromise+Validate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBLPromise+Validate.h"; path = "Sources/FBLPromises/include/FBLPromise+Validate.h"; sourceTree = ""; }; + BA6FBD47E2963CABD280B81DB22360F8 /* ISAdapterAdFullscreenProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdapterAdFullscreenProtocol.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterAdFullscreenProtocol.h"; sourceTree = ""; }; + BAB000C6FD1E36F2F5C4B7741FC84C71 /* FIRCLSUtility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSUtility.h; path = Crashlytics/Crashlytics/Helpers/FIRCLSUtility.h; sourceTree = ""; }; + BAC07B18C332D81D6C171D364DDBABBF /* LPMInterstitialAdDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LPMInterstitialAdDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMInterstitialAdDelegate.h"; sourceTree = ""; }; + BAFB6F04EE2610139F9720EE4548FF44 /* FIRLogger.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRLogger.h; path = FirebaseCore/Extension/FIRLogger.h; sourceTree = ""; }; + BB764ECF294A5117628B17E3D8BBA5F8 /* GDTCORUploadCoordinator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCORUploadCoordinator.h; path = GoogleDataTransport/GDTCORLibrary/Private/GDTCORUploadCoordinator.h; sourceTree = ""; }; + BBBA2645EC17F90B7F28C59B969882A8 /* FIRFirebaseUserAgent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRFirebaseUserAgent.m; path = FirebaseCore/Sources/FIRFirebaseUserAgent.m; sourceTree = ""; }; + BBC7794AF986904E25B7CE0DB0A9F34C /* LPMRewardedAdConfigBuilder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LPMRewardedAdConfigBuilder.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMRewardedAdConfigBuilder.h"; sourceTree = ""; }; + BBCCC4A3D65B7FB65B4F76FAA082C371 /* Time.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Time.swift; path = FirebaseSessions/Sources/Time.swift; sourceTree = ""; }; + BBF832B158FF262578C25354471128D5 /* FirebaseCoreInternal.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FirebaseCoreInternal.debug.xcconfig; sourceTree = ""; }; + BC1DE61C31C393FE3209CCC6D6B40907 /* FirebaseAnalytics.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; name = FirebaseAnalytics.xcframework; path = Frameworks/FirebaseAnalytics.xcframework; sourceTree = ""; }; + BCAF4541C5074ACD8C2905245AC70DF5 /* FBLPromiseError.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBLPromiseError.h; path = Sources/FBLPromises/include/FBLPromiseError.h; sourceTree = ""; }; + BCB4B9D4457810F91752A8B8397D1004 /* FIRSESNanoPBHelpers.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRSESNanoPBHelpers.h; path = FirebaseSessions/SourcesObjC/NanoPB/FIRSESNanoPBHelpers.h; sourceTree = ""; }; + BCF4E73A914FD06A61DC68D60806B05D /* FIRInstallationsAuthTokenResultInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRInstallationsAuthTokenResultInternal.h; path = FirebaseInstallations/Source/Library/FIRInstallationsAuthTokenResultInternal.h; sourceTree = ""; }; + BD4A67DEF8B578F26F206004B017DEA3 /* FIRCLSSerializeSymbolicatedFramesOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSSerializeSymbolicatedFramesOperation.h; path = Crashlytics/Crashlytics/Operations/Symbolication/FIRCLSSerializeSymbolicatedFramesOperation.h; sourceTree = ""; }; + BD69F3E097F350F66676D92EA232D4EE /* FBLPromise+Catch.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "FBLPromise+Catch.m"; path = "Sources/FBLPromises/FBLPromise+Catch.m"; sourceTree = ""; }; + BE2FE7C542F1105383E7C2CEC90E4D71 /* GDTCORTransport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GDTCORTransport.m; path = GoogleDataTransport/GDTCORLibrary/GDTCORTransport.m; sourceTree = ""; }; + BE8A892C61B8F435614C2F1BFE36C324 /* GDTCCTCompressionHelper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCCTCompressionHelper.h; path = GoogleDataTransport/GDTCCTLibrary/Private/GDTCCTCompressionHelper.h; sourceTree = ""; }; + C00CE81184920EC56452C7DD1D14EED1 /* PromisesObjC.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = PromisesObjC.modulemap; sourceTree = ""; }; + C043BF110B25F32912F5A0CC31E55881 /* GDTCORUploadBatch.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GDTCORUploadBatch.m; path = GoogleDataTransport/GDTCORLibrary/GDTCORUploadBatch.m; sourceTree = ""; }; + C0563836D0790B15FD3F7D2C1158652A /* GDTCORTargets.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCORTargets.h; path = GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORTargets.h; sourceTree = ""; }; + C078153D138EAC2449729B043CE7FE7D /* ISBiddingDataProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISBiddingDataProtocol.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBiddingDataProtocol.h"; sourceTree = ""; }; + C0A6374CBE0A6FC840B2CCB5BC04391E /* GDTCCTUploader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCCTUploader.h; path = GoogleDataTransport/GDTCCTLibrary/Private/GDTCCTUploader.h; sourceTree = ""; }; + C0DD38F422EEE1A5E8A79935AB1AA169 /* sessions.nanopb.c */ = {isa = PBXFileReference; includeInIndex = 1; name = sessions.nanopb.c; path = FirebaseSessions/SourcesObjC/Protogen/nanopb/sessions.nanopb.c; sourceTree = ""; }; + C13CD00C8F1FA7F57D74D66F2564105D /* ISAdapterMetaDataProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdapterMetaDataProtocol.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterMetaDataProtocol.h"; sourceTree = ""; }; + C17760A388DD7E59F4AF3ECFC9DE7A06 /* FBLPromise+Await.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "FBLPromise+Await.m"; path = "Sources/FBLPromises/FBLPromise+Await.m"; sourceTree = ""; }; + C1EC3F06127CD5746DD3B3FF57B012A7 /* IronSourceNetworkSwiftBridge.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IronSourceNetworkSwiftBridge.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/IronSourceNetworkSwiftBridge.h"; sourceTree = ""; }; + C21ACF77639E561FEC07A0A807061673 /* FIRCLSFABHost.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSFABHost.m; path = Crashlytics/Shared/FIRCLSFABHost.m; sourceTree = ""; }; + C2C26D27486D91CB1D8B04DD239959FF /* external_prequest_context.nanopb.c */ = {isa = PBXFileReference; includeInIndex = 1; name = external_prequest_context.nanopb.c; path = GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/external_prequest_context.nanopb.c; sourceTree = ""; }; + C2ED107AE0C240089F516E47ED83A3F8 /* FIRCLSDataCollectionArbiter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSDataCollectionArbiter.h; path = Crashlytics/Crashlytics/DataCollection/FIRCLSDataCollectionArbiter.h; sourceTree = ""; }; + C2F589B34C8A36EB6A6FD8C5BE6C91B0 /* GoogleDataTransport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GoogleDataTransport.h; path = GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GoogleDataTransport.h; sourceTree = ""; }; + C309DB544F609F3EC9050218B396B41B /* FirebaseCrashlytics.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FirebaseCrashlytics.debug.xcconfig; sourceTree = ""; }; + C31C3EC5CF8094BD8759E8471989140E /* IronSourceSDK.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IronSourceSDK.debug.xcconfig; sourceTree = ""; }; + C3D7D629150C258C8C14603B1B8DEB74 /* FIRHeartbeatLogger.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRHeartbeatLogger.h; path = FirebaseCore/Extension/FIRHeartbeatLogger.h; sourceTree = ""; }; + C4C41AF042441294CC9F26ED2956F9B2 /* LevelPlayBaseRewardedAdapter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LevelPlayBaseRewardedAdapter.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LevelPlayBaseRewardedAdapter.h"; sourceTree = ""; }; + C50377907868482D35E746056BEBEE31 /* FIRAnalyticsInteropListener.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRAnalyticsInteropListener.h; path = Interop/Analytics/Public/FIRAnalyticsInteropListener.h; sourceTree = ""; }; + C57FCD656B455BFA73C354814132DD67 /* FIRCLSSignal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSSignal.h; path = Crashlytics/Crashlytics/Handlers/FIRCLSSignal.h; sourceTree = ""; }; + C59A87359F467A1852B31CCDA105CB12 /* FIRCLSProcess.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSProcess.h; path = Crashlytics/Crashlytics/Components/FIRCLSProcess.h; sourceTree = ""; }; + C5BF157FF45862A88AF8EFE9D218EFF9 /* LevelPlayBaseInterstitialAdapter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LevelPlayBaseInterstitialAdapter.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LevelPlayBaseInterstitialAdapter.h"; sourceTree = ""; }; + C5D1CF1FE0538FDABC4F173896B26ADA /* ISBaseBannerAdapter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISBaseBannerAdapter.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseBannerAdapter.h"; sourceTree = ""; }; + C5D9AA0D80C027A086260C9A65AF5191 /* FIRCLSCrashedMarkerFile.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSCrashedMarkerFile.h; path = Crashlytics/Crashlytics/Components/FIRCLSCrashedMarkerFile.h; sourceTree = ""; }; + C5F74FE5F6CC393C95E29DF392D5DEF7 /* FIRCLSInternalReport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSInternalReport.m; path = Crashlytics/Crashlytics/Models/FIRCLSInternalReport.m; sourceTree = ""; }; + C5FAE066E74E99A94391144BF5040B24 /* pb_encode.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = pb_encode.h; sourceTree = ""; }; + C660DF3FCF93A7D8FA65DE45C3FC7051 /* ISNativeAdDataImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISNativeAdDataImage.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNativeAdDataImage.h"; sourceTree = ""; }; + C675EA4E6FEC2A1D378D740CD7E1AED8 /* LevelPlayBaseAdapter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LevelPlayBaseAdapter.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LevelPlayBaseAdapter.h"; sourceTree = ""; }; + C679CE6DF7C0B58791D3F961513031A2 /* ISNetworkInitializationDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISNetworkInitializationDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNetworkInitializationDelegate.h"; sourceTree = ""; }; + C6FB39B37366B1C2880DCFED242B6EEF /* ISLoggerManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISLoggerManager.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISLoggerManager.h"; sourceTree = ""; }; + C701DD6907FF92F7694F74D6DA235DDF /* FirebaseCore.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FirebaseCore.h; path = FirebaseCore/Sources/Public/FirebaseCore/FirebaseCore.h; sourceTree = ""; }; + C71474454F728EC2F1503A467235BFD1 /* FIRCLSRolloutsPersistenceManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSRolloutsPersistenceManager.m; path = Crashlytics/Crashlytics/Controllers/FIRCLSRolloutsPersistenceManager.m; sourceTree = ""; }; + C756CB0A0B0B5E40A7ABD0FB2408ACF9 /* GoogleDataTransport-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "GoogleDataTransport-umbrella.h"; sourceTree = ""; }; + C77EF9E41D58E3415726A8A3A8EDAC04 /* ISLog.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISLog.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISLog.h"; sourceTree = ""; }; + C794FC8EBC9859B63C0157039E49B4E9 /* ResourceBundle-GoogleDataTransport_Privacy-GoogleDataTransport-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-GoogleDataTransport_Privacy-GoogleDataTransport-Info.plist"; sourceTree = ""; }; + C843AC66CCC0B6523391AD34C888DB81 /* ISDemandOnlyInterstitialDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISDemandOnlyInterstitialDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISDemandOnlyInterstitialDelegate.h"; sourceTree = ""; }; + C8570F186E094E00F5E49B6E68D16235 /* FirebaseCoreInternal.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = FirebaseCoreInternal.modulemap; sourceTree = ""; }; + C89683528F1E4AA5FA1EDD4A8F3C9354 /* FirebaseCrashlytics-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "FirebaseCrashlytics-Info.plist"; sourceTree = ""; }; + C9316FE183C97664C3C149529E5C07F5 /* GULLoggerLevel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GULLoggerLevel.h; path = GoogleUtilities/Logger/Public/GoogleUtilities/GULLoggerLevel.h; sourceTree = ""; }; + C956E3FC143A0634D6BE7EC249F3FEF0 /* ISAdapterAdaptiveProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdapterAdaptiveProtocol.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterAdaptiveProtocol.h"; sourceTree = ""; }; + C9804D05C35FF1DD291AC9C0894A5B35 /* FIRCLSRecordHost.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSRecordHost.h; path = Crashlytics/Crashlytics/Models/Record/FIRCLSRecordHost.h; sourceTree = ""; }; + C9BAD2DF6BFA41360986C72BE9616A6C /* IronSourceAdQualitySDK-IronSourceAdQualityPrivacyInfo */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "IronSourceAdQualitySDK-IronSourceAdQualityPrivacyInfo"; path = IronSourceAdQualityPrivacyInfo.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + C9BE96E17F5B69CF3C20FB263E421F65 /* ISConfigurations.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISConfigurations.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISConfigurations.h"; sourceTree = ""; }; + CA90EAC6FA4D5FEC2C4746D17A04FA98 /* ISAdQualityAdType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdQualityAdType.h; path = "IronSourceAdQualitySDK.xcframework/ios-arm64_x86_64-simulator/Headers/ISAdQualityAdType.h"; sourceTree = ""; }; + CAC4AF12CEDA6145D2B5533F756AE5EF /* FIRComponentType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRComponentType.h; path = FirebaseCore/Extension/FIRComponentType.h; sourceTree = ""; }; + CB0183FEA633E9C900AB5ADA75F93D28 /* GoogleUtilities-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "GoogleUtilities-dummy.m"; sourceTree = ""; }; + CB04DABF29F7D0DFF27C6FD299DBEA10 /* LPMRewardedAdConfigBuilder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LPMRewardedAdConfigBuilder.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMRewardedAdConfigBuilder.h"; sourceTree = ""; }; + CB183053DA63F5B4E07A50E4E6571B78 /* UIView+ISNativeView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+ISNativeView.h"; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/UIView+ISNativeView.h"; sourceTree = ""; }; + CBA7406D31A3E8A993C367E8929BC6BE /* ISAdapterAdInteractionDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdapterAdInteractionDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterAdInteractionDelegate.h"; sourceTree = ""; }; + CBB174ABF14EFF529BB3102F45D26E01 /* GULUserDefaults.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GULUserDefaults.h; path = GoogleUtilities/UserDefaults/Public/GoogleUtilities/GULUserDefaults.h; sourceTree = ""; }; + CBC7ABF27B4FE2B428B41107C4B1A383 /* FIRComponent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRComponent.m; path = FirebaseCore/Sources/FIRComponent.m; sourceTree = ""; }; + CBE127715D8F178BF59971B25037588E /* ISABannerAdRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISABannerAdRequest.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISABannerAdRequest.h"; sourceTree = ""; }; + CC0821AB11E9F2A17681AEF21C3E08A3 /* FIRInstallationsHTTPError.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRInstallationsHTTPError.h; path = FirebaseInstallations/Source/Library/Errors/FIRInstallationsHTTPError.h; sourceTree = ""; }; + CC69C8F474714A281F42229040CF232F /* FIRInstallationsStoredItem.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRInstallationsStoredItem.m; path = FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStoredItem.m; sourceTree = ""; }; + CC6B9640FCA569A320811A83A6CDD770 /* ISNativeAdViewHolder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISNativeAdViewHolder.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNativeAdViewHolder.h"; sourceTree = ""; }; + CC950F2ADE69BD70EDFD94D222E702E1 /* FirebaseSessions-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "FirebaseSessions-Info.plist"; sourceTree = ""; }; + CC97D9CD7CBD9878F6316ABC729054EC /* FIRCLSDataCollectionToken.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSDataCollectionToken.m; path = Crashlytics/Crashlytics/DataCollection/FIRCLSDataCollectionToken.m; sourceTree = ""; }; + CCA6278DA8D55BF8690A2D68CCC8482A /* FirebaseCoreExtension-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "FirebaseCoreExtension-Info.plist"; sourceTree = ""; }; + CCD84BC000100B0CA5654CE3F1C3632B /* FBLPromise+Recover.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "FBLPromise+Recover.m"; path = "Sources/FBLPromises/FBLPromise+Recover.m"; sourceTree = ""; }; + CCDC0AB75D22DED4C9FC0437D2E5091D /* FIRCLSCompoundOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSCompoundOperation.h; path = Crashlytics/Shared/FIRCLSOperation/FIRCLSCompoundOperation.h; sourceTree = ""; }; + CCDE14D7266FB3FCADEF8BEBA22A811B /* LevelPlayNativeAdDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LevelPlayNativeAdDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LevelPlayNativeAdDelegate.h"; sourceTree = ""; }; + CCF916D47AC91AA089E294328685130C /* ISBannerAdapterProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISBannerAdapterProtocol.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBannerAdapterProtocol.h"; sourceTree = ""; }; + CCFCCC6FB9EB4AC5E83A4D63B2FFD014 /* LPMInterstitialAd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LPMInterstitialAd.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMInterstitialAd.h"; sourceTree = ""; }; + CDA957384322C69DA57C674CE734E4E8 /* ISABannerAdViewDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISABannerAdViewDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISABannerAdViewDelegate.h"; sourceTree = ""; }; + CDB2D3ADFF3C77CC8CFBD53089663335 /* IronSourceAds.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IronSourceAds.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/IronSourceAds.h"; sourceTree = ""; }; + CDDF030F4A6E517F34BF2B249C03A22B /* FIRCLSCompactUnwind.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSCompactUnwind.h; path = Crashlytics/Crashlytics/Unwind/Compact/FIRCLSCompactUnwind.h; sourceTree = ""; }; + CE0BF03D61A3396FE4A7AC5CD82061FC /* FIRCLSdSYM.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSdSYM.h; path = Crashlytics/Shared/FIRCLSMachO/FIRCLSdSYM.h; sourceTree = ""; }; + CE30E6006CDA5CD7AB42685F5330B642 /* ISAdapterErrorType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdapterErrorType.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterErrorType.h"; sourceTree = ""; }; + CECA6783FA589EAB190F02D2DE8ECF5B /* FIRCLSNetworkResponseHandler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSNetworkResponseHandler.m; path = Crashlytics/Shared/FIRCLSNetworking/FIRCLSNetworkResponseHandler.m; sourceTree = ""; }; + CEEA309601CB00DE0F4887906ECAE411 /* ISABannerAdLoader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISABannerAdLoader.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISABannerAdLoader.h"; sourceTree = ""; }; + CF9938E658BAA3135B786FA005760DB6 /* ISNAppStoreVCRootViewDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISNAppStoreVCRootViewDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNAppStoreVCRootViewDelegate.h"; sourceTree = ""; }; + CFA5A0F70B339127DED7B5419086695F /* LevelPlayMediaView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LevelPlayMediaView.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LevelPlayMediaView.h"; sourceTree = ""; }; + CFD8B638DEDD95E455817CF5ACAF651E /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = GoogleDataTransport/Resources/PrivacyInfo.xcprivacy; sourceTree = ""; }; + CFDBC5FF7914DC22737656251A2736F5 /* FirebaseCoreInternal-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "FirebaseCoreInternal-dummy.m"; sourceTree = ""; }; + CFE0D559DCD251C38581DE47B3292AC8 /* FIRCLSHost.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSHost.m; path = Crashlytics/Crashlytics/Components/FIRCLSHost.m; sourceTree = ""; }; + CFEAEBE26866A8878F06A26FF49B5831 /* IsAppEncrypted.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IsAppEncrypted.h; path = third_party/IsAppEncrypted/Public/IsAppEncrypted.h; sourceTree = ""; }; + D052E1DD96AE730D8F3FFAE40A8BC0C3 /* ISAdapterNativeAdData.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdapterNativeAdData.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdapterNativeAdData.h"; sourceTree = ""; }; + D08502D5153E2D6ED0657435C2CDB103 /* FIRHeartbeatLogger.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRHeartbeatLogger.m; path = FirebaseCore/Sources/FIRHeartbeatLogger.m; sourceTree = ""; }; + D0A345A32D6751F30E85551315CE72F4 /* FirebaseInstallations-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FirebaseInstallations-umbrella.h"; sourceTree = ""; }; + D0B5B130EF0B481732502A813048E953 /* nanopb-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "nanopb-prefix.pch"; sourceTree = ""; }; + D0BE4174B095C9D224D3C446BDF9263F /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = FirebaseCore/Sources/Resources/PrivacyInfo.xcprivacy; sourceTree = ""; }; + D12A23C9479F3872EC684FFEB7A8A9E1 /* FirebaseCrashlytics-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FirebaseCrashlytics-umbrella.h"; sourceTree = ""; }; + D16CCFE998E05CFAE5180480E1D56DFA /* GDTCOREvent+GDTMetricsSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "GDTCOREvent+GDTMetricsSupport.m"; path = "GoogleDataTransport/GDTCCTLibrary/GDTCOREvent+GDTMetricsSupport.m"; sourceTree = ""; }; + D17C5993C3025211E5829910536ABC30 /* FIRInstallationsAPIService.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRInstallationsAPIService.h; path = FirebaseInstallations/Source/Library/InstallationsAPI/FIRInstallationsAPIService.h; sourceTree = ""; }; + D1C485E07C4725266CBD932430A7F6FF /* FBLPromisePrivate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBLPromisePrivate.h; path = Sources/FBLPromises/include/FBLPromisePrivate.h; sourceTree = ""; }; + D1C898C4E9DC2D4D4D1E86B5DE0A7B98 /* FIRAppInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRAppInternal.h; path = FirebaseCore/Extension/FIRAppInternal.h; sourceTree = ""; }; + D206BF0BB5E5AE495B319990D18D98F2 /* LevelPlayBaseAdapter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LevelPlayBaseAdapter.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LevelPlayBaseAdapter.h"; sourceTree = ""; }; + D278B852D768C3B4F4987DADC1AF43DB /* Pods-TastePick-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-TastePick-acknowledgements.markdown"; sourceTree = ""; }; + D2853472D88033B857940859F2869BAC /* FBLPromise+Race.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBLPromise+Race.h"; path = "Sources/FBLPromises/include/FBLPromise+Race.h"; sourceTree = ""; }; + D2B5192C2DA782DD72AF3BED9062619A /* Promise+Always.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Promise+Always.swift"; path = "Sources/Promises/Promise+Always.swift"; sourceTree = ""; }; + D2E376CAE5C33DB7CE90C0BE279B9E68 /* LPMAdInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LPMAdInfo.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMAdInfo.h"; sourceTree = ""; }; + D30B5C733BE395B9290BF66EF07B47D8 /* FIRInstallationsSingleOperationPromiseCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRInstallationsSingleOperationPromiseCache.h; path = FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsSingleOperationPromiseCache.h; sourceTree = ""; }; + D32AAF74A1E3E9958EB82C44F2859E88 /* LPMInitRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LPMInitRequest.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMInitRequest.h"; sourceTree = ""; }; + D34D484D97DFFD1D1D9862DCEF4318EF /* ISABannerAdInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISABannerAdInfo.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISABannerAdInfo.h"; sourceTree = ""; }; + D3812CB68CC86AF590AEF887F442781C /* IronSourceNetworkSwiftBridge.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IronSourceNetworkSwiftBridge.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/IronSourceNetworkSwiftBridge.h"; sourceTree = ""; }; + D3EDA4CA6B3DF59B7470658EAD4A0726 /* FIRStackFrame_Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRStackFrame_Private.h; path = Crashlytics/Crashlytics/Private/FIRStackFrame_Private.h; sourceTree = ""; }; + D423B3B5F7AFB317B15D0FF7B5BC21B6 /* ISBiddingDataProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISBiddingDataProtocol.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBiddingDataProtocol.h"; sourceTree = ""; }; + D463F5B89599530250694EBA7C8A4277 /* FIROptions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIROptions.h; path = FirebaseCore/Sources/Public/FirebaseCore/FIROptions.h; sourceTree = ""; }; + D4B278C8E9AF40DF1029521DF6AF2600 /* ISNEventTrackerWrapper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISNEventTrackerWrapper.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNEventTrackerWrapper.h"; sourceTree = ""; }; + D4C5CBE11163C6511EE7ED28D41665C5 /* FIRInstallationsAPIService.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRInstallationsAPIService.m; path = FirebaseInstallations/Source/Library/InstallationsAPI/FIRInstallationsAPIService.m; sourceTree = ""; }; + D52720EBEE8D591811D098B131AED09A /* GDTCORProductData.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCORProductData.h; path = GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORProductData.h; sourceTree = ""; }; + D54022AE451161DCBDEE4F8EDA350F8E /* FIRComponentType.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRComponentType.m; path = FirebaseCore/Sources/FIRComponentType.m; sourceTree = ""; }; + D5728414FB5D291F0410158BBB99515C /* FIRCLSDataParsing.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSDataParsing.h; path = Crashlytics/Crashlytics/Unwind/Dwarf/FIRCLSDataParsing.h; sourceTree = ""; }; + D579B4328A248F1CCE7D5515604A338B /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/PrivacyInfo.xcprivacy"; sourceTree = ""; }; + D5BFE9CFA06F03C8C5142A84B9D005BD /* ISBannerSize.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISBannerSize.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBannerSize.h"; sourceTree = ""; }; + D5F4169D3FC469172BE10FF04E507D38 /* FirebaseSessions-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "FirebaseSessions-dummy.m"; sourceTree = ""; }; + D5F99A5B4CE9BD03128B9D9D3D5B484A /* GDTCORClock.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GDTCORClock.m; path = GoogleDataTransport/GDTCORLibrary/GDTCORClock.m; sourceTree = ""; }; + D660CA6091C52B9C5F297B131B681A68 /* LPMConfiguration.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LPMConfiguration.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMConfiguration.h"; sourceTree = ""; }; + D69FBDB2F6E8A4A1756B8363A19287A4 /* ISAdUnitAdapterProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdUnitAdapterProtocol.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdUnitAdapterProtocol.h"; sourceTree = ""; }; + D6AC87ED55C906B755326408B858A632 /* FIRComponent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRComponent.h; path = FirebaseCore/Extension/FIRComponent.h; sourceTree = ""; }; + D7E509F62306CFD371936FC95FD59C71 /* ISSetAPSDataProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISSetAPSDataProtocol.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISSetAPSDataProtocol.h"; sourceTree = ""; }; + D805237EFA8EF328F3B519266FCC9303 /* FIRExceptionModel_Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRExceptionModel_Private.h; path = Crashlytics/Crashlytics/Private/FIRExceptionModel_Private.h; sourceTree = ""; }; + D817BAB636451413E52543981E224726 /* Promise+Async.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Promise+Async.swift"; path = "Sources/Promises/Promise+Async.swift"; sourceTree = ""; }; + D863620CC96C7E1234821949251F1F55 /* GULLoggerCodes.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GULLoggerCodes.h; path = GoogleUtilities/Common/GULLoggerCodes.h; sourceTree = ""; }; + D8FEC6CA0C9F009A9AF67A8F28C6A04E /* FIRVersion.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRVersion.m; path = FirebaseCore/Sources/FIRVersion.m; sourceTree = ""; }; + D905CBD56E4B6F871771930498CBAEE6 /* UnfairLock.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UnfairLock.swift; path = FirebaseCore/Internal/Sources/Utilities/UnfairLock.swift; sourceTree = ""; }; + D90DE4A0922E388039EAAA4DD44E38D9 /* GoogleDataTransport.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = GoogleDataTransport.modulemap; sourceTree = ""; }; + D995D2A797A2F00D3637AA16E9F58735 /* FirebaseAnalytics-xcframeworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "FirebaseAnalytics-xcframeworks.sh"; sourceTree = ""; }; + D999936CB5DBEFFACAEB8F4C91F14038 /* ISAInterstitialAdLoader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAInterstitialAdLoader.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAInterstitialAdLoader.h"; sourceTree = ""; }; + D9AA670608CFCFA05E52A55B4EB8F5CF /* FIRCLSCrashedMarkerFile.c */ = {isa = PBXFileReference; includeInIndex = 1; name = FIRCLSCrashedMarkerFile.c; path = Crashlytics/Crashlytics/Components/FIRCLSCrashedMarkerFile.c; sourceTree = ""; }; + D9AD12C8E138FD2EC14CB63C52044780 /* GULAppEnvironmentUtil.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GULAppEnvironmentUtil.h; path = GoogleUtilities/Environment/Public/GoogleUtilities/GULAppEnvironmentUtil.h; sourceTree = ""; }; + D9E10F2DE71DAC0176088B4BD7AAAF40 /* FIRCLSContextInitData.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSContextInitData.m; path = Crashlytics/Crashlytics/Helpers/FIRCLSContextInitData.m; sourceTree = ""; }; + DA1607C2079B334D339DE217E8D52992 /* GULNetworkURLSession.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GULNetworkURLSession.m; path = GoogleUtilities/Network/GULNetworkURLSession.m; sourceTree = ""; }; + DA48B145114B81B074811930837FFB74 /* GDTCORClock.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCORClock.h; path = GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORClock.h; sourceTree = ""; }; + DA94A176C9DDF93FD794B8CACD5B0CD3 /* FIRCLSNotificationManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSNotificationManager.h; path = Crashlytics/Crashlytics/Controllers/FIRCLSNotificationManager.h; sourceTree = ""; }; + DAB1258CE44EB1649A4C007431FDF3F2 /* ISAdapterAdRewardedDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdapterAdRewardedDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterAdRewardedDelegate.h"; sourceTree = ""; }; + DB0201E3645474DA3F01E6CC6F3A3AA7 /* LPMRewardedAd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LPMRewardedAd.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMRewardedAd.h"; sourceTree = ""; }; + DB2BBA62CE19F6A33D6577F5944804CF /* FIRCLSUUID.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSUUID.m; path = Crashlytics/Shared/FIRCLSUUID.m; sourceTree = ""; }; + DB4125A2ADD8442CEBA9B65B91E1D673 /* GoogleUtilities.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GoogleUtilities.debug.xcconfig; sourceTree = ""; }; + DB7B79608541CAA0781D104C2AE25E04 /* dwarf.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = dwarf.h; path = Crashlytics/third_party/libunwind/dwarf.h; sourceTree = ""; }; + DB84B0FEA390C3C50C33023981CB6DAF /* LPMBannerAdViewConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LPMBannerAdViewConfig.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMBannerAdViewConfig.h"; sourceTree = ""; }; + DBA8A1C0B6E537722830F6645F6F057A /* ISBaseAdAdapter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISBaseAdAdapter.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseAdAdapter.h"; sourceTree = ""; }; + DBBF564D32F8A012EAEB876231B52DEA /* FirebaseCrashlytics.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = FirebaseCrashlytics.modulemap; sourceTree = ""; }; + DBC0A7B3EE3789BFBD83F4D00733A2C6 /* FIRCLSFABNetworkClient.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSFABNetworkClient.m; path = Crashlytics/Shared/FIRCLSNetworking/FIRCLSFABNetworkClient.m; sourceTree = ""; }; + DBD2108D96F13E939D896CAB1F211086 /* ISBaseAdUnitAdapter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISBaseAdUnitAdapter.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseAdUnitAdapter.h"; sourceTree = ""; }; + DBEAE374FB2BBD2DC600894306116762 /* FBLPromise+Race.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "FBLPromise+Race.m"; path = "Sources/FBLPromises/FBLPromise+Race.m"; sourceTree = ""; }; + DC09638ED9F7EE085BD698A9C2748103 /* ISBannerAdapterDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISBannerAdapterDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBannerAdapterDelegate.h"; sourceTree = ""; }; + DC5F74E6FC92E4C96BD36A86654F80CC /* RingBuffer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RingBuffer.swift; path = FirebaseCore/Internal/Sources/HeartbeatLogging/RingBuffer.swift; sourceTree = ""; }; + DCC3B43DD95A086CB58F71CB67599676 /* IronSource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IronSource.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/IronSource.h"; sourceTree = ""; }; + DD78237C3212BBFE1C92D8C64700F363 /* FIRBundleUtil.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRBundleUtil.m; path = FirebaseCore/Sources/FIRBundleUtil.m; sourceTree = ""; }; + DDCF1D3203DC57B5D9103D0F15379868 /* FirebaseCoreExtension-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "FirebaseCoreExtension-dummy.m"; sourceTree = ""; }; + DE3CE49D85D8CCF20D414460830FEE7A /* ISARewardedAdLoaderDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISARewardedAdLoaderDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISARewardedAdLoaderDelegate.h"; sourceTree = ""; }; + DE6686D5E66D53F23A55FC0B89A76436 /* FIRInstallationsStore.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRInstallationsStore.m; path = FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStore.m; sourceTree = ""; }; + DEBDFBFD60419C6875B4145D83150FBE /* GDTCORPlatform.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GDTCORPlatform.m; path = GoogleDataTransport/GDTCORLibrary/GDTCORPlatform.m; sourceTree = ""; }; + DEC0CBFF3AEC373BCF6CE57E7513755A /* FIRCLSApplication.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSApplication.m; path = Crashlytics/Crashlytics/Components/FIRCLSApplication.m; sourceTree = ""; }; + DEC61A91C59056C9B0313273CF1DDFC8 /* GDTCORStorageMetadata.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCORStorageMetadata.h; path = GoogleDataTransport/GDTCORLibrary/Private/GDTCORStorageMetadata.h; sourceTree = ""; }; + DED706D2DD6871C5D6FCDBD7A4B61884 /* ResourceBundle-GoogleUtilities_Privacy-GoogleUtilities-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-GoogleUtilities_Privacy-GoogleUtilities-Info.plist"; sourceTree = ""; }; + DF3158D3D5EAB700729ACD026F3057F8 /* ISBaseRewardedVideoAdapter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISBaseRewardedVideoAdapter.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISBaseRewardedVideoAdapter.h"; sourceTree = ""; }; + DF685DFA77326D8EAAAF2598883F56F8 /* FIRCLSRecordIdentity.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSRecordIdentity.m; path = Crashlytics/Crashlytics/Models/Record/FIRCLSRecordIdentity.m; sourceTree = ""; }; + DF72205ECA9D9FABB64FB14168AE93E8 /* ISBaseInterstitialAdapter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISBaseInterstitialAdapter.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseInterstitialAdapter.h"; sourceTree = ""; }; + E02A98982D5BB8B24B386D510226E73A /* FIRCLSOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSOperation.h; path = Crashlytics/Shared/FIRCLSOperation/FIRCLSOperation.h; sourceTree = ""; }; + E057788A986B47B316A6357ED7BED020 /* SDKDefaultSettings.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SDKDefaultSettings.swift; path = FirebaseSessions/Sources/Settings/SDKDefaultSettings.swift; sourceTree = ""; }; + E0D9EE7522917313EA7E35A89984F0D2 /* ISNSupersonicAdsPublisherSwiftFacade.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISNSupersonicAdsPublisherSwiftFacade.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNSupersonicAdsPublisherSwiftFacade.h"; sourceTree = ""; }; + E167981B8A73B538FE546347C153A501 /* FIRComponentContainer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRComponentContainer.h; path = FirebaseCore/Extension/FIRComponentContainer.h; sourceTree = ""; }; + E1C8682F1D0FD190CC6BFDD65A952A8E /* ISAInitRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAInitRequest.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAInitRequest.h"; sourceTree = ""; }; + E20A5B9D37ADDE907C68B5A0DF641EB2 /* FIRCLSExecutionIdentifierModel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSExecutionIdentifierModel.h; path = Crashlytics/Crashlytics/Models/FIRCLSExecutionIdentifierModel.h; sourceTree = ""; }; + E2B63D462DB7F827C4B11FD51E4F8E2D /* FirebaseCore */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = FirebaseCore; path = FirebaseCore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + E2D633E005F7F2FBF43146CE97AB035F /* FIRInstallationsStatus.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRInstallationsStatus.h; path = FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsStatus.h; sourceTree = ""; }; + E2DFFA7074DD7DB1C186089C3F7BB1FD /* LPMRewardedAdConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LPMRewardedAdConfig.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMRewardedAdConfig.h"; sourceTree = ""; }; + E355C7908673CD447EBA9E2627292044 /* Promise+Timeout.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Promise+Timeout.swift"; path = "Sources/Promises/Promise+Timeout.swift"; sourceTree = ""; }; + E398776A1232FFAB57A8462E6DEC0E32 /* ISNetworkInitializationDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISNetworkInitializationDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNetworkInitializationDelegate.h"; sourceTree = ""; }; + E3C1820AFC9A8D3151C19139F6BBBB96 /* FIRInstallationsAuthTokenResult.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRInstallationsAuthTokenResult.h; path = FirebaseInstallations/Source/Library/Public/FirebaseInstallations/FIRInstallationsAuthTokenResult.h; sourceTree = ""; }; + E40E4E1B01CC4243E22B6EF5D4639C4C /* PromisesSwift-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "PromisesSwift-dummy.m"; sourceTree = ""; }; + E468EC8047B85253A3F8865A433CBDF5 /* SessionStartEvent.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionStartEvent.swift; path = FirebaseSessions/Sources/SessionStartEvent.swift; sourceTree = ""; }; + E4ED531DD8427B6BEF3F72C391ED7991 /* FIRTimestamp.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRTimestamp.h; path = FirebaseCore/Sources/Public/FirebaseCore/FIRTimestamp.h; sourceTree = ""; }; + E51EF5D5622B0C07934CD388A395A7B9 /* ISNetworkInitCallbackProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISNetworkInitCallbackProtocol.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNetworkInitCallbackProtocol.h"; sourceTree = ""; }; + E5AD3E9C111C8222D721FB18E8AAC01E /* GDTCORTransformer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GDTCORTransformer.m; path = GoogleDataTransport/GDTCORLibrary/GDTCORTransformer.m; sourceTree = ""; }; + E5E207080C142E38C423629AF322C22A /* GULSwizzler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GULSwizzler.m; path = GoogleUtilities/MethodSwizzler/GULSwizzler.m; sourceTree = ""; }; + E5F512813D1324A2778661F22AC34DE7 /* ISNEventTrackerInterface.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISNEventTrackerInterface.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNEventTrackerInterface.h"; sourceTree = ""; }; + E6194471CC7D7B3811785D6FB35C5E9B /* FIRLibrary.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRLibrary.h; path = FirebaseCore/Extension/FIRLibrary.h; sourceTree = ""; }; + E64FDC4439FB05110F702AE12290FC9D /* FIRInstallationsItem+RegisterInstallationAPI.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "FIRInstallationsItem+RegisterInstallationAPI.m"; path = "FirebaseInstallations/Source/Library/InstallationsAPI/FIRInstallationsItem+RegisterInstallationAPI.m"; sourceTree = ""; }; + E67B793CA66575C559913EB7F66102D5 /* FirebaseCoreExtension.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = FirebaseCoreExtension.modulemap; sourceTree = ""; }; + E69C2479672DEE9632C64C294E1CE2BB /* dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = dummy.m; path = FirebaseCore/Extension/dummy.m; sourceTree = ""; }; + E6C42248AC8B2490BCB8AEA3363C72F2 /* GDTCCTURLSessionDataResponse.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCCTURLSessionDataResponse.h; path = GoogleDataTransport/GDTCCTLibrary/Private/GDTCCTURLSessionDataResponse.h; sourceTree = ""; }; + E7176FC3E8C82A6D42D00E8741C604A3 /* DevEventConsoleLogger.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DevEventConsoleLogger.swift; path = FirebaseSessions/Sources/Development/DevEventConsoleLogger.swift; sourceTree = ""; }; + E733897E58C3ECF71F8B593B0583C98C /* FIRCLSManagerData.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSManagerData.m; path = Crashlytics/Crashlytics/Controllers/FIRCLSManagerData.m; sourceTree = ""; }; + E797EC67D6E0ACAC462ABD3CBCD0A1E6 /* FBLPromise+Recover.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBLPromise+Recover.h"; path = "Sources/FBLPromises/include/FBLPromise+Recover.h"; sourceTree = ""; }; + E7D995F00390E63EC01B340C38316922 /* ISAdInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdInfo.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdInfo.h"; sourceTree = ""; }; + E81048105F15BD6D03DCAD86C4DF41EB /* GDTCORUploadBatch.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCORUploadBatch.h; path = GoogleDataTransport/GDTCORLibrary/Private/GDTCORUploadBatch.h; sourceTree = ""; }; + E814CF17C18B86D7848AB28D353970F2 /* cct.nanopb.c */ = {isa = PBXFileReference; includeInIndex = 1; name = cct.nanopb.c; path = GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/cct.nanopb.c; sourceTree = ""; }; + E84090DB23A890A20DDB9D6DAC5D52C9 /* Pods-TastePick-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-TastePick-umbrella.h"; sourceTree = ""; }; + E86149627A213EB95D15638DCFB13155 /* ISDemandOnlyBannerDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISDemandOnlyBannerDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISDemandOnlyBannerDelegate.h"; sourceTree = ""; }; + E87FCB761D062C05C7C44413916A46C2 /* FIRCLSDemangleOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSDemangleOperation.h; path = Crashlytics/Crashlytics/Operations/Symbolication/FIRCLSDemangleOperation.h; sourceTree = ""; }; + E8BA439DC820D21D4BF8C0B289F00EDC /* ResourceBundle-FirebaseInstallations_Privacy-FirebaseInstallations-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-FirebaseInstallations_Privacy-FirebaseInstallations-Info.plist"; sourceTree = ""; }; + E9156803190C11FF8782E65BB534A47D /* ISBaseAdapter+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "ISBaseAdapter+Internal.h"; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseAdapter+Internal.h"; sourceTree = ""; }; + E948A858602FAD098C5C3D98C7B7C80A /* ISDemandOnlyBannerDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISDemandOnlyBannerDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISDemandOnlyBannerDelegate.h"; sourceTree = ""; }; + E9499C8702EE3C4BA0EE46CBFC0D843E /* client_metrics.nanopb.c */ = {isa = PBXFileReference; includeInIndex = 1; name = client_metrics.nanopb.c; path = GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/client_metrics.nanopb.c; sourceTree = ""; }; + E96821E6404A23F47A8C3D9D9ACE11A6 /* FIRCLSLogger.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSLogger.m; path = Crashlytics/Crashlytics/Helpers/FIRCLSLogger.m; sourceTree = ""; }; + E98FEA4C808524F7744772D67D3D1A50 /* nanopb.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = nanopb.debug.xcconfig; sourceTree = ""; }; + E9A46E157DA0F94A4C4225E9A7FDCA04 /* ISAInterstitialAd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAInterstitialAd.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAInterstitialAd.h"; sourceTree = ""; }; + E9E0EA70CA46474BC6ACFCF4EEC7478A /* FirebaseCoreInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FirebaseCoreInternal.h; path = FirebaseCore/Extension/FirebaseCoreInternal.h; sourceTree = ""; }; + EA41D8F1297358F48A5C6FE9595C51F2 /* FIRLibrary.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRLibrary.h; path = FirebaseCore/Extension/FIRLibrary.h; sourceTree = ""; }; + EB12CA19814BFB60018835B0B656CA3D /* FBLPromise+Always.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBLPromise+Always.h"; path = "Sources/FBLPromises/include/FBLPromise+Always.h"; sourceTree = ""; }; + EB3640A53E23EBAA29760656C05BC864 /* GULAppEnvironmentUtil.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GULAppEnvironmentUtil.m; path = GoogleUtilities/Environment/GULAppEnvironmentUtil.m; sourceTree = ""; }; + EB728AF62221D7D4A0C428EADA2EDC6A /* ISNControllerMessageListener.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISNControllerMessageListener.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNControllerMessageListener.h"; sourceTree = ""; }; + EB7ED511E10B0912A631743816085954 /* FirebaseCore.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FirebaseCore.debug.xcconfig; sourceTree = ""; }; + EB9029979EA0093A618DB4C52AF8A142 /* Pods-TastePick-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-TastePick-acknowledgements.plist"; sourceTree = ""; }; + EB90473E82103B7D0EF1396D1445EDA6 /* FIRInstallations.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRInstallations.h; path = FirebaseInstallations/Source/Library/Public/FirebaseInstallations/FIRInstallations.h; sourceTree = ""; }; + EB966C4A2F7D24BB8E0E875535E70D1C /* FIRInstallationsStoredItem.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRInstallationsStoredItem.h; path = FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStoredItem.h; sourceTree = ""; }; + EBB4A43873B06A69D498EBF26083AAB5 /* ISLoggerManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISLoggerManager.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISLoggerManager.h"; sourceTree = ""; }; + EBBC7C64FA0F8C32203AC58709DC182B /* GULReachabilityMessageCode.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GULReachabilityMessageCode.h; path = GoogleUtilities/Reachability/GULReachabilityMessageCode.h; sourceTree = ""; }; + EC4CF58626C94A37CEEE596200CF4A2E /* FIRCLSDataCollectionArbiter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSDataCollectionArbiter.m; path = Crashlytics/Crashlytics/DataCollection/FIRCLSDataCollectionArbiter.m; sourceTree = ""; }; + EC8876154B49824D7A7F836853BA4CB2 /* FIRComponentContainer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRComponentContainer.m; path = FirebaseCore/Sources/FIRComponentContainer.m; sourceTree = ""; }; + ECAC028550A03412C51913B85686D98B /* FirebaseCoreExtension-FirebaseCoreExtension_Privacy */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "FirebaseCoreExtension-FirebaseCoreExtension_Privacy"; path = FirebaseCoreExtension_Privacy.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + ECE796880B52B02A97E21FF5B8F8CD3F /* FIRInstallationsStoredAuthToken.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRInstallationsStoredAuthToken.m; path = FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStoredAuthToken.m; sourceTree = ""; }; + ECEC8BD430609775580BBCE5DB5FCA82 /* ISNativeAdAdapterDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISNativeAdAdapterDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISNativeAdAdapterDelegate.h"; sourceTree = ""; }; + ED2D07B9F2849B4BED4249A363B843ED /* ISBaseNativeAdAdapter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISBaseNativeAdAdapter.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseNativeAdAdapter.h"; sourceTree = ""; }; + ED50E394510B175D86CC0C75359E664D /* FirebaseAnalytics.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FirebaseAnalytics.debug.xcconfig; sourceTree = ""; }; + EF764A00716BA22F5FDA2EE36A243947 /* ISAInterstitialAdInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAInterstitialAdInfo.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAInterstitialAdInfo.h"; sourceTree = ""; }; + EF8F75D03A0EB7CCDC0627E68E587553 /* HeartbeatController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HeartbeatController.swift; path = FirebaseCore/Internal/Sources/HeartbeatLogging/HeartbeatController.swift; sourceTree = ""; }; + F00A9AE5F1DE080B359CCB93AB03F214 /* ISAdapterNativeAdViewBinder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdapterNativeAdViewBinder.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAdapterNativeAdViewBinder.h"; sourceTree = ""; }; + F02211999487449E29659793EB81891A /* LPMBannerAdViewConfigBuilder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LPMBannerAdViewConfigBuilder.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMBannerAdViewConfigBuilder.h"; sourceTree = ""; }; + F064E9645A9CE6DABD7C6FCEB9B64BC1 /* FIRCLSAsyncOperation_Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSAsyncOperation_Private.h; path = Crashlytics/Crashlytics/Operations/FIRCLSAsyncOperation_Private.h; sourceTree = ""; }; + F0CBF52E8E78DB598F0935964191E5BE /* FIRCLSMachException.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSMachException.h; path = Crashlytics/Crashlytics/Handlers/FIRCLSMachException.h; sourceTree = ""; }; + F0D98674D9D210C0A8B28B6FE55F6CCA /* GoogleDataTransport-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "GoogleDataTransport-dummy.m"; sourceTree = ""; }; + F0FA261A79F1E495EBA3976B173C2751 /* GDTCORMetricsMetadata.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GDTCORMetricsMetadata.m; path = GoogleDataTransport/GDTCORLibrary/GDTCORMetricsMetadata.m; sourceTree = ""; }; + F124344AE96893E0594C26B3948D11D0 /* ISNAdViewsManagerSwiftFacade.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISNAdViewsManagerSwiftFacade.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNAdViewsManagerSwiftFacade.h"; sourceTree = ""; }; + F125DFC32618A9F8EFBE762F2951FF73 /* pb.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = pb.h; sourceTree = ""; }; + F16384F899915F2AB97FDC2DDC712581 /* FIRCLSHandler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSHandler.m; path = Crashlytics/Crashlytics/Handlers/FIRCLSHandler.m; sourceTree = ""; }; + F171CB55C4DBA6415F005DEAB04C9068 /* FIRAppInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRAppInternal.h; path = FirebaseCore/Extension/FIRAppInternal.h; sourceTree = ""; }; + F194DE6B4B2B513333F3125A7BCAB636 /* ResourceBundle-Promises_Privacy-PromisesSwift-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-Promises_Privacy-PromisesSwift-Info.plist"; sourceTree = ""; }; + F1A8CDF3B0998C42CFF10979FB44C768 /* ResourceBundle-FirebaseCore_Privacy-FirebaseCore-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-FirebaseCore_Privacy-FirebaseCore-Info.plist"; sourceTree = ""; }; + F1AE57B2231D059EADFE6A5F5D1202BF /* Promise+Validate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Promise+Validate.swift"; path = "Sources/Promises/Promise+Validate.swift"; sourceTree = ""; }; + F1D090674AF3A3F61B4DDAE7E2DD2034 /* LPMInitRequestBuilder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LPMInitRequestBuilder.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/LPMInitRequestBuilder.h"; sourceTree = ""; }; + F22C18A0CA273B8861C3083DECB42701 /* FirebaseCore-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "FirebaseCore-dummy.m"; sourceTree = ""; }; + F233CC4228F9B498FC5158D560DF7C4C /* GDTCORPlatform.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCORPlatform.h; path = GoogleDataTransport/GDTCORLibrary/Internal/GDTCORPlatform.h; sourceTree = ""; }; + F241586E839BA67D4272890DC9FF1F7F /* FIRCLSSignal.c */ = {isa = PBXFileReference; includeInIndex = 1; name = FIRCLSSignal.c; path = Crashlytics/Crashlytics/Handlers/FIRCLSSignal.c; sourceTree = ""; }; + F3238C4CE173BA1F14179E5E21CD39A0 /* ISAdUnitAdapterProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdUnitAdapterProtocol.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAdUnitAdapterProtocol.h"; sourceTree = ""; }; + F4594EEA6E07CEDE69B87D3B6DCA18EF /* LPMInterstitialAdDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LPMInterstitialAdDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMInterstitialAdDelegate.h"; sourceTree = ""; }; + F48D0F5CB15141F4F307D622FDB9D83C /* GDTCORDirectorySizeTracker.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCORDirectorySizeTracker.h; path = GoogleDataTransport/GDTCORLibrary/Internal/GDTCORDirectorySizeTracker.h; sourceTree = ""; }; + F503D63C28FC1EEFDA1891C3FB87035E /* ISAAdFormat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAAdFormat.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISAAdFormat.h"; sourceTree = ""; }; + F50FB8DB62656BC873280B51189DE69E /* ISAInterstitialAd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAInterstitialAd.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISAInterstitialAd.h"; sourceTree = ""; }; + F533149F3437731CB186C5927FE26F19 /* ISABannerAdViewDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISABannerAdViewDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISABannerAdViewDelegate.h"; sourceTree = ""; }; + F5747BC30069054A7B0D60AB1E618499 /* FIRCLSLogger.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSLogger.h; path = Crashlytics/Crashlytics/Helpers/FIRCLSLogger.h; sourceTree = ""; }; + F57C8BA36A7C24A2611DA09642153D19 /* ISBaseRewardedVideo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISBaseRewardedVideo.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISBaseRewardedVideo.h"; sourceTree = ""; }; + F5E12A948945215BBC2C36B65AFE1D0D /* FIRCrashlytics.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCrashlytics.h; path = Crashlytics/Crashlytics/Public/FirebaseCrashlytics/FIRCrashlytics.h; sourceTree = ""; }; + F601E0B0203B8534E89765E98F93CC3C /* FirebaseCoreInternal-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "FirebaseCoreInternal-Info.plist"; sourceTree = ""; }; + F617922645413BFF8368B03C2EA0C543 /* FIRCLSContextInitData.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSContextInitData.h; path = Crashlytics/Crashlytics/Helpers/FIRCLSContextInitData.h; sourceTree = ""; }; + F66DA3C2097B9D040A400036969452AF /* GDTCORConsoleLogger.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCORConsoleLogger.h; path = GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORConsoleLogger.h; sourceTree = ""; }; + F69827F9D444A1C8C757AF3332BBA839 /* FirebaseCoreExtension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FirebaseCoreExtension.release.xcconfig; sourceTree = ""; }; + F6BAE7CFD7109C70FEFDE60137A0FB67 /* GDTCORFlatFileStorage+Promises.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "GDTCORFlatFileStorage+Promises.h"; path = "GoogleDataTransport/GDTCORLibrary/Private/GDTCORFlatFileStorage+Promises.h"; sourceTree = ""; }; + F6D312C64B38571DC21E8F9A57E23BC2 /* external_privacy_context.nanopb.c */ = {isa = PBXFileReference; includeInIndex = 1; name = external_privacy_context.nanopb.c; path = GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/external_privacy_context.nanopb.c; sourceTree = ""; }; + F713A3A781624E48724F66E707E2984D /* GULKeychainStorage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GULKeychainStorage.h; path = GoogleUtilities/Environment/Public/GoogleUtilities/GULKeychainStorage.h; sourceTree = ""; }; + F73AA961F4AEFF2B46B00AE435DF6BE3 /* GoogleDataTransport-GoogleDataTransport_Privacy */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "GoogleDataTransport-GoogleDataTransport_Privacy"; path = GoogleDataTransport_Privacy.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + F810FC24EB86BB9C64EDFB77902E05BE /* FIRInstallationsHTTPError.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRInstallationsHTTPError.m; path = FirebaseInstallations/Source/Library/Errors/FIRInstallationsHTTPError.m; sourceTree = ""; }; + F8405023D5E7043F7EC04ED1DA688369 /* FIRConfiguration.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRConfiguration.h; path = FirebaseCore/Sources/Public/FirebaseCore/FIRConfiguration.h; sourceTree = ""; }; + F889FA26D580B1AFA343DEF9E5599BCD /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = Crashlytics/Resources/PrivacyInfo.xcprivacy; sourceTree = ""; }; + F8C2FD665ADA64BA8B568069E295F869 /* ISAdQualityMediationNetwork.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISAdQualityMediationNetwork.h; path = "IronSourceAdQualitySDK.xcframework/ios-arm64_x86_64-simulator/Headers/ISAdQualityMediationNetwork.h"; sourceTree = ""; }; + F8EC163DDE4F2BAB0FEF9B538EC2D8DD /* FIRVersion.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRVersion.h; path = FirebaseCore/Sources/Public/FirebaseCore/FIRVersion.h; sourceTree = ""; }; + F8FEAFB5D122AADE93CC623B210F09CB /* ISNativeAdProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISNativeAdProtocol.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNativeAdProtocol.h"; sourceTree = ""; }; + F958D4826D8EA515C4462BFED0FED895 /* ISNControllerManagerSwiftFacade.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISNControllerManagerSwiftFacade.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISNControllerManagerSwiftFacade.h"; sourceTree = ""; }; + F9DF843F93CE66AD5D17284146E812CC /* FBLPromise+Any.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBLPromise+Any.h"; path = "Sources/FBLPromises/include/FBLPromise+Any.h"; sourceTree = ""; }; + FA066B48AB9828479114868B51D5FCB5 /* FIRInstallationsBackoffController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRInstallationsBackoffController.h; path = FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsBackoffController.h; sourceTree = ""; }; + FA2E3B3981C2F0727AB450DC21490B78 /* Installations+InstallationsProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Installations+InstallationsProtocol.swift"; path = "FirebaseSessions/Sources/Installations+InstallationsProtocol.swift"; sourceTree = ""; }; + FA6D70D8547D00E793A64C1BC9AD2B71 /* ISABannerAdLoaderDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISABannerAdLoaderDelegate.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/ISABannerAdLoaderDelegate.h"; sourceTree = ""; }; + FAEB7FD705F633027F8EFC2ADAB11A8D /* FIRCLSMachOBinary.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSMachOBinary.h; path = Crashlytics/Shared/FIRCLSMachO/FIRCLSMachOBinary.h; sourceTree = ""; }; + FB5A222454C158DFF4282699459141CA /* FBLPromise.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBLPromise.m; path = Sources/FBLPromises/FBLPromise.m; sourceTree = ""; }; + FB607976AC966D4A13E86CF5E5DC2E24 /* FIRLoggerLevel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRLoggerLevel.h; path = FirebaseCore/Sources/Public/FirebaseCore/FIRLoggerLevel.h; sourceTree = ""; }; + FBE64380A7A08949D8A04B63EA06E134 /* PromisesObjC-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "PromisesObjC-Info.plist"; sourceTree = ""; }; + FC2B5772E909C03957AD6D8CE697FADD /* FirebaseSessions.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FirebaseSessions.debug.xcconfig; sourceTree = ""; }; + FDB288710A5819DDAF867AD51CB7C8BA /* FIRCLSFABAsyncOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSFABAsyncOperation.h; path = Crashlytics/Shared/FIRCLSOperation/FIRCLSFABAsyncOperation.h; sourceTree = ""; }; + FE2263D06B0F45669E7941E36275A164 /* PromisesSwift.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = PromisesSwift.modulemap; sourceTree = ""; }; + FE9F3E7574523DCB811C35B6609641DD /* LPMAdSize.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LPMAdSize.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LPMAdSize.h"; sourceTree = ""; }; + FF1836556425297312A4985C246EFEDD /* LevelPlayNativeAd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LevelPlayNativeAd.h; path = "IronSource/IronSource.xcframework/ios-arm64_x86_64-simulator/IronSource.framework/Headers/LevelPlayNativeAd.h"; sourceTree = ""; }; + FF49F83D45758D2C06244EA2B224D30E /* ISABannerAdInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISABannerAdInfo.h; path = "IronSource/IronSource.xcframework/ios-arm64/IronSource.framework/Headers/ISABannerAdInfo.h"; sourceTree = ""; }; + FF5C90394FFA709E28101D1185CB62A7 /* GULNetworkURLSession.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GULNetworkURLSession.h; path = GoogleUtilities/Network/Public/GoogleUtilities/GULNetworkURLSession.h; sourceTree = ""; }; + FF7D9C22D9575CAD5D16549620CF1F54 /* FIRCLSDataCollectionToken.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSDataCollectionToken.h; path = Crashlytics/Crashlytics/DataCollection/FIRCLSDataCollectionToken.h; sourceTree = ""; }; + FFC6EADF4B6C2CC4616BEE1E42AEF5A4 /* FIRCLSSymbolResolver.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSSymbolResolver.m; path = Crashlytics/Crashlytics/Models/FIRCLSSymbolResolver.m; sourceTree = ""; }; + FFF0E62BD9FA88413042F0BCBD7031F2 /* FIRCLSDownloadAndSaveSettingsOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSDownloadAndSaveSettingsOperation.m; path = Crashlytics/Crashlytics/Settings/Operations/FIRCLSDownloadAndSaveSettingsOperation.m; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 11EF6B892E83F50C5488F3CC859FD958 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 923D3678D40FDAC598A52A954C12E252 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 318AFB76D69A76F670332A09CC9BB69B /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 34252B889D1C413540C638DB308F5D82 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 11A3D6FF1465D4D84C3C2B568EB49FC0 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 3EB36BA1EDF6164CEAB60B9278117B73 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 45C2E717CD6DC2E2CA044BFE9A5C7C59 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 53157F13C7B0F3CABABA29BD677447B4 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + B46CC333BED069A7365B7831B7BEAA17 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 5813D36D677D5D155EA7C2A60305E54A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 5C119DF084D8CC03E2A548C4D84B3E51 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 5D3A93023CC89480A9A7BDBBF1A2E804 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 64E12CB82B1F05DF2029DAC0EFF0F607 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7EF43923DC36D06C0E43C68374CBC030 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + F0A5403D4B384C4CB473292E076BA6BA /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 86DE0F9F28848BEC1EACA092C3F9E20F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 8C67D15048DC24F023ED25EBED0F0D93 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 8507B85853224FD0370564907686121C /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 98A011625BB580D9957A01DC8C19ED77 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 0E5531CA13C51FB47EA129C89493942B /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 9A44ACD4040C82FECB0E3AEDE49296BC /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 8DB713CD29673A4921FD7AEA1B082F1C /* Foundation.framework in Frameworks */, + EBDD860E99D8088AD4206F8A841A0FD8 /* Security.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 9BB98489ADA0E537523CE0404A4EB77B /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 9C81C2CA49D9A222BFA041CA054441BB /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 6695EF6A933BA33BF037AAA19A45E3F3 /* Foundation.framework in Frameworks */, + BFC13BFF16CA927D57B84110566226B9 /* Security.framework in Frameworks */, + 0A41B3D607C3FEACEF10A4E218996748 /* SystemConfiguration.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B2A223672FDB5E01120CC61A4D65F24F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 5BEB66442C3EF989A1D975255081D660 /* Foundation.framework in Frameworks */, + 34E67347A7A953E9F49DE78BE92BE22A /* UIKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C673219313B57500FD948FC1D320CDD9 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C8BC4617EBB6C8D49C63CD3D9725A35F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 2B5268395145D1DAB7ED2BDBA634326A /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + CD76B46A17288AC5D9EEE7407B3DBA4E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 7BBB4D45CDEB2E67B20A5748D6F918BC /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D53D6F4C4A85C5E285872ED50510BE5E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D8CAF25339CD17DB08D9AA70AFA5FE39 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F2B6AED95316A5FD672E38F373BE6B16 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + A9D5A5F686D42A4B32622F26659CE75F /* CoreTelephony.framework in Frameworks */, + 99604CD663C8707DFDFDC76C2421F3B1 /* Foundation.framework in Frameworks */, + 024C5E62C86E488BC6ED5FE2E1B8FFE3 /* SystemConfiguration.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + FA187FB145737F95D328E91AB3BE6944 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 9810B7094A01A6900FAB9BE07463F29D /* Foundation.framework in Frameworks */, + B5FE2A5AEEBDAFF7BC4F02F2677F0DCE /* Security.framework in Frameworks */, + 0774A2D8C20DD7B2FDACEE3466180D6F /* SystemConfiguration.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 040D30B5E344DD5C725C40747AD9C6D2 /* Resources */ = { + isa = PBXGroup; + children = ( + D579B4328A248F1CCE7D5515604A338B /* PrivacyInfo.xcprivacy */, + ); + name = Resources; + sourceTree = ""; + }; + 044FB21EB446C61135CD3E1A6A364525 /* FirebaseCore */ = { + isa = PBXGroup; + children = ( + 783F2376C80B3E144C8808271A304EA7 /* FIRAnalyticsConfiguration.h */, + 928EB4F74D12F2775E1453DF6F8F5448 /* FIRAnalyticsConfiguration.m */, + AAA22AB3BDDB5122B8AE45AA82891F8A /* FIRApp.h */, + A5BDC59CE92B5971C70A6EB248252D5A /* FIRApp.m */, + 3896C1B7A6BF62C3D44EAA5107F8FF8C /* FIRAppInternal.h */, + 0DEA1F94A33613AE4F30F7F2AC3187C4 /* FIRBundleUtil.h */, + DD78237C3212BBFE1C92D8C64700F363 /* FIRBundleUtil.m */, + D6AC87ED55C906B755326408B858A632 /* FIRComponent.h */, + CBC7ABF27B4FE2B428B41107C4B1A383 /* FIRComponent.m */, + B6F49F6EF0F81B01765B056A8B012A04 /* FIRComponentContainer.h */, + EC8876154B49824D7A7F836853BA4CB2 /* FIRComponentContainer.m */, + 9C68A091AE9AFC6675997908F065AD15 /* FIRComponentContainerInternal.h */, + CAC4AF12CEDA6145D2B5533F756AE5EF /* FIRComponentType.h */, + D54022AE451161DCBDEE4F8EDA350F8E /* FIRComponentType.m */, + F8405023D5E7043F7EC04ED1DA688369 /* FIRConfiguration.h */, + 5723FF239BCEB6D88B9874F1440EEADA /* FIRConfiguration.m */, + 1073A31EF35FD64DE634B90E1238EA0F /* FIRConfigurationInternal.h */, + C701DD6907FF92F7694F74D6DA235DDF /* FirebaseCore.h */, + E9E0EA70CA46474BC6ACFCF4EEC7478A /* FirebaseCoreInternal.h */, + 7E072EE42C6817D97E8D699113F28148 /* FIRFirebaseUserAgent.h */, + BBBA2645EC17F90B7F28C59B969882A8 /* FIRFirebaseUserAgent.m */, + 8555E7FB469BD55854B5C570D91A9260 /* FIRHeartbeatLogger.h */, + D08502D5153E2D6ED0657435C2CDB103 /* FIRHeartbeatLogger.m */, + 7001A63E1A9DC7FE5211C829514A4388 /* FIRLibrary.h */, + 095526FC8C58547FC9AFAC3FA4146344 /* FIRLogger.h */, + 054793BA26B427ACD14E4A67EBA444D0 /* FIRLogger.m */, + FB607976AC966D4A13E86CF5E5DC2E24 /* FIRLoggerLevel.h */, + D463F5B89599530250694EBA7C8A4277 /* FIROptions.h */, + 041237B7780A329CCAC0E5D7CC1FFC2F /* FIROptions.m */, + 2DBF91E26611C1E7394DF3D28D3158C8 /* FIROptionsInternal.h */, + E4ED531DD8427B6BEF3F72C391ED7991 /* FIRTimestamp.h */, + AC6034781E48B285E9D76832343C5FAC /* FIRTimestamp.m */, + A8A4062D929DD42279DA66A4A0621294 /* FIRTimestampInternal.h */, + F8EC163DDE4F2BAB0FEF9B538EC2D8DD /* FIRVersion.h */, + D8FEC6CA0C9F009A9AF67A8F28C6A04E /* FIRVersion.m */, + 387C145A75364EFB63C6CA8111F404C1 /* Resources */, + 7347A038DB6104A8AB58758D005F68BE /* Support Files */, + ); + name = FirebaseCore; + path = FirebaseCore; + sourceTree = ""; + }; + 051370520B013C5D1C17A7ECF2D1B55A /* Resources */ = { + isa = PBXGroup; + children = ( + 8AD7EDA47090667D1A46D0D6BA5EB7B2 /* PrivacyInfo.xcprivacy */, + ); + name = Resources; + sourceTree = ""; + }; + 0530E85F6AD881F845E3478866B40BBB /* Logger */ = { + isa = PBXGroup; + children = ( + 9AD0850C0803DAB13E0E081B07845B91 /* GULLogger.h */, + 1DA040D8D1944A547F2CE9CEB368B983 /* GULLogger.m */, + C9316FE183C97664C3C149529E5C07F5 /* GULLoggerLevel.h */, + ); + name = Logger; + sourceTree = ""; + }; + 069CC94A2AF02440117C217830A9287D /* FirebaseCoreInternal */ = { + isa = PBXGroup; + children = ( + 32DD5F8C87EC0D61474350BF65B77615 /* _ObjC_HeartbeatController.swift */, + B7FDF38235B4F6D889DB018F7596B27C /* _ObjC_HeartbeatsPayload.swift */, + 69A4852926E3A9DD96162FEBB238FE20 /* Heartbeat.swift */, + EF8F75D03A0EB7CCDC0627E68E587553 /* HeartbeatController.swift */, + 1758B957BB4D36B3B969C7AE4E209789 /* HeartbeatLoggingTestUtils.swift */, + 05A64ED55B701A52C9F43F904FEB2032 /* HeartbeatsBundle.swift */, + 1B762B1EE7A4FF6B5CDC16D2B9D6757F /* HeartbeatsPayload.swift */, + 27053A773E2AD151CD813EDCB8E648B1 /* HeartbeatStorage.swift */, + DC5F74E6FC92E4C96BD36A86654F80CC /* RingBuffer.swift */, + 9E4D1EE87FA72D11176CC6321F325160 /* Storage.swift */, + 2F7F89196A1000F92ED359A936B94564 /* StorageFactory.swift */, + D905CBD56E4B6F871771930498CBAEE6 /* UnfairLock.swift */, + 71A7D5A7EA6A59D1467FEAB5392F46A5 /* WeakContainer.swift */, + 3E4BE139870B62D2BCA607E552A2B705 /* Resources */, + 7FA9D03CAEE6F75A8EE34691A2E6AF41 /* Support Files */, + ); + name = FirebaseCoreInternal; + path = FirebaseCoreInternal; + sourceTree = ""; + }; + 06DF5649B2F4F44A529847B6FB439B4D /* NSData+zlib */ = { + isa = PBXGroup; + children = ( + 9A3760A90C91C7825D4ED94A27D07A53 /* GULNSData+zlib.h */, + 73F1BDC5C04B01D703D1ED3ABBBB52BA /* GULNSData+zlib.m */, + ); + name = "NSData+zlib"; + sourceTree = ""; + }; + 087AAA21836F4DD9008CC3067B19B796 /* Resources */ = { + isa = PBXGroup; + children = ( + 2A013903A63F0BEB08E3A00DCAAFBFB4 /* PrivacyInfo.xcprivacy */, + ); + name = Resources; + sourceTree = ""; + }; + 0C688AAC43A10084722F109A729FED20 /* MethodSwizzler */ = { + isa = PBXGroup; + children = ( + 7F35B015EB4408E1E2CE0541A707AC9B /* GULOriginalIMPConvenienceMacros.h */, + 7D36278F28B9386784BCB7DD696476C3 /* GULSwizzler.h */, + E5E207080C142E38C423629AF322C22A /* GULSwizzler.m */, + ); + name = MethodSwizzler; + sourceTree = ""; + }; + 0DA760F7CF1400C211D401B62D23A2D6 /* Environment */ = { + isa = PBXGroup; + children = ( + D9AD12C8E138FD2EC14CB63C52044780 /* GULAppEnvironmentUtil.h */, + EB3640A53E23EBAA29760656C05BC864 /* GULAppEnvironmentUtil.m */, + F713A3A781624E48724F66E707E2984D /* GULKeychainStorage.h */, + 26D2C03BACF911A34C8F878660B53C2C /* GULKeychainStorage.m */, + 11229AFB0FDD9883E979E40CAA70AF48 /* GULKeychainUtils.h */, + 6B429F7B704C639EAB90CA4BAEF50C4C /* GULKeychainUtils.m */, + 85407414E799656985846E4B52CA9B0E /* GULNetworkInfo.h */, + 49C01A95AD44924B0A150B7FBF2D3C3B /* GULNetworkInfo.m */, + CFEAEBE26866A8878F06A26FF49B5831 /* IsAppEncrypted.h */, + 3ED2C548E8AF0C8CF19C444FAAA9E1F5 /* IsAppEncrypted.m */, + ); + name = Environment; + sourceTree = ""; + }; + 0F7FCEE0E715C499CEBCB3A143DC5E4D /* FirebaseInstallations */ = { + isa = PBXGroup; + children = ( + 026ABAC768ADF6EFAE52F6EB231566C8 /* FIRAppInternal.h */, + 73F2669B8E97E07B1E986EEDDCD1E20F /* FIRComponent.h */, + E167981B8A73B538FE546347C153A501 /* FIRComponentContainer.h */, + 603A3741C764ED8E33FFA78791103DC7 /* FIRComponentType.h */, + A4463B80D4074271B9828C77B9161130 /* FIRCurrentDateProvider.h */, + 589A8A9E3F768B680487BE8916448D53 /* FIRCurrentDateProvider.m */, + 750B2D0A333C9B773C5CD112D92B9624 /* FirebaseCoreInternal.h */, + 3E9FBDDA48E48B547C7C0727E2294D88 /* FirebaseInstallations.h */, + 016AA5BB178E30DCB042FE1CDAC73C69 /* FirebaseInstallationsInternal.h */, + 07A40BB09AB8BA963D4F2C0E6D52ED80 /* FIRHeartbeatLogger.h */, + EB90473E82103B7D0EF1396D1445EDA6 /* FIRInstallations.h */, + 42214B91DB94A8BCA9AAB752EC20709C /* FIRInstallations.m */, + D17C5993C3025211E5829910536ABC30 /* FIRInstallationsAPIService.h */, + D4C5CBE11163C6511EE7ED28D41665C5 /* FIRInstallationsAPIService.m */, + E3C1820AFC9A8D3151C19139F6BBBB96 /* FIRInstallationsAuthTokenResult.h */, + 813D484D4C1D83EDA74FFFF0A4A5C2AD /* FIRInstallationsAuthTokenResult.m */, + BCF4E73A914FD06A61DC68D60806B05D /* FIRInstallationsAuthTokenResultInternal.h */, + FA066B48AB9828479114868B51D5FCB5 /* FIRInstallationsBackoffController.h */, + 233D26E7E787BC05811554037BA231FF /* FIRInstallationsBackoffController.m */, + 2C8E3DDC3FDC1CDB26E0AEFF7902B4CE /* FIRInstallationsErrors.h */, + 941CD9B8673FA1E83DDB725CB3913B3A /* FIRInstallationsErrorUtil.h */, + 37E635B883B0849C4E370D3ED1FD8C74 /* FIRInstallationsErrorUtil.m */, + CC0821AB11E9F2A17681AEF21C3E08A3 /* FIRInstallationsHTTPError.h */, + F810FC24EB86BB9C64EDFB77902E05BE /* FIRInstallationsHTTPError.m */, + 9058232C8B527D93A7FBAD5A7C2C83B4 /* FIRInstallationsIDController.h */, + 490E7AB6DEADBE4BCBF1E69C4ACD9309 /* FIRInstallationsIDController.m */, + 69A2FC9AB94A757BD3026F9151C2D7D4 /* FIRInstallationsIIDStore.h */, + 745DF6128BC6D033E47AC4CB341C6742 /* FIRInstallationsIIDStore.m */, + 7BE07EBFBD81CBB624867A6C2E75F4E1 /* FIRInstallationsIIDTokenStore.h */, + 764FD3B73F706CB98739ECB8504FC38B /* FIRInstallationsIIDTokenStore.m */, + 52683691D0E142C39D15CA2DA8D5E237 /* FIRInstallationsItem.h */, + 51C8BA4480EF61CF419628A318848CBD /* FIRInstallationsItem.m */, + 6DD5E6DDDEDC478DF62822EB79509201 /* FIRInstallationsItem+RegisterInstallationAPI.h */, + E64FDC4439FB05110F702AE12290FC9D /* FIRInstallationsItem+RegisterInstallationAPI.m */, + B8C67CC462B5F2819801881EDE84376F /* FIRInstallationsLogger.h */, + 971D6CC0E391046E4819851E6BAACC90 /* FIRInstallationsLogger.m */, + D30B5C733BE395B9290BF66EF07B47D8 /* FIRInstallationsSingleOperationPromiseCache.h */, + 4A170FE629D15CDA92E90BDE57738254 /* FIRInstallationsSingleOperationPromiseCache.m */, + E2D633E005F7F2FBF43146CE97AB035F /* FIRInstallationsStatus.h */, + 0F55D58A85A745DCC23FC647F2E05FA6 /* FIRInstallationsStore.h */, + DE6686D5E66D53F23A55FC0B89A76436 /* FIRInstallationsStore.m */, + 723C7262FB570D774DAC5081A2209635 /* FIRInstallationsStoredAuthToken.h */, + ECE796880B52B02A97E21FF5B8F8CD3F /* FIRInstallationsStoredAuthToken.m */, + EB966C4A2F7D24BB8E0E875535E70D1C /* FIRInstallationsStoredItem.h */, + CC69C8F474714A281F42229040CF232F /* FIRInstallationsStoredItem.m */, + E6194471CC7D7B3811785D6FB35C5E9B /* FIRLibrary.h */, + 9282DF3214C3EE0A2E1219D9E7A701FA /* FIRLogger.h */, + D0186D61B8F6B0DC7E98BBB334DF93D4 /* Resources */, + D8F9ED88B738C161EB853279100AC6AF /* Support Files */, + ); + name = FirebaseInstallations; + path = FirebaseInstallations; + sourceTree = ""; + }; + 10F9DB55DC3702791ABBD5CB283994EA /* Resources */ = { + isa = PBXGroup; + children = ( + 42AD263E90CFB2730F35106BAEA86DAA /* PrivacyInfo.xcprivacy */, + ); + name = Resources; + sourceTree = ""; + }; + 150ACCA2F64C66CAD654EAC6303F2983 /* Support Files */ = { + isa = PBXGroup; + children = ( + E67B793CA66575C559913EB7F66102D5 /* FirebaseCoreExtension.modulemap */, + DDCF1D3203DC57B5D9103D0F15379868 /* FirebaseCoreExtension-dummy.m */, + CCA6278DA8D55BF8690A2D68CCC8482A /* FirebaseCoreExtension-Info.plist */, + 504585617C72E3E4F046B4166D73584E /* FirebaseCoreExtension-prefix.pch */, + 78699DA54089137B6922B98CD3909C9D /* FirebaseCoreExtension-umbrella.h */, + 1B304109378D7BE663BDB66843D276FD /* FirebaseCoreExtension.debug.xcconfig */, + F69827F9D444A1C8C757AF3332BBA839 /* FirebaseCoreExtension.release.xcconfig */, + 85602912DEE3932346960C77755A56C9 /* ResourceBundle-FirebaseCoreExtension_Privacy-FirebaseCoreExtension-Info.plist */, + ); + name = "Support Files"; + path = "../Target Support Files/FirebaseCoreExtension"; + sourceTree = ""; + }; + 208887086EA6EEB8AE8CBC68AA3AE167 /* decode */ = { + isa = PBXGroup; + children = ( + ); + name = decode; + sourceTree = ""; + }; + 2194CB9430A0DC0DF4F94215C6594C9F /* Resources */ = { + isa = PBXGroup; + children = ( + F889FA26D580B1AFA343DEF9E5599BCD /* PrivacyInfo.xcprivacy */, + ); + name = Resources; + sourceTree = ""; + }; + 220E561DEBD756583AF1A3760621C50E /* Frameworks */ = { + isa = PBXGroup; + children = ( + 7598137A247E471F3F68F82D668DF53B /* GoogleAppMeasurement.xcframework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 250C8E7A8055C8BCED59BFD411A0AF2A /* Support Files */ = { + isa = PBXGroup; + children = ( + 2ADA46F267FE7957F1038448DCE9D9B4 /* IronSourceSDK-xcframeworks.sh */, + C31C3EC5CF8094BD8759E8471989140E /* IronSourceSDK.debug.xcconfig */, + 6D3CA506E1A546D42FDF3E6448C106C8 /* IronSourceSDK.release.xcconfig */, + 89297C7BC38242650740653E02AF6561 /* ResourceBundle-IronSourcePrivacyInfo-IronSourceSDK-Info.plist */, + ); + name = "Support Files"; + path = "../Target Support Files/IronSourceSDK"; + sourceTree = ""; + }; + 25C0B3CC7BC55E481D47678F8BE96F6E /* Support Files */ = { + isa = PBXGroup; + children = ( + D90DE4A0922E388039EAAA4DD44E38D9 /* GoogleDataTransport.modulemap */, + F0D98674D9D210C0A8B28B6FE55F6CCA /* GoogleDataTransport-dummy.m */, + 05EFAFE4DC81653A8A7823602E3B1733 /* GoogleDataTransport-Info.plist */, + C756CB0A0B0B5E40A7ABD0FB2408ACF9 /* GoogleDataTransport-umbrella.h */, + 6327E28AF763E513DA6E86C88C092DE8 /* GoogleDataTransport.debug.xcconfig */, + 2F3F443A69F12C8FC5069D2F16BDAF87 /* GoogleDataTransport.release.xcconfig */, + C794FC8EBC9859B63C0157039E49B4E9 /* ResourceBundle-GoogleDataTransport_Privacy-GoogleDataTransport-Info.plist */, + ); + name = "Support Files"; + path = "../Target Support Files/GoogleDataTransport"; + sourceTree = ""; + }; + 2C62DDC0F97AAD9D45192C87DC463B4A /* Support Files */ = { + isa = PBXGroup; + children = ( + 369C32AFC4456AD8F92EA6E65B941D43 /* GoogleAppMeasurement-xcframeworks.sh */, + 8D97CA13CD9F41BB59ED02675F54F325 /* GoogleAppMeasurement.debug.xcconfig */, + 197116361CAE65ACB9526C14C557AC49 /* GoogleAppMeasurement.release.xcconfig */, + ); + name = "Support Files"; + path = "../Target Support Files/GoogleAppMeasurement"; + sourceTree = ""; + }; + 2D7352DA31F190A64B414327E4F9485F /* Pods */ = { + isa = PBXGroup; + children = ( + 400902532BA6C64D47E570AFC77EBE10 /* FirebaseAnalytics */, + 044FB21EB446C61135CD3E1A6A364525 /* FirebaseCore */, + DC37D0D612663DDC23BC3D6174EDCC9F /* FirebaseCoreExtension */, + 069CC94A2AF02440117C217830A9287D /* FirebaseCoreInternal */, + F9F8529C0BE3DD381A27C8374B34E340 /* FirebaseCrashlytics */, + 0F7FCEE0E715C499CEBCB3A143DC5E4D /* FirebaseInstallations */, + DA7A55CC8606ED3FA25E5DDB4A58AE15 /* FirebaseRemoteConfigInterop */, + D9E04C1033B0D62A16059D45A29F8D7E /* FirebaseSessions */, + B26D435B186D4D150CE8B1BC81E1E642 /* GoogleAdsOnDeviceConversion */, + 653E318231EB75853BF1A6EB6FBA3AE0 /* GoogleAppMeasurement */, + F408C6D4087EA4A11078962AA29890BB /* GoogleDataTransport */, + A2CA2A29FAE17A69651E1F477A1AA490 /* GoogleUtilities */, + 7D7C85B0FD233B35CF6EA0A81CE9644D /* IronSourceAdQualitySDK */, + 888A79ED50CBD2212A010A1FF0C0E196 /* IronSourceSDK */, + 6615443E07128A891361D29DEB73054C /* nanopb */, + 38218BA498E84844B34DD5600B1B5D0E /* PromisesObjC */, + CC67B1082C16CD474830A1665F6A7B33 /* PromisesSwift */, + ); + name = Pods; + sourceTree = ""; + }; + 381DB0A4B71140BC617D3732A275A95B /* Reachability */ = { + isa = PBXGroup; + children = ( + 99067CFED719586F74DAD834E958E08B /* GULReachabilityChecker.h */, + A11AEC0523CB4EA37262B5C3C7E50DC0 /* GULReachabilityChecker.m */, + 0B2F16B8F2FC5B1ADD4DA7E84C395EBF /* GULReachabilityChecker+Internal.h */, + EBBC7C64FA0F8C32203AC58709DC182B /* GULReachabilityMessageCode.h */, + ); + name = Reachability; + sourceTree = ""; + }; + 38218BA498E84844B34DD5600B1B5D0E /* PromisesObjC */ = { + isa = PBXGroup; + children = ( + B553EF71B83E67C6F54E7914C48BD838 /* FBLPromise.h */, + FB5A222454C158DFF4282699459141CA /* FBLPromise.m */, + 2D3BFB61D14A873B97B65B981C8A1E27 /* FBLPromise+All.h */, + B388B00DA719EF2544EA91FDDA94FB2E /* FBLPromise+All.m */, + EB12CA19814BFB60018835B0B656CA3D /* FBLPromise+Always.h */, + 69BBE354CEB2BB741A3AD48391272DF5 /* FBLPromise+Always.m */, + F9DF843F93CE66AD5D17284146E812CC /* FBLPromise+Any.h */, + 88F3652BCF8161395A5D3A8A147BD5FA /* FBLPromise+Any.m */, + 889BBA7CC7792F5213C9B5FEFD3AA322 /* FBLPromise+Async.h */, + 27A34803725F8490A9C6BD206E0206F0 /* FBLPromise+Async.m */, + 0512EB7FA415200AAB243C0ADFE21930 /* FBLPromise+Await.h */, + C17760A388DD7E59F4AF3ECFC9DE7A06 /* FBLPromise+Await.m */, + 3AB67A4904DEA3918B219175B34B54D1 /* FBLPromise+Catch.h */, + BD69F3E097F350F66676D92EA232D4EE /* FBLPromise+Catch.m */, + BA00CC7B756DA9535DFD704E1E535A2D /* FBLPromise+Delay.h */, + 168DAEDCFFFE16B056481C9974EA1EF1 /* FBLPromise+Delay.m */, + 2667A19A553EFAE25C536FD28C56B5E1 /* FBLPromise+Do.h */, + 1C715062998D5852EEF24EE8E49BB831 /* FBLPromise+Do.m */, + D2853472D88033B857940859F2869BAC /* FBLPromise+Race.h */, + DBEAE374FB2BBD2DC600894306116762 /* FBLPromise+Race.m */, + E797EC67D6E0ACAC462ABD3CBCD0A1E6 /* FBLPromise+Recover.h */, + CCD84BC000100B0CA5654CE3F1C3632B /* FBLPromise+Recover.m */, + 32489CC317F1FBF805DA321355833707 /* FBLPromise+Reduce.h */, + 4A3E90F23E0540C1E1A787A0100E6930 /* FBLPromise+Reduce.m */, + A15AF5BD51D7B01252F3A66B9E2FB319 /* FBLPromise+Retry.h */, + 0FE91634D96250807ECE1F66622CFAC2 /* FBLPromise+Retry.m */, + 0066C3DB56B36BFF30DB7B69F2804ED7 /* FBLPromise+Testing.h */, + 2E4BE348118E6A15F9012F41C1EEE40F /* FBLPromise+Testing.m */, + 4C459FCCE5F0DF8A0314184C5409BBF8 /* FBLPromise+Then.h */, + 32F3BA2F0DB35120F3D33522356ED250 /* FBLPromise+Then.m */, + 515E118D1F0F59CF24FADB24403C9AFF /* FBLPromise+Timeout.h */, + 1E5E160DA2A9DBD0F56F8046A8C6F028 /* FBLPromise+Timeout.m */, + BA65D1AF5D006E30A4704C88E3220AE6 /* FBLPromise+Validate.h */, + 70FBDF52C674C3971C4296F27117298A /* FBLPromise+Validate.m */, + A2A7063DD7E760FC088F71B3C13B072B /* FBLPromise+Wrap.h */, + 5DE5F407E457CDBC3EC989D5EC0267CB /* FBLPromise+Wrap.m */, + BCAF4541C5074ACD8C2905245AC70DF5 /* FBLPromiseError.h */, + 83F0DEBBE5DE2893FAD2E42DCF6FA866 /* FBLPromiseError.m */, + D1C485E07C4725266CBD932430A7F6FF /* FBLPromisePrivate.h */, + 11E35FF4C7C8650A90E54825818800B5 /* FBLPromises.h */, + 051370520B013C5D1C17A7ECF2D1B55A /* Resources */, + FA2BF906BA66F0EFAE2A93A940679FEF /* Support Files */, + ); + name = PromisesObjC; + path = PromisesObjC; + sourceTree = ""; + }; + 387C145A75364EFB63C6CA8111F404C1 /* Resources */ = { + isa = PBXGroup; + children = ( + D0BE4174B095C9D224D3C446BDF9263F /* PrivacyInfo.xcprivacy */, + ); + name = Resources; + sourceTree = ""; + }; + 3E4BE139870B62D2BCA607E552A2B705 /* Resources */ = { + isa = PBXGroup; + children = ( + 417AD7AF3A1ABD80AD36ABBB64A02D20 /* PrivacyInfo.xcprivacy */, + ); + name = Resources; + sourceTree = ""; + }; + 3FC7CDB3CE0A81BA1F234331B91BC2C4 /* Targets Support Files */ = { + isa = PBXGroup; + children = ( + F0D27934FBA048560D4906C397021C19 /* Pods-TastePick */, + ); + name = "Targets Support Files"; + sourceTree = ""; + }; + 400902532BA6C64D47E570AFC77EBE10 /* FirebaseAnalytics */ = { + isa = PBXGroup; + children = ( + A0C331B9F351966951957CC94B49BB51 /* Default */, + 7EDCD5AB61C8DE8FA22FAA82DBA1E70B /* Support Files */, + ); + name = FirebaseAnalytics; + path = FirebaseAnalytics; + sourceTree = ""; + }; + 41DB0E4265436D9AE75D27B5302965BC /* Core */ = { + isa = PBXGroup; + children = ( + 220E561DEBD756583AF1A3760621C50E /* Frameworks */, + ); + name = Core; + sourceTree = ""; + }; + 4A1E1CA21AEA5D3359F1FB16147BC644 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 79151FB773373872B30DBD699D878ACA /* IronSourceAdQualitySDK.xcframework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 4B78374D694969D9333D99D3FF83F35C /* Resources */ = { + isa = PBXGroup; + children = ( + 9E8F94C9DA5672FB0856CAC5A159B1E1 /* PrivacyInfo.xcprivacy */, + ); + name = Resources; + sourceTree = ""; + }; + 54B615D0CA07F1F0B5FEF225F68411EB /* Resources */ = { + isa = PBXGroup; + children = ( + CFD8B638DEDD95E455817CF5ACAF651E /* PrivacyInfo.xcprivacy */, + ); + name = Resources; + sourceTree = ""; + }; + 653E318231EB75853BF1A6EB6FBA3AE0 /* GoogleAppMeasurement */ = { + isa = PBXGroup; + children = ( + 41DB0E4265436D9AE75D27B5302965BC /* Core */, + 77F6AB7042FACD6958D95F60F52A466F /* IdentitySupport */, + 2C62DDC0F97AAD9D45192C87DC463B4A /* Support Files */, + ); + name = GoogleAppMeasurement; + path = GoogleAppMeasurement; + sourceTree = ""; + }; + 6615443E07128A891361D29DEB73054C /* nanopb */ = { + isa = PBXGroup; + children = ( + F125DFC32618A9F8EFBE762F2951FF73 /* pb.h */, + 42FB737570CE3DFC7CF25181D7DECD36 /* pb_common.c */, + A168D4D9F13E4405E8B88DF37E9798B4 /* pb_common.h */, + 49B9EA5BF9CBC4F459DC64049E1C5BC7 /* pb_decode.c */, + 055699715A5DA3DFD639B70780F4ACA5 /* pb_decode.h */, + 51864E8172B366BB542D866EE1F50EC6 /* pb_encode.c */, + C5FAE066E74E99A94391144BF5040B24 /* pb_encode.h */, + 208887086EA6EEB8AE8CBC68AA3AE167 /* decode */, + B349B6CA171936DE577CE93CE3F962D3 /* encode */, + 087AAA21836F4DD9008CC3067B19B796 /* Resources */, + 7157916E85EA0E337B0BB13DDCD64F40 /* Support Files */, + ); + name = nanopb; + path = nanopb; + sourceTree = ""; + }; + 6AE6F992A6BCA0ED90D4A4B23B8BDA93 /* Resources */ = { + isa = PBXGroup; + children = ( + 023C0146F2CA1C566C550E62B5481D96 /* PrivacyInfo.xcprivacy */, + ); + name = Resources; + sourceTree = ""; + }; + 7157916E85EA0E337B0BB13DDCD64F40 /* Support Files */ = { + isa = PBXGroup; + children = ( + 57719B363CDEFEBE2083CC146C9D265A /* nanopb.modulemap */, + 06B5066F4EFDF11927BD5974872CAA02 /* nanopb-dummy.m */, + 63E23B67F9D4DC249E1E10A949508119 /* nanopb-Info.plist */, + D0B5B130EF0B481732502A813048E953 /* nanopb-prefix.pch */, + 05CE57F2A3FD17DD25DB8EF61DC3306D /* nanopb-umbrella.h */, + E98FEA4C808524F7744772D67D3D1A50 /* nanopb.debug.xcconfig */, + 4E1394293C18E2CFDF5A3072F9E2A667 /* nanopb.release.xcconfig */, + 1C20C35ACB116D3A0CA67FFED6FE6035 /* ResourceBundle-nanopb_Privacy-nanopb-Info.plist */, + ); + name = "Support Files"; + path = "../Target Support Files/nanopb"; + sourceTree = ""; + }; + 7347A038DB6104A8AB58758D005F68BE /* Support Files */ = { + isa = PBXGroup; + children = ( + 798F562C47DA0B47E689EDC894A4C0A4 /* FirebaseCore.modulemap */, + F22C18A0CA273B8861C3083DECB42701 /* FirebaseCore-dummy.m */, + 2AAE67FCC2B77A6B7236BC1CB5E54F9A /* FirebaseCore-Info.plist */, + 4BEC5C7C53878CAC1940693EB61EE496 /* FirebaseCore-umbrella.h */, + EB7ED511E10B0912A631743816085954 /* FirebaseCore.debug.xcconfig */, + 92CD93B7791AA549AA821D32500C2271 /* FirebaseCore.release.xcconfig */, + F1A8CDF3B0998C42CFF10979FB44C768 /* ResourceBundle-FirebaseCore_Privacy-FirebaseCore-Info.plist */, + ); + name = "Support Files"; + path = "../Target Support Files/FirebaseCore"; + sourceTree = ""; + }; + 77F6AB7042FACD6958D95F60F52A466F /* IdentitySupport */ = { + isa = PBXGroup; + children = ( + 7FD6B28E771A43519EE11F1C7844B592 /* Frameworks */, + ); + name = IdentitySupport; + sourceTree = ""; + }; + 7D7C85B0FD233B35CF6EA0A81CE9644D /* IronSourceAdQualitySDK */ = { + isa = PBXGroup; + children = ( + 86F9B46500F65B7B1E05E6184DCF8A1B /* IronSourceAdQuality.h */, + 617ACE93F66B8FA1030C58ADF45E4536 /* IronSourceAdQuality.h */, + 16CBA1DBAA3AEF704450849D746C63D2 /* ISAdQualityAdType.h */, + CA90EAC6FA4D5FEC2C4746D17A04FA98 /* ISAdQualityAdType.h */, + 901A456DAB2612E1AC407171CA304EE0 /* ISAdQualityConfig.h */, + 93A76444F68A5E7237A6DBACA7F5DD90 /* ISAdQualityConfig.h */, + 64E7663603F5D0190EA8E49F05B42F7E /* ISAdQualityCustomMediationRevenue.h */, + 0177C215A932EBA5B41D62132D0A85E1 /* ISAdQualityCustomMediationRevenue.h */, + 065FBC1ACC54DED4C4527824E8CEE40E /* ISAdQualityMediationNetwork.h */, + F8C2FD665ADA64BA8B568069E295F869 /* ISAdQualityMediationNetwork.h */, + A35D99B5BD952647B3F6DCB42B0A2F8E /* ISAdQualitySegment.h */, + 65CA2C3429DDA663555FB02A1B75E201 /* ISAdQualitySegment.h */, + 4A1E1CA21AEA5D3359F1FB16147BC644 /* Frameworks */, + 10F9DB55DC3702791ABBD5CB283994EA /* Resources */, + DEDC774AF9089CBFD5E3B5ACDA21F1C3 /* Support Files */, + ); + name = IronSourceAdQualitySDK; + path = IronSourceAdQualitySDK; + sourceTree = ""; + }; + 7EDCD5AB61C8DE8FA22FAA82DBA1E70B /* Support Files */ = { + isa = PBXGroup; + children = ( + D995D2A797A2F00D3637AA16E9F58735 /* FirebaseAnalytics-xcframeworks.sh */, + ED50E394510B175D86CC0C75359E664D /* FirebaseAnalytics.debug.xcconfig */, + 52D5DE1F2A8D1741B87270EDD460C90F /* FirebaseAnalytics.release.xcconfig */, + ); + name = "Support Files"; + path = "../Target Support Files/FirebaseAnalytics"; + sourceTree = ""; + }; + 7F634F2CEA9E2B234BDDB0909E1932D0 /* UserDefaults */ = { + isa = PBXGroup; + children = ( + CBB174ABF14EFF529BB3102F45D26E01 /* GULUserDefaults.h */, + 6DE47118218FE9DD48B787D2008307CD /* GULUserDefaults.m */, + ); + name = UserDefaults; + sourceTree = ""; + }; + 7FA9D03CAEE6F75A8EE34691A2E6AF41 /* Support Files */ = { + isa = PBXGroup; + children = ( + C8570F186E094E00F5E49B6E68D16235 /* FirebaseCoreInternal.modulemap */, + CFDBC5FF7914DC22737656251A2736F5 /* FirebaseCoreInternal-dummy.m */, + F601E0B0203B8534E89765E98F93CC3C /* FirebaseCoreInternal-Info.plist */, + 61F9D482780BEC32124EC2E2BB6C54CF /* FirebaseCoreInternal-prefix.pch */, + 0CCCBC935F6C183B53EC9384AFB79535 /* FirebaseCoreInternal-umbrella.h */, + BBF832B158FF262578C25354471128D5 /* FirebaseCoreInternal.debug.xcconfig */, + 3E183627684F28D7E2F87BE57638D081 /* FirebaseCoreInternal.release.xcconfig */, + A74D0B4C2DCEDD2395612EF72C9DD8BD /* ResourceBundle-FirebaseCoreInternal_Privacy-FirebaseCoreInternal-Info.plist */, + ); + name = "Support Files"; + path = "../Target Support Files/FirebaseCoreInternal"; + sourceTree = ""; + }; + 7FD6B28E771A43519EE11F1C7844B592 /* Frameworks */ = { + isa = PBXGroup; + children = ( + AFC3B1DB52D11E0A0DAAA89A04A78C44 /* GoogleAppMeasurementIdentitySupport.xcframework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 86A00AB26F87E1960110040CE33872E8 /* Frameworks */ = { + isa = PBXGroup; + children = ( + A5635638C0BBBDF646C9AB83D02300BB /* IronSource.xcframework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 888A79ED50CBD2212A010A1FF0C0E196 /* IronSourceSDK */ = { + isa = PBXGroup; + children = ( + C29C06E71039F775EA6AB14B262C3740 /* Ads */, + 040D30B5E344DD5C725C40747AD9C6D2 /* Resources */, + 250C8E7A8055C8BCED59BFD411A0AF2A /* Support Files */, + ); + name = IronSourceSDK; + path = IronSourceSDK; + sourceTree = ""; + }; + 8FC4193FE58E2DFABC5702EE53C7CE07 /* Support Files */ = { + isa = PBXGroup; + children = ( + DBBF564D32F8A012EAEB876231B52DEA /* FirebaseCrashlytics.modulemap */, + 3F10AD0456E498087BA6D047684341AB /* FirebaseCrashlytics-dummy.m */, + C89683528F1E4AA5FA1EDD4A8F3C9354 /* FirebaseCrashlytics-Info.plist */, + D12A23C9479F3872EC684FFEB7A8A9E1 /* FirebaseCrashlytics-umbrella.h */, + C309DB544F609F3EC9050218B396B41B /* FirebaseCrashlytics.debug.xcconfig */, + 4353BC9AA91F31FEF0A5F70D8CF69875 /* FirebaseCrashlytics.release.xcconfig */, + 5854BE56E064339C5DDDC1EFFE5B5BB6 /* ResourceBundle-FirebaseCrashlytics_Privacy-FirebaseCrashlytics-Info.plist */, + ); + name = "Support Files"; + path = "../Target Support Files/FirebaseCrashlytics"; + sourceTree = ""; + }; + A0C331B9F351966951957CC94B49BB51 /* Default */ = { + isa = PBXGroup; + children = ( + F6169B24BFE05BD21D6226A16B7A69BB /* Frameworks */, + ); + name = Default; + sourceTree = ""; + }; + A2CA2A29FAE17A69651E1F477A1AA490 /* GoogleUtilities */ = { + isa = PBXGroup; + children = ( + F98BC1E6108C5DBAAB8C8CA53A52F4DB /* AppDelegateSwizzler */, + 0DA760F7CF1400C211D401B62D23A2D6 /* Environment */, + 0530E85F6AD881F845E3478866B40BBB /* Logger */, + 0C688AAC43A10084722F109A729FED20 /* MethodSwizzler */, + A97B9E3FF093B738A25422FA8B1A6DD9 /* Network */, + 06DF5649B2F4F44A529847B6FB439B4D /* NSData+zlib */, + DCCD105B717F51B6A64101C343674949 /* Privacy */, + 381DB0A4B71140BC617D3732A275A95B /* Reachability */, + E1E61C42060D89C63877606622E187BA /* Support Files */, + 7F634F2CEA9E2B234BDDB0909E1932D0 /* UserDefaults */, + ); + name = GoogleUtilities; + path = GoogleUtilities; + sourceTree = ""; + }; + A85E0A8AFB5DCE3EA7936761EB6B4D8E /* Support Files */ = { + isa = PBXGroup; + children = ( + FE2263D06B0F45669E7941E36275A164 /* PromisesSwift.modulemap */, + E40E4E1B01CC4243E22B6EF5D4639C4C /* PromisesSwift-dummy.m */, + 6C54F1E417AC67735075D965F9F416E1 /* PromisesSwift-Info.plist */, + 7D8DCC63E0E16A5128E9FE8F96B419EE /* PromisesSwift-prefix.pch */, + 402886C04939EE92BEDD4A62AAB68BE7 /* PromisesSwift-umbrella.h */, + 265303350DEFB1E52CEA4D56AACF5557 /* PromisesSwift.debug.xcconfig */, + B19877D75F441EA46145FC561954B989 /* PromisesSwift.release.xcconfig */, + F194DE6B4B2B513333F3125A7BCAB636 /* ResourceBundle-Promises_Privacy-PromisesSwift-Info.plist */, + ); + name = "Support Files"; + path = "../Target Support Files/PromisesSwift"; + sourceTree = ""; + }; + A97B9E3FF093B738A25422FA8B1A6DD9 /* Network */ = { + isa = PBXGroup; + children = ( + 626F5919EC4E5EA22A0ED424E151A745 /* GULMutableDictionary.h */, + 87547C181401BFF63982F4F8DDB601A6 /* GULMutableDictionary.m */, + 1C8E613B2FC4E42035291657D27705BE /* GULNetwork.h */, + 404E582F8FD063231A685E88402BD0E0 /* GULNetwork.m */, + AAE4E23513CFA47883CD490EB8B09BBC /* GULNetworkConstants.h */, + 5CF8157DAFAAF8F34E35FE42C7A4F50C /* GULNetworkConstants.m */, + B7D2463CFCEAF0027801B3431CDA76F0 /* GULNetworkInternal.h */, + 84ECD3166786E3B251EB4673A8B36282 /* GULNetworkLoggerProtocol.h */, + 4E5A6981A575BBBFA0E4883EA764E8EC /* GULNetworkMessageCode.h */, + FF5C90394FFA709E28101D1185CB62A7 /* GULNetworkURLSession.h */, + DA1607C2079B334D339DE217E8D52992 /* GULNetworkURLSession.m */, + ); + name = Network; + sourceTree = ""; + }; + B26D435B186D4D150CE8B1BC81E1E642 /* GoogleAdsOnDeviceConversion */ = { + isa = PBXGroup; + children = ( + F18E7D4C6A4C60A9AF5273DCE0B2BD4F /* Frameworks */, + B2F60C6A32989B4D39CFC33486B4F1AE /* Support Files */, + ); + name = GoogleAdsOnDeviceConversion; + path = GoogleAdsOnDeviceConversion; + sourceTree = ""; + }; + B2F60C6A32989B4D39CFC33486B4F1AE /* Support Files */ = { + isa = PBXGroup; + children = ( + 00800A06EB6FD9B53DF581224C977BD4 /* GoogleAdsOnDeviceConversion-xcframeworks.sh */, + 142890E49EB8F36DE49A468137C44DDD /* GoogleAdsOnDeviceConversion.debug.xcconfig */, + 88C3C2AB35E6D0E9E7E2BAA6F77A1472 /* GoogleAdsOnDeviceConversion.release.xcconfig */, + ); + name = "Support Files"; + path = "../Target Support Files/GoogleAdsOnDeviceConversion"; + sourceTree = ""; + }; + B349B6CA171936DE577CE93CE3F962D3 /* encode */ = { + isa = PBXGroup; + children = ( + ); + name = encode; + sourceTree = ""; + }; + B7BF4FC2CA35907F3457B07C2F20034E /* Support Files */ = { + isa = PBXGroup; + children = ( + 561E20D5F8638D118A0C9F79A9C30BFD /* FirebaseRemoteConfigInterop.modulemap */, + 0C3B2FBA5A25BA631AE76607BCEC0FF8 /* FirebaseRemoteConfigInterop-dummy.m */, + 51161A3571E1AD2CF433C165BD74315D /* FirebaseRemoteConfigInterop-Info.plist */, + 62762D87583BCC32FEFB6F9972282910 /* FirebaseRemoteConfigInterop-umbrella.h */, + 2C64F6C4B8FEB07E9A6D018E9936B5BD /* FirebaseRemoteConfigInterop.debug.xcconfig */, + 6749A4C1F2DECB3AF85B79A3312D52BB /* FirebaseRemoteConfigInterop.release.xcconfig */, + ); + name = "Support Files"; + path = "../Target Support Files/FirebaseRemoteConfigInterop"; + sourceTree = ""; + }; + B94D7768568A9992200DB461E8CF687F /* Frameworks */ = { + isa = PBXGroup; + children = ( + D4C766B4E2421A5A213D0DC5507C0EB6 /* iOS */, + ); + name = Frameworks; + sourceTree = ""; + }; + C29C06E71039F775EA6AB14B262C3740 /* Ads */ = { + isa = PBXGroup; + children = ( + 65726C9516CC9C543ECABF2CDF025C93 /* IronSource.h */, + DCC3B43DD95A086CB58F71CB67599676 /* IronSource.h */, + CDB2D3ADFF3C77CC8CFBD53089663335 /* IronSourceAds.h */, + 85BAD4FEE1FEACBF268C4398A0BB43B3 /* IronSourceAds.h */, + C1EC3F06127CD5746DD3B3FF57B012A7 /* IronSourceNetworkSwiftBridge.h */, + D3812CB68CC86AF590AEF887F442781C /* IronSourceNetworkSwiftBridge.h */, + 6BA4D2C15705196CA3438238C0424374 /* ISAAdFormat.h */, + F503D63C28FC1EEFDA1891C3FB87035E /* ISAAdFormat.h */, + 3CBB41DE6E4A3C2D4DB7CEC6C56E333F /* ISAAdSize.h */, + 780C95611F350E9839C019EC1F45D64B /* ISAAdSize.h */, + FF49F83D45758D2C06244EA2B224D30E /* ISABannerAdInfo.h */, + D34D484D97DFFD1D1D9862DCEF4318EF /* ISABannerAdInfo.h */, + 6E254AD732AA56E2233033B0F596DE44 /* ISABannerAdLoader.h */, + CEEA309601CB00DE0F4887906ECAE411 /* ISABannerAdLoader.h */, + 5A5E4CCB8F1B211F932AB6ABE9F6FC83 /* ISABannerAdLoaderDelegate.h */, + FA6D70D8547D00E793A64C1BC9AD2B71 /* ISABannerAdLoaderDelegate.h */, + 8FD5BE8A0683B732C3AC8790F1E2279D /* ISABannerAdRequest.h */, + CBE127715D8F178BF59971B25037588E /* ISABannerAdRequest.h */, + 116D56DBB173D6A02AA0C886B9F2B827 /* ISABannerAdRequestBuilder.h */, + 25F102FED69D1D269849E007B4D9F68E /* ISABannerAdRequestBuilder.h */, + 5E95A02FFCE48CD8F72CC9B4E7C30470 /* ISABannerAdView.h */, + 052520EECF51C1651FBAA6D4FEC30309 /* ISABannerAdView.h */, + CDA957384322C69DA57C674CE734E4E8 /* ISABannerAdViewDelegate.h */, + F533149F3437731CB186C5927FE26F19 /* ISABannerAdViewDelegate.h */, + C956E3FC143A0634D6BE7EC249F3FEF0 /* ISAdapterAdaptiveProtocol.h */, + 370DBA7034E52103E80C57EC5A6CE880 /* ISAdapterAdaptiveProtocol.h */, + B59C54B12F3A241635BBE00204AF44E8 /* ISAdapterAdDelegate.h */, + 684FCD89E8BA4550A0A6F1653CEB9245 /* ISAdapterAdDelegate.h */, + 02BFF2A39FF4CF48F68BA0268F057AEB /* ISAdapterAdFullscreenProtocol.h */, + BA6FBD47E2963CABD280B81DB22360F8 /* ISAdapterAdFullscreenProtocol.h */, + CBA7406D31A3E8A993C367E8929BC6BE /* ISAdapterAdInteractionDelegate.h */, + 564837C27D8B07B449946E93DAE05505 /* ISAdapterAdInteractionDelegate.h */, + DAB1258CE44EB1649A4C007431FDF3F2 /* ISAdapterAdRewardedDelegate.h */, + 33502EBB0395C1D1D2DD36EF0B27B1A4 /* ISAdapterAdRewardedDelegate.h */, + B18E90AC908B19200928A5CAB4E25EF2 /* ISAdapterAdViewDelegate.h */, + 2FFD8037315718314E2641EA5027512F /* ISAdapterAdViewDelegate.h */, + 261513B7300CC9683FDC6E197EFB59FE /* ISAdapterBannerProtocol.h */, + 357F73D9C74F084B234F11244058351F /* ISAdapterBannerProtocol.h */, + 6108FF09AFEBC89E23350E0AB0EC0442 /* ISAdapterBaseProtocol.h */, + 88092C8778FA79CF13885A52979196FB /* ISAdapterBaseProtocol.h */, + 968E38844B23C97F29587487B97A53DC /* ISAdapterConfig.h */, + 616FE9D1DE2A47CAA4135257B698B7FA /* ISAdapterConfig.h */, + 0421F34945387E49E17344CC8E327433 /* ISAdapterConsentProtocol.h */, + 453C58087E42DCEE7C64008C6269927E /* ISAdapterConsentProtocol.h */, + 3F31A2F0A43504AAABD2A50BA2F955B8 /* ISAdapterDebugProtocol.h */, + 022DF419536E5D2A4D01CFDA9325FFC2 /* ISAdapterDebugProtocol.h */, + 3D95656E223DD06A79CA577665D93B9D /* ISAdapterErrors.h */, + A38C9B57A39A6D6B791F8EFEB7DA5669 /* ISAdapterErrors.h */, + CE30E6006CDA5CD7AB42685F5330B642 /* ISAdapterErrorType.h */, + 740DF2224353145EB5C2BC97D089377C /* ISAdapterErrorType.h */, + C13CD00C8F1FA7F57D74D66F2564105D /* ISAdapterMetaDataProtocol.h */, + 4F4FC2F5CD235F506EBE68B517162E5F /* ISAdapterMetaDataProtocol.h */, + 82A4A50C7EA6B6072B7BA12DC9E8EB47 /* ISAdapterNativeAdData.h */, + D052E1DD96AE730D8F3FFAE40A8BC0C3 /* ISAdapterNativeAdData.h */, + 9F644AD6B6A720E1346552D61EF0AD70 /* ISAdapterNativeAdProtocol.h */, + A5CBBD74105B8D307714D0466F6A1D7D /* ISAdapterNativeAdProtocol.h */, + F00A9AE5F1DE080B359CCB93AB03F214 /* ISAdapterNativeAdViewBinder.h */, + A1DFF164E0D7FB58E6CB7B00A1D486A7 /* ISAdapterNativeAdViewBinder.h */, + 0234AC42621394D3FA2051F577E15D15 /* ISAdapterNativeAdViewBinderProtocol.h */, + 41676492598EFDE552A3AE32E4C034C2 /* ISAdapterNativeAdViewBinderProtocol.h */, + 18864872DA5BE81A02648F68AB92EA3B /* ISAdapterNetworkData.h */, + 568E5E09718BB4CB7242B53D62516E69 /* ISAdapterNetworkData.h */, + 92628FE4D416ED06ABE5E9B01288452D /* ISAdapterNetworkDataProtocol.h */, + 8BF9D7E0F91A35C8E3D8D4B080CB2DAF /* ISAdapterNetworkDataProtocol.h */, + 08E1BDF8B6EAFE5058EC6462AFC098C5 /* ISAdData.h */, + 27D7A2D305B306421389DFF86CE86C98 /* ISAdData.h */, + E7D995F00390E63EC01B340C38316922 /* ISAdInfo.h */, + 87FB573ED4C920CAA2168B53BEA21C6E /* ISAdInfo.h */, + 80A49CF3B148607199B055DD15A525A8 /* ISAdOptionsPosition.h */, + 18D90DAC7117F0FAA9F2BE0BE29EA40B /* ISAdOptionsPosition.h */, + D69FBDB2F6E8A4A1756B8363A19287A4 /* ISAdUnitAdapterProtocol.h */, + F3238C4CE173BA1F14179E5E21CD39A0 /* ISAdUnitAdapterProtocol.h */, + E1C8682F1D0FD190CC6BFDD65A952A8E /* ISAInitRequest.h */, + 99A7830E0392501B4768FE316DFDAB40 /* ISAInitRequest.h */, + 080A8F1D6B86F529419ACFE8A4686284 /* ISAInitRequestBuilder.h */, + AE2445804A048D10716759FA2216F2C0 /* ISAInitRequestBuilder.h */, + F50FB8DB62656BC873280B51189DE69E /* ISAInterstitialAd.h */, + E9A46E157DA0F94A4C4225E9A7FDCA04 /* ISAInterstitialAd.h */, + 06E3FC2328F0EC9A7185DBE42FEE661D /* ISAInterstitialAdDelegate.h */, + 96E03229B2FAAB792E2255559129942C /* ISAInterstitialAdDelegate.h */, + 3A91C934BAEC312F67127315E8B807D8 /* ISAInterstitialAdInfo.h */, + EF764A00716BA22F5FDA2EE36A243947 /* ISAInterstitialAdInfo.h */, + D999936CB5DBEFFACAEB8F4C91F14038 /* ISAInterstitialAdLoader.h */, + 765604E2111ABE566CAE69768847EAB8 /* ISAInterstitialAdLoader.h */, + 2BBB8DFD683B5B6C4F28B48F19F7C1E1 /* ISAInterstitialAdLoaderDelegate.h */, + B21D0FDBB3441A34955CC39DE5E38E13 /* ISAInterstitialAdLoaderDelegate.h */, + A8ECE32C49C8E3253E919C28428C9B20 /* ISAInterstitialAdRequest.h */, + 129C4B35961C8DF66361828972FAF22A /* ISAInterstitialAdRequest.h */, + 5EE7B9C176F062188973EE2872E7198C /* ISAInterstitialAdRequestBuilder.h */, + 6539A9F9D46CC31AC70EDA246A6C1147 /* ISAInterstitialAdRequestBuilder.h */, + 1024EEC68266A80A50CA12A0FFA93CBD /* ISAppStoreErrorDelegate.h */, + B734BCC41556BC500B23A5B1976E588F /* ISAppStoreErrorDelegate.h */, + 0CD8072432B2F4BED7A8D604D0083504 /* ISARewardedAd.h */, + 2F74B4E5D770A752C21BB6967568A3AF /* ISARewardedAd.h */, + 6A432EE11DA9A5233EA7E827EE18CE91 /* ISARewardedAdDelegate.h */, + 351A6091DC2E46903B363CD58DEDB54C /* ISARewardedAdDelegate.h */, + 05D0BBB93A9164AF0B3981F9274D3CA9 /* ISARewardedAdInfo.h */, + 254372CEB1BA1F5EF6EA42678BCB0ED3 /* ISARewardedAdInfo.h */, + 8CC9F0AEC4BDB9261B03A05DA163E688 /* ISARewardedAdLoader.h */, + 53080976EEC1F9A13D6491BED7A22D58 /* ISARewardedAdLoader.h */, + DE3CE49D85D8CCF20D414460830FEE7A /* ISARewardedAdLoaderDelegate.h */, + 3B8A18906655083C6E6009ECAE485D58 /* ISARewardedAdLoaderDelegate.h */, + 57821EE1A6C56AE10782479C1E3F30D2 /* ISARewardedAdRequest.h */, + 3D8A77D85454CB49401809664EF31849 /* ISARewardedAdRequest.h */, + 2256396D0A0B6791FDBF8F17D8AB3C08 /* ISARewardedAdRequestBuilder.h */, + 79F6B356FF2D607008AD74FD27FE419B /* ISARewardedAdRequestBuilder.h */, + 124E4A4D74A46B3B6F8D6FC1DE580A11 /* ISBannerAdapterDelegate.h */, + DC09638ED9F7EE085BD698A9C2748103 /* ISBannerAdapterDelegate.h */, + CCF916D47AC91AA089E294328685130C /* ISBannerAdapterProtocol.h */, + 487FB63FFB9821CEE76EDDC66E533D28 /* ISBannerAdapterProtocol.h */, + 0CC79ADC8590141A9D21787675E2E63F /* ISBannerAdDelegate.h */, + B9D552C2F2775868502A67B3ABAC477C /* ISBannerAdDelegate.h */, + 7A6041B634788DB96C3D5FF9D303DDC9 /* ISBannerSize.h */, + D5BFE9CFA06F03C8C5142A84B9D005BD /* ISBannerSize.h */, + DBA8A1C0B6E537722830F6645F6F057A /* ISBaseAdAdapter.h */, + 13379C781586050E65FBB300DA112FA7 /* ISBaseAdAdapter.h */, + 92344B6513717814C137F88DE7D88A62 /* ISBaseAdapter.h */, + 3CC4B3529FCD44548F7E2A50B3AED707 /* ISBaseAdapter.h */, + E9156803190C11FF8782E65BB534A47D /* ISBaseAdapter+Internal.h */, + 9172C03B641A8030C566A6704E14EE6F /* ISBaseAdapter+Internal.h */, + 94D834E2269BF89223DBC7F642A09AE4 /* ISBaseAdInteractionAdapter.h */, + 2CFB75EBE8AF8A68A95C33463466B708 /* ISBaseAdInteractionAdapter.h */, + DBD2108D96F13E939D896CAB1F211086 /* ISBaseAdUnitAdapter.h */, + 1C8763A191CD6E08D45D20340159C9EB /* ISBaseAdUnitAdapter.h */, + 77BAA74E5C55F0DAF3E9673B8B4348C9 /* ISBaseBanner.h */, + B91A0C0BCF2E431684BDAE758D7B40E0 /* ISBaseBanner.h */, + C5D1CF1FE0538FDABC4F173896B26ADA /* ISBaseBannerAdapter.h */, + 10ECA953DB3E716502A5DDC3BCA52F3E /* ISBaseBannerAdapter.h */, + 94A357B79517847580403D7F0E5174B0 /* ISBaseInterstitial.h */, + B16ED7EEE0B074135F2AE87E7F9C2DC4 /* ISBaseInterstitial.h */, + DF72205ECA9D9FABB64FB14168AE93E8 /* ISBaseInterstitialAdapter.h */, + 272EDD333F2C9C1FA3E0E2B1E395CA78 /* ISBaseInterstitialAdapter.h */, + 647765B7BD512ED2B40B53C3C093B64F /* ISBaseNativeAd.h */, + 58337BFD677DD26E6D5E319263AAD22A /* ISBaseNativeAd.h */, + ED2D07B9F2849B4BED4249A363B843ED /* ISBaseNativeAdAdapter.h */, + 5FB478C108C790F1E8E7C4EFF64EDAE7 /* ISBaseNativeAdAdapter.h */, + 84FF7E5F437D2B7E88183003E3A6C178 /* ISBaseNetworkAdapter.h */, + A2A7B9A7FA2A0DF8665BA841ABF788A2 /* ISBaseNetworkAdapter.h */, + F57C8BA36A7C24A2611DA09642153D19 /* ISBaseRewardedVideo.h */, + 0F04E23F87840C519D069AD94974B407 /* ISBaseRewardedVideo.h */, + 86F3A8E4B8F9344894158C5F5A3D3D04 /* ISBaseRewardedVideoAdapter.h */, + DF3158D3D5EAB700729ACD026F3057F8 /* ISBaseRewardedVideoAdapter.h */, + 7EC8A4FDDFCBBF77F5E6444388C01A38 /* ISBiddingDataDelegate.h */, + 36370E10C2901987B9E7ED1691F72A42 /* ISBiddingDataDelegate.h */, + D423B3B5F7AFB317B15D0FF7B5BC21B6 /* ISBiddingDataProtocol.h */, + C078153D138EAC2449729B043CE7FE7D /* ISBiddingDataProtocol.h */, + 0D606C6FB706D29E45E6A321DE83E10C /* ISConcurrentMutableArray.h */, + 607C000C9834FAA4793FD988672602AE /* ISConcurrentMutableArray.h */, + 62D61BFFD9EF25F636F9EB01DFB06FCE /* ISConcurrentMutableDictionary.h */, + 64CA801972BFE45B5D3152199C278C34 /* ISConcurrentMutableDictionary.h */, + 8DC41149D0050E028D28EFE2A1D42CE9 /* ISConcurrentMutableSet.h */, + 7DAF8A52BB7568429BA3F8C182BC7232 /* ISConcurrentMutableSet.h */, + 207CB937631F3C27B2979F3A8D5F2637 /* ISConfigurations.h */, + C9BE96E17F5B69CF3C20FB263E421F65 /* ISConfigurations.h */, + 13F0A082BBB3988A8530ACF6C3D6D45A /* ISDataKeys.h */, + 01BE6518C2AD1460E0506FBAB69A3241 /* ISDataKeys.h */, + E948A858602FAD098C5C3D98C7B7C80A /* ISDemandOnlyBannerDelegate.h */, + E86149627A213EB95D15638DCFB13155 /* ISDemandOnlyBannerDelegate.h */, + 7DADCF34E477641C9E6F47942A5F211A /* ISDemandOnlyBannerView.h */, + 4C824A6865EAFD8A3D7EA439CF5D4F84 /* ISDemandOnlyBannerView.h */, + 2ED0E73562BB974FCC7C5F3510134686 /* ISDemandOnlyInterstitialDelegate.h */, + C843AC66CCC0B6523391AD34C888DB81 /* ISDemandOnlyInterstitialDelegate.h */, + 5FA09508B0C5C707B32E6E6342F4595F /* ISDemandOnlyRewardedVideoDelegate.h */, + 3938ED45F1467366B3FA597B3F178900 /* ISDemandOnlyRewardedVideoDelegate.h */, + 1958DE73828BDFA7A975378E216171AE /* ISError.h */, + 6FA5E72A6A534C74AB25E6353E27A299 /* ISError.h */, + 916CC42B928D4C76034EB015065255E6 /* ISInterstitialAdapterDelegate.h */, + AC194B9B90BCCBDB031A0D4089F4B064 /* ISInterstitialAdapterDelegate.h */, + 748429F418DBBA8D955BD971DFF1ADAD /* ISInterstitialAdapterProtocol.h */, + 49855E912FB731CEB8B03D4DDBDB8841 /* ISInterstitialAdapterProtocol.h */, + 12F32E83FAF22F6ED4F55E92708CFD15 /* ISIronSourceAdapter.h */, + 47716F8006C67DDB72C6F7EBF750F8F4 /* ISIronSourceAdapter.h */, + 3CB4451DCD86D42BA70DBDF67A7F10D4 /* ISLoadWhileShowSupportState.h */, + 2EADCBC90D011F5463776B50E0C8335D /* ISLoadWhileShowSupportState.h */, + C77EF9E41D58E3415726A8A3A8EDAC04 /* ISLog.h */, + 4658139A2C368DC99EAC558629B8C9DD /* ISLog.h */, + EBB4A43873B06A69D498EBF26083AAB5 /* ISLoggerManager.h */, + C6FB39B37366B1C2880DCFED242B6EEF /* ISLoggerManager.h */, + 65A3DC7E3CF8C652EA16ACBA12E5B578 /* ISMediationGlobalDataWriterFacade.h */, + 3CB25E55E21EC087E604202C5DAE567D /* ISMediationGlobalDataWriterFacade.h */, + 432F4CB22E95568406C879D494702FCE /* ISMetaData.h */, + 69202D147DBF6F3A28227F730DEC1482 /* ISMetaData.h */, + 2C6420DBFA78FE8E465FB2FE373896E5 /* ISMetaDataConstants.h */, + 63B31B728F9FB1F9DC0C62F8F6B24C7E /* ISMetaDataConstants.h */, + 6935C3A678069F263360FDF0A3D88776 /* ISMetaDataUtils.h */, + 7FEEB0D1A0BD20DB97E8A30DB4E5DE85 /* ISMetaDataUtils.h */, + B6F819A71F0F8D189B1548146901DFD0 /* ISNAdViewsManagerSwiftFacade.h */, + F124344AE96893E0594C26B3948D11D0 /* ISNAdViewsManagerSwiftFacade.h */, + CF9938E658BAA3135B786FA005760DB6 /* ISNAppStoreVCRootViewDelegate.h */, + 6CF7C2897A3776BA972C140A9DEE6DB8 /* ISNAppStoreVCRootViewDelegate.h */, + ECEC8BD430609775580BBCE5DB5FCA82 /* ISNativeAdAdapterDelegate.h */, + 9C576F5978069C1CD4794E7AE2223FAF /* ISNativeAdAdapterDelegate.h */, + 5A8E4348AFB7C692C5BF589183AF6DD0 /* ISNativeAdAdapterProtocol.h */, + 5C07E83DBD3F3C1232005521D4188C03 /* ISNativeAdAdapterProtocol.h */, + 87087B8F1DB87F298CB188456C5D94E9 /* ISNativeAdDataImage.h */, + C660DF3FCF93A7D8FA65DE45C3FC7051 /* ISNativeAdDataImage.h */, + 2FE31925E3FB2582F1EEDD28B06BDA1C /* ISNativeAdDataProtocol.h */, + 47501895B5CBD9CE9F44D79EE948C9BA /* ISNativeAdDataProtocol.h */, + 3C5C331533FF8D5E3FFF134859FABE1C /* ISNativeAdDelegate.h */, + 4E8659A517690143F31B05CB9335DD83 /* ISNativeAdDelegate.h */, + 4C24D264760CA17033685161F6DC207D /* ISNativeAdInteractionDelegate.h */, + 0F14347526A0216442848950B9ACCE19 /* ISNativeAdInteractionDelegate.h */, + 4AFF614C103C40256E50FAD2D33AD893 /* ISNativeAdLoadDelegate.h */, + 8102DDB913C3C212560EE5CAAAA7A87F /* ISNativeAdLoadDelegate.h */, + 0EE8FD6E5D338AA401912585E96760EF /* ISNativeAdProperties.h */, + A813AE00639CE175E01B23568C922EFA /* ISNativeAdProperties.h */, + 469FB7F1902EBDB01D9AFC76CA5AFFEA /* ISNativeAdProtocol.h */, + F8FEAFB5D122AADE93CC623B210F09CB /* ISNativeAdProtocol.h */, + 7DA2E93913312C6089D29243E7364376 /* ISNativeAdView.h */, + 7D9C08BB6EFFDE773DC361593DC7495F /* ISNativeAdView.h */, + 1F622514FF218CDC29E7F9451401B2A3 /* ISNativeAdViewBinderProtocol.h */, + 7CD9AA954E5BD38685BBB4D6D3DAFA2A /* ISNativeAdViewBinderProtocol.h */, + AED4256906BC72F68D203E4E14478F58 /* ISNativeAdViewHolder.h */, + CC6B9640FCA569A320811A83A6CDD770 /* ISNativeAdViewHolder.h */, + 20A90CD99CAEAB8AA0B618803C43361C /* ISNControllerManagerSwiftFacade.h */, + F958D4826D8EA515C4462BFED0FED895 /* ISNControllerManagerSwiftFacade.h */, + EB728AF62221D7D4A0C428EADA2EDC6A /* ISNControllerMessageListener.h */, + 3D0E393DCD0512A23E694CD935872093 /* ISNControllerMessageListener.h */, + E51EF5D5622B0C07934CD388A395A7B9 /* ISNetworkInitCallbackProtocol.h */, + 55AA7890286F39C592241ADFBA093A56 /* ISNetworkInitCallbackProtocol.h */, + C679CE6DF7C0B58791D3F961513031A2 /* ISNetworkInitializationDelegate.h */, + E398776A1232FFAB57A8462E6DEC0E32 /* ISNetworkInitializationDelegate.h */, + 3B3D7B7CA466BD22A4230BEB5E680643 /* ISNEvent.h */, + 0535539685F361B16EA0CDB6BB4FD2AA /* ISNEvent.h */, + 1DBBFF835BF2265C902672A1EF99D52D /* ISNEventTrackerInterface.h */, + E5F512813D1324A2778661F22AC34DE7 /* ISNEventTrackerInterface.h */, + 572BE6A604DA19F19734B0FD32EC784E /* ISNEventTrackerWrapper.h */, + D4B278C8E9AF40DF1029521DF6AF2600 /* ISNEventTrackerWrapper.h */, + 5C6A689BFDDB937948874F7CD01C2618 /* ISNSupersonicAdsPublisherSwiftFacade.h */, + E0D9EE7522917313EA7E35A89984F0D2 /* ISNSupersonicAdsPublisherSwiftFacade.h */, + A1D4165830B490CF0F383E9EDDDCCA0B /* ISRewardedVideoAdapterDelegate.h */, + 8D06CE494F74C6DF16EC6E3A146A412E /* ISRewardedVideoAdapterDelegate.h */, + A381EB858DC35D4FF5B2A13B56465CC1 /* ISRewardedVideoAdapterProtocol.h */, + B4C9F429D6E40FC1BCFA34117532C4AD /* ISRewardedVideoAdapterProtocol.h */, + 75F7B6ACDDA3C90CDC50423C5B8BB512 /* ISSetAPSDataProtocol.h */, + D7E509F62306CFD371936FC95FD59C71 /* ISSetAPSDataProtocol.h */, + 3BD1A4A6145E74116D4527695B3A5431 /* ISSupersonicAdsConfiguration.h */, + 2F9EB19D0EBA6513681DF5691004A9E1 /* ISSupersonicAdsConfiguration.h */, + 75336B1CE3D1511D5E74D941916F139D /* LevelPlay.h */, + 7889DBBE3161B40749D0EF6EF19B209F /* LevelPlay.h */, + C675EA4E6FEC2A1D378D740CD7E1AED8 /* LevelPlayBaseAdapter.h */, + D206BF0BB5E5AE495B319990D18D98F2 /* LevelPlayBaseAdapter.h */, + 5D1B48F5E2F6A4D5924505DDAADEF8EC /* LevelPlayBaseBannerAdapter.h */, + 03A320D06C7E14E66AA09D82F3AB12EB /* LevelPlayBaseBannerAdapter.h */, + AC3C5D276A13926740CDC383A7452CA9 /* LevelPlayBaseInterstitialAdapter.h */, + C5BF157FF45862A88AF8EFE9D218EFF9 /* LevelPlayBaseInterstitialAdapter.h */, + B2734F44A87F56A06480F572EF36AC02 /* LevelPlayBaseNativeAdAdapter.h */, + 87D28C873F6250CE24E4FF580D1EFB6A /* LevelPlayBaseNativeAdAdapter.h */, + 2A64B80409F164E3803844301FB17174 /* LevelPlayBaseRewardedAdapter.h */, + C4C41AF042441294CC9F26ED2956F9B2 /* LevelPlayBaseRewardedAdapter.h */, + 5D84DC7476095566AF1272CB9D4DCEDF /* LevelPlayMediaView.h */, + CFA5A0F70B339127DED7B5419086695F /* LevelPlayMediaView.h */, + 361B15D754CA3EEB0EC554E81E00109B /* LevelPlayNativeAd.h */, + FF1836556425297312A4985C246EFEDD /* LevelPlayNativeAd.h */, + 31E2C311C21CF05614BD095C6689C450 /* LevelPlayNativeAdBuilder.h */, + 3D374DF11FD5A62F7DC500C33C411BE0 /* LevelPlayNativeAdBuilder.h */, + B2A431B7F89541CC6A680ED5D92913D5 /* LevelPlayNativeAdDelegate.h */, + CCDE14D7266FB3FCADEF8BEBA22A811B /* LevelPlayNativeAdDelegate.h */, + 1254D52A09DDBA845FDF18E3CDB1C2C6 /* LPMAdInfo.h */, + D2E376CAE5C33DB7CE90C0BE279B9E68 /* LPMAdInfo.h */, + 3D49B3D6C4005A54E1C34DCAF8E014F4 /* LPMAdSize.h */, + FE9F3E7574523DCB811C35B6609641DD /* LPMAdSize.h */, + 3F6B793E900414B3F8274C246135F8EC /* LPMBannerAdView.h */, + 663DE0794483C88A411B7BDA41B2DD0B /* LPMBannerAdView.h */, + 8522B1420EACB03F8E43FEADDB8633AD /* LPMBannerAdViewConfig.h */, + DB84B0FEA390C3C50C33023981CB6DAF /* LPMBannerAdViewConfig.h */, + F02211999487449E29659793EB81891A /* LPMBannerAdViewConfigBuilder.h */, + 6D9B49C53DB400504CB1D49494E84061 /* LPMBannerAdViewConfigBuilder.h */, + 646E8D078967D76A11EC2E76AB6DED34 /* LPMBannerAdViewDelegate.h */, + AD93B176CF28FE028AC766576C5896CA /* LPMBannerAdViewDelegate.h */, + D660CA6091C52B9C5F297B131B681A68 /* LPMConfiguration.h */, + 898C58C55EA2D600C78FD34B23E20374 /* LPMConfiguration.h */, + 2A2FECEA4904D1C3B04BCC1C3E193EE8 /* LPMDispatcherProtocol.h */, + 5E7EE5479D37A87F2D4D493403098EF9 /* LPMDispatcherProtocol.h */, + 92BFA548537D5DE5EA8044A119B4E140 /* LPMImpressionData.h */, + 5A2B8BEBEFA214E361C111AF3D8B7D68 /* LPMImpressionData.h */, + 36AB8A9692EBD7F8701BE4FC9B8EB91D /* LPMImpressionDataDelegate.h */, + A7503C9F9BC44E7DF1DC58C827279D88 /* LPMImpressionDataDelegate.h */, + D32AAF74A1E3E9958EB82C44F2859E88 /* LPMInitRequest.h */, + 38805ADA2E2590CEA84764CCEFC3AA65 /* LPMInitRequest.h */, + F1D090674AF3A3F61B4DDAE7E2DD2034 /* LPMInitRequestBuilder.h */, + 355D567D921F620CFA16BA43C68835AC /* LPMInitRequestBuilder.h */, + CCFCCC6FB9EB4AC5E83A4D63B2FFD014 /* LPMInterstitialAd.h */, + 691B9911C691A543A1AA8C1FA5BFCD6B /* LPMInterstitialAd.h */, + A238D1646D4E98F3F3766A4A1CA75F2B /* LPMInterstitialAdConfig.h */, + 98E3D463204F4172A295C5BF34B0E2A6 /* LPMInterstitialAdConfig.h */, + 875B7272AE723F328A70CA6B55CC169F /* LPMInterstitialAdConfigBuilder.h */, + 6874005D1E88242410692FD05721312F /* LPMInterstitialAdConfigBuilder.h */, + BAC07B18C332D81D6C171D364DDBABBF /* LPMInterstitialAdDelegate.h */, + F4594EEA6E07CEDE69B87D3B6DCA18EF /* LPMInterstitialAdDelegate.h */, + 35FCB2AC8AF8B9D0325ED932A9F17FA0 /* LPMReward.h */, + 76B37D610250B5FE141D4A203254B012 /* LPMReward.h */, + 32F68DDEFB50821F4FF6B68D8B7CABDA /* LPMRewardedAd.h */, + DB0201E3645474DA3F01E6CC6F3A3AA7 /* LPMRewardedAd.h */, + 12DB3B857AE6A39AE3DE9D25D89251B3 /* LPMRewardedAdConfig.h */, + E2DFFA7074DD7DB1C186089C3F7BB1FD /* LPMRewardedAdConfig.h */, + CB04DABF29F7D0DFF27C6FD299DBEA10 /* LPMRewardedAdConfigBuilder.h */, + BBC7794AF986904E25B7CE0DB0A9F34C /* LPMRewardedAdConfigBuilder.h */, + 36B73A9E37BAF99AFC87F01CFF4D8E2F /* LPMRewardedAdDelegate.h */, + 044DDBCD76EBDBF5A72F2E61B3F235DA /* LPMRewardedAdDelegate.h */, + 8DB547D1F18937EA5C859BCDC14B131C /* LPMSegment.h */, + A58551067FAC2CAC6CB5D3AF6692027E /* LPMSegment.h */, + CB183053DA63F5B4E07A50E4E6571B78 /* UIView+ISNativeView.h */, + A6A862027BC5082250B95334A12258EF /* UIView+ISNativeView.h */, + 86A00AB26F87E1960110040CE33872E8 /* Frameworks */, + ); + name = Ads; + sourceTree = ""; + }; + CC67B1082C16CD474830A1665F6A7B33 /* PromisesSwift */ = { + isa = PBXGroup; + children = ( + 6CFB31D2B6469BAFCF0D0EE83B6D6A74 /* Promise.swift */, + 9567717ECA736EF17C0C480A4D10498F /* Promise+All.swift */, + D2B5192C2DA782DD72AF3BED9062619A /* Promise+Always.swift */, + B6EA2E08F7B2B7C8266C021F934BB764 /* Promise+Any.swift */, + D817BAB636451413E52543981E224726 /* Promise+Async.swift */, + 8D124D2E1ADCFB2A1B40A9770344F845 /* Promise+Await.swift */, + 022E2DE980AE2DD8B673FEF029994237 /* Promise+Catch.swift */, + 3707E61A67EC8D0959FEED9B3939A5FC /* Promise+Delay.swift */, + 9A56E90AE4FC9D8A077C40F67513262E /* Promise+Do.swift */, + 5052CDC463F2CA370196062659882B38 /* Promise+Race.swift */, + 53D6559C8FDACD17A258B29C01DDCFEA /* Promise+Recover.swift */, + 2F313246CE8BAAC5D514B7BC8CD37BAB /* Promise+Reduce.swift */, + 7FFEBF54D10E73D8168D9C5FD2C3F6F1 /* Promise+Retry.swift */, + 595434D29B28CB61FFFE7415233145DD /* Promise+Testing.swift */, + 6F08C3B1CD07206601170D94C1BE73F0 /* Promise+Then.swift */, + E355C7908673CD447EBA9E2627292044 /* Promise+Timeout.swift */, + F1AE57B2231D059EADFE6A5F5D1202BF /* Promise+Validate.swift */, + 814F15E776B7574CC9CFD92A4EA9D982 /* Promise+Wrap.swift */, + 89A7CB6A8C6BF03238999CD916483805 /* PromiseError.swift */, + 6AE6F992A6BCA0ED90D4A4B23B8BDA93 /* Resources */, + A85E0A8AFB5DCE3EA7936761EB6B4D8E /* Support Files */, + ); + name = PromisesSwift; + path = PromisesSwift; + sourceTree = ""; + }; + CF1408CF629C7361332E53B88F7BD30C = { + isa = PBXGroup; + children = ( + 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, + B94D7768568A9992200DB461E8CF687F /* Frameworks */, + 2D7352DA31F190A64B414327E4F9485F /* Pods */, + E44144FB155AD11473806251490A0AF5 /* Products */, + 3FC7CDB3CE0A81BA1F234331B91BC2C4 /* Targets Support Files */, + ); + sourceTree = ""; + }; + D0186D61B8F6B0DC7E98BBB334DF93D4 /* Resources */ = { + isa = PBXGroup; + children = ( + 4E371453D1ABF2E876625E44EEDE9316 /* PrivacyInfo.xcprivacy */, + ); + name = Resources; + sourceTree = ""; + }; + D4C766B4E2421A5A213D0DC5507C0EB6 /* iOS */ = { + isa = PBXGroup; + children = ( + 3C0783D1DCE2D70C01DE8F66368E3525 /* CoreTelephony.framework */, + 411C572D658946450319E3438E61FBCC /* Foundation.framework */, + 619E6A45528E9255637879488FB26EDF /* Security.framework */, + B193AA1062E3BDA9FD9F681F8B33A4FB /* SystemConfiguration.framework */, + 21D9E6AABF6D4CF5BC663A230EF53A42 /* UIKit.framework */, + ); + name = iOS; + sourceTree = ""; + }; + D8F9ED88B738C161EB853279100AC6AF /* Support Files */ = { + isa = PBXGroup; + children = ( + B1249F9F649088F4E116CAA11B9D5D2F /* FirebaseInstallations.modulemap */, + 46474726596AE39D0A76F938E0A80E6A /* FirebaseInstallations-dummy.m */, + 39068D7FF3135809CAF855DF1FAF3801 /* FirebaseInstallations-Info.plist */, + D0A345A32D6751F30E85551315CE72F4 /* FirebaseInstallations-umbrella.h */, + 01FB650F7813CF1CA7B53199751B13B0 /* FirebaseInstallations.debug.xcconfig */, + 1AE2DDA9E2DB7DB2B4A53B457668348D /* FirebaseInstallations.release.xcconfig */, + E8BA439DC820D21D4BF8C0B289F00EDC /* ResourceBundle-FirebaseInstallations_Privacy-FirebaseInstallations-Info.plist */, + ); + name = "Support Files"; + path = "../Target Support Files/FirebaseInstallations"; + sourceTree = ""; + }; + D9E04C1033B0D62A16059D45A29F8D7E /* FirebaseSessions */ = { + isa = PBXGroup; + children = ( + 9964DE206F7E0A4807E94C5A5A3C077D /* ApplicationInfo.swift */, + E7176FC3E8C82A6D42D00E8741C604A3 /* DevEventConsoleLogger.swift */, + 8BCBA30428742D1C599371299B07C4DF /* EventGDTLogger.swift */, + 39647797621B506227286A3E40C9359F /* FirebaseSessions.swift */, + 7D9D9A9AE6965458892201A240625ACD /* FirebaseSessionsError.swift */, + BCB4B9D4457810F91752A8B8397D1004 /* FIRSESNanoPBHelpers.h */, + 5A05038D9FDA32819B7F732A223E07EF /* FIRSESNanoPBHelpers.m */, + B581EE4C1FC74016885897568F1D8E87 /* GoogleDataTransport+GoogleDataTransportProtocol.swift */, + FA2E3B3981C2F0727AB450DC21490B78 /* Installations+InstallationsProtocol.swift */, + A9ABAAC92E26E20E75013B9FEA3A5878 /* LocalOverrideSettings.swift */, + 64CF6C49437B67B6EF7D4AD50B1EBA3D /* Logger.swift */, + 3D52AB19F6BCD45B3C88CDDD10AEAE79 /* NanoPB+CustomStringConvertible.swift */, + A9809547A08DFE1B868E753F01D28026 /* NetworkInfo.swift */, + 25B6C2F45A00178B8E1249CB254B52F9 /* RemoteSettings.swift */, + E057788A986B47B316A6357ED7BED020 /* SDKDefaultSettings.swift */, + 8135B6E93577320E09B1461F350D6897 /* SessionCoordinator.swift */, + 0AAF8D43168DE149305848C3B443685D /* SessionGenerator.swift */, + 961CCB207747E50C7E7A415268E61837 /* SessionInitiator.swift */, + C0DD38F422EEE1A5E8A79935AB1AA169 /* sessions.nanopb.c */, + B895CB7BF5B8063D748E4CE261124320 /* sessions.nanopb.h */, + 30939D40FD7C3A32CC6CDE85982B6520 /* SessionsDependencies.swift */, + 623D13AE11D7ADBF6E124D5F2F6A0102 /* SessionsProvider.swift */, + 27987ADDED8E9F81E93FAC3C85BF751D /* SessionsSettings.swift */, + 227EB971EFD84A9CB75C423F9C85FFCB /* SessionsSubscriber.swift */, + E468EC8047B85253A3F8865A433CBDF5 /* SessionStartEvent.swift */, + 03333240DE76A905DBD22FCD540869A9 /* SettingsCacheClient.swift */, + 74050BBEB3A02EC7C964E0F4B4AFC8BA /* SettingsDownloadClient.swift */, + A9D25724806D45122402178B747AE6D5 /* SettingsProtocol.swift */, + 90A580880C102C87E456FD51A7F63EFF /* SettingsProvider.swift */, + BBCCC4A3D65B7FB65B4F76FAA082C371 /* Time.swift */, + FF8D5B0AC9E600C98C0C22F0816C65FA /* Support Files */, + ); + name = FirebaseSessions; + path = FirebaseSessions; + sourceTree = ""; + }; + DA7A55CC8606ED3FA25E5DDB4A58AE15 /* FirebaseRemoteConfigInterop */ = { + isa = PBXGroup; + children = ( + 7DCE9F08C6622DCED9A2D3899A8A4F8A /* RemoteConfigConstants.swift */, + 2073DD1BEC1C356821B09FFF3D0EEFC0 /* RemoteConfigInterop.swift */, + 68CF38C58D90C2F94CCA4118B4C034CC /* RolloutAssignment.swift */, + 88EEAAC0E812A8FDAFC91E692A057B74 /* RolloutsStateSubscriber.swift */, + B7BF4FC2CA35907F3457B07C2F20034E /* Support Files */, + ); + name = FirebaseRemoteConfigInterop; + path = FirebaseRemoteConfigInterop; + sourceTree = ""; + }; + DC37D0D612663DDC23BC3D6174EDCC9F /* FirebaseCoreExtension */ = { + isa = PBXGroup; + children = ( + E69C2479672DEE9632C64C294E1CE2BB /* dummy.m */, + D1C898C4E9DC2D4D4D1E86B5DE0A7B98 /* FIRAppInternal.h */, + 54D276171F73331F8A7575A8C2F8A24D /* FIRComponent.h */, + 9FB7C89D8ED4FC0A2D862D0BA6990DCD /* FIRComponentContainer.h */, + 2731B1A2A591BD8AA6F7A860C8DF942F /* FIRComponentType.h */, + 9F63BC66475319695185322AF43D4748 /* FirebaseCoreInternal.h */, + 3426CA7E57D379E97C6EEC3B79A6FC1C /* FIRHeartbeatLogger.h */, + 185E6F25949BB7762B48C7BB5ECD6418 /* FIRLibrary.h */, + BAFB6F04EE2610139F9720EE4548FF44 /* FIRLogger.h */, + F386D7BF555CF1F57C2F1D21A584BD04 /* Resources */, + 150ACCA2F64C66CAD654EAC6303F2983 /* Support Files */, + ); + name = FirebaseCoreExtension; + path = FirebaseCoreExtension; + sourceTree = ""; + }; + DCCD105B717F51B6A64101C343674949 /* Privacy */ = { + isa = PBXGroup; + children = ( + 4B78374D694969D9333D99D3FF83F35C /* Resources */, + ); + name = Privacy; + sourceTree = ""; + }; + DEDC774AF9089CBFD5E3B5ACDA21F1C3 /* Support Files */ = { + isa = PBXGroup; + children = ( + 44ECD413E08EF414A0AA8CC76B82B3E5 /* IronSourceAdQualitySDK-xcframeworks.sh */, + 6E44F078D0A8BF84F02C552F62EBC7AC /* IronSourceAdQualitySDK.debug.xcconfig */, + B6ADF39B0F8B2D8E2F53267C6D66340A /* IronSourceAdQualitySDK.release.xcconfig */, + 1E31FB3734C782C16ADDBB447B495FF9 /* ResourceBundle-IronSourceAdQualityPrivacyInfo-IronSourceAdQualitySDK-Info.plist */, + ); + name = "Support Files"; + path = "../Target Support Files/IronSourceAdQualitySDK"; + sourceTree = ""; + }; + E1E61C42060D89C63877606622E187BA /* Support Files */ = { + isa = PBXGroup; + children = ( + 0990016A8D67E4A41853CEC6119FEDEC /* GoogleUtilities.modulemap */, + CB0183FEA633E9C900AB5ADA75F93D28 /* GoogleUtilities-dummy.m */, + 20D77B4B14F2405656CD489AEDA89031 /* GoogleUtilities-Info.plist */, + 792271CCB62FDB0E606BB91279FC1F41 /* GoogleUtilities-umbrella.h */, + DB4125A2ADD8442CEBA9B65B91E1D673 /* GoogleUtilities.debug.xcconfig */, + 04CE4B3AAD7F874D08FB7FF1F21EBAC5 /* GoogleUtilities.release.xcconfig */, + DED706D2DD6871C5D6FCDBD7A4B61884 /* ResourceBundle-GoogleUtilities_Privacy-GoogleUtilities-Info.plist */, + ); + name = "Support Files"; + path = "../Target Support Files/GoogleUtilities"; + sourceTree = ""; + }; + E44144FB155AD11473806251490A0AF5 /* Products */ = { + isa = PBXGroup; + children = ( + E2B63D462DB7F827C4B11FD51E4F8E2D /* FirebaseCore */, + 8BB937B1C0DFFCF92F41861C2BC54DDA /* FirebaseCore-FirebaseCore_Privacy */, + AEF1DC80F0EB62580B81D18786BAF924 /* FirebaseCoreExtension */, + ECAC028550A03412C51913B85686D98B /* FirebaseCoreExtension-FirebaseCoreExtension_Privacy */, + 148D0F9E8C7373FEAF40D800FC5F1BAA /* FirebaseCoreInternal */, + 4DB03FD262B678178A44272143846563 /* FirebaseCoreInternal-FirebaseCoreInternal_Privacy */, + 86375444C196BA272DDBB8165BF64A15 /* FirebaseCrashlytics */, + 859AE0302B28BD8AE67A780BFCAEE082 /* FirebaseCrashlytics-FirebaseCrashlytics_Privacy */, + 13C8C8B254851998F9289F71229B28A2 /* FirebaseInstallations */, + 47C581450CDB4A6111CB97EEE0711A8C /* FirebaseInstallations-FirebaseInstallations_Privacy */, + 3CB3BCF1390F1406B03BC8DB4735D727 /* FirebaseRemoteConfigInterop */, + 83F5CCB22EE126A829F2A8820798DC8D /* FirebaseSessions */, + 856B5CD56F194FAD26EA91620B66D614 /* GoogleDataTransport */, + F73AA961F4AEFF2B46B00AE435DF6BE3 /* GoogleDataTransport-GoogleDataTransport_Privacy */, + B43874C6CBB50E7134FBEC24BABFE14F /* GoogleUtilities */, + 44E291D18340EAC3F761346198515323 /* GoogleUtilities-GoogleUtilities_Privacy */, + C9BAD2DF6BFA41360986C72BE9616A6C /* IronSourceAdQualitySDK-IronSourceAdQualityPrivacyInfo */, + 08DFEAAA1901B9FF8345827FDA56939E /* IronSourceSDK-IronSourcePrivacyInfo */, + 06FC5C9CF96D60C50FCD47D339C91951 /* nanopb */, + 3227F3FC45681D7CEE5D1355A532398A /* nanopb-nanopb_Privacy */, + 8A0AA9F2C3B51633419321E43977A03E /* Pods-TastePick */, + 3347A1AB6546F0A3977529B8F199DC41 /* PromisesObjC */, + 3F238BB22C5201CE689CAF2F766AED95 /* PromisesObjC-FBLPromises_Privacy */, + 379E5319BC6B4AE5613DFF7EEEAA6905 /* PromisesSwift */, + 067CED0F0662BBE6DC889AEC6DAB3049 /* PromisesSwift-Promises_Privacy */, + ); + name = Products; + sourceTree = ""; + }; + F0D27934FBA048560D4906C397021C19 /* Pods-TastePick */ = { + isa = PBXGroup; + children = ( + 031B7146CF4EA8F9D4F9D9FA1FD13D69 /* Pods-TastePick.modulemap */, + D278B852D768C3B4F4987DADC1AF43DB /* Pods-TastePick-acknowledgements.markdown */, + EB9029979EA0093A618DB4C52AF8A142 /* Pods-TastePick-acknowledgements.plist */, + 0A566D57D5C0DF1498A91010D518117A /* Pods-TastePick-dummy.m */, + B2562FA75F60B5D572F17F5EC9514C93 /* Pods-TastePick-frameworks.sh */, + 7635C4E0C35785A69D609681EEDFD49C /* Pods-TastePick-Info.plist */, + AB0BA2B8ADE49661B0832B40AAC81B25 /* Pods-TastePick-resources.sh */, + E84090DB23A890A20DDB9D6DAC5D52C9 /* Pods-TastePick-umbrella.h */, + 7F6428B15EAB7FEF0E33573A967DEE43 /* Pods-TastePick.debug.xcconfig */, + AC8C76E2670B571A134C0A71FAB87FA9 /* Pods-TastePick.release.xcconfig */, + ); + name = "Pods-TastePick"; + path = "Target Support Files/Pods-TastePick"; + sourceTree = ""; + }; + F18E7D4C6A4C60A9AF5273DCE0B2BD4F /* Frameworks */ = { + isa = PBXGroup; + children = ( + B94CEF504C790B1E1E90380A23D3078F /* GoogleAdsOnDeviceConversion.xcframework */, + ); + name = Frameworks; + sourceTree = ""; + }; + F386D7BF555CF1F57C2F1D21A584BD04 /* Resources */ = { + isa = PBXGroup; + children = ( + B4FC404DBDCF212DDC60060CF5D047C4 /* PrivacyInfo.xcprivacy */, + ); + name = Resources; + sourceTree = ""; + }; + F408C6D4087EA4A11078962AA29890BB /* GoogleDataTransport */ = { + isa = PBXGroup; + children = ( + E814CF17C18B86D7848AB28D353970F2 /* cct.nanopb.c */, + B1E166BF8ADCC0AB4F5C5A65FDFE11CF /* cct.nanopb.h */, + E9499C8702EE3C4BA0EE46CBFC0D843E /* client_metrics.nanopb.c */, + AAC7AFE020697B25E4865BC68EDBF18B /* client_metrics.nanopb.h */, + 93528F9C66D1C44F701EE44CEF2B12A2 /* compliance.nanopb.c */, + 566D45DD6426EDBEE7BA301FD8383537 /* compliance.nanopb.h */, + C2C26D27486D91CB1D8B04DD239959FF /* external_prequest_context.nanopb.c */, + 533A1C390C27BFCA44BDC78888B6C6A9 /* external_prequest_context.nanopb.h */, + F6D312C64B38571DC21E8F9A57E23BC2 /* external_privacy_context.nanopb.c */, + 24F6C0552D85DB8F55623B2943F64F15 /* external_privacy_context.nanopb.h */, + BE8A892C61B8F435614C2F1BFE36C324 /* GDTCCTCompressionHelper.h */, + 8CE156EDC12BD8E274F2EE03CECE7641 /* GDTCCTCompressionHelper.m */, + 1CE2D09E4A00E609BE326453FA5D543F /* GDTCCTNanopbHelpers.h */, + 98CF4046D07545106FB11F650FA2C0A7 /* GDTCCTNanopbHelpers.m */, + C0A6374CBE0A6FC840B2CCB5BC04391E /* GDTCCTUploader.h */, + 3AFD59D27B0CB0B9AE20097A85658997 /* GDTCCTUploader.m */, + 3EF44F3C3F4C03084F5647187712A799 /* GDTCCTUploadOperation.h */, + 2EC2D87E8B7BC61C65FE126377760DC0 /* GDTCCTUploadOperation.m */, + E6C42248AC8B2490BCB8AEA3363C72F2 /* GDTCCTURLSessionDataResponse.h */, + A6D0C615AB1F9953AB63ED940124C908 /* GDTCCTURLSessionDataResponse.m */, + 4BA86F1748E41114305A22D7B6D5A953 /* GDTCORAssert.h */, + A193BD55A0E7F7CA562C12F3F5D93A5F /* GDTCORAssert.m */, + DA48B145114B81B074811930837FFB74 /* GDTCORClock.h */, + D5F99A5B4CE9BD03128B9D9D3D5B484A /* GDTCORClock.m */, + F66DA3C2097B9D040A400036969452AF /* GDTCORConsoleLogger.h */, + 9BF943E13BECF93D2A48AFEC131BBE86 /* GDTCORConsoleLogger.m */, + F48D0F5CB15141F4F307D622FDB9D83C /* GDTCORDirectorySizeTracker.h */, + 3A8322DEBCC05B27EC0F485116CB3581 /* GDTCORDirectorySizeTracker.m */, + 4E44829C91EC31D7CC498CFCE1823D71 /* GDTCOREndpoints.h */, + 25E01BB2192AE035461221BD497CC08E /* GDTCOREndpoints.m */, + 7526970C05C8ACD66297C7E2B11A458A /* GDTCOREndpoints_Private.h */, + 9BA693F5FC03A8325517A09E3C4D1493 /* GDTCOREvent.h */, + 2A0F94D6EF56BEC681DF7ED04CD8DB5F /* GDTCOREvent.m */, + 786BBAD049118554013D53C283077CE3 /* GDTCOREvent+GDTCCTSupport.h */, + 9390BE29BAF167FEAE1E7BE6F5AC1C01 /* GDTCOREvent+GDTCCTSupport.m */, + B9521C0C3DEB6B0A3CB8AEB4D34BD281 /* GDTCOREvent+GDTMetricsSupport.h */, + D16CCFE998E05CFAE5180480E1D56DFA /* GDTCOREvent+GDTMetricsSupport.m */, + 82961C47312C5F33B867FA72C66A2B3B /* GDTCOREvent_Private.h */, + 6C8D3D0BDAA8FB49A5D4E2C21B23881D /* GDTCOREventDataObject.h */, + 2CD17B881E8A2BFAFDF09FF663B3EFED /* GDTCOREventDropReason.h */, + A0C4B81B52F3550FB26F2301A4D3830F /* GDTCOREventTransformer.h */, + 7B6C46CA9CE820944624F07B22DB7583 /* GDTCORFlatFileStorage.h */, + 7705F842EADF3AF5994BB27C1F4EDCEB /* GDTCORFlatFileStorage.m */, + F6BAE7CFD7109C70FEFDE60137A0FB67 /* GDTCORFlatFileStorage+Promises.h */, + 5CC1C3F46924563DD7F364E2EFD61652 /* GDTCORFlatFileStorage+Promises.m */, + 9A09D4E58AE07B59FB190EEE48280AD9 /* GDTCORLifecycle.h */, + 3BB4CA31F7DE998710ABCE65AA36AA77 /* GDTCORLifecycle.m */, + 887155058FADB78B34F55428F2D1C93E /* GDTCORLogSourceMetrics.h */, + 6102E83195F0B1D1BB9085D6FA872D2B /* GDTCORLogSourceMetrics.m */, + 23F60C0F834C7294C4181CFC6FC52A9F /* GDTCORMetrics.h */, + 22B8D50B74DE97D7A1516169B05859A4 /* GDTCORMetrics.m */, + 758F93EFBC31D5CA2CBB4CF6B2C95B64 /* GDTCORMetrics+GDTCCTSupport.h */, + 1023E99E35C71294BD4212E31FE8D1E5 /* GDTCORMetrics+GDTCCTSupport.m */, + 623C6C791AD1AC849BD033EE3B6ACE99 /* GDTCORMetricsController.h */, + 43F9B2C99AC9C9CCA867629A0FF1D7E3 /* GDTCORMetricsController.m */, + 53E213CDE8EA6EAC06399F2176AE3D4B /* GDTCORMetricsControllerProtocol.h */, + 1FFCE5CE085019AB4DF83559B2238B43 /* GDTCORMetricsMetadata.h */, + F0FA261A79F1E495EBA3976B173C2751 /* GDTCORMetricsMetadata.m */, + F233CC4228F9B498FC5158D560DF7C4C /* GDTCORPlatform.h */, + DEBDFBFD60419C6875B4145D83150FBE /* GDTCORPlatform.m */, + D52720EBEE8D591811D098B131AED09A /* GDTCORProductData.h */, + A443C138B2A4D29DE3E10FAA1EA8F004 /* GDTCORProductData.m */, + 08105A73A76E1C926DE8ABFB274329C5 /* GDTCORReachability.h */, + 76077ED823B78658850BC396CA91A52C /* GDTCORReachability.m */, + 4EA60B96ECDE4EAAB06858C4F627CCBC /* GDTCORReachability_Private.h */, + 80AB68E0240AA5FC233F16FBB3EFA199 /* GDTCORRegistrar.h */, + 213D31970FC3C34E21FB0E4EBFAC8239 /* GDTCORRegistrar.m */, + 71212E335B1881ECF4D260EEE26D4B47 /* GDTCORRegistrar_Private.h */, + 0089C0347F22CDD47F7D20F708F88D30 /* GDTCORStorageEventSelector.h */, + 0BD2DC1F13BE67B61E77456AFEDBF204 /* GDTCORStorageEventSelector.m */, + DEC61A91C59056C9B0313273CF1DDFC8 /* GDTCORStorageMetadata.h */, + 289B7EC46EE1B61BBF0071115B2EAFFE /* GDTCORStorageMetadata.m */, + 8CFC8F1F8999E22D3BDE4B506CD86B3E /* GDTCORStorageProtocol.h */, + 05CE75891727610C65FC34203126DAFD /* GDTCORStorageSizeBytes.h */, + C0563836D0790B15FD3F7D2C1158652A /* GDTCORTargets.h */, + 2F63566A90B8B15BB252B732D8FC2944 /* GDTCORTransformer.h */, + E5AD3E9C111C8222D721FB18E8AAC01E /* GDTCORTransformer.m */, + 3E5791351CAC66246499292E224E1906 /* GDTCORTransformer_Private.h */, + B6CC975F9C0616F8F8A37C42A76CB016 /* GDTCORTransport.h */, + BE2FE7C542F1105383E7C2CEC90E4D71 /* GDTCORTransport.m */, + 7DCA0E4A73EF2D142A698E1C4EDD7A42 /* GDTCORTransport_Private.h */, + E81048105F15BD6D03DCAD86C4DF41EB /* GDTCORUploadBatch.h */, + C043BF110B25F32912F5A0CC31E55881 /* GDTCORUploadBatch.m */, + BB764ECF294A5117628B17E3D8BBA5F8 /* GDTCORUploadCoordinator.h */, + 8C63286B4E589B8B7276886332C71CA1 /* GDTCORUploadCoordinator.m */, + 810642D4AD0BBAEA549774F189FC6441 /* GDTCORUploader.h */, + C2F589B34C8A36EB6A6FD8C5BE6C91B0 /* GoogleDataTransport.h */, + 54B615D0CA07F1F0B5FEF225F68411EB /* Resources */, + 25C0B3CC7BC55E481D47678F8BE96F6E /* Support Files */, + ); + name = GoogleDataTransport; + path = GoogleDataTransport; + sourceTree = ""; + }; + F6169B24BFE05BD21D6226A16B7A69BB /* Frameworks */ = { + isa = PBXGroup; + children = ( + BC1DE61C31C393FE3209CCC6D6B40907 /* FirebaseAnalytics.xcframework */, + ); + name = Frameworks; + sourceTree = ""; + }; + F98BC1E6108C5DBAAB8C8CA53A52F4DB /* AppDelegateSwizzler */ = { + isa = PBXGroup; + children = ( + 0D45A6F0B06D69697404FA689F2C9A7C /* GULAppDelegateSwizzler.h */, + 71676436D07AD420A8D4EEB7170D0276 /* GULAppDelegateSwizzler.m */, + 5E3980C1701466712484BB5AA87A843C /* GULAppDelegateSwizzler_Private.h */, + 3B0287C57BE7DCF9619AC7D86755E6B9 /* GULApplication.h */, + D863620CC96C7E1234821949251F1F55 /* GULLoggerCodes.h */, + 1255AFC3E86546B3312D04714D8F2C86 /* GULSceneDelegateSwizzler.h */, + 189D64AA8AA2FF6B5EAD8A74A61A36E5 /* GULSceneDelegateSwizzler.m */, + 212DFA72D0E2CA51B6EC619A06CCD600 /* GULSceneDelegateSwizzler_Private.h */, + ); + name = AppDelegateSwizzler; + sourceTree = ""; + }; + F9F8529C0BE3DD381A27C8374B34E340 /* FirebaseCrashlytics */ = { + isa = PBXGroup; + children = ( + A7FE293EA89F6DA186AA827D6959534C /* crashlytics.nanopb.c */, + 29A0E4CB79E64ABDE0215A8170CB4BD0 /* crashlytics.nanopb.h */, + 319D2DB0F299ADF8C69525C6E1AA4521 /* CrashlyticsRemoteConfigManager.swift */, + DB7B79608541CAA0781D104C2AE25E04 /* dwarf.h */, + 3BDBD876705B47F9B901833DA8212529 /* EncodedRolloutAssignment.swift */, + 4CF8C434D2863D02CE45275CA3243C18 /* FIRAnalyticsInterop.h */, + C50377907868482D35E746056BEBEE31 /* FIRAnalyticsInteropListener.h */, + F171CB55C4DBA6415F005DEAB04C9068 /* FIRAppInternal.h */, + B1235FF6E9EE36FD4108C0DF39A741E5 /* FIRCLSAllocate.c */, + 8D79C303AB6E2236D9B3F93915775007 /* FIRCLSAllocate.h */, + 3666ABC259DA72953FE993E05E3A5531 /* FIRCLSAnalyticsManager.h */, + A526CAA2BF74CF37D01D654302BE29E1 /* FIRCLSAnalyticsManager.m */, + 8CABCB98EE7D2FF1C51B2CFD2805562C /* FIRCLSApplication.h */, + DEC0CBFF3AEC373BCF6CE57E7513755A /* FIRCLSApplication.m */, + 93993DDFB096B20356E0FCA54A271A85 /* FIRCLSApplicationIdentifierModel.h */, + 1BE1CBF8E9B5709393138ABEDF831B50 /* FIRCLSApplicationIdentifierModel.m */, + 4AB9BA7C4F288A9888D0AF459B73E388 /* FIRCLSAsyncOperation.h */, + 589B5CA0837902E9A2F318B4BBD29197 /* FIRCLSAsyncOperation.m */, + F064E9645A9CE6DABD7C6FCEB9B64BC1 /* FIRCLSAsyncOperation_Private.h */, + 0D063E804BB8B39A3CEFCD3A2ECE5567 /* FIRCLSBinaryImage.h */, + 8C646683231AB6053322DD656B8F08FA /* FIRCLSBinaryImage.m */, + 6B1DA01E1FE7F68932E0BEE63FB99E88 /* FIRCLSByteUtility.h */, + AC93949D8A77E4A30500EF08D24DD5AF /* FIRCLSByteUtility.m */, + 88223842AB5E8C62E0DBBE137C7DA842 /* FIRCLSCallStackTree.h */, + 8CFAF503B3616030C48201CEEB846090 /* FIRCLSCallStackTree.m */, + 9D3A17EE970C5C44B970AE4B5ECA4A29 /* FIRCLSCodeMapping.h */, + B81BDC2643BA56A17EF26F3DB83AAB43 /* FIRCLSCodeMapping.m */, + 7CD1A0A0766F6DCBD1A7C5490746BD0F /* FIRCLSCompactUnwind.c */, + CDDF030F4A6E517F34BF2B249C03A22B /* FIRCLSCompactUnwind.h */, + 7626561CCC2B0572C89B82904ACF459C /* FIRCLSCompactUnwind_Private.h */, + CCDC0AB75D22DED4C9FC0437D2E5091D /* FIRCLSCompoundOperation.h */, + 9B63150A5F6E7C96E4554EE4C497BE4B /* FIRCLSCompoundOperation.m */, + A457DFA45654B3D1C0EA9565B2811B97 /* FIRCLSConstants.h */, + 45A97CCCD5706C3372CFE18761AD892C /* FIRCLSConstants.m */, + 6E77A4773E824C1D7A5DC5B725A71C00 /* FIRCLSContext.h */, + 3252DF1406BC2146B50B4840FD6FBA04 /* FIRCLSContext.m */, + F617922645413BFF8368B03C2EA0C543 /* FIRCLSContextInitData.h */, + D9E10F2DE71DAC0176088B4BD7AAAF40 /* FIRCLSContextInitData.m */, + 48FA46A66247F6EEA5175CFB52550095 /* FIRCLSContextManager.h */, + 616B8035F222994177E84AC8B8809C60 /* FIRCLSContextManager.m */, + D9AA670608CFCFA05E52A55B4EB8F5CF /* FIRCLSCrashedMarkerFile.c */, + C5D9AA0D80C027A086260C9A65AF5191 /* FIRCLSCrashedMarkerFile.h */, + C2ED107AE0C240089F516E47ED83A3F8 /* FIRCLSDataCollectionArbiter.h */, + EC4CF58626C94A37CEEE596200CF4A2E /* FIRCLSDataCollectionArbiter.m */, + FF7D9C22D9575CAD5D16549620CF1F54 /* FIRCLSDataCollectionToken.h */, + CC97D9CD7CBD9878F6316ABC729054EC /* FIRCLSDataCollectionToken.m */, + 5744EFD31B947A5BD323ABC59C4EC853 /* FIRCLSDataParsing.c */, + D5728414FB5D291F0410158BBB99515C /* FIRCLSDataParsing.h */, + 828EE3550DD2B792458BF1F9C9D0859E /* FIRCLSDefines.h */, + E87FCB761D062C05C7C44413916A46C2 /* FIRCLSDemangleOperation.h */, + 43635576C595B52CD10CBDCAAF2582A9 /* FIRCLSDemangleOperation.mm */, + 15101FAC07F75892F901C206FBD6D676 /* FIRCLSDownloadAndSaveSettingsOperation.h */, + FFF0E62BD9FA88413042F0BCBD7031F2 /* FIRCLSDownloadAndSaveSettingsOperation.m */, + CE0BF03D61A3396FE4A7AC5CD82061FC /* FIRCLSdSYM.h */, + 9AFDD3E443E85EECC92CC116A9716863 /* FIRCLSdSYM.m */, + B362261E9E8CB7A626EF723102A6C278 /* FIRCLSDwarfExpressionMachine.c */, + A10588C4300AC9C3D11455BE9D879450 /* FIRCLSDwarfExpressionMachine.h */, + 342FA6FC6FF29FD9ED11AA3C0C030E1B /* FIRCLSDwarfUnwind.c */, + 28A5D30FD1E238696F83B0BB00289AB8 /* FIRCLSDwarfUnwind.h */, + 6F467609B407F926B182ACF7D04672A5 /* FIRCLSDwarfUnwindRegisters.h */, + 99790E1F0014A6D9319C17A74E117E98 /* FIRCLSException.h */, + 10EC7FBA885D28D61F2A2F9826E6DB47 /* FIRCLSException.mm */, + E20A5B9D37ADDE907C68B5A0DF641EB2 /* FIRCLSExecutionIdentifierModel.h */, + 26FE2F6DAF58997316C13CC97978F5AD /* FIRCLSExecutionIdentifierModel.m */, + 617B0F345BFFAF23969A525A39D142F4 /* FIRCLSExistingReportManager.h */, + 94BACBC372793B939CB61CECCC28F929 /* FIRCLSExistingReportManager.m */, + AA8C68D02D19733F5151B2C8F193944E /* FIRCLSExistingReportManager_Private.h */, + FDB288710A5819DDAF867AD51CB7C8BA /* FIRCLSFABAsyncOperation.h */, + 02DF0F6D77AA82B6DE41974516D77AB4 /* FIRCLSFABAsyncOperation.m */, + 6FD189EB7D8DAAA1B0FD1DE606EF1D5F /* FIRCLSFABAsyncOperation_Private.h */, + 8438C9207D6070E9DCBB4B51309E2444 /* FIRCLSFABHost.h */, + C21ACF77639E561FEC07A0A807061673 /* FIRCLSFABHost.m */, + 4BA1A5F567A5A56048407845D0A0D76B /* FIRCLSFABNetworkClient.h */, + DBC0A7B3EE3789BFBD83F4D00733A2C6 /* FIRCLSFABNetworkClient.m */, + A51C7180F539F77E2D031E2EA01DD503 /* FIRCLSFeatures.h */, + 8E489BA48F1A72A775C7E2A06FE04C54 /* FIRCLSFile.h */, + B4A617B11AB65681B00B3D330658907C /* FIRCLSFile.m */, + B63B8E13FA9721DBEE5E31F976C20935 /* FIRCLSFileManager.h */, + 57C8765FACA5923A29B9B3E6549BAC57 /* FIRCLSFileManager.m */, + 5AAE37425AE59D987BC8415EE3B4E94A /* FIRCLSGlobals.h */, + 4ADC1FD14195B521394962C3B98DD910 /* FIRCLSHandler.h */, + F16384F899915F2AB97FDC2DDC712581 /* FIRCLSHandler.m */, + A07E589DAAD31FFCB8DED3973BDCD21A /* FIRCLSHost.h */, + CFE0D559DCD251C38581DE47B3292AC8 /* FIRCLSHost.m */, + 23FD42DA48CB04E5A2EC2FCAD6972449 /* FIRCLSInstallIdentifierModel.h */, + B21C17A0C7530C3AC5A41DCFD7232B69 /* FIRCLSInstallIdentifierModel.m */, + A355F7EDA13E66D7A11FD7439E6D6A46 /* FIRCLSInternalLogging.c */, + 6A0B50CC9CF04507E15EF2B57B633B13 /* FIRCLSInternalLogging.h */, + B51E7D729DB4FC403626769772BDBEC4 /* FIRCLSInternalReport.h */, + C5F74FE5F6CC393C95E29DF392D5DEF7 /* FIRCLSInternalReport.m */, + 5871D5CE9439B478C694221E60B2EDFB /* FIRCLSLaunchMarkerModel.h */, + 116852A1A1333FCDE65458FC8EFCE21B /* FIRCLSLaunchMarkerModel.m */, + F5747BC30069054A7B0D60AB1E618499 /* FIRCLSLogger.h */, + E96821E6404A23F47A8C3D9D9ACE11A6 /* FIRCLSLogger.m */, + 28EE3935B708ADB28BB2F7CFA8DBEA8F /* FIRCLSMachException.c */, + F0CBF52E8E78DB598F0935964191E5BE /* FIRCLSMachException.h */, + 26CD1818E4B5E4B04A89C9F8C537A485 /* FIRCLSMachO.h */, + 4510828D4ED1A91B7DC48E597A6ABF69 /* FIRCLSMachO.m */, + FAEB7FD705F633027F8EFC2ADAB11A8D /* FIRCLSMachOBinary.h */, + 6080C60B399A25A3911D15626DCF7711 /* FIRCLSMachOBinary.m */, + 434E8926C8AD43CA9F81CBA38ABE052E /* FIRCLSMachOSlice.h */, + 3D49B8237795FB0937E007E53CC2A559 /* FIRCLSMachOSlice.m */, + 714FC804868794FC65ACC809A4BD408D /* FIRCLSManagerData.h */, + E733897E58C3ECF71F8B593B0583C98C /* FIRCLSManagerData.m */, + 74269A41A6C776DF12BC3E6F3A7D63E0 /* FIRCLSMetricKitManager.h */, + 2F347F62F3CE83D50D94207B6ECCCECA /* FIRCLSMetricKitManager.m */, + 85933203B5A2100972719926F7272D99 /* FIRCLSNetworkOperation.h */, + A5425E5A63F497B11099CF7643E9E208 /* FIRCLSNetworkOperation.m */, + 93AD81543696806262AD4DE414D50B3C /* FIRCLSNetworkResponseHandler.h */, + CECA6783FA589EAB190F02D2DE8ECF5B /* FIRCLSNetworkResponseHandler.m */, + DA94A176C9DDF93FD794B8CACD5B0CD3 /* FIRCLSNotificationManager.h */, + 3EF32FAE4E797E58A9BCD2572B05CA92 /* FIRCLSNotificationManager.m */, + 46597EE1583194FE324E15F384F67BAD /* FIRCLSOnDemandModel.h */, + 7699E36A6CA8F5B111B31CF18A31EE6D /* FIRCLSOnDemandModel.m */, + 5498B35700C70EF67D8D2393D70B227E /* FIRCLSOnDemandModel_Private.h */, + E02A98982D5BB8B24B386D510226E73A /* FIRCLSOperation.h */, + 0C0E1B45CC38811401D3E98AC998434C /* FIRCLSProcess.c */, + C59A87359F467A1852B31CCDA105CB12 /* FIRCLSProcess.h */, + 046E5D36AC65413A5A781F4E1D7C6261 /* FIRCLSProcessReportOperation.h */, + 61DE5AAEAE501D74076AF93A500EDB32 /* FIRCLSProcessReportOperation.m */, + 924FE8C8660ABC321E2BE8C94A1702F1 /* FIRCLSRecordApplication.h */, + 060CC8BFD82A68361F597F34930457CD /* FIRCLSRecordApplication.m */, + 2DF720DD665469A774CF01FFBAD2642E /* FIRCLSRecordBase.h */, + 68A8AAB178F233C0B13967A06044250D /* FIRCLSRecordBase.m */, + C9804D05C35FF1DD291AC9C0894A5B35 /* FIRCLSRecordHost.h */, + 7BEB9DF17EBF5909321944E7CC6498C9 /* FIRCLSRecordHost.m */, + 58F9C2791E5A67647907A7133F675B29 /* FIRCLSRecordIdentity.h */, + DF685DFA77326D8EAAAF2598883F56F8 /* FIRCLSRecordIdentity.m */, + A30C51E88E588C86FA1D9E8DE9779A67 /* FIRCLSReportAdapter.h */, + 814C6F9EC0C621F3CE4C609C316FFDDE /* FIRCLSReportAdapter.m */, + A99271F36551C1652FF3C85759D7CB13 /* FIRCLSReportAdapter_Private.h */, + B8FDE4F9BCEA63788B22E25481BE406E /* FIRCLSReportManager.h */, + A6A883C71E6CBF998A3024458645CB4D /* FIRCLSReportManager.m */, + 2BC672E68574FB2722DCA645BB15CBDA /* FIRCLSReportManager_Private.h */, + 5D131BE371CBFE130D89867B8E064F1B /* FIRCLSReportUploader.h */, + 18F7AFFCBB981A5B6010FB86D232D553 /* FIRCLSReportUploader.m */, + 843A7D4ED9CE137645ABB91C4875BEFB /* FIRCLSReportUploader_Private.h */, + 37C4832F00EE3E4DEBDBB310FAB46DA8 /* FIRCLSRolloutsPersistenceManager.h */, + C71474454F728EC2F1503A467235BFD1 /* FIRCLSRolloutsPersistenceManager.m */, + BD4A67DEF8B578F26F206004B017DEA3 /* FIRCLSSerializeSymbolicatedFramesOperation.h */, + 7F76AAD62A4A84BFE0581D0C7BEE8E7F /* FIRCLSSerializeSymbolicatedFramesOperation.m */, + 087E8D30407214C477A95FDD49C95C30 /* FIRCLSSettings.h */, + A4FD66189E78011EBD505204D5031AA3 /* FIRCLSSettings.m */, + B1A4DD032645B1162F1AEC5E2E58CD69 /* FIRCLSSettingsManager.h */, + 32E65117318E5B38802ACB90B12EABC5 /* FIRCLSSettingsManager.m */, + F241586E839BA67D4272890DC9FF1F7F /* FIRCLSSignal.c */, + C57FCD656B455BFA73C354814132DD67 /* FIRCLSSignal.h */, + 43C1871CCE14AF1BC38FEB833AECF454 /* FIRCLSSymbolicationOperation.h */, + 5E80B7130BC2F64202AB13497088153E /* FIRCLSSymbolicationOperation.m */, + 0FD002B29C0EB41C532916678D2C2308 /* FIRCLSSymbolResolver.h */, + FFC6EADF4B6C2CC4616BEE1E42AEF5A4 /* FIRCLSSymbolResolver.m */, + 5265C01DC45E528FBA0FFE4DFFE90730 /* FIRCLSThreadArrayOperation.h */, + 3F1393803DCB326B4FAA0DC80356DF7D /* FIRCLSThreadArrayOperation.m */, + 12F21DBE304707FF6CE2EAF4CE7A4EF8 /* FIRCLSThreadState.c */, + 0DD073421759B00E23FB08B1F75EC155 /* FIRCLSThreadState.h */, + AE8FF765072302853E758B7BE874C87A /* FIRCLSUnwind.c */, + 64D6422854E4C1D922D158AA82F9AF1B /* FIRCLSUnwind.h */, + 4035964C91C1B0CA76EA274AF5C93909 /* FIRCLSUnwind_arch.h */, + 5B01756129B6690A81409AE25328118D /* FIRCLSUnwind_arm.c */, + 1F42A07890ACB9ABA006BAC6D7E0084D /* FIRCLSUnwind_x86.c */, + AD703333F9B0745C2D257492FD12722A /* FIRCLSUnwind_x86.h */, + B873FAF8312CC7BC6F728E5F19A484FA /* FIRCLSURLBuilder.h */, + 7EE640A447F7A826C01D825C868E41C9 /* FIRCLSURLBuilder.m */, + 9B1FA6B3964F94D088403931F2AB55BD /* FIRCLSUserDefaults.h */, + A23261055B8F9FB83FA551DDB4797D11 /* FIRCLSUserDefaults.m */, + 8A667B8A1F9D03FB9C3E9A3A37DC1A8D /* FIRCLSUserDefaults_private.h */, + 946744B8CA3FC88BA9ECC2FA7DE8A2F5 /* FIRCLSUserLogging.h */, + 99552BF905D8E4331EFB57956A0A736D /* FIRCLSUserLogging.m */, + BAB000C6FD1E36F2F5C4B7741FC84C71 /* FIRCLSUtility.h */, + 85E3BEBDCDFBC21B3230D522B661A6EC /* FIRCLSUtility.m */, + 5B7BB3434B89A73963792BF227173DD7 /* FIRCLSUUID.h */, + DB2BBA62CE19F6A33D6577F5944804CF /* FIRCLSUUID.m */, + 1A1DB983C34B2FD725FAC923C3A37A20 /* FIRComponent.h */, + 9CDB2DEADAF8AE9B512CF1689B83B605 /* FIRComponentContainer.h */, + 7C5753C964A382D2D4AC757CC424DFC2 /* FIRComponentType.h */, + F5E12A948945215BBC2C36B65AFE1D0D /* FIRCrashlytics.h */, + 01FCE3564F910A6112B6A8394DABD2EF /* FIRCrashlytics.m */, + 9E9152196876F701FA6A08C1E20930CE /* FIRCrashlyticsReport.h */, + 9319249E7AE5E567BAF1865989044E9F /* FIRCrashlyticsReport.m */, + 62F3F90BEEA6A0BEA026D0F582C4BD64 /* FIRCrashlyticsReport_Private.h */, + 8C4C6536679FF5808BEE94412E4735F6 /* FirebaseCoreInternal.h */, + 4D8B8BD8FA97850F82DEACDA6D2564F7 /* FirebaseCrashlytics.h */, + 3D4CFAD3D4543185148C01387890F561 /* FirebaseInstallationsInternal.h */, + 0B521A65D627501A9EBEF884958EA814 /* FIRExceptionModel.h */, + 0DF97D07B88A1545D907FC37F67BA03A /* FIRExceptionModel.m */, + D805237EFA8EF328F3B519266FCC9303 /* FIRExceptionModel_Private.h */, + C3D7D629150C258C8C14603B1B8DEB74 /* FIRHeartbeatLogger.h */, + 017F5BFF2516DEAE325B5310B6A7C52B /* FIRInteropEventNames.h */, + 93C37CDFEB5DFF48E588D628FC88FA86 /* FIRInteropParameterNames.h */, + EA41D8F1297358F48A5C6FE9595C51F2 /* FIRLibrary.h */, + 405A27AA81B7BAD6FB4DEE0CF6DA5DD7 /* FIRLogger.h */, + 87C918E4D0BA80C4D8BA0EA103659C98 /* FIRStackFrame.h */, + 84FC089496B0A9AB12314969A2DE2B5E /* FIRStackFrame.m */, + D3EDA4CA6B3DF59B7470658EAD4A0726 /* FIRStackFrame_Private.h */, + 7F26F07A4A325DDC3BE1F76D2E2D21D0 /* StringToHexConverter.swift */, + 2194CB9430A0DC0DF4F94215C6594C9F /* Resources */, + 8FC4193FE58E2DFABC5702EE53C7CE07 /* Support Files */, + ); + name = FirebaseCrashlytics; + path = FirebaseCrashlytics; + sourceTree = ""; + }; + FA2BF906BA66F0EFAE2A93A940679FEF /* Support Files */ = { + isa = PBXGroup; + children = ( + C00CE81184920EC56452C7DD1D14EED1 /* PromisesObjC.modulemap */, + 70CE9B00B0C5DDF3A0264BD2D5EAAC9B /* PromisesObjC-dummy.m */, + FBE64380A7A08949D8A04B63EA06E134 /* PromisesObjC-Info.plist */, + B5F5B453B8863EC9F159C5273DBA728D /* PromisesObjC-umbrella.h */, + 320664D59D6FEE7224D3B503B842956D /* PromisesObjC.debug.xcconfig */, + 87030F8AC3EDC19A2886F3EA674BDB64 /* PromisesObjC.release.xcconfig */, + 8E9298A227F92C31B2AD2F9A1FB3130A /* ResourceBundle-FBLPromises_Privacy-PromisesObjC-Info.plist */, + ); + name = "Support Files"; + path = "../Target Support Files/PromisesObjC"; + sourceTree = ""; + }; + FF8D5B0AC9E600C98C0C22F0816C65FA /* Support Files */ = { + isa = PBXGroup; + children = ( + 87E2CB0838307AD504DB6E27B4DCC32F /* FirebaseSessions.modulemap */, + D5F4169D3FC469172BE10FF04E507D38 /* FirebaseSessions-dummy.m */, + CC950F2ADE69BD70EDFD94D222E702E1 /* FirebaseSessions-Info.plist */, + 15ABC8AE36399535577898CA8432E164 /* FirebaseSessions-umbrella.h */, + FC2B5772E909C03957AD6D8CE697FADD /* FirebaseSessions.debug.xcconfig */, + 88AD9A5A20918C0D9CABCF967A0CACAF /* FirebaseSessions.release.xcconfig */, + ); + name = "Support Files"; + path = "../Target Support Files/FirebaseSessions"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 1663B7421DCAFCBD5F5787299E7A4482 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + D9C802FC5E931B7CD4DC40497F3DCA17 /* FirebaseRemoteConfigInterop-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1A84A53BA8D2A245E029029A02B76F4E /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + F2375C10EF8FE2CCF181212D6907FE04 /* FBLPromise.h in Headers */, + DA3ECF9B0B0387D0D866D17C8A9921D0 /* FBLPromise+All.h in Headers */, + 0EB3A13390A65E25588109ED1E29EC31 /* FBLPromise+Always.h in Headers */, + 558FBFE06C9E98E454CF04C4F57ED39A /* FBLPromise+Any.h in Headers */, + 13D1FA43A710E67F644E2C7B7BEE56E8 /* FBLPromise+Async.h in Headers */, + BE4CD650F1DD0A5B6D235C313ECCBD64 /* FBLPromise+Await.h in Headers */, + 7864BABE506E059F1A96282C38714944 /* FBLPromise+Catch.h in Headers */, + 63AAD8A825537E5A67DF0422794222F2 /* FBLPromise+Delay.h in Headers */, + A6A480CC48505EBECC2B62C2EA13430C /* FBLPromise+Do.h in Headers */, + 2E6C7B2BACD02D0F7E2DC60C4E6F3B7F /* FBLPromise+Race.h in Headers */, + 2E6B780535E1FBBCEA655AF6E2981F2C /* FBLPromise+Recover.h in Headers */, + 2E7E7B7808EF5577BCD81CC459EE0487 /* FBLPromise+Reduce.h in Headers */, + 1D0BD4847CBE978A9D5524DD1894784A /* FBLPromise+Retry.h in Headers */, + FDADB1EE603BEE6C32355B424A9F321F /* FBLPromise+Testing.h in Headers */, + ED349D74640C5EE5D50D7BDBEFA99745 /* FBLPromise+Then.h in Headers */, + E2DE213ABB0254BB85C90BA3A68E057E /* FBLPromise+Timeout.h in Headers */, + 3C64170837FDDD55C0089BEDBDFF07E9 /* FBLPromise+Validate.h in Headers */, + AC419D8184161CD92F445524E70A161A /* FBLPromise+Wrap.h in Headers */, + 107F78620AB880CA8E8A05E77D2809D1 /* FBLPromiseError.h in Headers */, + 3DADA2CFAC2C6B2CF351166A46A839C8 /* FBLPromisePrivate.h in Headers */, + 71EB4C84D81B48392C331BBFAE2648AA /* FBLPromises.h in Headers */, + 1520E5AF81663189CAAC569B2D32DBA4 /* PromisesObjC-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2450C419E9AD5F959D135926CEEC05EA /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + F15DBB9C08A202BAF0F591CF639A8B72 /* FIRAppInternal.h in Headers */, + DEC410E13A113AEC0A26D97BAE90F8DA /* FIRComponent.h in Headers */, + 90D5A7A71FB4963A14D363A668F0F78E /* FIRComponentContainer.h in Headers */, + 844F7C9361AEB77302090187DB0618F4 /* FIRComponentType.h in Headers */, + 9BD78DA7C373ABC6BDF39EE1D9FC927E /* FIRCurrentDateProvider.h in Headers */, + 7EF9AF554B0FAE1A9437A579ABF8D152 /* FirebaseCoreInternal.h in Headers */, + C183322903177EA59850B20F94D97CB8 /* FirebaseInstallations.h in Headers */, + CAFFAF927A515064D7FC8F1668CE0844 /* FirebaseInstallations-umbrella.h in Headers */, + 45CB6307F21E7E33AD61891D6079F682 /* FirebaseInstallationsInternal.h in Headers */, + BC65CAF9073F1E8C94B1CE22E34DF9DA /* FIRHeartbeatLogger.h in Headers */, + D14517641061AC41A694AD3264FE4041 /* FIRInstallations.h in Headers */, + C42F45102AB280B4CA9255F1549626AE /* FIRInstallationsAPIService.h in Headers */, + AD1ABF91892AA15DE03D894602D882F0 /* FIRInstallationsAuthTokenResult.h in Headers */, + BC248F24375838DEEEDC25471C3E0252 /* FIRInstallationsAuthTokenResultInternal.h in Headers */, + C1C3C33281A565AA925AD9037AEF50A7 /* FIRInstallationsBackoffController.h in Headers */, + 9E4301FDEAD6BFFE5CBBF4BABBD89D3F /* FIRInstallationsErrors.h in Headers */, + E7006B811D42800A2C1154B3BF097678 /* FIRInstallationsErrorUtil.h in Headers */, + 1D666D284C590ECD65FA2E774BDD8CC3 /* FIRInstallationsHTTPError.h in Headers */, + 288C75D6217D270AC08072113D94C5B2 /* FIRInstallationsIDController.h in Headers */, + EE5D6707A915C51EAD35CAF633F1775E /* FIRInstallationsIIDStore.h in Headers */, + FBC6536B77183CAEC13BB4D8046C6F5C /* FIRInstallationsIIDTokenStore.h in Headers */, + DBF255B0F6FB75012B26271370517880 /* FIRInstallationsItem.h in Headers */, + F2CE87A578929DC63B552E6589FDE075 /* FIRInstallationsItem+RegisterInstallationAPI.h in Headers */, + 26027D7C3E9C906D89BBE8782910852F /* FIRInstallationsLogger.h in Headers */, + 9E42D0DCD9D25FF02F7AE47080883218 /* FIRInstallationsSingleOperationPromiseCache.h in Headers */, + 0932CE085A9F031247976BCDDB9EEE82 /* FIRInstallationsStatus.h in Headers */, + A6DFB4B904231EC684C43E2F00F97312 /* FIRInstallationsStore.h in Headers */, + 1F75F912151C62FBBAB8821F80D08428 /* FIRInstallationsStoredAuthToken.h in Headers */, + CD25622DF8C812C65BF6E7FEE1CDB832 /* FIRInstallationsStoredItem.h in Headers */, + 8C6BEE1247E4766A0003D344B0119E3F /* FIRLibrary.h in Headers */, + 9688E9B84D7C8D7A36CA05C0F4016DF0 /* FIRLogger.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 5F9CA146A486B15F616296C40996A39D /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 7C519FA9E861261CE89DB368DAABA7C1 /* crashlytics.nanopb.h in Headers */, + F37872903354C07DA3F20A9362722793 /* dwarf.h in Headers */, + ACAA53257411877CE561FB476AB066A5 /* FIRAnalyticsInterop.h in Headers */, + 83D2170CC90A070963865D02C530D3C3 /* FIRAnalyticsInteropListener.h in Headers */, + A6F3421F005F855880FAF68557A717F9 /* FIRAppInternal.h in Headers */, + 1F25E108A60C7ECC0A1B9F7F16CC8FCE /* FIRCLSAllocate.h in Headers */, + 5960B19D2D02380A1BB29857216D16E6 /* FIRCLSAnalyticsManager.h in Headers */, + F1BEA81550E77F6730B861A768778A34 /* FIRCLSApplication.h in Headers */, + 921B06126E5934CC3CDD75E847C0E03A /* FIRCLSApplicationIdentifierModel.h in Headers */, + 43AF89A9D73FF24A3091C2E5447643AC /* FIRCLSAsyncOperation.h in Headers */, + BE06C2F35DD79E93083E4900F1B2FFCA /* FIRCLSAsyncOperation_Private.h in Headers */, + 41D8BC323C08A701FBF964C7D359B787 /* FIRCLSBinaryImage.h in Headers */, + 31843A688DD8FDC2A68BEE81507C7612 /* FIRCLSByteUtility.h in Headers */, + 55316220FF36AF4675021F9CD6965CF4 /* FIRCLSCallStackTree.h in Headers */, + 432A8633160A66ECF85E8A7553CAA795 /* FIRCLSCodeMapping.h in Headers */, + 6FE95F0DC6FABC3ADF7E0D2DAE0190CA /* FIRCLSCompactUnwind.h in Headers */, + 0A1F184E81E7FF80E53B8DD81291FA12 /* FIRCLSCompactUnwind_Private.h in Headers */, + 7466E182BA226654680743A54E17E9E9 /* FIRCLSCompoundOperation.h in Headers */, + BBC78E187B4246D27AB0CDAD6348A415 /* FIRCLSConstants.h in Headers */, + DD32A03DDA9BA8B44788950A70D31423 /* FIRCLSContext.h in Headers */, + 3E80BF7E87349B39909E4667D23481E3 /* FIRCLSContextInitData.h in Headers */, + 4BA72B8BDB176E605A6A79063A02756F /* FIRCLSContextManager.h in Headers */, + D5B2C527D261870C0B319388FECC53DD /* FIRCLSCrashedMarkerFile.h in Headers */, + ECAFFCFC9C1FEC1677D6B64965C13ED2 /* FIRCLSDataCollectionArbiter.h in Headers */, + 3BA244DA19C9677AFBEE8E8DADD58CA5 /* FIRCLSDataCollectionToken.h in Headers */, + 5A883D789AEEA201D08961C95F3A03CB /* FIRCLSDataParsing.h in Headers */, + 9637A55E8D666CF881D4505DDF7AA584 /* FIRCLSDefines.h in Headers */, + B35DFBDB89DFDC118AB1177B71FEEA83 /* FIRCLSDemangleOperation.h in Headers */, + 5AFA670233B0989E3D21BF6F669E2AB1 /* FIRCLSDownloadAndSaveSettingsOperation.h in Headers */, + 2AFD13ECCFF88FC50783E38BF7D24A14 /* FIRCLSdSYM.h in Headers */, + 2C1F76CFDD3DAFB9BFEBF30F1BC0A8A5 /* FIRCLSDwarfExpressionMachine.h in Headers */, + E817877B92E3179F9F06DBE84190F48D /* FIRCLSDwarfUnwind.h in Headers */, + 53F04602C362D6F9065B7550061F6FCC /* FIRCLSDwarfUnwindRegisters.h in Headers */, + 601D54656496EC341F97E6809827D9E7 /* FIRCLSException.h in Headers */, + 055FCE1CE4FC9321961C1CF67117D3C1 /* FIRCLSExecutionIdentifierModel.h in Headers */, + 342FFA8F186EAC0D6C9D823C06BF8A5E /* FIRCLSExistingReportManager.h in Headers */, + E96B5291AEC756610D220D4814FDE62D /* FIRCLSExistingReportManager_Private.h in Headers */, + AB6B258C84B14272FE111C6A9EBFFD6D /* FIRCLSFABAsyncOperation.h in Headers */, + 5AB093CFAB7386AB921F8EDD61BDD453 /* FIRCLSFABAsyncOperation_Private.h in Headers */, + F58544FB78423DB5F260CB3044A99216 /* FIRCLSFABHost.h in Headers */, + A2FA722779F4D3C5937240D7AB5241AF /* FIRCLSFABNetworkClient.h in Headers */, + C974441E3088753CA0052B09C36C2FD8 /* FIRCLSFeatures.h in Headers */, + 35EA3E1B10279345F5D3EDAE00304C5F /* FIRCLSFile.h in Headers */, + D8034B6F59B5C62FB53866C337D40880 /* FIRCLSFileManager.h in Headers */, + 8C4DADB96458B23183E3B32405631885 /* FIRCLSGlobals.h in Headers */, + EB06F2FD948319F611E0D5227F13E941 /* FIRCLSHandler.h in Headers */, + F98E0FE3355BEE76FD800160FD4EE623 /* FIRCLSHost.h in Headers */, + EB766AF23A9FE7A967742B7017FCECD1 /* FIRCLSInstallIdentifierModel.h in Headers */, + FDD5E68F33BFCA7297075A004E0EAE0E /* FIRCLSInternalLogging.h in Headers */, + EFDAAADC763677CAD9004F5DE3AA1852 /* FIRCLSInternalReport.h in Headers */, + 1797F6ACD264D50BE103569E79319EF6 /* FIRCLSLaunchMarkerModel.h in Headers */, + 73116F88F7B21E3AE68C47A42DF5D7B8 /* FIRCLSLogger.h in Headers */, + 0B2925EE7EE0555A0DB9A76AEED60D03 /* FIRCLSMachException.h in Headers */, + 88448E30E8E4933F4818F18DB513E10A /* FIRCLSMachO.h in Headers */, + F060A9FDF787A8A912899DF9B1097F03 /* FIRCLSMachOBinary.h in Headers */, + A4A8D478E91AD41B2F73A03F089AD067 /* FIRCLSMachOSlice.h in Headers */, + 062654AFE46612A5BE3342F5018EC88C /* FIRCLSManagerData.h in Headers */, + 5693402C5FE481037EB077CD1846C12A /* FIRCLSMetricKitManager.h in Headers */, + B4E5A3B187AD55E00F1CD85AAC23E8C8 /* FIRCLSNetworkOperation.h in Headers */, + DBAE0767EBF4DF98F21A123B8E97CEFA /* FIRCLSNetworkResponseHandler.h in Headers */, + 8A585C217645847AF19FE9DBF155316B /* FIRCLSNotificationManager.h in Headers */, + 17E72E17601B2DEEE9C19C1225DD7263 /* FIRCLSOnDemandModel.h in Headers */, + B2BE7696FEC99184B2D953DEB9704E93 /* FIRCLSOnDemandModel_Private.h in Headers */, + 3166D6E317BAC49BB7FD87F9939BAB74 /* FIRCLSOperation.h in Headers */, + E319C831EC32D784B9593FC12FA4E635 /* FIRCLSProcess.h in Headers */, + 957FEBF524624E2CCF8F21924BF505D6 /* FIRCLSProcessReportOperation.h in Headers */, + 76A210958B71CAAEEABB7F4A31D544A6 /* FIRCLSRecordApplication.h in Headers */, + 491A08E1B4C6A15DAACD54F162592CC2 /* FIRCLSRecordBase.h in Headers */, + 1BA474695EFC108B62F2DD5B7B75BA40 /* FIRCLSRecordHost.h in Headers */, + 27E999A077388E2CF8F03789C5719C0B /* FIRCLSRecordIdentity.h in Headers */, + 76214DE3AC8C33A0F13505465AF4D477 /* FIRCLSReportAdapter.h in Headers */, + 8F4FBDF827D51F1E5B1C73CCB948081E /* FIRCLSReportAdapter_Private.h in Headers */, + 4106232EAD19C18BD2FEE0A8A68E2322 /* FIRCLSReportManager.h in Headers */, + 736C8D6800E95449F224C9291CFC8050 /* FIRCLSReportManager_Private.h in Headers */, + 3A8D1F6B60A6E2A684C877DB6BE4FEF4 /* FIRCLSReportUploader.h in Headers */, + 34043F3DEB9E6AD7A50684DAA9A004C6 /* FIRCLSReportUploader_Private.h in Headers */, + 74AAB4190FD0E2C555DD64C2495FA6F5 /* FIRCLSRolloutsPersistenceManager.h in Headers */, + D3ACF29E7ED1ADD11C3468216E7CE09C /* FIRCLSSerializeSymbolicatedFramesOperation.h in Headers */, + E242BC13FA8E04EA832E80A69C2B9670 /* FIRCLSSettings.h in Headers */, + E3497EDC2DD0B95E3348C1D59C06AE89 /* FIRCLSSettingsManager.h in Headers */, + 152E1979B64224C036A67A135DDC3BB3 /* FIRCLSSignal.h in Headers */, + 214523E405E6318F36B42A46D8D55088 /* FIRCLSSymbolicationOperation.h in Headers */, + A5A42D4935209BCAEF68858EB72BD4F6 /* FIRCLSSymbolResolver.h in Headers */, + 360A6CE0F33B5A4AAECB1C6C0CF4CD9A /* FIRCLSThreadArrayOperation.h in Headers */, + 4E4A88A399B2DE9D5FE3FB201499B9D7 /* FIRCLSThreadState.h in Headers */, + 160C160EAEBAF3E77FD13A53AA459836 /* FIRCLSUnwind.h in Headers */, + 5AC2E27F5DA0F438AB8AF1D2B50FDAA4 /* FIRCLSUnwind_arch.h in Headers */, + 2414A0FF76268D732929851E52A2C573 /* FIRCLSUnwind_x86.h in Headers */, + 5B296D3A0E6DDDDE13797730F9AA2749 /* FIRCLSURLBuilder.h in Headers */, + 41603336ACB938B20BE77A3348245FDF /* FIRCLSUserDefaults.h in Headers */, + 46F622CD7DC408AF48BE7ACEFA10DA0A /* FIRCLSUserDefaults_private.h in Headers */, + 120463CCF964EAEC4293AF335D4EC20D /* FIRCLSUserLogging.h in Headers */, + 28B05F735A29B22073D1344FD7037455 /* FIRCLSUtility.h in Headers */, + 8062F8F2C973694735E52B4745F8A966 /* FIRCLSUUID.h in Headers */, + 662EEBB687037E84AFD71ECD268A3925 /* FIRComponent.h in Headers */, + A8F5DB2062B75C76F6D18C2D4DCD456F /* FIRComponentContainer.h in Headers */, + EEDD21FF5A34E37638F282D2B80489EA /* FIRComponentType.h in Headers */, + 34533D0D914DF6EAE5224FB5C4AC1754 /* FIRCrashlytics.h in Headers */, + 395FDBC9D0588B4F47CE8B60F2B571D1 /* FIRCrashlyticsReport.h in Headers */, + 45B33C5D2B040FB5B245F1EF2353DFF2 /* FIRCrashlyticsReport_Private.h in Headers */, + CEC2B3E4DC18511BF86E251EB8FC74E5 /* FirebaseCoreInternal.h in Headers */, + 0D6EBF8FC2F718A12F8760F5609397C4 /* FirebaseCrashlytics.h in Headers */, + 37D159A64E67F5944AD7B8C9325B4A1A /* FirebaseCrashlytics-umbrella.h in Headers */, + A9883A7D6D2F6E331DD1125C39515F15 /* FirebaseInstallationsInternal.h in Headers */, + 670D2C009DF2F7DB4E1EBC23080D64A8 /* FIRExceptionModel.h in Headers */, + F9D0D939B0B060EDB5310CA8AF5BC207 /* FIRExceptionModel_Private.h in Headers */, + 4DEAD39E3A33CCA4105A3ED225A5D5B9 /* FIRHeartbeatLogger.h in Headers */, + C73AA099611ACD9C596C2A0BA1F91CA3 /* FIRInteropEventNames.h in Headers */, + ECDF258DA8B84CE3808644F0727DB770 /* FIRInteropParameterNames.h in Headers */, + E1E195E36CF477D73E68053A2C5D23FA /* FIRLibrary.h in Headers */, + BBA0883AC96B78C1306EAFE4B4FC2285 /* FIRLogger.h in Headers */, + 05593F3B46315141F9C47A71C7815531 /* FIRStackFrame.h in Headers */, + 2D66BCA16FF51C2632D66048492B7E0A /* FIRStackFrame_Private.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 6DAA78CB0BB50B1DF0F731C344939485 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ED54C348808DAD6561E4A3C3FB631127 /* PromisesSwift-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 88B549601A8F2DA6519349DAF873A54E /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 2156A3F6A0A6341B085683754093D724 /* GoogleUtilities-umbrella.h in Headers */, + 5BC3D71B6715E66A5B1701FE08AEE5B1 /* GULAppDelegateSwizzler.h in Headers */, + 520FC369F2241FD6954B09A76703343B /* GULAppDelegateSwizzler_Private.h in Headers */, + 708B76BFE1D16E8E96404A82E6A8BF47 /* GULAppEnvironmentUtil.h in Headers */, + 8F79A7CAD74BA3B7FFB15D5283732346 /* GULApplication.h in Headers */, + D146E1C62F26E6DD90E2697CBB37A8BF /* GULKeychainStorage.h in Headers */, + 3C8122247F01D1D8FA6061CD54D48948 /* GULKeychainUtils.h in Headers */, + F31756354D6ACB5D3C57890158B81F39 /* GULLogger.h in Headers */, + E915EA73D04CC6A43ABF1E247D29F8F8 /* GULLoggerCodes.h in Headers */, + DE28E0B4B0688F862B79B8083D10A51A /* GULLoggerLevel.h in Headers */, + D811F3A64399C00CCFF5DFB774502EF7 /* GULMutableDictionary.h in Headers */, + 57D21A30916C67B027BB05FC22328610 /* GULNetwork.h in Headers */, + 86F0E3136DAEC762E5A0DD7D7D11961B /* GULNetworkConstants.h in Headers */, + A6A5335CC4712103CE1F38EE239F96D8 /* GULNetworkInfo.h in Headers */, + 0E036C2E64B45B14232CC0FBD4F72798 /* GULNetworkInternal.h in Headers */, + 85FAD6E88C9D435ADAA1015F92FF6914 /* GULNetworkLoggerProtocol.h in Headers */, + 69342F3087ABACE850E6D743204BD707 /* GULNetworkMessageCode.h in Headers */, + CFB16F56A7D7186D601BFFF5B4E39D61 /* GULNetworkURLSession.h in Headers */, + 3141BC7FC9D854D42F2A04DDDFAC8BDF /* GULNSData+zlib.h in Headers */, + 14DFEC76B3F76D8F2D6A08236F7F074F /* GULOriginalIMPConvenienceMacros.h in Headers */, + 3730D1693882A6026E06B0BA02FFA12A /* GULReachabilityChecker.h in Headers */, + 112883FB5F6DFF8CA1D2604D2F3D2C93 /* GULReachabilityChecker+Internal.h in Headers */, + CF1175A05670DB5293660C30F26223BC /* GULReachabilityMessageCode.h in Headers */, + 9D1CB8F7AD4288C505953FED072ACBD2 /* GULSceneDelegateSwizzler.h in Headers */, + 743C6CB5CD83267D2A066EDCCBC64758 /* GULSceneDelegateSwizzler_Private.h in Headers */, + 13ED8C4B93C1CE275A2D729963588057 /* GULSwizzler.h in Headers */, + 6420182F1011B03D77290F862B246B3F /* GULUserDefaults.h in Headers */, + D0C50DB9F9ECDA1E3FE4D704838D485A /* IsAppEncrypted.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 96BF8F0CF4E778AC47F554A089981743 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 05916C1D212E2A89693D7ACE3A4B6E58 /* FIRAppInternal.h in Headers */, + 1FD3344EA93D4E6B64820688B02B92C4 /* FIRComponent.h in Headers */, + 0C471FE123727890F5038C0BC3076C22 /* FIRComponentContainer.h in Headers */, + 4DEF4ABC7CA070F2AEFDF261A32DF356 /* FIRComponentType.h in Headers */, + 269DB94EDA31583E5B77E25CF3987BFF /* FirebaseCoreExtension-umbrella.h in Headers */, + 3D1EEF4B54CC0DFF7CA6051D25B08AE6 /* FirebaseCoreInternal.h in Headers */, + 4247A00A2B8F0684E225CC36047F7DEE /* FIRHeartbeatLogger.h in Headers */, + 40D8DCCD636EE210777C5C3F57ECC80A /* FIRLibrary.h in Headers */, + 411F843F7BA12A1394626834E0C1B941 /* FIRLogger.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 98BF3CA6325C74A194CACEA88FF71B70 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + B57162BB3649BD2BB97029D08C705E19 /* FirebaseSessions-umbrella.h in Headers */, + DAF67810EB208F691AF76E40C87C148B /* FIRSESNanoPBHelpers.h in Headers */, + 4A5AC3CA93AE337464541313731A7A9C /* sessions.nanopb.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A0C999B751F9111287799956D01F264E /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 3A1AEF20E3CCAD12A16647DEE9C9676B /* FirebaseCoreInternal-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C3093B166B461392EC5F850FB5AA999D /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 2002913D5B08708080BDB305AFED98B9 /* FIRAnalyticsConfiguration.h in Headers */, + 58A317419E19D1C23BA647CEB4776F85 /* FIRApp.h in Headers */, + 6D2DF47A3BAF471A033D0003B76DC592 /* FIRAppInternal.h in Headers */, + 9D8154DA1A40BFB0826D439419880896 /* FIRBundleUtil.h in Headers */, + 94AF1546C8B8A9161A1A6E97426F6252 /* FIRComponent.h in Headers */, + EC48E1AAF6D4E9A8CFF82BD4F9EFCC46 /* FIRComponentContainer.h in Headers */, + 8DFEEDD448D06939AE7BF9AFF73B1672 /* FIRComponentContainerInternal.h in Headers */, + 8E235264B19BB39546A286DA29C53D3A /* FIRComponentType.h in Headers */, + 2E7CF40C448F9DDC4A7B330F4D736408 /* FIRConfiguration.h in Headers */, + 810807B21C3D8B0934058F3B3F7FF26B /* FIRConfigurationInternal.h in Headers */, + 845FC9D1F56ED31BE92DFBAFAB8D680D /* FirebaseCore.h in Headers */, + 91F4C14A683E9A6B7929D0AAF906CA98 /* FirebaseCore-umbrella.h in Headers */, + EBD1C33D9B1037D13D181CA0025C77A9 /* FirebaseCoreInternal.h in Headers */, + 043936EC88DD0E9E608E573809B08BCB /* FIRFirebaseUserAgent.h in Headers */, + DF19D2C784FD3B352765E99ADF612F6F /* FIRHeartbeatLogger.h in Headers */, + 55C4B450EB7756B7537941B84CAE5281 /* FIRLibrary.h in Headers */, + F5BE05EAEA0D5EEA5209007E85D90E99 /* FIRLogger.h in Headers */, + 182DCB1148B1E6A750415D05F21D5EC9 /* FIRLoggerLevel.h in Headers */, + F116EB3DF8F9D8BC3F097E54650B735A /* FIROptions.h in Headers */, + 7BEE5CE3066E86F9A376DFE4CDA8C54D /* FIROptionsInternal.h in Headers */, + 1EC5973F4EB31D2EA33170F97B2FBF12 /* FIRTimestamp.h in Headers */, + E3E686B96E4FCEA44AA6661AD68B60FF /* FIRTimestampInternal.h in Headers */, + 525D13DD5832540814E5616565D446C0 /* FIRVersion.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + CACA996CC0E7F15C7AFA822ED7433A23 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 0B5B75DEA77EBD9393A6E4BBC9191C23 /* Pods-TastePick-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + CC1C540E3930DE7B2F6E2FA75FC484DB /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + AA4FAD29657AB8347F1081BCF7E93B71 /* cct.nanopb.h in Headers */, + 0BCCCD9FA6EE58241B4CF6B1C42D0906 /* client_metrics.nanopb.h in Headers */, + D67BDC6DBFCB5E79D45575B2A715F194 /* compliance.nanopb.h in Headers */, + D97B5FCA31078C5FA63D0D1363F8793E /* external_prequest_context.nanopb.h in Headers */, + EFC214036F5502CDEF96C5A542B16104 /* external_privacy_context.nanopb.h in Headers */, + 0D5DE7BACE63707FBFCB9ECA478ED243 /* GDTCCTCompressionHelper.h in Headers */, + 661C69B122A9B3B1C5C95EE6CBA7DF67 /* GDTCCTNanopbHelpers.h in Headers */, + 47A896ACF46A488708EA3F254E540802 /* GDTCCTUploader.h in Headers */, + 393EEBCF227242DD2340C48816C8E8DE /* GDTCCTUploadOperation.h in Headers */, + 17FAA9E125833B53477AABA778339AFA /* GDTCCTURLSessionDataResponse.h in Headers */, + 22361A6E93C21B375FD8F884952296BA /* GDTCORAssert.h in Headers */, + 4267AE966A8705A83DC409E1EC3E4E36 /* GDTCORClock.h in Headers */, + 7D8BB2B1E5341A55CA005B7E949C532D /* GDTCORConsoleLogger.h in Headers */, + 98FE404F1DA5E5F7F4C15FC437336C08 /* GDTCORDirectorySizeTracker.h in Headers */, + 01ED96999FAECA476A6B05A5D0AB41DE /* GDTCOREndpoints.h in Headers */, + 057F1F07F30477EB7A8F601C8344CA15 /* GDTCOREndpoints_Private.h in Headers */, + C2E5F9421D107C19DADFBC625A9A3339 /* GDTCOREvent.h in Headers */, + E1253F2DD86DFEC475F68CE8EF40925F /* GDTCOREvent+GDTCCTSupport.h in Headers */, + B85D750662D7E40EF29DD08AB00E3929 /* GDTCOREvent+GDTMetricsSupport.h in Headers */, + 761912A96B2D375810BC1EC80474D7E6 /* GDTCOREvent_Private.h in Headers */, + D0F6BBBA252A0E0155EF6EB0CB5F09C4 /* GDTCOREventDataObject.h in Headers */, + F0DFF5AE65382BD85FE6077D353C3296 /* GDTCOREventDropReason.h in Headers */, + 37B2EE8F07B91BEE5313CAB3B05B3BC6 /* GDTCOREventTransformer.h in Headers */, + 261385B144F85ED328EDB45E3C31F257 /* GDTCORFlatFileStorage.h in Headers */, + 07008DA89D59E1830C774E3E61FD65D1 /* GDTCORFlatFileStorage+Promises.h in Headers */, + 70E1000B1E1BA39ACEE597D36909851D /* GDTCORLifecycle.h in Headers */, + 7AD4274199ADF97A40E074B42F8E7CC7 /* GDTCORLogSourceMetrics.h in Headers */, + ABC150185072B24CB5A3B047D7E6805A /* GDTCORMetrics.h in Headers */, + F4610468A7F9259FB21E9A01D280CF32 /* GDTCORMetrics+GDTCCTSupport.h in Headers */, + 54F6964123FE7FBFEFAF81B8415DAF88 /* GDTCORMetricsController.h in Headers */, + 727B391BA00F33EB592FDB6C6E7550C4 /* GDTCORMetricsControllerProtocol.h in Headers */, + 76BB123B5A56448868FE59685143B9C3 /* GDTCORMetricsMetadata.h in Headers */, + 378A4CBC32EB5FFEEC702E0AB41C0CE0 /* GDTCORPlatform.h in Headers */, + 1DE3608D257DE0F803B41CD19D17F6D4 /* GDTCORProductData.h in Headers */, + B619CB521D8C6E6BFC1A10063ECD06F2 /* GDTCORReachability.h in Headers */, + 4FBD013ABBDCDA7D051FFDB1D2D1855F /* GDTCORReachability_Private.h in Headers */, + B89E58AAA80E228AF70F10A47D82090A /* GDTCORRegistrar.h in Headers */, + F800A27E336628B2A3641D67EE4E4072 /* GDTCORRegistrar_Private.h in Headers */, + 5388AA9F5579D7A9D77E2C45166E8BB8 /* GDTCORStorageEventSelector.h in Headers */, + 7E56580CA0F7FC8C87133D6754B6F9BF /* GDTCORStorageMetadata.h in Headers */, + AD90FFA4D3EDC86651E2D54F6F751E91 /* GDTCORStorageProtocol.h in Headers */, + 1248703EED82292C27B270778CD0E1A0 /* GDTCORStorageSizeBytes.h in Headers */, + BDCE6106F40DB1C0FD6946F930B6864E /* GDTCORTargets.h in Headers */, + A0AC77ED57C19174948779C90E845AC4 /* GDTCORTransformer.h in Headers */, + 2243CBBAE5FEE418621A45ACFA7670E0 /* GDTCORTransformer_Private.h in Headers */, + DD34A2100E0A2750F0BD2A9C280F374D /* GDTCORTransport.h in Headers */, + 062510FB2DDC2CB0E480BD9FB6B01BDF /* GDTCORTransport_Private.h in Headers */, + BCDB8F9DEB39E43A15DA06DF60854478 /* GDTCORUploadBatch.h in Headers */, + 96D2A7562648D47FC9D8E8B443C8CA22 /* GDTCORUploadCoordinator.h in Headers */, + E62B299A966ECA0BD129F1F559928C76 /* GDTCORUploader.h in Headers */, + DF21EF2EA3BB8AC586DA00B67794D96E /* GoogleDataTransport.h in Headers */, + 8FA0A46DAE1C8A5BFA7A9FB03B54D71B /* GoogleDataTransport-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E9B7EB629ECBB1CE970A5932EADA32CC /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 99C5518A17183B5BBD6D9443AE165839 /* nanopb-umbrella.h in Headers */, + FD1B82372596048BB72D331926612A01 /* pb.h in Headers */, + 10784DF2FF3D8C9FB8C1F46B4A62402F /* pb_common.h in Headers */, + 471BAD961F19AB1648FD51005DA77CC7 /* pb_decode.h in Headers */, + E2E9BC8C14A384472C03365A45122F83 /* pb_encode.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 1001C16510D946B47CFF8B19DBC0B787 /* FirebaseCore-FirebaseCore_Privacy */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1980222F32F37BB8E602D386124CD12A /* Build configuration list for PBXNativeTarget "FirebaseCore-FirebaseCore_Privacy" */; + buildPhases = ( + 555DD2D72AA2C5D547A419FEE99C5EEC /* Sources */, + 86DE0F9F28848BEC1EACA092C3F9E20F /* Frameworks */, + 20FC8C14AB1A49D8D1CCFF751A09F1FF /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "FirebaseCore-FirebaseCore_Privacy"; + productName = FirebaseCore_Privacy; + productReference = 8BB937B1C0DFFCF92F41861C2BC54DDA /* FirebaseCore-FirebaseCore_Privacy */; + productType = "com.apple.product-type.bundle"; + }; + 17CBCC6221F62B870268E935098B7D7D /* FirebaseCrashlytics-FirebaseCrashlytics_Privacy */ = { + isa = PBXNativeTarget; + buildConfigurationList = 9951C1DDB84E948D6CA84EBAB70F7A3B /* Build configuration list for PBXNativeTarget "FirebaseCrashlytics-FirebaseCrashlytics_Privacy" */; + buildPhases = ( + F06E5CC4690B6DB0C70F01D2E4DE2FC6 /* Sources */, + 3EB36BA1EDF6164CEAB60B9278117B73 /* Frameworks */, + E3D4A8126CB79E6BEF5E2C2FAF0F2343 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "FirebaseCrashlytics-FirebaseCrashlytics_Privacy"; + productName = FirebaseCrashlytics_Privacy; + productReference = 859AE0302B28BD8AE67A780BFCAEE082 /* FirebaseCrashlytics-FirebaseCrashlytics_Privacy */; + productType = "com.apple.product-type.bundle"; + }; + 1BFBEDBF7E03729D43C96530EE190825 /* PromisesObjC-FBLPromises_Privacy */ = { + isa = PBXNativeTarget; + buildConfigurationList = 20B2A8D7471DCBB16F3A2257DCD6C02B /* Build configuration list for PBXNativeTarget "PromisesObjC-FBLPromises_Privacy" */; + buildPhases = ( + 865369FEBC726BB647CA34B8D8C9F940 /* Sources */, + 318AFB76D69A76F670332A09CC9BB69B /* Frameworks */, + A4C2E7DAC6B906E8D462DB20E2AA1E57 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "PromisesObjC-FBLPromises_Privacy"; + productName = FBLPromises_Privacy; + productReference = 3F238BB22C5201CE689CAF2F766AED95 /* PromisesObjC-FBLPromises_Privacy */; + productType = "com.apple.product-type.bundle"; + }; + 230F5EE18ECBB227C09ED2C571AFA319 /* PromisesSwift-Promises_Privacy */ = { + isa = PBXNativeTarget; + buildConfigurationList = E37BD70A18AC57E12CC62356300E5E36 /* Build configuration list for PBXNativeTarget "PromisesSwift-Promises_Privacy" */; + buildPhases = ( + F9BD64F9F73284B8441BAB91615B22AA /* Sources */, + D53D6F4C4A85C5E285872ED50510BE5E /* Frameworks */, + CBB433EBACCE5402AF1AE3AB5384381A /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "PromisesSwift-Promises_Privacy"; + productName = Promises_Privacy; + productReference = 067CED0F0662BBE6DC889AEC6DAB3049 /* PromisesSwift-Promises_Privacy */; + productType = "com.apple.product-type.bundle"; + }; + 25E9E9A17BC3F670357D7385C521E48E /* FirebaseCoreInternal */ = { + isa = PBXNativeTarget; + buildConfigurationList = 860FA929D2E0E66071BC99C2D79BDC9C /* Build configuration list for PBXNativeTarget "FirebaseCoreInternal" */; + buildPhases = ( + A0C999B751F9111287799956D01F264E /* Headers */, + 6D3C3D9C985D2F8124F1639D42EEE5DC /* Sources */, + C8BC4617EBB6C8D49C63CD3D9725A35F /* Frameworks */, + 22B1BBC3658511749539EE42739F01C9 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 875FBAB3F6B2D6798080207C9FC3ADE0 /* PBXTargetDependency */, + 9293C3767BBC6A8BE8512F5EDEF1B465 /* PBXTargetDependency */, + ); + name = FirebaseCoreInternal; + productName = FirebaseCoreInternal; + productReference = 148D0F9E8C7373FEAF40D800FC5F1BAA /* FirebaseCoreInternal */; + productType = "com.apple.product-type.framework"; + }; + 2949783F7EDB27AD4666B5427B63DC79 /* FirebaseCoreInternal-FirebaseCoreInternal_Privacy */ = { + isa = PBXNativeTarget; + buildConfigurationList = C18FDEFFF33020F57C546887CFA5E705 /* Build configuration list for PBXNativeTarget "FirebaseCoreInternal-FirebaseCoreInternal_Privacy" */; + buildPhases = ( + 487E7C5B9E1217164F3859DF81D6DCD5 /* Sources */, + 64E12CB82B1F05DF2029DAC0EFF0F607 /* Frameworks */, + 3D82620B1B7732BA079FBFB4E6E88FAF /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "FirebaseCoreInternal-FirebaseCoreInternal_Privacy"; + productName = FirebaseCoreInternal_Privacy; + productReference = 4DB03FD262B678178A44272143846563 /* FirebaseCoreInternal-FirebaseCoreInternal_Privacy */; + productType = "com.apple.product-type.bundle"; + }; + 2BBF7206D7FAC92C82A042A99C4A98F8 /* PromisesObjC */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4AED99C26D40D4852CC88123F3B7B58B /* Build configuration list for PBXNativeTarget "PromisesObjC" */; + buildPhases = ( + 1A84A53BA8D2A245E029029A02B76F4E /* Headers */, + 7FFAE69C14B3D2DA3FE60F85EEEC9960 /* Sources */, + 8C67D15048DC24F023ED25EBED0F0D93 /* Frameworks */, + 97E980931F54A293FF1780AA3EE770C2 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 94870B075058C3E21F86C64E7D4EBA5D /* PBXTargetDependency */, + ); + name = PromisesObjC; + productName = FBLPromises; + productReference = 3347A1AB6546F0A3977529B8F199DC41 /* PromisesObjC */; + productType = "com.apple.product-type.framework"; + }; + 328CC04F43300C6CAB81659260A3799D /* FirebaseRemoteConfigInterop */ = { + isa = PBXNativeTarget; + buildConfigurationList = 96A70753B83AFD8694E4E8FD8DA4664B /* Build configuration list for PBXNativeTarget "FirebaseRemoteConfigInterop" */; + buildPhases = ( + 1663B7421DCAFCBD5F5787299E7A4482 /* Headers */, + 8F33A92836D1C0830E5048A2857CFFA5 /* Sources */, + 34252B889D1C413540C638DB308F5D82 /* Frameworks */, + 02FA1936933139E71BCC506E42D0C2F6 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = FirebaseRemoteConfigInterop; + productName = FirebaseRemoteConfigInterop; + productReference = 3CB3BCF1390F1406B03BC8DB4735D727 /* FirebaseRemoteConfigInterop */; + productType = "com.apple.product-type.framework"; + }; + 3EB14444A17F9D4F1F697F7C1FF32245 /* FirebaseInstallations-FirebaseInstallations_Privacy */ = { + isa = PBXNativeTarget; + buildConfigurationList = C40D816C342A6A11AB67B1B1D69D5F99 /* Build configuration list for PBXNativeTarget "FirebaseInstallations-FirebaseInstallations_Privacy" */; + buildPhases = ( + 9FA64E34B2FA0A639705295660886458 /* Sources */, + D8CAF25339CD17DB08D9AA70AFA5FE39 /* Frameworks */, + 38344AB96111A2B6540FEE0847E653A5 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "FirebaseInstallations-FirebaseInstallations_Privacy"; + productName = FirebaseInstallations_Privacy; + productReference = 47C581450CDB4A6111CB97EEE0711A8C /* FirebaseInstallations-FirebaseInstallations_Privacy */; + productType = "com.apple.product-type.bundle"; + }; + 3F8EC37C78673149F2B94E8BD9AA8737 /* FirebaseSessions */ = { + isa = PBXNativeTarget; + buildConfigurationList = F934F2C48865040AD922909CD4325EB7 /* Build configuration list for PBXNativeTarget "FirebaseSessions" */; + buildPhases = ( + 98BF3CA6325C74A194CACEA88FF71B70 /* Headers */, + 64957C0562563285818F0270D8818ED0 /* Sources */, + 7EF43923DC36D06C0E43C68374CBC030 /* Frameworks */, + C63569B9992968179C3EF476C49DBB33 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 0EDD0333C6767165884B72D9185B9B98 /* PBXTargetDependency */, + 67CB3DB06CB65F4D9F827A636FF80FA7 /* PBXTargetDependency */, + F63FBFCD07CDB9D9C47CDF744B02CE4B /* PBXTargetDependency */, + B1A961481F3231DC8091D661B9CF5A71 /* PBXTargetDependency */, + 237BDF8C12568F0AA33B1C4D6F5730D0 /* PBXTargetDependency */, + B37B87297F38444F771BEAA5072CDD5A /* PBXTargetDependency */, + D5C0B04920096D4EF2A2DEE9AB6E3729 /* PBXTargetDependency */, + ); + name = FirebaseSessions; + productName = FirebaseSessions; + productReference = 83F5CCB22EE126A829F2A8820798DC8D /* FirebaseSessions */; + productType = "com.apple.product-type.framework"; + }; + 4317F1CA49C4682E275F7D8FF912FAD2 /* IronSourceAdQualitySDK-IronSourceAdQualityPrivacyInfo */ = { + isa = PBXNativeTarget; + buildConfigurationList = F83CF10AB510FC5D3970F1C7E76D409F /* Build configuration list for PBXNativeTarget "IronSourceAdQualitySDK-IronSourceAdQualityPrivacyInfo" */; + buildPhases = ( + E2C00CA88D3132B4AA394E7D406FEFAB /* Sources */, + 5813D36D677D5D155EA7C2A60305E54A /* Frameworks */, + A8AEBC17E53D32DA8709BBC565EA0513 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "IronSourceAdQualitySDK-IronSourceAdQualityPrivacyInfo"; + productName = IronSourceAdQualityPrivacyInfo; + productReference = C9BAD2DF6BFA41360986C72BE9616A6C /* IronSourceAdQualitySDK-IronSourceAdQualityPrivacyInfo */; + productType = "com.apple.product-type.bundle"; + }; + 4402AFF83DBDC4DD07E198685FDC2DF2 /* FirebaseCore */ = { + isa = PBXNativeTarget; + buildConfigurationList = 60089825B3EB728460DC31D3F86485DB /* Build configuration list for PBXNativeTarget "FirebaseCore" */; + buildPhases = ( + C3093B166B461392EC5F850FB5AA999D /* Headers */, + C3BA4564BD2F94A92331FB010488A29A /* Sources */, + B2A223672FDB5E01120CC61A4D65F24F /* Frameworks */, + 7081383AFE5E080A466A7E7DD6D725DD /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + D9E50F675130C3C429A6BCF40A019D66 /* PBXTargetDependency */, + 1B74730F35F64C7A4552BDB9C0A64C14 /* PBXTargetDependency */, + B959C158384B598B38F8C1764C4A328F /* PBXTargetDependency */, + ); + name = FirebaseCore; + productName = FirebaseCore; + productReference = E2B63D462DB7F827C4B11FD51E4F8E2D /* FirebaseCore */; + productType = "com.apple.product-type.framework"; + }; + 526C4398D095B3704EB933DADBC30093 /* FirebaseCrashlytics */ = { + isa = PBXNativeTarget; + buildConfigurationList = 79B208F0A69CFBB82FCC1F540BE84FC0 /* Build configuration list for PBXNativeTarget "FirebaseCrashlytics" */; + buildPhases = ( + 5F9CA146A486B15F616296C40996A39D /* Headers */, + C59EE3614ED07CE48C2C7A1A0E67083C /* Sources */, + FA187FB145737F95D328E91AB3BE6944 /* Frameworks */, + 61A1B0A9E946C1084831E4DCA7D96D34 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 5D2B0F7AF48AA97ABAA38AEA6A44C62B /* PBXTargetDependency */, + 8FF469EE781D85D3CDE73E88B099637A /* PBXTargetDependency */, + 3D936F524DAFD0ADE7853DC75CFC851B /* PBXTargetDependency */, + B34CE4F0930B547CE0E38C9CE3BB7463 /* PBXTargetDependency */, + 755658629F08C7B9E6ECBD91B60E2ABC /* PBXTargetDependency */, + ECFF791D359315450D8CEABF117194BC /* PBXTargetDependency */, + 0097E61B0E5B179B6962D5110A7F7807 /* PBXTargetDependency */, + DE59EEE02428834B3C733C15D5C0C99D /* PBXTargetDependency */, + AE008DF3EEE07AA4BA3CC6F5CCC0B608 /* PBXTargetDependency */, + ); + name = FirebaseCrashlytics; + productName = FirebaseCrashlytics; + productReference = 86375444C196BA272DDBB8165BF64A15 /* FirebaseCrashlytics */; + productType = "com.apple.product-type.framework"; + }; + 55522A91938FF505CFEBEAD2DD85AE2D /* nanopb-nanopb_Privacy */ = { + isa = PBXNativeTarget; + buildConfigurationList = 88FEE67E30B7B5CDFD98838DB4F0ACB8 /* Build configuration list for PBXNativeTarget "nanopb-nanopb_Privacy" */; + buildPhases = ( + FF71D156BD5D37C1402A22DFD67722BD /* Sources */, + C673219313B57500FD948FC1D320CDD9 /* Frameworks */, + F457B0A35E4C85862FCD044B4169962E /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "nanopb-nanopb_Privacy"; + productName = nanopb_Privacy; + productReference = 3227F3FC45681D7CEE5D1355A532398A /* nanopb-nanopb_Privacy */; + productType = "com.apple.product-type.bundle"; + }; + 5C0371EE948D0357B8EE0E34ABB44BF0 /* GoogleDataTransport */ = { + isa = PBXNativeTarget; + buildConfigurationList = EEB67ABEEC82A6C468B4707FB6DF4174 /* Build configuration list for PBXNativeTarget "GoogleDataTransport" */; + buildPhases = ( + CC1C540E3930DE7B2F6E2FA75FC484DB /* Headers */, + AD4D40B77B1CD3B1C2C373C988E60CC5 /* Sources */, + F2B6AED95316A5FD672E38F373BE6B16 /* Frameworks */, + 60BDC59FA7254888EA81029B10D6EAC3 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 1DF8A555B01EB545C870B1019C3D1D8E /* PBXTargetDependency */, + B6A355A29E1FB825F8913DCA41279CEF /* PBXTargetDependency */, + 79A8EFDC22D9694FF920B8036B399F6E /* PBXTargetDependency */, + ); + name = GoogleDataTransport; + productName = GoogleDataTransport; + productReference = 856B5CD56F194FAD26EA91620B66D614 /* GoogleDataTransport */; + productType = "com.apple.product-type.framework"; + }; + 5FF1A58DEEC5DB749FCD6C120B97CC82 /* GoogleUtilities-GoogleUtilities_Privacy */ = { + isa = PBXNativeTarget; + buildConfigurationList = A8ECFA3F0517069FF8D968DCFAE2CC0E /* Build configuration list for PBXNativeTarget "GoogleUtilities-GoogleUtilities_Privacy" */; + buildPhases = ( + 009210A7AD6A5B4102680D3254391973 /* Sources */, + 5C119DF084D8CC03E2A548C4D84B3E51 /* Frameworks */, + 3A1AE47432B4F0B0ACE88B05AC1A5747 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "GoogleUtilities-GoogleUtilities_Privacy"; + productName = GoogleUtilities_Privacy; + productReference = 44E291D18340EAC3F761346198515323 /* GoogleUtilities-GoogleUtilities_Privacy */; + productType = "com.apple.product-type.bundle"; + }; + 87803597EB3F20FC46472B85392EC4FD /* FirebaseInstallations */ = { + isa = PBXNativeTarget; + buildConfigurationList = E536D4C91B029845235C7E10CC087A27 /* Build configuration list for PBXNativeTarget "FirebaseInstallations" */; + buildPhases = ( + 2450C419E9AD5F959D135926CEEC05EA /* Headers */, + B0AAAC75260CC101AE77382891911963 /* Sources */, + 9A44ACD4040C82FECB0E3AEDE49296BC /* Frameworks */, + 834B648801D1625E6F21EE25444F119B /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 8DC0B6EE6831FDC04F3EC458660C0220 /* PBXTargetDependency */, + 503B4D3AF6A950AC54574462E3ED3CE9 /* PBXTargetDependency */, + C73AA11B73FCE1FC9A1428331F277FFC /* PBXTargetDependency */, + 1391F2E44BF7587E2B6DB83214E857CA /* PBXTargetDependency */, + ); + name = FirebaseInstallations; + productName = FirebaseInstallations; + productReference = 13C8C8B254851998F9289F71229B28A2 /* FirebaseInstallations */; + productType = "com.apple.product-type.framework"; + }; + 8D7F5D5DD528D21A72DC87ADA5B12E2D /* GoogleUtilities */ = { + isa = PBXNativeTarget; + buildConfigurationList = D1A2E3157A0DDEF6C64DB4307F6D7769 /* Build configuration list for PBXNativeTarget "GoogleUtilities" */; + buildPhases = ( + 88B549601A8F2DA6519349DAF873A54E /* Headers */, + 36F2E990F6289879C3D3FB9E16F19B2C /* Sources */, + 9C81C2CA49D9A222BFA041CA054441BB /* Frameworks */, + 8125F44866951D79D71A81872130FF81 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + C784FF17C3DCC09C1145E65235491FFD /* PBXTargetDependency */, + ); + name = GoogleUtilities; + productName = GoogleUtilities; + productReference = B43874C6CBB50E7134FBEC24BABFE14F /* GoogleUtilities */; + productType = "com.apple.product-type.framework"; + }; + 9C4575D64B2B6264CF6AB60FB03302AA /* FirebaseCoreExtension-FirebaseCoreExtension_Privacy */ = { + isa = PBXNativeTarget; + buildConfigurationList = AFAE7292701BB80B080E988A585D2C84 /* Build configuration list for PBXNativeTarget "FirebaseCoreExtension-FirebaseCoreExtension_Privacy" */; + buildPhases = ( + E6F56F12D6ED5A80B6F1C64D842261FA /* Sources */, + 9BB98489ADA0E537523CE0404A4EB77B /* Frameworks */, + 96EFA25F4D302C0521A2F0111BBAB4F1 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "FirebaseCoreExtension-FirebaseCoreExtension_Privacy"; + productName = FirebaseCoreExtension_Privacy; + productReference = ECAC028550A03412C51913B85686D98B /* FirebaseCoreExtension-FirebaseCoreExtension_Privacy */; + productType = "com.apple.product-type.bundle"; + }; + A979F9D3632CD5F2F7518F9A362CBAE3 /* PromisesSwift */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4F66F2B4599AF08971549A362FB64DB6 /* Build configuration list for PBXNativeTarget "PromisesSwift" */; + buildPhases = ( + 6DAA78CB0BB50B1DF0F731C344939485 /* Headers */, + 3E929EAC2E1C0EEBE5157110575D204C /* Sources */, + 11EF6B892E83F50C5488F3CC859FD958 /* Frameworks */, + 81E1FA1ECD240C0A44D21A8032B3ABD0 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 236506D979D979151310284C9BFD7D4C /* PBXTargetDependency */, + 42C6A5D683E1BB10DEDAB516CE7E3292 /* PBXTargetDependency */, + ); + name = PromisesSwift; + productName = Promises; + productReference = 379E5319BC6B4AE5613DFF7EEEAA6905 /* PromisesSwift */; + productType = "com.apple.product-type.framework"; + }; + AF4066D13B4DC667FB970ABF861B2B47 /* IronSourceSDK-IronSourcePrivacyInfo */ = { + isa = PBXNativeTarget; + buildConfigurationList = 29A903CEF83455579E309A91F9076621 /* Build configuration list for PBXNativeTarget "IronSourceSDK-IronSourcePrivacyInfo" */; + buildPhases = ( + 1FA8369B3574850BB0437BAAE044BBE6 /* Sources */, + 45C2E717CD6DC2E2CA044BFE9A5C7C59 /* Frameworks */, + 9022AAD9A34C581D03016CEB3F13C4CF /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "IronSourceSDK-IronSourcePrivacyInfo"; + productName = IronSourcePrivacyInfo; + productReference = 08DFEAAA1901B9FF8345827FDA56939E /* IronSourceSDK-IronSourcePrivacyInfo */; + productType = "com.apple.product-type.bundle"; + }; + D2B5E7DCCBBFB32341D857D01211A1A3 /* nanopb */ = { + isa = PBXNativeTarget; + buildConfigurationList = 44C2387AB11F5B899AE2FF36D7198C69 /* Build configuration list for PBXNativeTarget "nanopb" */; + buildPhases = ( + E9B7EB629ECBB1CE970A5932EADA32CC /* Headers */, + 39BD154DE3A3ADF7D7A725C333B95D7C /* Sources */, + CD76B46A17288AC5D9EEE7407B3DBA4E /* Frameworks */, + CA9410AA2A4D294DE8DCB6B98FBB730A /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 153B58761E1D76A219D1164FA82A32F9 /* PBXTargetDependency */, + ); + name = nanopb; + productName = nanopb; + productReference = 06FC5C9CF96D60C50FCD47D339C91951 /* nanopb */; + productType = "com.apple.product-type.framework"; + }; + DD0D41A9315A48004E57F4F0E54095F1 /* GoogleDataTransport-GoogleDataTransport_Privacy */ = { + isa = PBXNativeTarget; + buildConfigurationList = 35714539239E46ECFF3779AD7811BB3A /* Build configuration list for PBXNativeTarget "GoogleDataTransport-GoogleDataTransport_Privacy" */; + buildPhases = ( + CA63ADB8298B9567B5557E1F37DC07C3 /* Sources */, + 5D3A93023CC89480A9A7BDBBF1A2E804 /* Frameworks */, + C14EEA632DD38743EAE9151E7AA989E4 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "GoogleDataTransport-GoogleDataTransport_Privacy"; + productName = GoogleDataTransport_Privacy; + productReference = F73AA961F4AEFF2B46B00AE435DF6BE3 /* GoogleDataTransport-GoogleDataTransport_Privacy */; + productType = "com.apple.product-type.bundle"; + }; + F04A6BBE3244693342361EF11CCB2903 /* Pods-TastePick */ = { + isa = PBXNativeTarget; + buildConfigurationList = 48B8693F66F6CB93095D71C69BD72E2A /* Build configuration list for PBXNativeTarget "Pods-TastePick" */; + buildPhases = ( + CACA996CC0E7F15C7AFA822ED7433A23 /* Headers */, + 36BC435565105B0981D27CD50DBDA7A2 /* Sources */, + 98A011625BB580D9957A01DC8C19ED77 /* Frameworks */, + 10A577EFDE905F8C97FF89EC48E124D5 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 09773A37FD4D65ECAFE0EC03740CF8C3 /* PBXTargetDependency */, + A22FDDD64A3A5E58FA6AFE4475FDF3F2 /* PBXTargetDependency */, + 430687AB4CF6DF6F8A6AB085631D746C /* PBXTargetDependency */, + 4816EDAFC4ADDE2E7A85A04C3008762E /* PBXTargetDependency */, + 970067168A05FEBADA0722E9AB5338AB /* PBXTargetDependency */, + BDAE3DBCEE3760B145FDA692D0065418 /* PBXTargetDependency */, + 4ECCD3A9A961455B777DB5DD193E5F58 /* PBXTargetDependency */, + 976BE867872D59B2F412792128F98598 /* PBXTargetDependency */, + F0A764F545B1B90E8D22CFC184D24C86 /* PBXTargetDependency */, + 3A72B60800B19245A356B3DDEAA5BF33 /* PBXTargetDependency */, + 60D0407C1605F26B57A2A6803C396358 /* PBXTargetDependency */, + 4E643E958DD5BC564F398548C8628107 /* PBXTargetDependency */, + 13B63CCC7671FFC33563DFC82B8CBD94 /* PBXTargetDependency */, + 7EE4E6CCEAAE2BA6010C3DAD6808D664 /* PBXTargetDependency */, + 162820A6207087BCEEB1C1A61A7658C0 /* PBXTargetDependency */, + 7E9AC2926A821E6DF8969FD45614F97B /* PBXTargetDependency */, + 41B2AA0C5F71BE687B4C154B055A1035 /* PBXTargetDependency */, + ); + name = "Pods-TastePick"; + productName = Pods_TastePick; + productReference = 8A0AA9F2C3B51633419321E43977A03E /* Pods-TastePick */; + productType = "com.apple.product-type.framework"; + }; + FE1DE31D91C32501251AE9687CDC2E0F /* FirebaseCoreExtension */ = { + isa = PBXNativeTarget; + buildConfigurationList = ECA2C98A56E455AF772E403D3B87A717 /* Build configuration list for PBXNativeTarget "FirebaseCoreExtension" */; + buildPhases = ( + 96BF8F0CF4E778AC47F554A089981743 /* Headers */, + F3EFAEF89113AEC19D9F4C36031E4082 /* Sources */, + 53157F13C7B0F3CABABA29BD677447B4 /* Frameworks */, + 08AF3CE7F05F9D19E0509801853B23BC /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + A608DEC9C5F35AC4E5F12A3A612DE3C8 /* PBXTargetDependency */, + FF66B4DE08FD8BFCC60AF8286224CFFE /* PBXTargetDependency */, + ); + name = FirebaseCoreExtension; + productName = FirebaseCoreExtension; + productReference = AEF1DC80F0EB62580B81D18786BAF924 /* FirebaseCoreExtension */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + BFDFE7DC352907FC980B868725387E98 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1600; + LastUpgradeCheck = 1600; + }; + buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */; + compatibilityVersion = "Xcode 16.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + Base, + en, + ); + mainGroup = CF1408CF629C7361332E53B88F7BD30C; + minimizedProjectReferenceProxies = 0; + preferredProjectObjectVersion = 77; + productRefGroup = E44144FB155AD11473806251490A0AF5 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + C49E7A4D59E5C8BE8DE9FB1EFB150185 /* FirebaseAnalytics */, + 4402AFF83DBDC4DD07E198685FDC2DF2 /* FirebaseCore */, + 1001C16510D946B47CFF8B19DBC0B787 /* FirebaseCore-FirebaseCore_Privacy */, + FE1DE31D91C32501251AE9687CDC2E0F /* FirebaseCoreExtension */, + 9C4575D64B2B6264CF6AB60FB03302AA /* FirebaseCoreExtension-FirebaseCoreExtension_Privacy */, + 25E9E9A17BC3F670357D7385C521E48E /* FirebaseCoreInternal */, + 2949783F7EDB27AD4666B5427B63DC79 /* FirebaseCoreInternal-FirebaseCoreInternal_Privacy */, + 526C4398D095B3704EB933DADBC30093 /* FirebaseCrashlytics */, + 17CBCC6221F62B870268E935098B7D7D /* FirebaseCrashlytics-FirebaseCrashlytics_Privacy */, + 87803597EB3F20FC46472B85392EC4FD /* FirebaseInstallations */, + 3EB14444A17F9D4F1F697F7C1FF32245 /* FirebaseInstallations-FirebaseInstallations_Privacy */, + 328CC04F43300C6CAB81659260A3799D /* FirebaseRemoteConfigInterop */, + 3F8EC37C78673149F2B94E8BD9AA8737 /* FirebaseSessions */, + 26309F9D4DF43E362A8AF6A93B41FF6D /* GoogleAdsOnDeviceConversion */, + B53D977A951AFC38B21751B706C1DF83 /* GoogleAppMeasurement */, + 5C0371EE948D0357B8EE0E34ABB44BF0 /* GoogleDataTransport */, + DD0D41A9315A48004E57F4F0E54095F1 /* GoogleDataTransport-GoogleDataTransport_Privacy */, + 8D7F5D5DD528D21A72DC87ADA5B12E2D /* GoogleUtilities */, + 5FF1A58DEEC5DB749FCD6C120B97CC82 /* GoogleUtilities-GoogleUtilities_Privacy */, + A2E1CD763F5748382ECFDCFBD119D430 /* IronSourceAdQualitySDK */, + 4317F1CA49C4682E275F7D8FF912FAD2 /* IronSourceAdQualitySDK-IronSourceAdQualityPrivacyInfo */, + 205EFBEF86DA6E7E3D5B9BABED8872EE /* IronSourceSDK */, + AF4066D13B4DC667FB970ABF861B2B47 /* IronSourceSDK-IronSourcePrivacyInfo */, + D2B5E7DCCBBFB32341D857D01211A1A3 /* nanopb */, + 55522A91938FF505CFEBEAD2DD85AE2D /* nanopb-nanopb_Privacy */, + F04A6BBE3244693342361EF11CCB2903 /* Pods-TastePick */, + 2BBF7206D7FAC92C82A042A99C4A98F8 /* PromisesObjC */, + 1BFBEDBF7E03729D43C96530EE190825 /* PromisesObjC-FBLPromises_Privacy */, + A979F9D3632CD5F2F7518F9A362CBAE3 /* PromisesSwift */, + 230F5EE18ECBB227C09ED2C571AFA319 /* PromisesSwift-Promises_Privacy */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 02FA1936933139E71BCC506E42D0C2F6 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 08AF3CE7F05F9D19E0509801853B23BC /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 3F1C71FB8A3408483D48047D6B59C8BF /* FirebaseCoreExtension-FirebaseCoreExtension_Privacy in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 10A577EFDE905F8C97FF89EC48E124D5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 20FC8C14AB1A49D8D1CCFF751A09F1FF /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ADB12F9782FD023812EACE261C7BDED7 /* PrivacyInfo.xcprivacy in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 22B1BBC3658511749539EE42739F01C9 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 475C802D1D9918C579E38211E3078886 /* FirebaseCoreInternal-FirebaseCoreInternal_Privacy in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 38344AB96111A2B6540FEE0847E653A5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2F379D418E5EE3E62BD79E0014756652 /* PrivacyInfo.xcprivacy in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 3A1AE47432B4F0B0ACE88B05AC1A5747 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 85AE2B72D317CBF5D34B80893CD7E72E /* PrivacyInfo.xcprivacy in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 3D82620B1B7732BA079FBFB4E6E88FAF /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + A8B30F6F9D78E88DEDB024F7DB39A947 /* PrivacyInfo.xcprivacy in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 60BDC59FA7254888EA81029B10D6EAC3 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 64271735B1C773ED84408EE510F7465E /* GoogleDataTransport-GoogleDataTransport_Privacy in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 61A1B0A9E946C1084831E4DCA7D96D34 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 20D76889FE59073145CE2C1793CFBE70 /* FirebaseCrashlytics-FirebaseCrashlytics_Privacy in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7081383AFE5E080A466A7E7DD6D725DD /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 9C5A83F954FE0B386A7B89F029255F1E /* FirebaseCore-FirebaseCore_Privacy in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 8125F44866951D79D71A81872130FF81 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C737825926984F0CF47C0B0F189FDF87 /* GoogleUtilities-GoogleUtilities_Privacy in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 81E1FA1ECD240C0A44D21A8032B3ABD0 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + A99C0B633C8AAA68FC18E650229D3430 /* PromisesSwift-Promises_Privacy in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 834B648801D1625E6F21EE25444F119B /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2582096CCEDC9DF084852E349AE03C25 /* FirebaseInstallations-FirebaseInstallations_Privacy in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 9022AAD9A34C581D03016CEB3F13C4CF /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8CEE645869AED50003E0CA1661EA29C2 /* PrivacyInfo.xcprivacy in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 96EFA25F4D302C0521A2F0111BBAB4F1 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B90D31C255FBD297D6FFAC7AA30AEBCE /* PrivacyInfo.xcprivacy in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97E980931F54A293FF1780AA3EE770C2 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 14EBB23396569D24A213124C7C4B10EE /* PromisesObjC-FBLPromises_Privacy in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A4C2E7DAC6B906E8D462DB20E2AA1E57 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + EE40FD76E243F55312A38EEB6448E91A /* PrivacyInfo.xcprivacy in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A8AEBC17E53D32DA8709BBC565EA0513 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B73F323E869CC5EEF30BBF61193CA448 /* PrivacyInfo.xcprivacy in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C14EEA632DD38743EAE9151E7AA989E4 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 07CC403A047AE25FC779B64A70424FC4 /* PrivacyInfo.xcprivacy in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C63569B9992968179C3EF476C49DBB33 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + CA9410AA2A4D294DE8DCB6B98FBB730A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 45CDF7093DEBF0C1351FA9EB28930733 /* nanopb-nanopb_Privacy in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + CBB433EBACCE5402AF1AE3AB5384381A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + E3F9D76A23BDE62F4611166C5B0F5F7A /* PrivacyInfo.xcprivacy in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E3D4A8126CB79E6BEF5E2C2FAF0F2343 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 706797A84BD0AE37CC987E1A50C4334D /* PrivacyInfo.xcprivacy in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F457B0A35E4C85862FCD044B4169962E /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 741733D18221B8AFFAE7A870B8C6EFB9 /* PrivacyInfo.xcprivacy in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 1CF14C206992BEF41024C706A498E049 /* [CP] Copy XCFrameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/IronSourceAdQualitySDK/IronSourceAdQualitySDK-xcframeworks-input-files.xcfilelist", + ); + name = "[CP] Copy XCFrameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/IronSourceAdQualitySDK/IronSourceAdQualitySDK-xcframeworks-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/IronSourceAdQualitySDK/IronSourceAdQualitySDK-xcframeworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 71C738B11F24D01E484FD73DE871B01F /* [CP] Copy XCFrameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/GoogleAdsOnDeviceConversion/GoogleAdsOnDeviceConversion-xcframeworks-input-files.xcfilelist", + ); + name = "[CP] Copy XCFrameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/GoogleAdsOnDeviceConversion/GoogleAdsOnDeviceConversion-xcframeworks-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/GoogleAdsOnDeviceConversion/GoogleAdsOnDeviceConversion-xcframeworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 8C5B5926777AB8C2838BC915F74F1BC1 /* [CP] Copy XCFrameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/FirebaseAnalytics/FirebaseAnalytics-xcframeworks-input-files.xcfilelist", + ); + name = "[CP] Copy XCFrameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/FirebaseAnalytics/FirebaseAnalytics-xcframeworks-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/FirebaseAnalytics/FirebaseAnalytics-xcframeworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + BD432A771BC3AE991F66E87FAC379E10 /* [CP] Copy XCFrameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/IronSourceSDK/IronSourceSDK-xcframeworks-input-files.xcfilelist", + ); + name = "[CP] Copy XCFrameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/IronSourceSDK/IronSourceSDK-xcframeworks-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/IronSourceSDK/IronSourceSDK-xcframeworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + F1EE8DCC166D71E692E94B5DB424941B /* [CP] Copy XCFrameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/GoogleAppMeasurement/GoogleAppMeasurement-xcframeworks-input-files.xcfilelist", + ); + name = "[CP] Copy XCFrameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/GoogleAppMeasurement/GoogleAppMeasurement-xcframeworks-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/GoogleAppMeasurement/GoogleAppMeasurement-xcframeworks.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 009210A7AD6A5B4102680D3254391973 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1FA8369B3574850BB0437BAAE044BBE6 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 36BC435565105B0981D27CD50DBDA7A2 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 73A1CC681D985F80EF364ED59723867E /* Pods-TastePick-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 36F2E990F6289879C3D3FB9E16F19B2C /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 3021DE756F9928B3CF80401D95359872 /* GoogleUtilities-dummy.m in Sources */, + 1E7C7DF3BEFAD49CE5CE34E3B39525D7 /* GULAppDelegateSwizzler.m in Sources */, + A3E74331F9232CA71B783072A72ED085 /* GULAppEnvironmentUtil.m in Sources */, + 8A7D639E50EACE32177B7FECF0D6B06C /* GULKeychainStorage.m in Sources */, + 96FFD1472FDF26503BA6F48981D7B757 /* GULKeychainUtils.m in Sources */, + A282EB350472E6592E4567C3BF2D8E31 /* GULLogger.m in Sources */, + 3CB394A48027DA1961734970980AEBFA /* GULMutableDictionary.m in Sources */, + 46E5CD3AC1BB5EDB3175667EF12FED96 /* GULNetwork.m in Sources */, + 1AC3A3FF4E9EDFB124443865D6F128B5 /* GULNetworkConstants.m in Sources */, + 5F0966C8D041AC12FF848B277B55A2A9 /* GULNetworkInfo.m in Sources */, + 9CD5BD94DEDA4FCCF19E7EC08FA4A1F3 /* GULNetworkURLSession.m in Sources */, + 3C0C47835887898E0DDF2907166D3F89 /* GULNSData+zlib.m in Sources */, + 06AA8B5FBD868A2D0FB8384053F41DC5 /* GULReachabilityChecker.m in Sources */, + 08432A4869515AC4F02C4764779F7179 /* GULSceneDelegateSwizzler.m in Sources */, + 3486EB3CCE273B39F6133813B8017F04 /* GULSwizzler.m in Sources */, + 6F9FE607567997B9522DA349CA416B92 /* GULUserDefaults.m in Sources */, + CD2B03D02B22C5547E0EB1028DB31970 /* IsAppEncrypted.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 39BD154DE3A3ADF7D7A725C333B95D7C /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 4D4DC0ED16223119D07DC4C7E84B0D62 /* nanopb-dummy.m in Sources */, + 8B50F612BB38DC1643FC8F4AD307FF22 /* pb_common.c in Sources */, + 29AF613F4ACECFB53B273C4EE8AEDF2D /* pb_decode.c in Sources */, + 8191E019D2E7D81824D6A3D39644C78F /* pb_encode.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 3E929EAC2E1C0EEBE5157110575D204C /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 202D701C92B114E60D25D5F653040E3C /* Promise.swift in Sources */, + 1657E1F8898B4C8D705CB34D8B8BD059 /* Promise+All.swift in Sources */, + 7E882523FF824824B3118C2BC413F209 /* Promise+Always.swift in Sources */, + D2D746617C80038D4FC7B7E70E13BBD2 /* Promise+Any.swift in Sources */, + 222EA3C5BDEBB9C5701777D84ABDC5A2 /* Promise+Async.swift in Sources */, + 8AF2CBF1E6FDDCE63E0B55BA98C9224D /* Promise+Await.swift in Sources */, + 2D16F164C0FC5C365223B119B859FC6D /* Promise+Catch.swift in Sources */, + D7E998FB582BCB3C5A0B17BCDD0E0C8A /* Promise+Delay.swift in Sources */, + 6F5E51F9260DE9ACA071C0C09CE4DFB8 /* Promise+Do.swift in Sources */, + 6BCF480FDDFE4E2AE7761E28929CF58F /* Promise+Race.swift in Sources */, + 7E2C09F497BD0129BD2E2FEAE043DD04 /* Promise+Recover.swift in Sources */, + 1E1CC531B7ED09DB93B66FAC450E675A /* Promise+Reduce.swift in Sources */, + AC722BBE56CB33A94E72D20BC40A1006 /* Promise+Retry.swift in Sources */, + D1CD3A6817E5A9FC89055DCDF71F26AB /* Promise+Testing.swift in Sources */, + 71F2D91DCF258E2459EEE9998E62740A /* Promise+Then.swift in Sources */, + 5D4544BEEA2076764CF8A2AB072DAFA6 /* Promise+Timeout.swift in Sources */, + 4F67449A026049C3BCE5699AC327BC1B /* Promise+Validate.swift in Sources */, + B76C1FA257183B17B76CAD30ADBA7065 /* Promise+Wrap.swift in Sources */, + 420D13046C8191C86E960D35B85D483A /* PromiseError.swift in Sources */, + 487B3B6A7FDAF31A2500B50C71785F23 /* PromisesSwift-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 487E7C5B9E1217164F3859DF81D6DCD5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 555DD2D72AA2C5D547A419FEE99C5EEC /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 64957C0562563285818F0270D8818ED0 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + AB4DFAF9E31C90C10D762E058C3B5FA7 /* ApplicationInfo.swift in Sources */, + ABB588101D6413968489A2B7B38709FD /* DevEventConsoleLogger.swift in Sources */, + 9B49E51CB5D1E67E1B8678D192A6CC78 /* EventGDTLogger.swift in Sources */, + 42BAB29ABAA0D0D37B6A8FB10E54A5AC /* FirebaseSessions.swift in Sources */, + 7BF981899794C58EC1B4ED5821379FF2 /* FirebaseSessions-dummy.m in Sources */, + CA594015447F28227A955E5FCE88C4C1 /* FirebaseSessionsError.swift in Sources */, + 3210D7FECB1DE2632A2DE15CBAA1DED5 /* FIRSESNanoPBHelpers.m in Sources */, + 33E32F99DBB7D19907CAA192C566AE34 /* GoogleDataTransport+GoogleDataTransportProtocol.swift in Sources */, + 84850D7DE71FC7F3383583C06BF25B85 /* Installations+InstallationsProtocol.swift in Sources */, + 48C6D0B6DFC547D29B35A74361290064 /* LocalOverrideSettings.swift in Sources */, + 498C3F35EEAFEC9A33F55F68EBAD2209 /* Logger.swift in Sources */, + 7E142D58B3D22A999D8BBC9EE70ED33A /* NanoPB+CustomStringConvertible.swift in Sources */, + 40263C8C76CBE7124CF00DA29C309A59 /* NetworkInfo.swift in Sources */, + EDF3828C5D3E008F81017AA539235EB8 /* RemoteSettings.swift in Sources */, + F75685672CFC912E487C2119F546DC5C /* SDKDefaultSettings.swift in Sources */, + C0D8F6C7FC4ADF881BD47CDD09FD6F78 /* SessionCoordinator.swift in Sources */, + CC85673A36DB9EC976AF7443ABA44DF2 /* SessionGenerator.swift in Sources */, + 0D1926623D79C695C4524B77CFF557D3 /* SessionInitiator.swift in Sources */, + C3E222FE768F475273899C65CB7282A6 /* sessions.nanopb.c in Sources */, + 7781EBE38C5C4762D351CD85899CB3EC /* SessionsDependencies.swift in Sources */, + D7C455295388AAEBFEAA7259900C4AD7 /* SessionsProvider.swift in Sources */, + 41C08FE0F958CE6BB37141FF60E4269B /* SessionsSettings.swift in Sources */, + DB36A6680516D5D15A64397D87CA4F2F /* SessionsSubscriber.swift in Sources */, + AF1D4A20BD9F99FCEDB2E117B070E932 /* SessionStartEvent.swift in Sources */, + CCE6750E1B50DA5E5D32E7B258A66BD0 /* SettingsCacheClient.swift in Sources */, + F5DE3E5DB7C696843303CBD8BE0BB404 /* SettingsDownloadClient.swift in Sources */, + AF01834E8D7122B994C48CBCB660AB85 /* SettingsProtocol.swift in Sources */, + 7EDAEDE24C4040D859AA6F606424527A /* SettingsProvider.swift in Sources */, + BE4B3385AC375EE06559BE988F853C11 /* Time.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 6D3C3D9C985D2F8124F1639D42EEE5DC /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + F0D1FF998A997FBBB5449B21D1D978FA /* _ObjC_HeartbeatController.swift in Sources */, + D2322362B88E43084653CE0C1ED6AFA5 /* _ObjC_HeartbeatsPayload.swift in Sources */, + 156CBEB855F0F55630B7A6F37F09A3D9 /* FirebaseCoreInternal-dummy.m in Sources */, + 6D6147FC10CA2EBF735A5C6D72C5A301 /* Heartbeat.swift in Sources */, + A958A7EDCE3199EAB4C443C0CE8F8D27 /* HeartbeatController.swift in Sources */, + 64E3CD57458B64D956DDBBCF11F7C9C2 /* HeartbeatLoggingTestUtils.swift in Sources */, + 0B608C58D9CAF466D1270BB7E4D69E5D /* HeartbeatsBundle.swift in Sources */, + 1562BC1ED03BBFBFF8513F1DC4B72E43 /* HeartbeatsPayload.swift in Sources */, + AB6FD8CF1194EEF96E05F07A081E5ACD /* HeartbeatStorage.swift in Sources */, + FEEA3BF7DA87224644F9C075ED1897D2 /* RingBuffer.swift in Sources */, + 126C9897DB357D17669F4457EAF5379B /* Storage.swift in Sources */, + D590FE30FAAE24BF46B44EF2DA5634AF /* StorageFactory.swift in Sources */, + 252F285922800841EAF0FA05B8B79372 /* UnfairLock.swift in Sources */, + B4B888E4F1A8B14A944AE4CC8656C556 /* WeakContainer.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7FFAE69C14B3D2DA3FE60F85EEEC9960 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D4F55174024B0A87671B1E75E20E578C /* FBLPromise.m in Sources */, + F0386024A3443A322BF2A809531E0B7B /* FBLPromise+All.m in Sources */, + 301073943D4E1E25BFAB96560E974D0B /* FBLPromise+Always.m in Sources */, + 4E9FE44998F718071E47B89A67AB4774 /* FBLPromise+Any.m in Sources */, + DD88079D1AAB7534AF8926BBF6169337 /* FBLPromise+Async.m in Sources */, + 100970140F74221C358AD7555DDE6FC2 /* FBLPromise+Await.m in Sources */, + BBFD72C68DC588218C5BF7B088985778 /* FBLPromise+Catch.m in Sources */, + 3D789E37D949CAFF82B9285B436B396B /* FBLPromise+Delay.m in Sources */, + 05DD921124345B271177CBCF4FE3A6D6 /* FBLPromise+Do.m in Sources */, + 94C9BB4C44974A180536169E8257CD3D /* FBLPromise+Race.m in Sources */, + 8373E40DEA064F2F96FAC3A65F681288 /* FBLPromise+Recover.m in Sources */, + 8A5DE634040AD655252C5DABB8E480F1 /* FBLPromise+Reduce.m in Sources */, + F4269AA43900D81CA10CDBF088EEC0A0 /* FBLPromise+Retry.m in Sources */, + 8E24AFFBEBDA0BFD6D9D401893A880F9 /* FBLPromise+Testing.m in Sources */, + E02952277C6FF8D868D1FC389D399291 /* FBLPromise+Then.m in Sources */, + FD2802682A4EA92638132BBBFA0B6465 /* FBLPromise+Timeout.m in Sources */, + 80F10E3A8823AB0C370745BEDBAFF514 /* FBLPromise+Validate.m in Sources */, + 160A0814FFA5AABEA8E757089A9C9823 /* FBLPromise+Wrap.m in Sources */, + 4A3D625141904C2FD36FF4187D5264BC /* FBLPromiseError.m in Sources */, + 429816BF1F373D7808F4556979C3B3F9 /* PromisesObjC-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 865369FEBC726BB647CA34B8D8C9F940 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 8F33A92836D1C0830E5048A2857CFFA5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + DC1A6C258524398E4050A82953AA73D8 /* FirebaseRemoteConfigInterop-dummy.m in Sources */, + BD591A368424B18143A83ECD6C35FA4C /* RemoteConfigConstants.swift in Sources */, + 0FBC1E3378FE0502E0305891F25D3A5C /* RemoteConfigInterop.swift in Sources */, + D2CF4520FE42CD0C57C0F17A190EE8D2 /* RolloutAssignment.swift in Sources */, + A27BB0FA1B994DA32D2CE5C748A8253B /* RolloutsStateSubscriber.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 9FA64E34B2FA0A639705295660886458 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + AD4D40B77B1CD3B1C2C373C988E60CC5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 88AA4C4396EE322933DA943F150B5860 /* cct.nanopb.c in Sources */, + 1DD6A7A4E2C5009F8E23204EC23A898D /* client_metrics.nanopb.c in Sources */, + 32D486C0379B79E8495F439CA3279A05 /* compliance.nanopb.c in Sources */, + 074BD0B4C006F842EA707DE29D89F0AB /* external_prequest_context.nanopb.c in Sources */, + B339ECE81D227F0A2BD41B6F07E62D57 /* external_privacy_context.nanopb.c in Sources */, + C03D9768A05ECDD7831D3F0B4D95BBC5 /* GDTCCTCompressionHelper.m in Sources */, + 0C8A265B9D2DE968E2AC2119C79E9B9D /* GDTCCTNanopbHelpers.m in Sources */, + 1BABD89B9DE243F7853BC997A8691248 /* GDTCCTUploader.m in Sources */, + FEEB7F71C661C61D1B8A0F7305DAD1E3 /* GDTCCTUploadOperation.m in Sources */, + 5D205A42D6D52C5F1D95270C6E325200 /* GDTCCTURLSessionDataResponse.m in Sources */, + EF051DF029EE9A12141757B7005F89F5 /* GDTCORAssert.m in Sources */, + 6A370BC815C22E5318D81C7F18F191A0 /* GDTCORClock.m in Sources */, + 76F044041A4C5DE9C69F6BC69E996A8B /* GDTCORConsoleLogger.m in Sources */, + 7740D0F9A0DE4AE09E228385CCBA3E51 /* GDTCORDirectorySizeTracker.m in Sources */, + 0F7AF811B1F25B7C36109BB6B317D91E /* GDTCOREndpoints.m in Sources */, + B2507D86D9C718BD571B2C235D937401 /* GDTCOREvent.m in Sources */, + 5897D3B3E5A97CCC5F0E098AAC8F1B93 /* GDTCOREvent+GDTCCTSupport.m in Sources */, + 546382F85F3C2F02FA03F36540FE99CB /* GDTCOREvent+GDTMetricsSupport.m in Sources */, + B2A8B64BBEBEA27713A702AB7DCEE0AF /* GDTCORFlatFileStorage.m in Sources */, + 51F6AEBC50F67FD1DDF27CE89DA2F50F /* GDTCORFlatFileStorage+Promises.m in Sources */, + B9BF0F0B3DDD6C1B86EF3221AB9C1B5C /* GDTCORLifecycle.m in Sources */, + 63E6A2B474008FA01DE8D4EA0BB9BAE3 /* GDTCORLogSourceMetrics.m in Sources */, + 96D64AB4C30AF4EF8A84884FFF22BC85 /* GDTCORMetrics.m in Sources */, + 7A56F0778424050770BFD1DFB238952A /* GDTCORMetrics+GDTCCTSupport.m in Sources */, + 4BF483B82FFDE4C3D2721190F917B352 /* GDTCORMetricsController.m in Sources */, + 117D366C2B33540C50EC57BA3EB826DA /* GDTCORMetricsMetadata.m in Sources */, + 907E2EEADC3885EDB50AFFADE2A48D6F /* GDTCORPlatform.m in Sources */, + 6D4BEBCE00B561C942F57E065D56F99B /* GDTCORProductData.m in Sources */, + 54E0B38E0A4B998715EBC8D32E81D33E /* GDTCORReachability.m in Sources */, + 3AC699C480E1AA6DD6A50B924B513985 /* GDTCORRegistrar.m in Sources */, + AC8CF44BC0193A573F4CE196220D0499 /* GDTCORStorageEventSelector.m in Sources */, + 1049B7F945735DA030ED6B6A89AC05AE /* GDTCORStorageMetadata.m in Sources */, + 678048BF0B3FF61EDE3B83389EBE009A /* GDTCORTransformer.m in Sources */, + 0DC0C6161D0507A2E898365F45320CED /* GDTCORTransport.m in Sources */, + 55B1AA2B945D12A673A7D687DBCACD76 /* GDTCORUploadBatch.m in Sources */, + A10A5D8F81F20C322B8AE87F9820BAC9 /* GDTCORUploadCoordinator.m in Sources */, + 87F3E164D6180CFCC344816B29EB9D43 /* GoogleDataTransport-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B0AAAC75260CC101AE77382891911963 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + FE71DB58F4375D97D495A63AF0B5725C /* FIRCurrentDateProvider.m in Sources */, + 98981CD6423980FC27F111532601E235 /* FirebaseInstallations-dummy.m in Sources */, + DF598F7A905E1A185FCE93A095C67E2B /* FIRInstallations.m in Sources */, + F4A1FBED4F8F44C71E662D93AFE49DF6 /* FIRInstallationsAPIService.m in Sources */, + 643EC004DC0A1E0FE311F6C01E8E5C4D /* FIRInstallationsAuthTokenResult.m in Sources */, + 0CA37C905B2351EC9E0F789B31116CD3 /* FIRInstallationsBackoffController.m in Sources */, + 0E3A3677D667E4A6EF03BB90A42E900D /* FIRInstallationsErrorUtil.m in Sources */, + 008C656B9D533D0A219CA1C869E390E9 /* FIRInstallationsHTTPError.m in Sources */, + E032DC89486E8C04F9018D6DB76C6675 /* FIRInstallationsIDController.m in Sources */, + E169350B7F0E6EFA584A2D4C9A79DC1E /* FIRInstallationsIIDStore.m in Sources */, + 9DB10F62601D45317249D366B2CEE378 /* FIRInstallationsIIDTokenStore.m in Sources */, + 071BBC1B5F61DD0B4D006F74897A40E3 /* FIRInstallationsItem.m in Sources */, + 69A87D89994D4C494300A61DE6D9ED0B /* FIRInstallationsItem+RegisterInstallationAPI.m in Sources */, + 2B085124D491991AFB531924C05029F8 /* FIRInstallationsLogger.m in Sources */, + 48AF238CCC3514B3FF7CF777D30802AD /* FIRInstallationsSingleOperationPromiseCache.m in Sources */, + 90F9256DC310D10FE5C7FFA0F585FB5C /* FIRInstallationsStore.m in Sources */, + 540483A74F863FA83592B2BADD717E80 /* FIRInstallationsStoredAuthToken.m in Sources */, + 6B1235FFE92D37D0475C791D73F1B7DF /* FIRInstallationsStoredItem.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C3BA4564BD2F94A92331FB010488A29A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 606ADCD7A2F53B218B09EA7FCBE60CE5 /* FIRAnalyticsConfiguration.m in Sources */, + 3B6A08C5F1FBCDA5C16A87B954AF8116 /* FIRApp.m in Sources */, + C1CA132E0CBF72384291054E1CA2AEBD /* FIRBundleUtil.m in Sources */, + 313B5C334AAD8CE67A03FB1D84EC4A7B /* FIRComponent.m in Sources */, + 4ECD319370B2E1BA99D820E2E73F546E /* FIRComponentContainer.m in Sources */, + 85A56A56CCA523362D3F03D3E553796F /* FIRComponentType.m in Sources */, + 12D33A476302F2F61AD70AD60CA2FBDA /* FIRConfiguration.m in Sources */, + A9293AC9565AFC6759E66545CF6B01F5 /* FirebaseCore-dummy.m in Sources */, + 2C26082FF7042AE4ED3CB01AB4F98621 /* FIRFirebaseUserAgent.m in Sources */, + 2422B797AC7DC3054BB10671C2E896CB /* FIRHeartbeatLogger.m in Sources */, + 4B39B07721DCA778282F4F4BFEB52F8A /* FIRLogger.m in Sources */, + 495A3E3546D28106D30C9F033FCF89C5 /* FIROptions.m in Sources */, + 52784892B3A092F6136BD758A686070A /* FIRTimestamp.m in Sources */, + 39E0B400944C81F20DD871C526313963 /* FIRVersion.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C59EE3614ED07CE48C2C7A1A0E67083C /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + A5D189FBBABB2C21CC5E9D6D7E257BDD /* crashlytics.nanopb.c in Sources */, + 25D5978720F4078ABEB8C7E10369F307 /* CrashlyticsRemoteConfigManager.swift in Sources */, + BE775B47CC9A673C86241D85FB9164C5 /* EncodedRolloutAssignment.swift in Sources */, + E390A9111C88164B23CE0069B5B1345F /* FIRCLSAllocate.c in Sources */, + 796BE8A62C71BE788EC7186E46DAEC67 /* FIRCLSAnalyticsManager.m in Sources */, + D778204FA9C39D3CD284AE34D9C57561 /* FIRCLSApplication.m in Sources */, + 2B5D794282006D917AAAB3C34039374B /* FIRCLSApplicationIdentifierModel.m in Sources */, + 7E282174A49CCADFDAD3380FF833CCDF /* FIRCLSAsyncOperation.m in Sources */, + 0BAFD20DEEBE51D5687822958D43C54D /* FIRCLSBinaryImage.m in Sources */, + 95410CBA1A1745DD2841C2367B46D6A1 /* FIRCLSByteUtility.m in Sources */, + 562B04C758A4B190229EE958FC715F7B /* FIRCLSCallStackTree.m in Sources */, + 853758D54BACE73D5DAC0F15202C2868 /* FIRCLSCodeMapping.m in Sources */, + D83C33087921CA88A4184D7E752C9B7A /* FIRCLSCompactUnwind.c in Sources */, + 4A939E7C7D730EAF9A056C7BF89BC4CE /* FIRCLSCompoundOperation.m in Sources */, + 6DAF6EFA062A3D46D387529467F6D54A /* FIRCLSConstants.m in Sources */, + 97EDA437FB2DB6311C81DFC580DB45FD /* FIRCLSContext.m in Sources */, + C9591B01A97199177CE1C5244345FFD6 /* FIRCLSContextInitData.m in Sources */, + E6D7B43252FB4812983E40F804ECD3E1 /* FIRCLSContextManager.m in Sources */, + 92EB309DD97645E4978C3793BDB38AEF /* FIRCLSCrashedMarkerFile.c in Sources */, + 156AD13B01E18134815403FBA9ECB09C /* FIRCLSDataCollectionArbiter.m in Sources */, + A61C9CEABC2BD9CDE10CF7CE4800D7E9 /* FIRCLSDataCollectionToken.m in Sources */, + 69B142955482DB2F776C9DC471D6C64F /* FIRCLSDataParsing.c in Sources */, + B6E39097F5842A205D36E12A278580CA /* FIRCLSDemangleOperation.mm in Sources */, + A1DE49510A0F5FE30C8C1A2271E5CBA6 /* FIRCLSDownloadAndSaveSettingsOperation.m in Sources */, + AC2699FC73240A1F3D3F4D202FE8FE9D /* FIRCLSdSYM.m in Sources */, + 7CE612DA64E95ED7B034D7A7AB0CBF69 /* FIRCLSDwarfExpressionMachine.c in Sources */, + A00B3C0EAD7285D062ADE742FB70203D /* FIRCLSDwarfUnwind.c in Sources */, + 52336C3ACF5F55E464162040EB6B9388 /* FIRCLSException.mm in Sources */, + FF75A39D43BC6A9B308425FB5F2AD962 /* FIRCLSExecutionIdentifierModel.m in Sources */, + 6CFA5420733D19C97D13C61740DFA940 /* FIRCLSExistingReportManager.m in Sources */, + 059109895BDFD724CE25A633AD1031B5 /* FIRCLSFABAsyncOperation.m in Sources */, + 49D5645C5B253DBF5797F824E56F6BE8 /* FIRCLSFABHost.m in Sources */, + 14782E5746464AA90E7821AE50E46EFF /* FIRCLSFABNetworkClient.m in Sources */, + 3896E4F06151C2DD4A83F951D9C029A2 /* FIRCLSFile.m in Sources */, + 9435656D731BAD32451630A2B5FCBBDB /* FIRCLSFileManager.m in Sources */, + 10BABCE8D44B8A5C7C64DC420FCA25C7 /* FIRCLSHandler.m in Sources */, + 59BB1BED6211F6F86D2EF91057912CC2 /* FIRCLSHost.m in Sources */, + D6163F73BC0B2776F5D46A1A32A47B32 /* FIRCLSInstallIdentifierModel.m in Sources */, + F7F3F6F640D39624FE05900C638BACC1 /* FIRCLSInternalLogging.c in Sources */, + 8C67F4AE832D052C9A7AC3FF30D2D608 /* FIRCLSInternalReport.m in Sources */, + 903FA111987E3F837641E29D14C53DAC /* FIRCLSLaunchMarkerModel.m in Sources */, + 34771C101C9A71BD0DF3ABC746689B67 /* FIRCLSLogger.m in Sources */, + 8C3D041C63F2CE2D2AAA1980E3F53E3F /* FIRCLSMachException.c in Sources */, + 96A664DD04C7E6CB38BB11050DD72045 /* FIRCLSMachO.m in Sources */, + FB40F36CF9AE1EE8AD1CB84C74E5E738 /* FIRCLSMachOBinary.m in Sources */, + 492D49CBA3F9AEEF2E46638D45DEE877 /* FIRCLSMachOSlice.m in Sources */, + 58BD8A7A51492CFF92BCD94220E42DD3 /* FIRCLSManagerData.m in Sources */, + 28D715152671D221E44DA4BDF0902980 /* FIRCLSMetricKitManager.m in Sources */, + 839F7A7877C0181041B6A83DF9ED1C8E /* FIRCLSNetworkOperation.m in Sources */, + 1D1D6E58BACAC45FE741B87CBB27FFF5 /* FIRCLSNetworkResponseHandler.m in Sources */, + 7871457C6AF99AFF143EC808200BFF25 /* FIRCLSNotificationManager.m in Sources */, + E9945D7AC33F2F715442F8555A508658 /* FIRCLSOnDemandModel.m in Sources */, + E038F7B639D0E56F4CB91590A7C882AA /* FIRCLSProcess.c in Sources */, + AC599175C89ABA571244021574902E3F /* FIRCLSProcessReportOperation.m in Sources */, + 128FB622556D297AD5020B4CDB2467C1 /* FIRCLSRecordApplication.m in Sources */, + 903F6BDA7007338C73C9BEA3959D27F5 /* FIRCLSRecordBase.m in Sources */, + 372A144E6EB2B7EDFF0E83F4C1018AF4 /* FIRCLSRecordHost.m in Sources */, + 3BE68DF47BBC7A0D4494B6D94BEF2F8D /* FIRCLSRecordIdentity.m in Sources */, + B8DA6EBE31492BB2C21E1FE868828371 /* FIRCLSReportAdapter.m in Sources */, + 79178BCB9342BCDC272BDC3EC79E08B1 /* FIRCLSReportManager.m in Sources */, + B096BB997A3AB0265B843B3F7DD2C1CE /* FIRCLSReportUploader.m in Sources */, + 950E10804AB46A6A4F977687E0E022CD /* FIRCLSRolloutsPersistenceManager.m in Sources */, + DF10BD3B1246EC7E21A2802C4234F85A /* FIRCLSSerializeSymbolicatedFramesOperation.m in Sources */, + 892F81A054898BBC6D4356C5837A630B /* FIRCLSSettings.m in Sources */, + A8E354927585F4787B2AF9EB70D8E095 /* FIRCLSSettingsManager.m in Sources */, + 8732A6466542F7DCE56208F554D1DD9B /* FIRCLSSignal.c in Sources */, + DD6B443181389B19CB9732744E40C6D0 /* FIRCLSSymbolicationOperation.m in Sources */, + D9145A28576376B4403FC0AC0DD26704 /* FIRCLSSymbolResolver.m in Sources */, + BE59BCF4E78D2054D022D96E5D1D3FB3 /* FIRCLSThreadArrayOperation.m in Sources */, + D3A0FEC8AEAC6CAEC38EB86AB2A30F1C /* FIRCLSThreadState.c in Sources */, + D17C0839652445A6173073FE0D6C5337 /* FIRCLSUnwind.c in Sources */, + DCC1D914B8635153EF79671172B0F9D4 /* FIRCLSUnwind_arm.c in Sources */, + 2F4E7D32064886D3C5916D026BA5B74D /* FIRCLSUnwind_x86.c in Sources */, + A39E8B78626BBD47EFA9483879C21A39 /* FIRCLSURLBuilder.m in Sources */, + 54B79731BEB75E30C2DC698E564B25E3 /* FIRCLSUserDefaults.m in Sources */, + 5547E4476B4F55A67501AF62B82E28D2 /* FIRCLSUserLogging.m in Sources */, + 78E6606A265EE8EBD823053789E30D13 /* FIRCLSUtility.m in Sources */, + FEB57B84C5166970116A8EB05AABDCE4 /* FIRCLSUUID.m in Sources */, + 7859D7BF55E67EF873C45CA5F8BA07E9 /* FIRCrashlytics.m in Sources */, + 331BDE0E0E4A63C06A33A8090507AAD1 /* FIRCrashlyticsReport.m in Sources */, + E7CA7E4F874F4B8A5737223269786B7E /* FirebaseCrashlytics-dummy.m in Sources */, + F9E8A9F92603218E90595781D812D62E /* FIRExceptionModel.m in Sources */, + EB5DDE117AE54AF4193A66EDAEFC8595 /* FIRStackFrame.m in Sources */, + 2E62C7A519F3CBDCA77D9E36E0DA7CDC /* StringToHexConverter.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + CA63ADB8298B9567B5557E1F37DC07C3 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E2C00CA88D3132B4AA394E7D406FEFAB /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E6F56F12D6ED5A80B6F1C64D842261FA /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F06E5CC4690B6DB0C70F01D2E4DE2FC6 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F3EFAEF89113AEC19D9F4C36031E4082 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 92B5515DD16C72A1903B97537E441B74 /* dummy.m in Sources */, + CDECB5D1ED07F5624019A85CCC1E29C8 /* FirebaseCoreExtension-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F9BD64F9F73284B8441BAB91615B22AA /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + FF71D156BD5D37C1402A22DFD67722BD /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 0097E61B0E5B179B6962D5110A7F7807 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = GoogleUtilities; + target = 8D7F5D5DD528D21A72DC87ADA5B12E2D /* GoogleUtilities */; + targetProxy = 71A86E040A2659303BD18DD1BCE8D70D /* PBXContainerItemProxy */; + }; + 09773A37FD4D65ECAFE0EC03740CF8C3 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = FirebaseAnalytics; + target = C49E7A4D59E5C8BE8DE9FB1EFB150185 /* FirebaseAnalytics */; + targetProxy = 4703F08886E699BBD457E8784A953A23 /* PBXContainerItemProxy */; + }; + 0EDD0333C6767165884B72D9185B9B98 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = FirebaseCore; + target = 4402AFF83DBDC4DD07E198685FDC2DF2 /* FirebaseCore */; + targetProxy = 5ECC3C7C666FC1E215484E3F77D1E04F /* PBXContainerItemProxy */; + }; + 1391F2E44BF7587E2B6DB83214E857CA /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = PromisesObjC; + target = 2BBF7206D7FAC92C82A042A99C4A98F8 /* PromisesObjC */; + targetProxy = 1C30E3061C61AE5E62891AC0A19FB3B9 /* PBXContainerItemProxy */; + }; + 13B63CCC7671FFC33563DFC82B8CBD94 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = IronSourceAdQualitySDK; + target = A2E1CD763F5748382ECFDCFBD119D430 /* IronSourceAdQualitySDK */; + targetProxy = D124A14AE0BAE75FFDF2FDF5A4FD5A1B /* PBXContainerItemProxy */; + }; + 153B58761E1D76A219D1164FA82A32F9 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "nanopb-nanopb_Privacy"; + target = 55522A91938FF505CFEBEAD2DD85AE2D /* nanopb-nanopb_Privacy */; + targetProxy = 1AD63F727A8ED947A7D9D53C90A531CF /* PBXContainerItemProxy */; + }; + 162820A6207087BCEEB1C1A61A7658C0 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = PromisesObjC; + target = 2BBF7206D7FAC92C82A042A99C4A98F8 /* PromisesObjC */; + targetProxy = 7D64F063559BAA34DFCF95AB21B82ADC /* PBXContainerItemProxy */; + }; + 16F986DB78475A7F38B1CF5CE8BA79CF /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = IronSourceAdQualitySDK; + target = A2E1CD763F5748382ECFDCFBD119D430 /* IronSourceAdQualitySDK */; + targetProxy = 2C6CD346A33BBCE1181D5E6AEB7E0CA8 /* PBXContainerItemProxy */; + }; + 1999B5990B3201D581D02A4852D4C081 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = GoogleAppMeasurement; + target = B53D977A951AFC38B21751B706C1DF83 /* GoogleAppMeasurement */; + targetProxy = 5D67FE3F614F8618A9222511F30FB52B /* PBXContainerItemProxy */; + }; + 1B74730F35F64C7A4552BDB9C0A64C14 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = FirebaseCoreInternal; + target = 25E9E9A17BC3F670357D7385C521E48E /* FirebaseCoreInternal */; + targetProxy = E19335BDB606ED164438697978DEE71B /* PBXContainerItemProxy */; + }; + 1D0E375272D6399E61FD638CAC2F76C9 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = nanopb; + target = D2B5E7DCCBBFB32341D857D01211A1A3 /* nanopb */; + targetProxy = 165CE7B3574CADAAD0790C1D0C78E34B /* PBXContainerItemProxy */; + }; + 1DF8A555B01EB545C870B1019C3D1D8E /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "GoogleDataTransport-GoogleDataTransport_Privacy"; + target = DD0D41A9315A48004E57F4F0E54095F1 /* GoogleDataTransport-GoogleDataTransport_Privacy */; + targetProxy = 131E63DB9275F52AB6083117D780D1A9 /* PBXContainerItemProxy */; + }; + 20373381B9BABD75C18951C7B1273B84 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = GoogleUtilities; + target = 8D7F5D5DD528D21A72DC87ADA5B12E2D /* GoogleUtilities */; + targetProxy = F89B95AABF292BEA8C300B526CF431AE /* PBXContainerItemProxy */; + }; + 236506D979D979151310284C9BFD7D4C /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = PromisesObjC; + target = 2BBF7206D7FAC92C82A042A99C4A98F8 /* PromisesObjC */; + targetProxy = 3CCE50973982D90C58D623CAC6DAEC8E /* PBXContainerItemProxy */; + }; + 237BDF8C12568F0AA33B1C4D6F5730D0 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = GoogleUtilities; + target = 8D7F5D5DD528D21A72DC87ADA5B12E2D /* GoogleUtilities */; + targetProxy = 44521A4A53B13D382C6474279F165CEA /* PBXContainerItemProxy */; + }; + 3A72B60800B19245A356B3DDEAA5BF33 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = GoogleAppMeasurement; + target = B53D977A951AFC38B21751B706C1DF83 /* GoogleAppMeasurement */; + targetProxy = 4DDBFC47370FB5E5DBBCFA9D9730D78C /* PBXContainerItemProxy */; + }; + 3D936F524DAFD0ADE7853DC75CFC851B /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = FirebaseInstallations; + target = 87803597EB3F20FC46472B85392EC4FD /* FirebaseInstallations */; + targetProxy = 35490FDFC77A9C2677D10528B900587A /* PBXContainerItemProxy */; + }; + 41B2AA0C5F71BE687B4C154B055A1035 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = nanopb; + target = D2B5E7DCCBBFB32341D857D01211A1A3 /* nanopb */; + targetProxy = 9CA4F0741A4ABBBDB838D0245BC74A91 /* PBXContainerItemProxy */; + }; + 42C6A5D683E1BB10DEDAB516CE7E3292 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "PromisesSwift-Promises_Privacy"; + target = 230F5EE18ECBB227C09ED2C571AFA319 /* PromisesSwift-Promises_Privacy */; + targetProxy = 112847E7D8245D4EB7F65A88A3FAA128 /* PBXContainerItemProxy */; + }; + 430687AB4CF6DF6F8A6AB085631D746C /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = FirebaseCoreExtension; + target = FE1DE31D91C32501251AE9687CDC2E0F /* FirebaseCoreExtension */; + targetProxy = 215D2B6EC1914B0CD3ACDCDEA8933340 /* PBXContainerItemProxy */; + }; + 4816EDAFC4ADDE2E7A85A04C3008762E /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = FirebaseCoreInternal; + target = 25E9E9A17BC3F670357D7385C521E48E /* FirebaseCoreInternal */; + targetProxy = 0AEDC7695709B14C07E66DFD8EB75C25 /* PBXContainerItemProxy */; + }; + 4E643E958DD5BC564F398548C8628107 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = GoogleUtilities; + target = 8D7F5D5DD528D21A72DC87ADA5B12E2D /* GoogleUtilities */; + targetProxy = 572951F34C407CA98B317105770EE8D8 /* PBXContainerItemProxy */; + }; + 4ECCD3A9A961455B777DB5DD193E5F58 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = FirebaseRemoteConfigInterop; + target = 328CC04F43300C6CAB81659260A3799D /* FirebaseRemoteConfigInterop */; + targetProxy = 8C2AD4323BC01E2D9EDEDB04B66066DC /* PBXContainerItemProxy */; + }; + 503B4D3AF6A950AC54574462E3ED3CE9 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "FirebaseInstallations-FirebaseInstallations_Privacy"; + target = 3EB14444A17F9D4F1F697F7C1FF32245 /* FirebaseInstallations-FirebaseInstallations_Privacy */; + targetProxy = 118A1B042C57A03055FC1105A4220933 /* PBXContainerItemProxy */; + }; + 58DB6FB40B9E57559F7A6BE96B9431E9 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = GoogleUtilities; + target = 8D7F5D5DD528D21A72DC87ADA5B12E2D /* GoogleUtilities */; + targetProxy = E48E1DC06C1609E1E69CB4BAAF24F578 /* PBXContainerItemProxy */; + }; + 5D2B0F7AF48AA97ABAA38AEA6A44C62B /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = FirebaseCore; + target = 4402AFF83DBDC4DD07E198685FDC2DF2 /* FirebaseCore */; + targetProxy = A69632337C3BECBFF68ABC70AD3EC3B4 /* PBXContainerItemProxy */; + }; + 60D0407C1605F26B57A2A6803C396358 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = GoogleDataTransport; + target = 5C0371EE948D0357B8EE0E34ABB44BF0 /* GoogleDataTransport */; + targetProxy = A4217FA86749E034DBEB0F211AB34696 /* PBXContainerItemProxy */; + }; + 67CB3DB06CB65F4D9F827A636FF80FA7 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = FirebaseCoreExtension; + target = FE1DE31D91C32501251AE9687CDC2E0F /* FirebaseCoreExtension */; + targetProxy = 7DFF17BCCB325A34320936B74C9989A9 /* PBXContainerItemProxy */; + }; + 6A41C7DFEBA8BBD1DE9ED8EB9BB26E7D /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = FirebaseCore; + target = 4402AFF83DBDC4DD07E198685FDC2DF2 /* FirebaseCore */; + targetProxy = 384B5A4E87D37200982EF4C9F8297B3C /* PBXContainerItemProxy */; + }; + 755658629F08C7B9E6ECBD91B60E2ABC /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = FirebaseSessions; + target = 3F8EC37C78673149F2B94E8BD9AA8737 /* FirebaseSessions */; + targetProxy = FE4048AEA7B2A318B63438FABCD4F8C3 /* PBXContainerItemProxy */; + }; + 79A8EFDC22D9694FF920B8036B399F6E /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = nanopb; + target = D2B5E7DCCBBFB32341D857D01211A1A3 /* nanopb */; + targetProxy = 7FE5137DAADBB0B4EC15AE9B8AA729F1 /* PBXContainerItemProxy */; + }; + 7E9AC2926A821E6DF8969FD45614F97B /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = PromisesSwift; + target = A979F9D3632CD5F2F7518F9A362CBAE3 /* PromisesSwift */; + targetProxy = 5080A78383408B47D9ABACBA5EEFBA6E /* PBXContainerItemProxy */; + }; + 7EE4E6CCEAAE2BA6010C3DAD6808D664 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = IronSourceSDK; + target = 205EFBEF86DA6E7E3D5B9BABED8872EE /* IronSourceSDK */; + targetProxy = 090D3560E9D11997273A0D2B8DBD18B7 /* PBXContainerItemProxy */; + }; + 875FBAB3F6B2D6798080207C9FC3ADE0 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "FirebaseCoreInternal-FirebaseCoreInternal_Privacy"; + target = 2949783F7EDB27AD4666B5427B63DC79 /* FirebaseCoreInternal-FirebaseCoreInternal_Privacy */; + targetProxy = 168347FFF9CC0ABAB0B4FE426F0E0489 /* PBXContainerItemProxy */; + }; + 8DC0B6EE6831FDC04F3EC458660C0220 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = FirebaseCore; + target = 4402AFF83DBDC4DD07E198685FDC2DF2 /* FirebaseCore */; + targetProxy = BD0170F52406791A521FAA6BB540E818 /* PBXContainerItemProxy */; + }; + 8E193CFD3718B0470445B637D1D0D56A /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = GoogleUtilities; + target = 8D7F5D5DD528D21A72DC87ADA5B12E2D /* GoogleUtilities */; + targetProxy = 6BAA1D6F714068ECE90C9D49D4B52E82 /* PBXContainerItemProxy */; + }; + 8FF469EE781D85D3CDE73E88B099637A /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "FirebaseCrashlytics-FirebaseCrashlytics_Privacy"; + target = 17CBCC6221F62B870268E935098B7D7D /* FirebaseCrashlytics-FirebaseCrashlytics_Privacy */; + targetProxy = 248C7027C24F088EDB1F7CB3B266D8EB /* PBXContainerItemProxy */; + }; + 9293C3767BBC6A8BE8512F5EDEF1B465 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = GoogleUtilities; + target = 8D7F5D5DD528D21A72DC87ADA5B12E2D /* GoogleUtilities */; + targetProxy = A1D3D7A640D47B5B2F44D553C7AE1541 /* PBXContainerItemProxy */; + }; + 94870B075058C3E21F86C64E7D4EBA5D /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "PromisesObjC-FBLPromises_Privacy"; + target = 1BFBEDBF7E03729D43C96530EE190825 /* PromisesObjC-FBLPromises_Privacy */; + targetProxy = 0E9B78B542E98D758FCBD0BDD3016DB7 /* PBXContainerItemProxy */; + }; + 970067168A05FEBADA0722E9AB5338AB /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = FirebaseCrashlytics; + target = 526C4398D095B3704EB933DADBC30093 /* FirebaseCrashlytics */; + targetProxy = 4B2E72074A2C0203AFD32D9C2988FE08 /* PBXContainerItemProxy */; + }; + 976BE867872D59B2F412792128F98598 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = FirebaseSessions; + target = 3F8EC37C78673149F2B94E8BD9AA8737 /* FirebaseSessions */; + targetProxy = 93551147FF9A8F2E6D4C742E79912CEF /* PBXContainerItemProxy */; + }; + A22FDDD64A3A5E58FA6AFE4475FDF3F2 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = FirebaseCore; + target = 4402AFF83DBDC4DD07E198685FDC2DF2 /* FirebaseCore */; + targetProxy = 018E01B46A8AB95046DED9CB7352FFAF /* PBXContainerItemProxy */; + }; + A410C6903786A4EC8F8343931F8A828F /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = FirebaseInstallations; + target = 87803597EB3F20FC46472B85392EC4FD /* FirebaseInstallations */; + targetProxy = 71C3C5732BC0A09CE002BCA40899E7C4 /* PBXContainerItemProxy */; + }; + A608DEC9C5F35AC4E5F12A3A612DE3C8 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = FirebaseCore; + target = 4402AFF83DBDC4DD07E198685FDC2DF2 /* FirebaseCore */; + targetProxy = 4DEAD30847DFA1371EA8028BB5DC465B /* PBXContainerItemProxy */; + }; + AE008DF3EEE07AA4BA3CC6F5CCC0B608 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = nanopb; + target = D2B5E7DCCBBFB32341D857D01211A1A3 /* nanopb */; + targetProxy = 5DDAA350440DA03BF994E987753013B2 /* PBXContainerItemProxy */; + }; + B096EC4C1C370353B7DFCDB791DEE330 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = nanopb; + target = D2B5E7DCCBBFB32341D857D01211A1A3 /* nanopb */; + targetProxy = 1A39224268B72A68C99502673F451DED /* PBXContainerItemProxy */; + }; + B1A961481F3231DC8091D661B9CF5A71 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = GoogleDataTransport; + target = 5C0371EE948D0357B8EE0E34ABB44BF0 /* GoogleDataTransport */; + targetProxy = C9610F2F6181F6F9BB7694459615C138 /* PBXContainerItemProxy */; + }; + B34CE4F0930B547CE0E38C9CE3BB7463 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = FirebaseRemoteConfigInterop; + target = 328CC04F43300C6CAB81659260A3799D /* FirebaseRemoteConfigInterop */; + targetProxy = FD33298F6D9D1E054EA5913A12A12246 /* PBXContainerItemProxy */; + }; + B37B87297F38444F771BEAA5072CDD5A /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = PromisesSwift; + target = A979F9D3632CD5F2F7518F9A362CBAE3 /* PromisesSwift */; + targetProxy = 334007B11B4B2010CDA4139860A1AEA5 /* PBXContainerItemProxy */; + }; + B6A355A29E1FB825F8913DCA41279CEF /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = PromisesObjC; + target = 2BBF7206D7FAC92C82A042A99C4A98F8 /* PromisesObjC */; + targetProxy = 26F18CBCD231DEA3718060810BF89B18 /* PBXContainerItemProxy */; + }; + B959C158384B598B38F8C1764C4A328F /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = GoogleUtilities; + target = 8D7F5D5DD528D21A72DC87ADA5B12E2D /* GoogleUtilities */; + targetProxy = 68BB89BFE02AC2BEBFB6A44157B89DF8 /* PBXContainerItemProxy */; + }; + BDAE3DBCEE3760B145FDA692D0065418 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = FirebaseInstallations; + target = 87803597EB3F20FC46472B85392EC4FD /* FirebaseInstallations */; + targetProxy = 91055FDE681B27AB781A92EF9A7A2834 /* PBXContainerItemProxy */; + }; + C1EC47ACC6C680CE70C8EF672D860F7B /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = nanopb; + target = D2B5E7DCCBBFB32341D857D01211A1A3 /* nanopb */; + targetProxy = B928DE7571902239FD44F557C68D3E45 /* PBXContainerItemProxy */; + }; + C73AA11B73FCE1FC9A1428331F277FFC /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = GoogleUtilities; + target = 8D7F5D5DD528D21A72DC87ADA5B12E2D /* GoogleUtilities */; + targetProxy = 3E6931CB0F943CC68E1F279C4A443F5A /* PBXContainerItemProxy */; + }; + C784FF17C3DCC09C1145E65235491FFD /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "GoogleUtilities-GoogleUtilities_Privacy"; + target = 5FF1A58DEEC5DB749FCD6C120B97CC82 /* GoogleUtilities-GoogleUtilities_Privacy */; + targetProxy = 653871C14A97AB4FD09D70364EC3EF4A /* PBXContainerItemProxy */; + }; + D5C0B04920096D4EF2A2DEE9AB6E3729 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = nanopb; + target = D2B5E7DCCBBFB32341D857D01211A1A3 /* nanopb */; + targetProxy = 16A19C5501F6933759A8F2A7C680DF7B /* PBXContainerItemProxy */; + }; + D9E50F675130C3C429A6BCF40A019D66 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "FirebaseCore-FirebaseCore_Privacy"; + target = 1001C16510D946B47CFF8B19DBC0B787 /* FirebaseCore-FirebaseCore_Privacy */; + targetProxy = 62A06F8508A7670635A04652CF34C1B1 /* PBXContainerItemProxy */; + }; + DE59EEE02428834B3C733C15D5C0C99D /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = PromisesObjC; + target = 2BBF7206D7FAC92C82A042A99C4A98F8 /* PromisesObjC */; + targetProxy = 10DAD9144B329B3D3AF0964E83849F46 /* PBXContainerItemProxy */; + }; + ECFF791D359315450D8CEABF117194BC /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = GoogleDataTransport; + target = 5C0371EE948D0357B8EE0E34ABB44BF0 /* GoogleDataTransport */; + targetProxy = FEFF157E534C552F7ACF2437E46C1964 /* PBXContainerItemProxy */; + }; + EE636BA91E7627BBAE7B069AD84A6A04 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "IronSourceAdQualitySDK-IronSourceAdQualityPrivacyInfo"; + target = 4317F1CA49C4682E275F7D8FF912FAD2 /* IronSourceAdQualitySDK-IronSourceAdQualityPrivacyInfo */; + targetProxy = 442C72C1DF5C7E2DA7861DC0441050AD /* PBXContainerItemProxy */; + }; + F0A764F545B1B90E8D22CFC184D24C86 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = GoogleAdsOnDeviceConversion; + target = 26309F9D4DF43E362A8AF6A93B41FF6D /* GoogleAdsOnDeviceConversion */; + targetProxy = 417B7FE84E917D047F7B19051330EEB6 /* PBXContainerItemProxy */; + }; + F63FBFCD07CDB9D9C47CDF744B02CE4B /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = FirebaseInstallations; + target = 87803597EB3F20FC46472B85392EC4FD /* FirebaseInstallations */; + targetProxy = B507DFD3C894D9C8185B5F1FFDA748EF /* PBXContainerItemProxy */; + }; + F69BE287892D6155C48BBDE95E070AA9 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = GoogleAdsOnDeviceConversion; + target = 26309F9D4DF43E362A8AF6A93B41FF6D /* GoogleAdsOnDeviceConversion */; + targetProxy = A0F11355AE8C469EEF42274EA874A108 /* PBXContainerItemProxy */; + }; + FF66B4DE08FD8BFCC60AF8286224CFFE /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "FirebaseCoreExtension-FirebaseCoreExtension_Privacy"; + target = 9C4575D64B2B6264CF6AB60FB03302AA /* FirebaseCoreExtension-FirebaseCoreExtension_Privacy */; + targetProxy = FD068D6ADAD061FF04AE1453D76E7030 /* PBXContainerItemProxy */; + }; + FFFEDE03FEE5C6C3C7959B41A66D7C5D /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "IronSourceSDK-IronSourcePrivacyInfo"; + target = AF4066D13B4DC667FB970ABF861B2B47 /* IronSourceSDK-IronSourcePrivacyInfo */; + targetProxy = F8B5149875BC42AFC76EE6821174E496 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 00738E47C6AE4750C5C4792104EBF5BE /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 1B304109378D7BE663BDB66843D276FD /* FirebaseCoreExtension.debug.xcconfig */; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_PREFIX_HEADER = "Target Support Files/FirebaseCoreExtension/FirebaseCoreExtension-prefix.pch"; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/FirebaseCoreExtension/FirebaseCoreExtension-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/FirebaseCoreExtension/FirebaseCoreExtension.modulemap"; + PRODUCT_MODULE_NAME = FirebaseCoreExtension; + PRODUCT_NAME = FirebaseCoreExtension; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.9; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 076648177251140C05190DFE8A206977 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = BBF832B158FF262578C25354471128D5 /* FirebaseCoreInternal.debug.xcconfig */; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_PREFIX_HEADER = "Target Support Files/FirebaseCoreInternal/FirebaseCoreInternal-prefix.pch"; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/FirebaseCoreInternal/FirebaseCoreInternal-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/FirebaseCoreInternal/FirebaseCoreInternal.modulemap"; + PRODUCT_MODULE_NAME = FirebaseCoreInternal; + PRODUCT_NAME = FirebaseCoreInternal; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.9; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 0AA57C7EE3CC40BDC5B67D6987012997 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 1B304109378D7BE663BDB66843D276FD /* FirebaseCoreExtension.debug.xcconfig */; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/FirebaseCoreExtension"; + IBSC_MODULE = FirebaseCoreExtension; + INFOPLIST_FILE = "Target Support Files/FirebaseCoreExtension/ResourceBundle-FirebaseCoreExtension_Privacy-FirebaseCoreExtension-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + PRODUCT_NAME = FirebaseCoreExtension_Privacy; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Debug; + }; + 0B06E54810C44C51D33B103EECFF2E18 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = C309DB544F609F3EC9050218B396B41B /* FirebaseCrashlytics.debug.xcconfig */; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/FirebaseCrashlytics/FirebaseCrashlytics-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/FirebaseCrashlytics/FirebaseCrashlytics.modulemap"; + PRODUCT_MODULE_NAME = FirebaseCrashlytics; + PRODUCT_NAME = FirebaseCrashlytics; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.9; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 1013AD81B66C35A645B42CD9D32B2EE9 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 2F3F443A69F12C8FC5069D2F16BDAF87 /* GoogleDataTransport.release.xcconfig */; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/GoogleDataTransport"; + IBSC_MODULE = GoogleDataTransport; + INFOPLIST_FILE = "Target Support Files/GoogleDataTransport/ResourceBundle-GoogleDataTransport_Privacy-GoogleDataTransport-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + PRODUCT_NAME = GoogleDataTransport_Privacy; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Release; + }; + 11D9D0109B5A73199B87A6936673C084 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = C31C3EC5CF8094BD8759E8471989140E /* IronSourceSDK.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_ENABLE_OBJC_WEAK = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 1A3E76B54702191DD8E1678DEC236F58 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 6D3CA506E1A546D42FDF3E6448C106C8 /* IronSourceSDK.release.xcconfig */; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/IronSourceSDK"; + IBSC_MODULE = IronSourceSDK; + INFOPLIST_FILE = "Target Support Files/IronSourceSDK/ResourceBundle-IronSourcePrivacyInfo-IronSourceSDK-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + PRODUCT_NAME = IronSourcePrivacyInfo; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Release; + }; + 254E37C21B022BB3BCDDC35E7CBB6CFE /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = F69827F9D444A1C8C757AF3332BBA839 /* FirebaseCoreExtension.release.xcconfig */; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/FirebaseCoreExtension"; + IBSC_MODULE = FirebaseCoreExtension; + INFOPLIST_FILE = "Target Support Files/FirebaseCoreExtension/ResourceBundle-FirebaseCoreExtension_Privacy-FirebaseCoreExtension-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + PRODUCT_NAME = FirebaseCoreExtension_Privacy; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Release; + }; + 272ACF2EAD00C6EF5F0F73B60E998F82 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 01FB650F7813CF1CA7B53199751B13B0 /* FirebaseInstallations.debug.xcconfig */; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/FirebaseInstallations/FirebaseInstallations-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/FirebaseInstallations/FirebaseInstallations.modulemap"; + PRODUCT_MODULE_NAME = FirebaseInstallations; + PRODUCT_NAME = FirebaseInstallations; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.9; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 2C6FFC1F8EC6485B8784795846DE84B3 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 197116361CAE65ACB9526C14C557AC49 /* GoogleAppMeasurement.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_ENABLE_OBJC_WEAK = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 2E499BD69CA7C8E1B7B1054CFA63B57A /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 88AD9A5A20918C0D9CABCF967A0CACAF /* FirebaseSessions.release.xcconfig */; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/FirebaseSessions/FirebaseSessions-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/FirebaseSessions/FirebaseSessions.modulemap"; + PRODUCT_MODULE_NAME = FirebaseSessions; + PRODUCT_NAME = FirebaseSessions; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.9; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 33A3ED86542226C8A993CEC2DEDE28D2 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = F69827F9D444A1C8C757AF3332BBA839 /* FirebaseCoreExtension.release.xcconfig */; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_PREFIX_HEADER = "Target Support Files/FirebaseCoreExtension/FirebaseCoreExtension-prefix.pch"; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/FirebaseCoreExtension/FirebaseCoreExtension-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/FirebaseCoreExtension/FirebaseCoreExtension.modulemap"; + PRODUCT_MODULE_NAME = FirebaseCoreExtension; + PRODUCT_NAME = FirebaseCoreExtension; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.9; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 3556F52D6CF2099531FFA7B85FCCF35F /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 2F3F443A69F12C8FC5069D2F16BDAF87 /* GoogleDataTransport.release.xcconfig */; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/GoogleDataTransport/GoogleDataTransport-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/GoogleDataTransport/GoogleDataTransport.modulemap"; + PRODUCT_MODULE_NAME = GoogleDataTransport; + PRODUCT_NAME = GoogleDataTransport; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 37F688529FB23FC350C3EE0DAE3E19DE /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 6749A4C1F2DECB3AF85B79A3312D52BB /* FirebaseRemoteConfigInterop.release.xcconfig */; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/FirebaseRemoteConfigInterop/FirebaseRemoteConfigInterop-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/FirebaseRemoteConfigInterop/FirebaseRemoteConfigInterop.modulemap"; + PRODUCT_MODULE_NAME = FirebaseRemoteConfigInterop; + PRODUCT_NAME = FirebaseRemoteConfigInterop; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.9; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 385AEFC4C2F6E1B4144EA35ADA71E6FB /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 320664D59D6FEE7224D3B503B842956D /* PromisesObjC.debug.xcconfig */; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/PromisesObjC"; + IBSC_MODULE = FBLPromises; + INFOPLIST_FILE = "Target Support Files/PromisesObjC/ResourceBundle-FBLPromises_Privacy-PromisesObjC-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + PRODUCT_NAME = FBLPromises_Privacy; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Debug; + }; + 3A04D1B6D3EDB9EC3864B59D94F259D5 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 04CE4B3AAD7F874D08FB7FF1F21EBAC5 /* GoogleUtilities.release.xcconfig */; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/GoogleUtilities"; + IBSC_MODULE = GoogleUtilities; + INFOPLIST_FILE = "Target Support Files/GoogleUtilities/ResourceBundle-GoogleUtilities_Privacy-GoogleUtilities-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + PRODUCT_NAME = GoogleUtilities_Privacy; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Release; + }; + 42DAA2BDED3CB02C960BFD0C7B525199 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 87030F8AC3EDC19A2886F3EA674BDB64 /* PromisesObjC.release.xcconfig */; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/PromisesObjC/PromisesObjC-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/PromisesObjC/PromisesObjC.modulemap"; + PRODUCT_MODULE_NAME = FBLPromises; + PRODUCT_NAME = FBLPromises; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 42DC16F389E06A0DECC91BBD315C3A13 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 01FB650F7813CF1CA7B53199751B13B0 /* FirebaseInstallations.debug.xcconfig */; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/FirebaseInstallations"; + IBSC_MODULE = FirebaseInstallations; + INFOPLIST_FILE = "Target Support Files/FirebaseInstallations/ResourceBundle-FirebaseInstallations_Privacy-FirebaseInstallations-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + PRODUCT_NAME = FirebaseInstallations_Privacy; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Debug; + }; + 459BA786B12ED071DFEEC02E8EA97385 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 1AE2DDA9E2DB7DB2B4A53B457668348D /* FirebaseInstallations.release.xcconfig */; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/FirebaseInstallations"; + IBSC_MODULE = FirebaseInstallations; + INFOPLIST_FILE = "Target Support Files/FirebaseInstallations/ResourceBundle-FirebaseInstallations_Privacy-FirebaseInstallations-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + PRODUCT_NAME = FirebaseInstallations_Privacy; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Release; + }; + 563D586422F18CAD50E39839648AE602 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 2C64F6C4B8FEB07E9A6D018E9936B5BD /* FirebaseRemoteConfigInterop.debug.xcconfig */; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/FirebaseRemoteConfigInterop/FirebaseRemoteConfigInterop-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/FirebaseRemoteConfigInterop/FirebaseRemoteConfigInterop.modulemap"; + PRODUCT_MODULE_NAME = FirebaseRemoteConfigInterop; + PRODUCT_NAME = FirebaseRemoteConfigInterop; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.9; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 5FCE7E636AF9950EE495950991AFA757 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = BBF832B158FF262578C25354471128D5 /* FirebaseCoreInternal.debug.xcconfig */; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/FirebaseCoreInternal"; + IBSC_MODULE = FirebaseCoreInternal; + INFOPLIST_FILE = "Target Support Files/FirebaseCoreInternal/ResourceBundle-FirebaseCoreInternal_Privacy-FirebaseCoreInternal-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + PRODUCT_NAME = FirebaseCoreInternal_Privacy; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Debug; + }; + 65287EC1C413B3564E279E177B6AC812 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 265303350DEFB1E52CEA4D56AACF5557 /* PromisesSwift.debug.xcconfig */; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_PREFIX_HEADER = "Target Support Files/PromisesSwift/PromisesSwift-prefix.pch"; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/PromisesSwift/PromisesSwift-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/PromisesSwift/PromisesSwift.modulemap"; + PRODUCT_MODULE_NAME = Promises; + PRODUCT_NAME = Promises; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.2; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 68413EA6C582EF92B022067ECED90E5E /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 4E1394293C18E2CFDF5A3072F9E2A667 /* nanopb.release.xcconfig */; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/nanopb"; + IBSC_MODULE = nanopb; + INFOPLIST_FILE = "Target Support Files/nanopb/ResourceBundle-nanopb_Privacy-nanopb-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + PRODUCT_NAME = nanopb_Privacy; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Release; + }; + 68E1BC4621051BB9968A68E9E99C3BDE /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 4353BC9AA91F31FEF0A5F70D8CF69875 /* FirebaseCrashlytics.release.xcconfig */; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/FirebaseCrashlytics/FirebaseCrashlytics-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/FirebaseCrashlytics/FirebaseCrashlytics.modulemap"; + PRODUCT_MODULE_NAME = FirebaseCrashlytics; + PRODUCT_NAME = FirebaseCrashlytics; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.9; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 69C41B3CACBDAEC972141F12DD8FD107 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = DB4125A2ADD8442CEBA9B65B91E1D673 /* GoogleUtilities.debug.xcconfig */; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/GoogleUtilities"; + IBSC_MODULE = GoogleUtilities; + INFOPLIST_FILE = "Target Support Files/GoogleUtilities/ResourceBundle-GoogleUtilities_Privacy-GoogleUtilities-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + PRODUCT_NAME = GoogleUtilities_Privacy; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Debug; + }; + 6A030D0DFD06C7EA4C6A1036C52DC028 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 3E183627684F28D7E2F87BE57638D081 /* FirebaseCoreInternal.release.xcconfig */; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/FirebaseCoreInternal"; + IBSC_MODULE = FirebaseCoreInternal; + INFOPLIST_FILE = "Target Support Files/FirebaseCoreInternal/ResourceBundle-FirebaseCoreInternal_Privacy-FirebaseCoreInternal-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + PRODUCT_NAME = FirebaseCoreInternal_Privacy; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Release; + }; + 864983AA5436345BE3F2FBF5549D1CB5 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 320664D59D6FEE7224D3B503B842956D /* PromisesObjC.debug.xcconfig */; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/PromisesObjC/PromisesObjC-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/PromisesObjC/PromisesObjC.modulemap"; + PRODUCT_MODULE_NAME = FBLPromises; + PRODUCT_NAME = FBLPromises; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 90D4D09BCB6A4660E43ACBE9ECB6FE9A /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "POD_CONFIGURATION_DEBUG=1", + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRIP_INSTALLED_PRODUCT = NO; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + SYMROOT = "${SRCROOT}/../build"; + }; + name = Debug; + }; + 93FB64CAD62B25B1008CA853CD77CBCD /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = B19877D75F441EA46145FC561954B989 /* PromisesSwift.release.xcconfig */; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_PREFIX_HEADER = "Target Support Files/PromisesSwift/PromisesSwift-prefix.pch"; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/PromisesSwift/PromisesSwift-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/PromisesSwift/PromisesSwift.modulemap"; + PRODUCT_MODULE_NAME = Promises; + PRODUCT_NAME = Promises; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.2; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 94C9001EC8CEC55D629A88BD0604DD6E /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = AC8C76E2670B571A134C0A71FAB87FA9 /* Pods-TastePick.release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + INFOPLIST_FILE = "Target Support Files/Pods-TastePick/Pods-TastePick-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-TastePick/Pods-TastePick.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 9507AF12B3AA71067F60A33263F806B7 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = B6ADF39B0F8B2D8E2F53267C6D66340A /* IronSourceAdQualitySDK.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_ENABLE_OBJC_WEAK = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 9553C89E183877A5CB2F3C6801BEC129 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + "POD_CONFIGURATION_RELEASE=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRIP_INSTALLED_PRODUCT = NO; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_VERSION = 5.0; + SYMROOT = "${SRCROOT}/../build"; + }; + name = Release; + }; + 96DC323DCD881E70D85486AB6794F9CE /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = EB7ED511E10B0912A631743816085954 /* FirebaseCore.debug.xcconfig */; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/FirebaseCore"; + IBSC_MODULE = FirebaseCore; + INFOPLIST_FILE = "Target Support Files/FirebaseCore/ResourceBundle-FirebaseCore_Privacy-FirebaseCore-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + PRODUCT_NAME = FirebaseCore_Privacy; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Debug; + }; + 9973FFBA844D857065D50FC819BA77AC /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = EB7ED511E10B0912A631743816085954 /* FirebaseCore.debug.xcconfig */; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/FirebaseCore/FirebaseCore-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/FirebaseCore/FirebaseCore.modulemap"; + PRODUCT_MODULE_NAME = FirebaseCore; + PRODUCT_NAME = FirebaseCore; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.9; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 9A347BFF7C7E7E7179978ED5EBD117F8 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 04CE4B3AAD7F874D08FB7FF1F21EBAC5 /* GoogleUtilities.release.xcconfig */; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/GoogleUtilities/GoogleUtilities-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/GoogleUtilities/GoogleUtilities.modulemap"; + PRODUCT_MODULE_NAME = GoogleUtilities; + PRODUCT_NAME = GoogleUtilities; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 9B89A7E805A34410B621CA4DF23ECC52 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 6327E28AF763E513DA6E86C88C092DE8 /* GoogleDataTransport.debug.xcconfig */; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/GoogleDataTransport/GoogleDataTransport-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/GoogleDataTransport/GoogleDataTransport.modulemap"; + PRODUCT_MODULE_NAME = GoogleDataTransport; + PRODUCT_NAME = GoogleDataTransport; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 9C67425E9EBCB0F92EAC363290CAE62A /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = FC2B5772E909C03957AD6D8CE697FADD /* FirebaseSessions.debug.xcconfig */; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/FirebaseSessions/FirebaseSessions-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/FirebaseSessions/FirebaseSessions.modulemap"; + PRODUCT_MODULE_NAME = FirebaseSessions; + PRODUCT_NAME = FirebaseSessions; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.9; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 9E3DCFE4DC62B60BF1EDB90FB07BAAF0 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 3E183627684F28D7E2F87BE57638D081 /* FirebaseCoreInternal.release.xcconfig */; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_PREFIX_HEADER = "Target Support Files/FirebaseCoreInternal/FirebaseCoreInternal-prefix.pch"; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/FirebaseCoreInternal/FirebaseCoreInternal-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/FirebaseCoreInternal/FirebaseCoreInternal.modulemap"; + PRODUCT_MODULE_NAME = FirebaseCoreInternal; + PRODUCT_NAME = FirebaseCoreInternal; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.9; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + A3932E1DABFBA280B68A960D5CFC9BEF /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 4353BC9AA91F31FEF0A5F70D8CF69875 /* FirebaseCrashlytics.release.xcconfig */; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/FirebaseCrashlytics"; + IBSC_MODULE = FirebaseCrashlytics; + INFOPLIST_FILE = "Target Support Files/FirebaseCrashlytics/ResourceBundle-FirebaseCrashlytics_Privacy-FirebaseCrashlytics-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + PRODUCT_NAME = FirebaseCrashlytics_Privacy; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Release; + }; + A8D56CEA1220F877E962050A239B555E /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = C309DB544F609F3EC9050218B396B41B /* FirebaseCrashlytics.debug.xcconfig */; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/FirebaseCrashlytics"; + IBSC_MODULE = FirebaseCrashlytics; + INFOPLIST_FILE = "Target Support Files/FirebaseCrashlytics/ResourceBundle-FirebaseCrashlytics_Privacy-FirebaseCrashlytics-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + PRODUCT_NAME = FirebaseCrashlytics_Privacy; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Debug; + }; + A95431748970A6708D18A867B11072CF /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = C31C3EC5CF8094BD8759E8471989140E /* IronSourceSDK.debug.xcconfig */; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/IronSourceSDK"; + IBSC_MODULE = IronSourceSDK; + INFOPLIST_FILE = "Target Support Files/IronSourceSDK/ResourceBundle-IronSourcePrivacyInfo-IronSourceSDK-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + PRODUCT_NAME = IronSourcePrivacyInfo; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Debug; + }; + ADD4A63B31BA9F9CACF3C93FEF14C0FC /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = DB4125A2ADD8442CEBA9B65B91E1D673 /* GoogleUtilities.debug.xcconfig */; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/GoogleUtilities/GoogleUtilities-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/GoogleUtilities/GoogleUtilities.modulemap"; + PRODUCT_MODULE_NAME = GoogleUtilities; + PRODUCT_NAME = GoogleUtilities; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + AFA6EFF1AA7E8DBE0998A60A53CB8B01 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 6E44F078D0A8BF84F02C552F62EBC7AC /* IronSourceAdQualitySDK.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_ENABLE_OBJC_WEAK = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + B7CA1F7A53BC6E403F38401E7A5430DC /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 87030F8AC3EDC19A2886F3EA674BDB64 /* PromisesObjC.release.xcconfig */; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/PromisesObjC"; + IBSC_MODULE = FBLPromises; + INFOPLIST_FILE = "Target Support Files/PromisesObjC/ResourceBundle-FBLPromises_Privacy-PromisesObjC-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + PRODUCT_NAME = FBLPromises_Privacy; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Release; + }; + BB504975522836EA5DD46D5BA055842A /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = E98FEA4C808524F7744772D67D3D1A50 /* nanopb.debug.xcconfig */; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_PREFIX_HEADER = "Target Support Files/nanopb/nanopb-prefix.pch"; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/nanopb/nanopb-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/nanopb/nanopb.modulemap"; + PRODUCT_MODULE_NAME = nanopb; + PRODUCT_NAME = nanopb; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + BE5D8D57B30A5A65174B545134D5A5A2 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 88C3C2AB35E6D0E9E7E2BAA6F77A1472 /* GoogleAdsOnDeviceConversion.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_ENABLE_OBJC_WEAK = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + C199EDFCE04929C6D574C2D2495E1957 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 92CD93B7791AA549AA821D32500C2271 /* FirebaseCore.release.xcconfig */; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/FirebaseCore/FirebaseCore-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/FirebaseCore/FirebaseCore.modulemap"; + PRODUCT_MODULE_NAME = FirebaseCore; + PRODUCT_NAME = FirebaseCore; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.9; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + C37AC8CA5C26BAF0BBFBB965B875FA99 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = E98FEA4C808524F7744772D67D3D1A50 /* nanopb.debug.xcconfig */; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/nanopb"; + IBSC_MODULE = nanopb; + INFOPLIST_FILE = "Target Support Files/nanopb/ResourceBundle-nanopb_Privacy-nanopb-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + PRODUCT_NAME = nanopb_Privacy; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Debug; + }; + C3FDB5B88B2771DDE697346EE6563DC1 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 8D97CA13CD9F41BB59ED02675F54F325 /* GoogleAppMeasurement.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_ENABLE_OBJC_WEAK = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + C50AB47A30C2BE6BD8845ABDB25A6A70 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 142890E49EB8F36DE49A468137C44DDD /* GoogleAdsOnDeviceConversion.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_ENABLE_OBJC_WEAK = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + C6CA6DDFD862347B75083F48F07A249C /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 92CD93B7791AA549AA821D32500C2271 /* FirebaseCore.release.xcconfig */; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/FirebaseCore"; + IBSC_MODULE = FirebaseCore; + INFOPLIST_FILE = "Target Support Files/FirebaseCore/ResourceBundle-FirebaseCore_Privacy-FirebaseCore-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + PRODUCT_NAME = FirebaseCore_Privacy; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Release; + }; + C733851505CF4205F25267E221FA9C2C /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 4E1394293C18E2CFDF5A3072F9E2A667 /* nanopb.release.xcconfig */; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_PREFIX_HEADER = "Target Support Files/nanopb/nanopb-prefix.pch"; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/nanopb/nanopb-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/nanopb/nanopb.modulemap"; + PRODUCT_MODULE_NAME = nanopb; + PRODUCT_NAME = nanopb; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + DAF96A10F95FD2614408ACD91A18BC44 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7F6428B15EAB7FEF0E33573A967DEE43 /* Pods-TastePick.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + INFOPLIST_FILE = "Target Support Files/Pods-TastePick/Pods-TastePick-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-TastePick/Pods-TastePick.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + DBC75B8FA3719B29A9B7EE37063294B1 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 1AE2DDA9E2DB7DB2B4A53B457668348D /* FirebaseInstallations.release.xcconfig */; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/FirebaseInstallations/FirebaseInstallations-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/FirebaseInstallations/FirebaseInstallations.modulemap"; + PRODUCT_MODULE_NAME = FirebaseInstallations; + PRODUCT_NAME = FirebaseInstallations; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.9; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + DD84BDD4B55F2CEF504D2F3AA4013DDF /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 6D3CA506E1A546D42FDF3E6448C106C8 /* IronSourceSDK.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_ENABLE_OBJC_WEAK = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + DE739CF77AA2832426F3113DCA07A720 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = ED50E394510B175D86CC0C75359E664D /* FirebaseAnalytics.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_ENABLE_OBJC_WEAK = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + DECEC2C2C3E983FA46B736FFB8B98460 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = B6ADF39B0F8B2D8E2F53267C6D66340A /* IronSourceAdQualitySDK.release.xcconfig */; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/IronSourceAdQualitySDK"; + IBSC_MODULE = IronSourceAdQualitySDK; + INFOPLIST_FILE = "Target Support Files/IronSourceAdQualitySDK/ResourceBundle-IronSourceAdQualityPrivacyInfo-IronSourceAdQualitySDK-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + PRODUCT_NAME = IronSourceAdQualityPrivacyInfo; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Release; + }; + E45BB602705FF288778A2FF8212349E9 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 6E44F078D0A8BF84F02C552F62EBC7AC /* IronSourceAdQualitySDK.debug.xcconfig */; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/IronSourceAdQualitySDK"; + IBSC_MODULE = IronSourceAdQualitySDK; + INFOPLIST_FILE = "Target Support Files/IronSourceAdQualitySDK/ResourceBundle-IronSourceAdQualityPrivacyInfo-IronSourceAdQualitySDK-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + PRODUCT_NAME = IronSourceAdQualityPrivacyInfo; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Debug; + }; + EE20BFBC85DECA4FD1E233E71C455142 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = B19877D75F441EA46145FC561954B989 /* PromisesSwift.release.xcconfig */; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/PromisesSwift"; + IBSC_MODULE = Promises; + INFOPLIST_FILE = "Target Support Files/PromisesSwift/ResourceBundle-Promises_Privacy-PromisesSwift-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + PRODUCT_NAME = Promises_Privacy; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Release; + }; + F5727D80209C8DBFDE75BA78BE20C953 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 265303350DEFB1E52CEA4D56AACF5557 /* PromisesSwift.debug.xcconfig */; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/PromisesSwift"; + IBSC_MODULE = Promises; + INFOPLIST_FILE = "Target Support Files/PromisesSwift/ResourceBundle-Promises_Privacy-PromisesSwift-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + PRODUCT_NAME = Promises_Privacy; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Debug; + }; + F8760C7F6935943F382380D4BE2C4454 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 6327E28AF763E513DA6E86C88C092DE8 /* GoogleDataTransport.debug.xcconfig */; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/GoogleDataTransport"; + IBSC_MODULE = GoogleDataTransport; + INFOPLIST_FILE = "Target Support Files/GoogleDataTransport/ResourceBundle-GoogleDataTransport_Privacy-GoogleDataTransport-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + PRODUCT_NAME = GoogleDataTransport_Privacy; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Debug; + }; + FE5C28C4833DF0F108CE8FA82F19CF86 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 52D5DE1F2A8D1741B87270EDD460C90F /* FirebaseAnalytics.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_ENABLE_OBJC_WEAK = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1980222F32F37BB8E602D386124CD12A /* Build configuration list for PBXNativeTarget "FirebaseCore-FirebaseCore_Privacy" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 96DC323DCD881E70D85486AB6794F9CE /* Debug */, + C6CA6DDFD862347B75083F48F07A249C /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 20B2A8D7471DCBB16F3A2257DCD6C02B /* Build configuration list for PBXNativeTarget "PromisesObjC-FBLPromises_Privacy" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 385AEFC4C2F6E1B4144EA35ADA71E6FB /* Debug */, + B7CA1F7A53BC6E403F38401E7A5430DC /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 29A903CEF83455579E309A91F9076621 /* Build configuration list for PBXNativeTarget "IronSourceSDK-IronSourcePrivacyInfo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A95431748970A6708D18A867B11072CF /* Debug */, + 1A3E76B54702191DD8E1678DEC236F58 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 35714539239E46ECFF3779AD7811BB3A /* Build configuration list for PBXNativeTarget "GoogleDataTransport-GoogleDataTransport_Privacy" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F8760C7F6935943F382380D4BE2C4454 /* Debug */, + 1013AD81B66C35A645B42CD9D32B2EE9 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 44C2387AB11F5B899AE2FF36D7198C69 /* Build configuration list for PBXNativeTarget "nanopb" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BB504975522836EA5DD46D5BA055842A /* Debug */, + C733851505CF4205F25267E221FA9C2C /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 90D4D09BCB6A4660E43ACBE9ECB6FE9A /* Debug */, + 9553C89E183877A5CB2F3C6801BEC129 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 48B8693F66F6CB93095D71C69BD72E2A /* Build configuration list for PBXNativeTarget "Pods-TastePick" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + DAF96A10F95FD2614408ACD91A18BC44 /* Debug */, + 94C9001EC8CEC55D629A88BD0604DD6E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4AED99C26D40D4852CC88123F3B7B58B /* Build configuration list for PBXNativeTarget "PromisesObjC" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 864983AA5436345BE3F2FBF5549D1CB5 /* Debug */, + 42DAA2BDED3CB02C960BFD0C7B525199 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4F66F2B4599AF08971549A362FB64DB6 /* Build configuration list for PBXNativeTarget "PromisesSwift" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 65287EC1C413B3564E279E177B6AC812 /* Debug */, + 93FB64CAD62B25B1008CA853CD77CBCD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 60089825B3EB728460DC31D3F86485DB /* Build configuration list for PBXNativeTarget "FirebaseCore" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 9973FFBA844D857065D50FC819BA77AC /* Debug */, + C199EDFCE04929C6D574C2D2495E1957 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 79B208F0A69CFBB82FCC1F540BE84FC0 /* Build configuration list for PBXNativeTarget "FirebaseCrashlytics" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 0B06E54810C44C51D33B103EECFF2E18 /* Debug */, + 68E1BC4621051BB9968A68E9E99C3BDE /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 829ACD64FCFF77F7DA5817E8CFAEBF74 /* Build configuration list for PBXAggregateTarget "FirebaseAnalytics" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + DE739CF77AA2832426F3113DCA07A720 /* Debug */, + FE5C28C4833DF0F108CE8FA82F19CF86 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 860FA929D2E0E66071BC99C2D79BDC9C /* Build configuration list for PBXNativeTarget "FirebaseCoreInternal" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 076648177251140C05190DFE8A206977 /* Debug */, + 9E3DCFE4DC62B60BF1EDB90FB07BAAF0 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 88FEE67E30B7B5CDFD98838DB4F0ACB8 /* Build configuration list for PBXNativeTarget "nanopb-nanopb_Privacy" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C37AC8CA5C26BAF0BBFBB965B875FA99 /* Debug */, + 68413EA6C582EF92B022067ECED90E5E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 8A0DE6AFDB54CEC05AA32EC699C71AC8 /* Build configuration list for PBXAggregateTarget "IronSourceAdQualitySDK" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + AFA6EFF1AA7E8DBE0998A60A53CB8B01 /* Debug */, + 9507AF12B3AA71067F60A33263F806B7 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 96A70753B83AFD8694E4E8FD8DA4664B /* Build configuration list for PBXNativeTarget "FirebaseRemoteConfigInterop" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 563D586422F18CAD50E39839648AE602 /* Debug */, + 37F688529FB23FC350C3EE0DAE3E19DE /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 9951C1DDB84E948D6CA84EBAB70F7A3B /* Build configuration list for PBXNativeTarget "FirebaseCrashlytics-FirebaseCrashlytics_Privacy" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A8D56CEA1220F877E962050A239B555E /* Debug */, + A3932E1DABFBA280B68A960D5CFC9BEF /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + A1E4CC3AD0358552ED2D6DAF38C35EB8 /* Build configuration list for PBXAggregateTarget "GoogleAdsOnDeviceConversion" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C50AB47A30C2BE6BD8845ABDB25A6A70 /* Debug */, + BE5D8D57B30A5A65174B545134D5A5A2 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + A8ECFA3F0517069FF8D968DCFAE2CC0E /* Build configuration list for PBXNativeTarget "GoogleUtilities-GoogleUtilities_Privacy" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 69C41B3CACBDAEC972141F12DD8FD107 /* Debug */, + 3A04D1B6D3EDB9EC3864B59D94F259D5 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + AFAE7292701BB80B080E988A585D2C84 /* Build configuration list for PBXNativeTarget "FirebaseCoreExtension-FirebaseCoreExtension_Privacy" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 0AA57C7EE3CC40BDC5B67D6987012997 /* Debug */, + 254E37C21B022BB3BCDDC35E7CBB6CFE /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C18FDEFFF33020F57C546887CFA5E705 /* Build configuration list for PBXNativeTarget "FirebaseCoreInternal-FirebaseCoreInternal_Privacy" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5FCE7E636AF9950EE495950991AFA757 /* Debug */, + 6A030D0DFD06C7EA4C6A1036C52DC028 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C40D816C342A6A11AB67B1B1D69D5F99 /* Build configuration list for PBXNativeTarget "FirebaseInstallations-FirebaseInstallations_Privacy" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 42DC16F389E06A0DECC91BBD315C3A13 /* Debug */, + 459BA786B12ED071DFEEC02E8EA97385 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + D1A2E3157A0DDEF6C64DB4307F6D7769 /* Build configuration list for PBXNativeTarget "GoogleUtilities" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + ADD4A63B31BA9F9CACF3C93FEF14C0FC /* Debug */, + 9A347BFF7C7E7E7179978ED5EBD117F8 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + D1E345BE40FA3FB99D76F312FDB467F1 /* Build configuration list for PBXAggregateTarget "IronSourceSDK" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 11D9D0109B5A73199B87A6936673C084 /* Debug */, + DD84BDD4B55F2CEF504D2F3AA4013DDF /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + E37BD70A18AC57E12CC62356300E5E36 /* Build configuration list for PBXNativeTarget "PromisesSwift-Promises_Privacy" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F5727D80209C8DBFDE75BA78BE20C953 /* Debug */, + EE20BFBC85DECA4FD1E233E71C455142 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + E536D4C91B029845235C7E10CC087A27 /* Build configuration list for PBXNativeTarget "FirebaseInstallations" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 272ACF2EAD00C6EF5F0F73B60E998F82 /* Debug */, + DBC75B8FA3719B29A9B7EE37063294B1 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + ECA2C98A56E455AF772E403D3B87A717 /* Build configuration list for PBXNativeTarget "FirebaseCoreExtension" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 00738E47C6AE4750C5C4792104EBF5BE /* Debug */, + 33A3ED86542226C8A993CEC2DEDE28D2 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + EEB67ABEEC82A6C468B4707FB6DF4174 /* Build configuration list for PBXNativeTarget "GoogleDataTransport" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 9B89A7E805A34410B621CA4DF23ECC52 /* Debug */, + 3556F52D6CF2099531FFA7B85FCCF35F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + F62BEE46382CC31E9FE0D344B6DF4CB9 /* Build configuration list for PBXAggregateTarget "GoogleAppMeasurement" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C3FDB5B88B2771DDE697346EE6563DC1 /* Debug */, + 2C6FFC1F8EC6485B8784795846DE84B3 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + F83CF10AB510FC5D3970F1C7E76D409F /* Build configuration list for PBXNativeTarget "IronSourceAdQualitySDK-IronSourceAdQualityPrivacyInfo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + E45BB602705FF288778A2FF8212349E9 /* Debug */, + DECEC2C2C3E983FA46B736FFB8B98460 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + F934F2C48865040AD922909CD4325EB7 /* Build configuration list for PBXNativeTarget "FirebaseSessions" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 9C67425E9EBCB0F92EAC363290CAE62A /* Debug */, + 2E499BD69CA7C8E1B7B1054CFA63B57A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = BFDFE7DC352907FC980B868725387E98 /* Project object */; +} diff --git a/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/FirebaseAnalytics.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/FirebaseAnalytics.xcscheme new file mode 100644 index 0000000..43c9116 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/FirebaseAnalytics.xcscheme @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/FirebaseCore-FirebaseCore_Privacy.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/FirebaseCore-FirebaseCore_Privacy.xcscheme new file mode 100644 index 0000000..db5ab1a --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/FirebaseCore-FirebaseCore_Privacy.xcscheme @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/FirebaseCore.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/FirebaseCore.xcscheme new file mode 100644 index 0000000..d940df9 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/FirebaseCore.xcscheme @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/FirebaseCoreExtension-FirebaseCoreExtension_Privacy.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/FirebaseCoreExtension-FirebaseCoreExtension_Privacy.xcscheme new file mode 100644 index 0000000..22eb362 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/FirebaseCoreExtension-FirebaseCoreExtension_Privacy.xcscheme @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/FirebaseCoreExtension.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/FirebaseCoreExtension.xcscheme new file mode 100644 index 0000000..45cdbe5 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/FirebaseCoreExtension.xcscheme @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/FirebaseCoreInternal-FirebaseCoreInternal_Privacy.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/FirebaseCoreInternal-FirebaseCoreInternal_Privacy.xcscheme new file mode 100644 index 0000000..381966a --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/FirebaseCoreInternal-FirebaseCoreInternal_Privacy.xcscheme @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/FirebaseCoreInternal.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/FirebaseCoreInternal.xcscheme new file mode 100644 index 0000000..3bd33ab --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/FirebaseCoreInternal.xcscheme @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/FirebaseCrashlytics-FirebaseCrashlytics_Privacy.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/FirebaseCrashlytics-FirebaseCrashlytics_Privacy.xcscheme new file mode 100644 index 0000000..2501f5d --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/FirebaseCrashlytics-FirebaseCrashlytics_Privacy.xcscheme @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/FirebaseCrashlytics.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/FirebaseCrashlytics.xcscheme new file mode 100644 index 0000000..ab5af3b --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/FirebaseCrashlytics.xcscheme @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/FirebaseInstallations-FirebaseInstallations_Privacy.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/FirebaseInstallations-FirebaseInstallations_Privacy.xcscheme new file mode 100644 index 0000000..938f09f --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/FirebaseInstallations-FirebaseInstallations_Privacy.xcscheme @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/FirebaseInstallations.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/FirebaseInstallations.xcscheme new file mode 100644 index 0000000..f4c66d3 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/FirebaseInstallations.xcscheme @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/FirebaseRemoteConfigInterop.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/FirebaseRemoteConfigInterop.xcscheme new file mode 100644 index 0000000..11fae5a --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/FirebaseRemoteConfigInterop.xcscheme @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/FirebaseSessions.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/FirebaseSessions.xcscheme new file mode 100644 index 0000000..c83b4fe --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/FirebaseSessions.xcscheme @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/GoogleAdsOnDeviceConversion.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/GoogleAdsOnDeviceConversion.xcscheme new file mode 100644 index 0000000..b2c4433 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/GoogleAdsOnDeviceConversion.xcscheme @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/GoogleAppMeasurement.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/GoogleAppMeasurement.xcscheme new file mode 100644 index 0000000..adfd883 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/GoogleAppMeasurement.xcscheme @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/GoogleDataTransport-GoogleDataTransport_Privacy.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/GoogleDataTransport-GoogleDataTransport_Privacy.xcscheme new file mode 100644 index 0000000..1f6831e --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/GoogleDataTransport-GoogleDataTransport_Privacy.xcscheme @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/GoogleDataTransport.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/GoogleDataTransport.xcscheme new file mode 100644 index 0000000..5143a18 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/GoogleDataTransport.xcscheme @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/GoogleUtilities-GoogleUtilities_Privacy.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/GoogleUtilities-GoogleUtilities_Privacy.xcscheme new file mode 100644 index 0000000..cd8f14b --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/GoogleUtilities-GoogleUtilities_Privacy.xcscheme @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/GoogleUtilities.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/GoogleUtilities.xcscheme new file mode 100644 index 0000000..370e321 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/GoogleUtilities.xcscheme @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/IronSourceAdQualitySDK-IronSourceAdQualityPrivacyInfo.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/IronSourceAdQualitySDK-IronSourceAdQualityPrivacyInfo.xcscheme new file mode 100644 index 0000000..b8ca99a --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/IronSourceAdQualitySDK-IronSourceAdQualityPrivacyInfo.xcscheme @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/IronSourceAdQualitySDK.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/IronSourceAdQualitySDK.xcscheme new file mode 100644 index 0000000..d6eb3b3 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/IronSourceAdQualitySDK.xcscheme @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/IronSourceSDK-IronSourcePrivacyInfo.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/IronSourceSDK-IronSourcePrivacyInfo.xcscheme new file mode 100644 index 0000000..13fdf9c --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/IronSourceSDK-IronSourcePrivacyInfo.xcscheme @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/IronSourceSDK.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/IronSourceSDK.xcscheme new file mode 100644 index 0000000..dcc6e15 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/IronSourceSDK.xcscheme @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/Pods-TastePick.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/Pods-TastePick.xcscheme new file mode 100644 index 0000000..6744bea --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/Pods-TastePick.xcscheme @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/PromisesObjC-FBLPromises_Privacy.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/PromisesObjC-FBLPromises_Privacy.xcscheme new file mode 100644 index 0000000..aa272c6 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/PromisesObjC-FBLPromises_Privacy.xcscheme @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/PromisesObjC.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/PromisesObjC.xcscheme new file mode 100644 index 0000000..a44c01c --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/PromisesObjC.xcscheme @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/PromisesSwift-Promises_Privacy.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/PromisesSwift-Promises_Privacy.xcscheme new file mode 100644 index 0000000..0773788 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/PromisesSwift-Promises_Privacy.xcscheme @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/PromisesSwift.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/PromisesSwift.xcscheme new file mode 100644 index 0000000..582cb5d --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/PromisesSwift.xcscheme @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/nanopb-nanopb_Privacy.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/nanopb-nanopb_Privacy.xcscheme new file mode 100644 index 0000000..ecb3559 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/nanopb-nanopb_Privacy.xcscheme @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/nanopb.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/nanopb.xcscheme new file mode 100644 index 0000000..b79a7c3 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/nanopb.xcscheme @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/xcschememanagement.plist b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..9da6a6d --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,221 @@ + + + + + SchemeUserState + + FirebaseAnalytics.xcscheme + + isShown + + orderHint + 0 + + FirebaseCore-FirebaseCore_Privacy.xcscheme + + isShown + + orderHint + 2 + + FirebaseCore.xcscheme + + isShown + + orderHint + 1 + + FirebaseCoreExtension-FirebaseCoreExtension_Privacy.xcscheme + + isShown + + orderHint + 4 + + FirebaseCoreExtension.xcscheme + + isShown + + orderHint + 3 + + FirebaseCoreInternal-FirebaseCoreInternal_Privacy.xcscheme + + isShown + + orderHint + 6 + + FirebaseCoreInternal.xcscheme + + isShown + + orderHint + 5 + + FirebaseCrashlytics-FirebaseCrashlytics_Privacy.xcscheme + + isShown + + orderHint + 8 + + FirebaseCrashlytics.xcscheme + + isShown + + orderHint + 7 + + FirebaseInstallations-FirebaseInstallations_Privacy.xcscheme + + isShown + + orderHint + 10 + + FirebaseInstallations.xcscheme + + isShown + + orderHint + 9 + + FirebaseRemoteConfigInterop.xcscheme + + isShown + + orderHint + 11 + + FirebaseSessions.xcscheme + + isShown + + orderHint + 12 + + GoogleAdsOnDeviceConversion.xcscheme + + isShown + + orderHint + 13 + + GoogleAppMeasurement.xcscheme + + isShown + + orderHint + 14 + + GoogleDataTransport-GoogleDataTransport_Privacy.xcscheme + + isShown + + orderHint + 16 + + GoogleDataTransport.xcscheme + + isShown + + orderHint + 15 + + GoogleUtilities-GoogleUtilities_Privacy.xcscheme + + isShown + + orderHint + 18 + + GoogleUtilities.xcscheme + + isShown + + orderHint + 17 + + IronSourceAdQualitySDK-IronSourceAdQualityPrivacyInfo.xcscheme + + isShown + + orderHint + 20 + + IronSourceAdQualitySDK.xcscheme + + isShown + + orderHint + 19 + + IronSourceSDK-IronSourcePrivacyInfo.xcscheme + + isShown + + orderHint + 22 + + IronSourceSDK.xcscheme + + isShown + + orderHint + 21 + + Pods-TastePick.xcscheme + + isShown + + orderHint + 25 + + PromisesObjC-FBLPromises_Privacy.xcscheme + + isShown + + orderHint + 27 + + PromisesObjC.xcscheme + + isShown + + orderHint + 26 + + PromisesSwift-Promises_Privacy.xcscheme + + isShown + + orderHint + 29 + + PromisesSwift.xcscheme + + isShown + + orderHint + 28 + + nanopb-nanopb_Privacy.xcscheme + + isShown + + orderHint + 24 + + nanopb.xcscheme + + isShown + + orderHint + 23 + + + SuppressBuildableAutocreation + + + diff --git a/Pods/PromisesObjC/LICENSE b/Pods/PromisesObjC/LICENSE new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/Pods/PromisesObjC/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/Pods/PromisesObjC/README.md b/Pods/PromisesObjC/README.md new file mode 100644 index 0000000..e0e65b7 --- /dev/null +++ b/Pods/PromisesObjC/README.md @@ -0,0 +1,60 @@ +[![Apache +License](https://img.shields.io/github/license/google/promises.svg)](LICENSE) +[![Travis](https://api.travis-ci.org/google/promises.svg?branch=master)](https://travis-ci.org/google/promises) +[![Gitter Chat](https://badges.gitter.im/google/promises.svg)](https://gitter.im/google/promises) + +![Platforms](https://img.shields.io/badge/platforms-macOS%20%7C%20iOS%20%7C%20tvOS%20%7C%20watchOS-blue.svg?longCache=true&style=flat) +![Languages](https://img.shields.io/badge/languages-Swift%20%7C%20ObjC-orange.svg?longCache=true&style=flat) +![Package Managers](https://img.shields.io/badge/supports-Bazel%20%7C%20SwiftPM%20%7C%20CocoaPods%20%7C%20Carthage-yellow.svg?longCache=true&style=flat) + +# Promises + +Promises is a modern framework that provides a synchronization construct for +Objective-C and Swift to facilitate writing asynchronous code. + +* [Introduction](g3doc/index.md) + * [The problem with async + code](g3doc/index.md#the-problem-with-async-code) + * [Promises to the rescue](g3doc/index.md#promises-to-the-rescue) + * [What is a promise?](g3doc/index.md#what-is-a-promise) +* [Framework](g3doc/index.md#framework) + * [Features](g3doc/index.md#features) + * [Benchmark](g3doc/index.md#benchmark) +* [Getting started](g3doc/index.md#getting-started) + * [Add dependency](g3doc/index.md#add-dependency) + * [Import](g3doc/index.md#import) + * [Adopt](g3doc/index.md#adopt) +* [Basics](g3doc/index.md#basics) + * [Creating promises](g3doc/index.md#creating-promises) + * [Async](g3doc/index.md#async) + * [Do](g3doc/index.md#do) + * [Pending](g3doc/index.md#pending) + * [Resolved](g3doc/index.md#create-a-resolved-promise) + * [Observing fulfillment](g3doc/index.md#observing-fulfillment) + * [Then](g3doc/index.md#then) + * [Observing rejection](g3doc/index.md#observing-rejection) + * [Catch](g3doc/index.md#catch) +* [Extensions](g3doc/index.md#extensions) + * [All](g3doc/index.md#all) + * [Always](g3doc/index.md#always) + * [Any](g3doc/index.md#any) + * [AwaitPromise](g3doc/index.md#awaitpromise) + * [Delay](g3doc/index.md#delay) + * [Race](g3doc/index.md#race) + * [Recover](g3doc/index.md#recover) + * [Reduce](g3doc/index.md#reduce) + * [Retry](g3doc/index.md#retry) + * [Timeout](g3doc/index.md#timeout) + * [Validate](g3doc/index.md#validate) + * [Wrap](g3doc/index.md#wrap) +* [Advanced topics](g3doc/index.md#advanced-topics) + * [Default dispatch queue](g3doc/index.md#default-dispatch-queue) + * [Ownership and retain + cycles](g3doc/index.md#ownership-and-retain-cycles) + * [Testing](g3doc/index.md#testing) + * [Objective-C <-> Swift + interoperability](g3doc/index.md#objective-c---swift-interoperability) + * [Dot-syntax in Objective-C](g3doc/index.md#dot-syntax-in-objective-c) +* [Anti-patterns](g3doc/index.md#anti-patterns) + * [Broken chain](g3doc/index.md#broken-chain) + * [Nested promises](g3doc/index.md#nested-promises) diff --git a/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+All.m b/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+All.m new file mode 100644 index 0000000..a9c7feb --- /dev/null +++ b/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+All.m @@ -0,0 +1,89 @@ +/** + Copyright 2018 Google Inc. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at: + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "FBLPromise+All.h" + +#import "FBLPromise+Async.h" +#import "FBLPromisePrivate.h" + +@implementation FBLPromise (AllAdditions) + ++ (FBLPromise *)all:(NSArray *)promises { + return [self onQueue:self.defaultDispatchQueue all:promises]; +} + ++ (FBLPromise *)onQueue:(dispatch_queue_t)queue all:(NSArray *)allPromises { + NSParameterAssert(queue); + NSParameterAssert(allPromises); + + if (allPromises.count == 0) { + return [[self alloc] initWithResolution:@[]]; + } + NSMutableArray *promises = [allPromises mutableCopy]; + return [self + onQueue:queue + async:^(FBLPromiseFulfillBlock fulfill, FBLPromiseRejectBlock reject) { + for (NSUInteger i = 0; i < promises.count; ++i) { + id promise = promises[i]; + if ([promise isKindOfClass:self]) { + continue; + } else if ([promise isKindOfClass:[NSError class]]) { + reject(promise); + return; + } else { + [promises replaceObjectAtIndex:i + withObject:[[self alloc] initWithResolution:promise]]; + } + } + for (FBLPromise *promise in promises) { + [promise observeOnQueue:queue + fulfill:^(id __unused _) { + // Wait until all are fulfilled. + for (FBLPromise *promise in promises) { + if (!promise.isFulfilled) { + return; + } + } + // If called multiple times, only the first one affects the result. + fulfill([promises valueForKey:NSStringFromSelector(@selector(value))]); + } + reject:^(NSError *error) { + reject(error); + }]; + } + }]; +} + +@end + +@implementation FBLPromise (DotSyntax_AllAdditions) + ++ (FBLPromise * (^)(NSArray *))all { + return ^(NSArray *promises) { + return [self all:promises]; + }; +} + ++ (FBLPromise * (^)(dispatch_queue_t, NSArray *))allOn { + return ^(dispatch_queue_t queue, NSArray *promises) { + return [self onQueue:queue all:promises]; + }; +} + +@end + +/** Stub used to force the linker to include the categories in this file. */ +void FBLIncludeAllCategory(void) {} diff --git a/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Always.m b/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Always.m new file mode 100644 index 0000000..c4e9776 --- /dev/null +++ b/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Always.m @@ -0,0 +1,61 @@ +/** + Copyright 2018 Google Inc. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at: + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "FBLPromise+Always.h" + +#import "FBLPromisePrivate.h" + +@implementation FBLPromise (AlwaysAdditions) + +- (FBLPromise *)always:(FBLPromiseAlwaysWorkBlock)work { + return [self onQueue:FBLPromise.defaultDispatchQueue always:work]; +} + +- (FBLPromise *)onQueue:(dispatch_queue_t)queue always:(FBLPromiseAlwaysWorkBlock)work { + NSParameterAssert(queue); + NSParameterAssert(work); + + return [self chainOnQueue:queue + chainedFulfill:^id(id value) { + work(); + return value; + } + chainedReject:^id(NSError *error) { + work(); + return error; + }]; +} + +@end + +@implementation FBLPromise (DotSyntax_AlwaysAdditions) + +- (FBLPromise * (^)(FBLPromiseAlwaysWorkBlock))always { + return ^(FBLPromiseAlwaysWorkBlock work) { + return [self always:work]; + }; +} + +- (FBLPromise * (^)(dispatch_queue_t, FBLPromiseAlwaysWorkBlock))alwaysOn { + return ^(dispatch_queue_t queue, FBLPromiseAlwaysWorkBlock work) { + return [self onQueue:queue always:work]; + }; +} + +@end + +/** Stub used to force the linker to include the categories in this file. */ +void FBLIncludeAlwaysCategory(void) {} diff --git a/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Any.m b/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Any.m new file mode 100644 index 0000000..8454c34 --- /dev/null +++ b/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Any.m @@ -0,0 +1,115 @@ +/** + Copyright 2018 Google Inc. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at: + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "FBLPromise+Any.h" + +#import "FBLPromise+Async.h" +#import "FBLPromisePrivate.h" + +static NSArray *FBLPromiseCombineValuesAndErrors(NSArray *promises) { + NSMutableArray *combinedValuesAndErrors = [[NSMutableArray alloc] init]; + for (FBLPromise *promise in promises) { + if (promise.isFulfilled) { + [combinedValuesAndErrors addObject:promise.value ?: [NSNull null]]; + continue; + } + if (promise.isRejected) { + [combinedValuesAndErrors addObject:promise.error]; + continue; + } + assert(!promise.isPending); + }; + return combinedValuesAndErrors; +} + +@implementation FBLPromise (AnyAdditions) + ++ (FBLPromise *)any:(NSArray *)promises { + return [self onQueue:FBLPromise.defaultDispatchQueue any:promises]; +} + ++ (FBLPromise *)onQueue:(dispatch_queue_t)queue any:(NSArray *)anyPromises { + NSParameterAssert(queue); + NSParameterAssert(anyPromises); + + if (anyPromises.count == 0) { + return [[self alloc] initWithResolution:@[]]; + } + NSMutableArray *promises = [anyPromises mutableCopy]; + return [self + onQueue:queue + async:^(FBLPromiseFulfillBlock fulfill, FBLPromiseRejectBlock reject) { + for (NSUInteger i = 0; i < promises.count; ++i) { + id promise = promises[i]; + if ([promise isKindOfClass:self]) { + continue; + } else { + [promises replaceObjectAtIndex:i + withObject:[[self alloc] initWithResolution:promise]]; + } + } + for (FBLPromise *promise in promises) { + [promise observeOnQueue:queue + fulfill:^(id __unused _) { + // Wait until all are resolved. + for (FBLPromise *promise in promises) { + if (promise.isPending) { + return; + } + } + // If called multiple times, only the first one affects the result. + fulfill(FBLPromiseCombineValuesAndErrors(promises)); + } + reject:^(NSError *error) { + BOOL atLeastOneIsFulfilled = NO; + for (FBLPromise *promise in promises) { + if (promise.isPending) { + return; + } + if (promise.isFulfilled) { + atLeastOneIsFulfilled = YES; + } + } + if (atLeastOneIsFulfilled) { + fulfill(FBLPromiseCombineValuesAndErrors(promises)); + } else { + reject(error); + } + }]; + } + }]; +} + +@end + +@implementation FBLPromise (DotSyntax_AnyAdditions) + ++ (FBLPromise * (^)(NSArray *))any { + return ^(NSArray *promises) { + return [self any:promises]; + }; +} + ++ (FBLPromise * (^)(dispatch_queue_t, NSArray *))anyOn { + return ^(dispatch_queue_t queue, NSArray *promises) { + return [self onQueue:queue any:promises]; + }; +} + +@end + +/** Stub used to force the linker to include the categories in this file. */ +void FBLIncludeAnyCategory(void) {} diff --git a/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Async.m b/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Async.m new file mode 100644 index 0000000..c0a89d3 --- /dev/null +++ b/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Async.m @@ -0,0 +1,73 @@ +/** + Copyright 2018 Google Inc. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at: + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "FBLPromise+Async.h" + +#import "FBLPromisePrivate.h" + +@implementation FBLPromise (AsyncAdditions) + ++ (instancetype)async:(FBLPromiseAsyncWorkBlock)work { + return [self onQueue:self.defaultDispatchQueue async:work]; +} + ++ (instancetype)onQueue:(dispatch_queue_t)queue async:(FBLPromiseAsyncWorkBlock)work { + NSParameterAssert(queue); + NSParameterAssert(work); + + FBLPromise *promise = [[self alloc] initPending]; + dispatch_group_async(FBLPromise.dispatchGroup, queue, ^{ + work( + ^(id __nullable value) { + if ([value isKindOfClass:[FBLPromise class]]) { + [(FBLPromise *)value observeOnQueue:queue + fulfill:^(id __nullable value) { + [promise fulfill:value]; + } + reject:^(NSError *error) { + [promise reject:error]; + }]; + } else { + [promise fulfill:value]; + } + }, + ^(NSError *error) { + [promise reject:error]; + }); + }); + return promise; +} + +@end + +@implementation FBLPromise (DotSyntax_AsyncAdditions) + ++ (FBLPromise* (^)(FBLPromiseAsyncWorkBlock))async { + return ^(FBLPromiseAsyncWorkBlock work) { + return [self async:work]; + }; +} + ++ (FBLPromise* (^)(dispatch_queue_t, FBLPromiseAsyncWorkBlock))asyncOn { + return ^(dispatch_queue_t queue, FBLPromiseAsyncWorkBlock work) { + return [self onQueue:queue async:work]; + }; +} + +@end + +/** Stub used to force the linker to include the categories in this file. */ +void FBLIncludeAsyncCategory(void) {} diff --git a/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Await.m b/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Await.m new file mode 100644 index 0000000..0f86b2f --- /dev/null +++ b/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Await.m @@ -0,0 +1,51 @@ +/** + Copyright 2018 Google Inc. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at: + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "FBLPromise+Await.h" + +#import "FBLPromisePrivate.h" + +id __nullable FBLPromiseAwait(FBLPromise *promise, NSError **outError) { + assert(promise); + + static dispatch_once_t onceToken; + static dispatch_queue_t queue; + dispatch_once(&onceToken, ^{ + queue = dispatch_queue_create("com.google.FBLPromises.Await", DISPATCH_QUEUE_CONCURRENT); + }); + dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); + id __block resolution; + NSError __block *blockError; + [promise chainOnQueue:queue + chainedFulfill:^id(id value) { + resolution = value; + dispatch_semaphore_signal(semaphore); + return value; + } + chainedReject:^id(NSError *error) { + blockError = error; + dispatch_semaphore_signal(semaphore); + return error; + }]; + dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); + if (outError) { + *outError = blockError; + } + return resolution; +} + +/** Stub used to force the linker to include the categories in this file. */ +void FBLIncludeAwaitCategory(void) {} diff --git a/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Catch.m b/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Catch.m new file mode 100644 index 0000000..fff7690 --- /dev/null +++ b/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Catch.m @@ -0,0 +1,58 @@ +/** + Copyright 2018 Google Inc. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at: + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "FBLPromise+Catch.h" + +#import "FBLPromisePrivate.h" + +@implementation FBLPromise (CatchAdditions) + +- (FBLPromise *)catch:(FBLPromiseCatchWorkBlock)reject { + return [self onQueue:FBLPromise.defaultDispatchQueue catch:reject]; +} + +- (FBLPromise *)onQueue:(dispatch_queue_t)queue catch:(FBLPromiseCatchWorkBlock)reject { + NSParameterAssert(queue); + NSParameterAssert(reject); + + return [self chainOnQueue:queue + chainedFulfill:nil + chainedReject:^id(NSError *error) { + reject(error); + return error; + }]; +} + +@end + +@implementation FBLPromise (DotSyntax_CatchAdditions) + +- (FBLPromise* (^)(FBLPromiseCatchWorkBlock))catch { + return ^(FBLPromiseCatchWorkBlock catch) { + return [self catch:catch]; + }; +} + +- (FBLPromise* (^)(dispatch_queue_t, FBLPromiseCatchWorkBlock))catchOn { + return ^(dispatch_queue_t queue, FBLPromiseCatchWorkBlock catch) { + return [self onQueue:queue catch:catch]; + }; +} + +@end + +/** Stub used to force the linker to include the categories in this file. */ +void FBLIncludeCatchCategory(void) {} diff --git a/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Delay.m b/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Delay.m new file mode 100644 index 0000000..5aeeb1f --- /dev/null +++ b/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Delay.m @@ -0,0 +1,62 @@ +/** + Copyright 2018 Google Inc. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at: + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "FBLPromise+Delay.h" + +#import "FBLPromisePrivate.h" + +@implementation FBLPromise (DelayAdditions) + +- (FBLPromise *)delay:(NSTimeInterval)interval { + return [self onQueue:FBLPromise.defaultDispatchQueue delay:interval]; +} + +- (FBLPromise *)onQueue:(dispatch_queue_t)queue delay:(NSTimeInterval)interval { + NSParameterAssert(queue); + + FBLPromise *promise = [[[self class] alloc] initPending]; + [self observeOnQueue:queue + fulfill:^(id __nullable value) { + dispatch_after(dispatch_time(0, (int64_t)(interval * NSEC_PER_SEC)), queue, ^{ + [promise fulfill:value]; + }); + } + reject:^(NSError *error) { + [promise reject:error]; + }]; + return promise; +} + +@end + +@implementation FBLPromise (DotSyntax_DelayAdditions) + +- (FBLPromise * (^)(NSTimeInterval))delay { + return ^(NSTimeInterval interval) { + return [self delay:interval]; + }; +} + +- (FBLPromise * (^)(dispatch_queue_t, NSTimeInterval))delayOn { + return ^(dispatch_queue_t queue, NSTimeInterval interval) { + return [self onQueue:queue delay:interval]; + }; +} + +@end + +/** Stub used to force the linker to include the categories in this file. */ +void FBLIncludeDelayCategory(void) {} diff --git a/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Do.m b/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Do.m new file mode 100644 index 0000000..9ae6033 --- /dev/null +++ b/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Do.m @@ -0,0 +1,62 @@ +/** + Copyright 2018 Google Inc. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at: + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "FBLPromise+Do.h" + +#import "FBLPromisePrivate.h" + +@implementation FBLPromise (DoAdditions) + ++ (instancetype)do:(FBLPromiseDoWorkBlock)work { + return [self onQueue:self.defaultDispatchQueue do:work]; +} + ++ (instancetype)onQueue:(dispatch_queue_t)queue do:(FBLPromiseDoWorkBlock)work { + NSParameterAssert(queue); + NSParameterAssert(work); + + FBLPromise *promise = [[self alloc] initPending]; + dispatch_group_async(FBLPromise.dispatchGroup, queue, ^{ + id value = work(); + if ([value isKindOfClass:[FBLPromise class]]) { + [(FBLPromise *)value observeOnQueue:queue + fulfill:^(id __nullable value) { + [promise fulfill:value]; + } + reject:^(NSError *error) { + [promise reject:error]; + }]; + } else { + [promise fulfill:value]; + } + }); + return promise; +} + +@end + +@implementation FBLPromise (DotSyntax_DoAdditions) + ++ (FBLPromise* (^)(dispatch_queue_t, FBLPromiseDoWorkBlock))doOn { + return ^(dispatch_queue_t queue, FBLPromiseDoWorkBlock work) { + return [self onQueue:queue do:work]; + }; +} + +@end + +/** Stub used to force the linker to include the categories in this file. */ +void FBLIncludeDoCategory(void) {} diff --git a/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Race.m b/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Race.m new file mode 100644 index 0000000..1672ac4 --- /dev/null +++ b/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Race.m @@ -0,0 +1,68 @@ +/** + Copyright 2018 Google Inc. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at: + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "FBLPromise+Race.h" + +#import "FBLPromise+Async.h" +#import "FBLPromisePrivate.h" + +@implementation FBLPromise (RaceAdditions) + ++ (instancetype)race:(NSArray *)promises { + return [self onQueue:self.defaultDispatchQueue race:promises]; +} + ++ (instancetype)onQueue:(dispatch_queue_t)queue race:(NSArray *)racePromises { + NSParameterAssert(queue); + NSAssert(racePromises.count > 0, @"No promises to observe"); + + NSArray *promises = [racePromises copy]; + return [self onQueue:queue + async:^(FBLPromiseFulfillBlock fulfill, FBLPromiseRejectBlock reject) { + for (id promise in promises) { + if (![promise isKindOfClass:self]) { + fulfill(promise); + return; + } + } + // Subscribe all, but only the first one to resolve will change + // the resulting promise's state. + for (FBLPromise *promise in promises) { + [promise observeOnQueue:queue fulfill:fulfill reject:reject]; + } + }]; +} + +@end + +@implementation FBLPromise (DotSyntax_RaceAdditions) + ++ (FBLPromise * (^)(NSArray *))race { + return ^(NSArray *promises) { + return [self race:promises]; + }; +} + ++ (FBLPromise * (^)(dispatch_queue_t, NSArray *))raceOn { + return ^(dispatch_queue_t queue, NSArray *promises) { + return [self onQueue:queue race:promises]; + }; +} + +@end + +/** Stub used to force the linker to include the categories in this file. */ +void FBLIncludeRaceCategory(void) {} diff --git a/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Recover.m b/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Recover.m new file mode 100644 index 0000000..50e337a --- /dev/null +++ b/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Recover.m @@ -0,0 +1,57 @@ +/** + Copyright 2018 Google Inc. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at: + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "FBLPromise+Recover.h" + +#import "FBLPromisePrivate.h" + +@implementation FBLPromise (RecoverAdditions) + +- (FBLPromise *)recover:(FBLPromiseRecoverWorkBlock)recovery { + return [self onQueue:FBLPromise.defaultDispatchQueue recover:recovery]; +} + +- (FBLPromise *)onQueue:(dispatch_queue_t)queue recover:(FBLPromiseRecoverWorkBlock)recovery { + NSParameterAssert(queue); + NSParameterAssert(recovery); + + return [self chainOnQueue:queue + chainedFulfill:nil + chainedReject:^id(NSError *error) { + return recovery(error); + }]; +} + +@end + +@implementation FBLPromise (DotSyntax_RecoverAdditions) + +- (FBLPromise * (^)(FBLPromiseRecoverWorkBlock))recover { + return ^(FBLPromiseRecoverWorkBlock recovery) { + return [self recover:recovery]; + }; +} + +- (FBLPromise * (^)(dispatch_queue_t, FBLPromiseRecoverWorkBlock))recoverOn { + return ^(dispatch_queue_t queue, FBLPromiseRecoverWorkBlock recovery) { + return [self onQueue:queue recover:recovery]; + }; +} + +@end + +/** Stub used to force the linker to include the categories in this file. */ +void FBLIncludeRecoverCategory(void) {} diff --git a/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Reduce.m b/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Reduce.m new file mode 100644 index 0000000..f98cf69 --- /dev/null +++ b/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Reduce.m @@ -0,0 +1,64 @@ +/** + Copyright 2018 Google Inc. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at: + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "FBLPromise+Reduce.h" + +#import "FBLPromisePrivate.h" + +@implementation FBLPromise (ReduceAdditions) + +- (FBLPromise *)reduce:(NSArray *)items combine:(FBLPromiseReducerBlock)reducer { + return [self onQueue:FBLPromise.defaultDispatchQueue reduce:items combine:reducer]; +} + +- (FBLPromise *)onQueue:(dispatch_queue_t)queue + reduce:(NSArray *)items + combine:(FBLPromiseReducerBlock)reducer { + NSParameterAssert(queue); + NSParameterAssert(items); + NSParameterAssert(reducer); + + FBLPromise *promise = self; + for (id item in items) { + promise = [promise chainOnQueue:queue + chainedFulfill:^id(id value) { + return reducer(value, item); + } + chainedReject:nil]; + } + return promise; +} + +@end + +@implementation FBLPromise (DotSyntax_ReduceAdditions) + +- (FBLPromise * (^)(NSArray *, FBLPromiseReducerBlock))reduce { + return ^(NSArray *items, FBLPromiseReducerBlock reducer) { + return [self reduce:items combine:reducer]; + }; +} + +- (FBLPromise * (^)(dispatch_queue_t, NSArray *, FBLPromiseReducerBlock))reduceOn { + return ^(dispatch_queue_t queue, NSArray *items, FBLPromiseReducerBlock reducer) { + return [self onQueue:queue reduce:items combine:reducer]; + }; +} + +@end + +/** Stub used to force the linker to include the categories in this file. */ +void FBLIncludeReduceCategory(void) {} diff --git a/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Retry.m b/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Retry.m new file mode 100644 index 0000000..841be68 --- /dev/null +++ b/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Retry.m @@ -0,0 +1,131 @@ +/** + Copyright 2018 Google Inc. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at: + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "FBLPromise+Retry.h" + +#import "FBLPromisePrivate.h" + +NSInteger const FBLPromiseRetryDefaultAttemptsCount = 1; +NSTimeInterval const FBLPromiseRetryDefaultDelayInterval = 1.0; + +static void FBLPromiseRetryAttempt(FBLPromise *promise, dispatch_queue_t queue, NSInteger count, + NSTimeInterval interval, FBLPromiseRetryPredicateBlock predicate, + FBLPromiseRetryWorkBlock work) { + __auto_type retrier = ^(id __nullable value) { + if ([value isKindOfClass:[NSError class]]) { + if (count <= 0 || (predicate && !predicate(count, value))) { + [promise reject:value]; + } else { + dispatch_after(dispatch_time(0, (int64_t)(interval * NSEC_PER_SEC)), queue, ^{ + FBLPromiseRetryAttempt(promise, queue, count - 1, interval, predicate, work); + }); + } + } else { + [promise fulfill:value]; + } + }; + id value = work(); + if ([value isKindOfClass:[FBLPromise class]]) { + [(FBLPromise *)value observeOnQueue:queue fulfill:retrier reject:retrier]; + } else { + retrier(value); + } +} + +@implementation FBLPromise (RetryAdditions) + ++ (instancetype)retry:(FBLPromiseRetryWorkBlock)work { + return [self onQueue:FBLPromise.defaultDispatchQueue retry:work]; +} + ++ (instancetype)onQueue:(dispatch_queue_t)queue retry:(FBLPromiseRetryWorkBlock)work { + return [self onQueue:queue attempts:FBLPromiseRetryDefaultAttemptsCount retry:work]; +} + ++ (instancetype)attempts:(NSInteger)count retry:(FBLPromiseRetryWorkBlock)work { + return [self onQueue:FBLPromise.defaultDispatchQueue attempts:count retry:work]; +} + ++ (instancetype)onQueue:(dispatch_queue_t)queue + attempts:(NSInteger)count + retry:(FBLPromiseRetryWorkBlock)work { + return [self onQueue:queue + attempts:count + delay:FBLPromiseRetryDefaultDelayInterval + condition:nil + retry:work]; +} + ++ (instancetype)attempts:(NSInteger)count + delay:(NSTimeInterval)interval + condition:(nullable FBLPromiseRetryPredicateBlock)predicate + retry:(FBLPromiseRetryWorkBlock)work { + return [self onQueue:FBLPromise.defaultDispatchQueue + attempts:count + delay:interval + condition:predicate + retry:work]; +} + ++ (instancetype)onQueue:(dispatch_queue_t)queue + attempts:(NSInteger)count + delay:(NSTimeInterval)interval + condition:(nullable FBLPromiseRetryPredicateBlock)predicate + retry:(FBLPromiseRetryWorkBlock)work { + NSParameterAssert(queue); + NSParameterAssert(work); + + FBLPromise *promise = [[self alloc] initPending]; + FBLPromiseRetryAttempt(promise, queue, count, interval, predicate, work); + return promise; +} + +@end + +@implementation FBLPromise (DotSyntax_RetryAdditions) + ++ (FBLPromise * (^)(FBLPromiseRetryWorkBlock))retry { + return ^id(FBLPromiseRetryWorkBlock work) { + return [self retry:work]; + }; +} + ++ (FBLPromise * (^)(dispatch_queue_t, FBLPromiseRetryWorkBlock))retryOn { + return ^id(dispatch_queue_t queue, FBLPromiseRetryWorkBlock work) { + return [self onQueue:queue retry:work]; + }; +} + ++ (FBLPromise * (^)(NSInteger, NSTimeInterval, FBLPromiseRetryPredicateBlock, + FBLPromiseRetryWorkBlock))retryAgain { + return ^id(NSInteger count, NSTimeInterval interval, FBLPromiseRetryPredicateBlock predicate, + FBLPromiseRetryWorkBlock work) { + return [self attempts:count delay:interval condition:predicate retry:work]; + }; +} + ++ (FBLPromise * (^)(dispatch_queue_t, NSInteger, NSTimeInterval, FBLPromiseRetryPredicateBlock, + FBLPromiseRetryWorkBlock))retryAgainOn { + return ^id(dispatch_queue_t queue, NSInteger count, NSTimeInterval interval, + FBLPromiseRetryPredicateBlock predicate, FBLPromiseRetryWorkBlock work) { + return [self onQueue:queue attempts:count delay:interval condition:predicate retry:work]; + }; +} + +@end + +/** Stub used to force the linker to include the categories in this file. */ +void FBLIncludeRetryCategory(void) {} diff --git a/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Testing.m b/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Testing.m new file mode 100644 index 0000000..7d6b461 --- /dev/null +++ b/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Testing.m @@ -0,0 +1,58 @@ +/** + Copyright 2018 Google Inc. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at: + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "FBLPromise+Testing.h" + +BOOL FBLWaitForPromisesWithTimeout(NSTimeInterval timeout) { + BOOL isTimedOut = NO; + NSDate *timeoutDate = [NSDate dateWithTimeIntervalSinceNow:timeout]; + static NSTimeInterval const minimalTimeout = 0.01; + static int64_t const minimalTimeToWait = (int64_t)(minimalTimeout * NSEC_PER_SEC); + dispatch_time_t waitTime = dispatch_time(DISPATCH_TIME_NOW, minimalTimeToWait); + dispatch_group_t dispatchGroup = FBLPromise.dispatchGroup; + NSRunLoop *runLoop = NSRunLoop.currentRunLoop; + while (dispatch_group_wait(dispatchGroup, waitTime)) { + isTimedOut = timeoutDate.timeIntervalSinceNow < 0.0; + if (isTimedOut) { + break; + } + [runLoop runUntilDate:[NSDate dateWithTimeIntervalSinceNow:minimalTimeout]]; + } + return !isTimedOut; +} + +@implementation FBLPromise (TestingAdditions) + +// These properties are implemented in the FBLPromise class itself. +@dynamic isPending; +@dynamic isFulfilled; +@dynamic isRejected; +@dynamic value; +@dynamic error; + ++ (dispatch_group_t)dispatchGroup { + static dispatch_group_t gDispatchGroup; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + gDispatchGroup = dispatch_group_create(); + }); + return gDispatchGroup; +} + +@end + +/** Stub used to force the linker to include the categories in this file. */ +void FBLIncludeTestingCategory(void) {} diff --git a/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Then.m b/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Then.m new file mode 100644 index 0000000..32df102 --- /dev/null +++ b/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Then.m @@ -0,0 +1,53 @@ +/** + Copyright 2018 Google Inc. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at: + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "FBLPromise+Then.h" + +#import "FBLPromisePrivate.h" + +@implementation FBLPromise (ThenAdditions) + +- (FBLPromise *)then:(FBLPromiseThenWorkBlock)work { + return [self onQueue:FBLPromise.defaultDispatchQueue then:work]; +} + +- (FBLPromise *)onQueue:(dispatch_queue_t)queue then:(FBLPromiseThenWorkBlock)work { + NSParameterAssert(queue); + NSParameterAssert(work); + + return [self chainOnQueue:queue chainedFulfill:work chainedReject:nil]; +} + +@end + +@implementation FBLPromise (DotSyntax_ThenAdditions) + +- (FBLPromise* (^)(FBLPromiseThenWorkBlock))then { + return ^(FBLPromiseThenWorkBlock work) { + return [self then:work]; + }; +} + +- (FBLPromise* (^)(dispatch_queue_t, FBLPromiseThenWorkBlock))thenOn { + return ^(dispatch_queue_t queue, FBLPromiseThenWorkBlock work) { + return [self onQueue:queue then:work]; + }; +} + +@end + +/** Stub used to force the linker to include the categories in this file. */ +void FBLIncludeThenCategory(void) {} diff --git a/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Timeout.m b/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Timeout.m new file mode 100644 index 0000000..91da9ff --- /dev/null +++ b/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Timeout.m @@ -0,0 +1,67 @@ +/** + Copyright 2018 Google Inc. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at: + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "FBLPromise+Timeout.h" + +#import "FBLPromisePrivate.h" + +@implementation FBLPromise (TimeoutAdditions) + +- (FBLPromise *)timeout:(NSTimeInterval)interval { + return [self onQueue:FBLPromise.defaultDispatchQueue timeout:interval]; +} + +- (FBLPromise *)onQueue:(dispatch_queue_t)queue timeout:(NSTimeInterval)interval { + NSParameterAssert(queue); + + FBLPromise *promise = [[[self class] alloc] initPending]; + [self observeOnQueue:queue + fulfill:^(id __nullable value) { + [promise fulfill:value]; + } + reject:^(NSError *error) { + [promise reject:error]; + }]; + FBLPromise* __weak weakPromise = promise; + dispatch_after(dispatch_time(0, (int64_t)(interval * NSEC_PER_SEC)), queue, ^{ + NSError *timedOutError = [[NSError alloc] initWithDomain:FBLPromiseErrorDomain + code:FBLPromiseErrorCodeTimedOut + userInfo:nil]; + [weakPromise reject:timedOutError]; + }); + return promise; +} + +@end + +@implementation FBLPromise (DotSyntax_TimeoutAdditions) + +- (FBLPromise* (^)(NSTimeInterval))timeout { + return ^(NSTimeInterval interval) { + return [self timeout:interval]; + }; +} + +- (FBLPromise* (^)(dispatch_queue_t, NSTimeInterval))timeoutOn { + return ^(dispatch_queue_t queue, NSTimeInterval interval) { + return [self onQueue:queue timeout:interval]; + }; +} + +@end + +/** Stub used to force the linker to include the categories in this file. */ +void FBLIncludeTimeoutCategory(void) {} diff --git a/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Validate.m b/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Validate.m new file mode 100644 index 0000000..3520e24 --- /dev/null +++ b/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Validate.m @@ -0,0 +1,59 @@ +/** + Copyright 2018 Google Inc. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at: + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "FBLPromise+Validate.h" + +#import "FBLPromisePrivate.h" + +@implementation FBLPromise (ValidateAdditions) + +- (FBLPromise*)validate:(FBLPromiseValidateWorkBlock)predicate { + return [self onQueue:FBLPromise.defaultDispatchQueue validate:predicate]; +} + +- (FBLPromise*)onQueue:(dispatch_queue_t)queue validate:(FBLPromiseValidateWorkBlock)predicate { + NSParameterAssert(queue); + NSParameterAssert(predicate); + + FBLPromiseChainedFulfillBlock chainedFulfill = ^id(id value) { + return predicate(value) ? value : + [[NSError alloc] initWithDomain:FBLPromiseErrorDomain + code:FBLPromiseErrorCodeValidationFailure + userInfo:nil]; + }; + return [self chainOnQueue:queue chainedFulfill:chainedFulfill chainedReject:nil]; +} + +@end + +@implementation FBLPromise (DotSyntax_ValidateAdditions) + +- (FBLPromise* (^)(FBLPromiseValidateWorkBlock))validate { + return ^(FBLPromiseValidateWorkBlock predicate) { + return [self validate:predicate]; + }; +} + +- (FBLPromise* (^)(dispatch_queue_t, FBLPromiseValidateWorkBlock))validateOn { + return ^(dispatch_queue_t queue, FBLPromiseValidateWorkBlock predicate) { + return [self onQueue:queue validate:predicate]; + }; +} + +@end + +/** Stub used to force the linker to include the categories in this file. */ +void FBLIncludeValidateCategory(void) {} diff --git a/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Wrap.m b/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Wrap.m new file mode 100644 index 0000000..840bc16 --- /dev/null +++ b/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Wrap.m @@ -0,0 +1,423 @@ +/** + Copyright 2018 Google Inc. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at: + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "FBLPromise+Wrap.h" + +#import "FBLPromise+Async.h" + +@implementation FBLPromise (WrapAdditions) + ++ (instancetype)wrapCompletion:(void (^)(FBLPromiseCompletion))work { + return [self onQueue:self.defaultDispatchQueue wrapCompletion:work]; +} + ++ (instancetype)onQueue:(dispatch_queue_t)queue + wrapCompletion:(void (^)(FBLPromiseCompletion))work { + NSParameterAssert(queue); + NSParameterAssert(work); + + return [self onQueue:queue + async:^(FBLPromiseFulfillBlock fulfill, FBLPromiseRejectBlock __unused _) { + work(^{ + fulfill(nil); + }); + }]; +} + ++ (instancetype)wrapObjectCompletion:(void (^)(FBLPromiseObjectCompletion))work { + return [self onQueue:self.defaultDispatchQueue wrapObjectCompletion:work]; +} + ++ (instancetype)onQueue:(dispatch_queue_t)queue + wrapObjectCompletion:(void (^)(FBLPromiseObjectCompletion))work { + NSParameterAssert(queue); + NSParameterAssert(work); + + return [self onQueue:queue + async:^(FBLPromiseFulfillBlock fulfill, FBLPromiseRejectBlock __unused _) { + work(^(id __nullable value) { + fulfill(value); + }); + }]; +} + ++ (instancetype)wrapErrorCompletion:(void (^)(FBLPromiseErrorCompletion))work { + return [self onQueue:self.defaultDispatchQueue wrapErrorCompletion:work]; +} + ++ (instancetype)onQueue:(dispatch_queue_t)queue + wrapErrorCompletion:(void (^)(FBLPromiseErrorCompletion))work { + NSParameterAssert(queue); + NSParameterAssert(work); + + return [self onQueue:queue + async:^(FBLPromiseFulfillBlock fulfill, FBLPromiseRejectBlock reject) { + work(^(NSError *__nullable error) { + if (error) { + reject(error); + } else { + fulfill(nil); + } + }); + }]; +} + ++ (instancetype)wrapObjectOrErrorCompletion:(void (^)(FBLPromiseObjectOrErrorCompletion))work { + return [self onQueue:self.defaultDispatchQueue wrapObjectOrErrorCompletion:work]; +} + ++ (instancetype)onQueue:(dispatch_queue_t)queue + wrapObjectOrErrorCompletion:(void (^)(FBLPromiseObjectOrErrorCompletion))work { + NSParameterAssert(queue); + NSParameterAssert(work); + + return [self onQueue:queue + async:^(FBLPromiseFulfillBlock fulfill, FBLPromiseRejectBlock reject) { + work(^(id __nullable value, NSError *__nullable error) { + if (error) { + reject(error); + } else { + fulfill(value); + } + }); + }]; +} + ++ (instancetype)wrapErrorOrObjectCompletion:(void (^)(FBLPromiseErrorOrObjectCompletion))work { + return [self onQueue:self.defaultDispatchQueue wrapErrorOrObjectCompletion:work]; +} + ++ (instancetype)onQueue:(dispatch_queue_t)queue + wrapErrorOrObjectCompletion:(void (^)(FBLPromiseErrorOrObjectCompletion))work { + NSParameterAssert(queue); + NSParameterAssert(work); + + return [self onQueue:queue + async:^(FBLPromiseFulfillBlock fulfill, FBLPromiseRejectBlock reject) { + work(^(NSError *__nullable error, id __nullable value) { + if (error) { + reject(error); + } else { + fulfill(value); + } + }); + }]; +} + ++ (FBLPromise *)wrap2ObjectsOrErrorCompletion: + (void (^)(FBLPromise2ObjectsOrErrorCompletion))work { + return [self onQueue:self.defaultDispatchQueue wrap2ObjectsOrErrorCompletion:work]; +} + ++ (FBLPromise *)onQueue:(dispatch_queue_t)queue + wrap2ObjectsOrErrorCompletion:(void (^)(FBLPromise2ObjectsOrErrorCompletion))work { + NSParameterAssert(queue); + NSParameterAssert(work); + + return [self onQueue:queue + async:^(FBLPromiseFulfillBlock fulfill, FBLPromiseRejectBlock reject) { + work(^(id __nullable value1, id __nullable value2, NSError *__nullable error) { + if (error) { + reject(error); + } else { + fulfill(@[ value1 ?: [NSNull null], value2 ?: [NSNull null] ]); + } + }); + }]; +} + ++ (FBLPromise *)wrapBoolCompletion:(void (^)(FBLPromiseBoolCompletion))work { + return [self onQueue:self.defaultDispatchQueue wrapBoolCompletion:work]; +} + ++ (FBLPromise *)onQueue:(dispatch_queue_t)queue + wrapBoolCompletion:(void (^)(FBLPromiseBoolCompletion))work { + NSParameterAssert(queue); + NSParameterAssert(work); + + return [self onQueue:queue + async:^(FBLPromiseFulfillBlock fulfill, FBLPromiseRejectBlock __unused _) { + work(^(BOOL value) { + fulfill(@(value)); + }); + }]; +} + ++ (FBLPromise *)wrapBoolOrErrorCompletion: + (void (^)(FBLPromiseBoolOrErrorCompletion))work { + return [self onQueue:self.defaultDispatchQueue wrapBoolOrErrorCompletion:work]; +} + ++ (FBLPromise *)onQueue:(dispatch_queue_t)queue + wrapBoolOrErrorCompletion:(void (^)(FBLPromiseBoolOrErrorCompletion))work { + NSParameterAssert(queue); + NSParameterAssert(work); + + return [self onQueue:queue + async:^(FBLPromiseFulfillBlock fulfill, FBLPromiseRejectBlock reject) { + work(^(BOOL value, NSError *__nullable error) { + if (error) { + reject(error); + } else { + fulfill(@(value)); + } + }); + }]; +} + ++ (FBLPromise *)wrapIntegerCompletion:(void (^)(FBLPromiseIntegerCompletion))work { + return [self onQueue:self.defaultDispatchQueue wrapIntegerCompletion:work]; +} + ++ (FBLPromise *)onQueue:(dispatch_queue_t)queue + wrapIntegerCompletion:(void (^)(FBLPromiseIntegerCompletion))work { + NSParameterAssert(queue); + NSParameterAssert(work); + + return [self onQueue:queue + async:^(FBLPromiseFulfillBlock fulfill, FBLPromiseRejectBlock __unused _) { + work(^(NSInteger value) { + fulfill(@(value)); + }); + }]; +} + ++ (FBLPromise *)wrapIntegerOrErrorCompletion: + (void (^)(FBLPromiseIntegerOrErrorCompletion))work { + return [self onQueue:self.defaultDispatchQueue wrapIntegerOrErrorCompletion:work]; +} + ++ (FBLPromise *)onQueue:(dispatch_queue_t)queue + wrapIntegerOrErrorCompletion:(void (^)(FBLPromiseIntegerOrErrorCompletion))work { + NSParameterAssert(queue); + NSParameterAssert(work); + + return [self onQueue:queue + async:^(FBLPromiseFulfillBlock fulfill, FBLPromiseRejectBlock reject) { + work(^(NSInteger value, NSError *__nullable error) { + if (error) { + reject(error); + } else { + fulfill(@(value)); + } + }); + }]; +} + ++ (FBLPromise *)wrapDoubleCompletion:(void (^)(FBLPromiseDoubleCompletion))work { + return [self onQueue:self.defaultDispatchQueue wrapDoubleCompletion:work]; +} + ++ (FBLPromise *)onQueue:(dispatch_queue_t)queue + wrapDoubleCompletion:(void (^)(FBLPromiseDoubleCompletion))work { + NSParameterAssert(queue); + NSParameterAssert(work); + + return [self onQueue:(dispatch_queue_t)queue + async:^(FBLPromiseFulfillBlock fulfill, FBLPromiseRejectBlock __unused _) { + work(^(double value) { + fulfill(@(value)); + }); + }]; +} + ++ (FBLPromise *)wrapDoubleOrErrorCompletion: + (void (^)(FBLPromiseDoubleOrErrorCompletion))work { + return [self onQueue:self.defaultDispatchQueue wrapDoubleOrErrorCompletion:work]; +} + ++ (FBLPromise *)onQueue:(dispatch_queue_t)queue + wrapDoubleOrErrorCompletion:(void (^)(FBLPromiseDoubleOrErrorCompletion))work { + NSParameterAssert(queue); + NSParameterAssert(work); + + return [self onQueue:queue + async:^(FBLPromiseFulfillBlock fulfill, FBLPromiseRejectBlock reject) { + work(^(double value, NSError *__nullable error) { + if (error) { + reject(error); + } else { + fulfill(@(value)); + } + }); + }]; +} + +@end + +@implementation FBLPromise (DotSyntax_WrapAdditions) + ++ (FBLPromise * (^)(void (^)(FBLPromiseCompletion)))wrapCompletion { + return ^(void (^work)(FBLPromiseCompletion)) { + return [self wrapCompletion:work]; + }; +} + ++ (FBLPromise * (^)(dispatch_queue_t, void (^)(FBLPromiseCompletion)))wrapCompletionOn { + return ^(dispatch_queue_t queue, void (^work)(FBLPromiseCompletion)) { + return [self onQueue:queue wrapCompletion:work]; + }; +} + ++ (FBLPromise * (^)(void (^)(FBLPromiseObjectCompletion)))wrapObjectCompletion { + return ^(void (^work)(FBLPromiseObjectCompletion)) { + return [self wrapObjectCompletion:work]; + }; +} + ++ (FBLPromise * (^)(dispatch_queue_t, void (^)(FBLPromiseObjectCompletion)))wrapObjectCompletionOn { + return ^(dispatch_queue_t queue, void (^work)(FBLPromiseObjectCompletion)) { + return [self onQueue:queue wrapObjectCompletion:work]; + }; +} + ++ (FBLPromise * (^)(void (^)(FBLPromiseErrorCompletion)))wrapErrorCompletion { + return ^(void (^work)(FBLPromiseErrorCompletion)) { + return [self wrapErrorCompletion:work]; + }; +} + ++ (FBLPromise * (^)(dispatch_queue_t, void (^)(FBLPromiseErrorCompletion)))wrapErrorCompletionOn { + return ^(dispatch_queue_t queue, void (^work)(FBLPromiseErrorCompletion)) { + return [self onQueue:queue wrapErrorCompletion:work]; + }; +} + ++ (FBLPromise * (^)(void (^)(FBLPromiseObjectOrErrorCompletion)))wrapObjectOrErrorCompletion { + return ^(void (^work)(FBLPromiseObjectOrErrorCompletion)) { + return [self wrapObjectOrErrorCompletion:work]; + }; +} + ++ (FBLPromise * (^)(dispatch_queue_t, + void (^)(FBLPromiseObjectOrErrorCompletion)))wrapObjectOrErrorCompletionOn { + return ^(dispatch_queue_t queue, void (^work)(FBLPromiseObjectOrErrorCompletion)) { + return [self onQueue:queue wrapObjectOrErrorCompletion:work]; + }; +} + ++ (FBLPromise * (^)(void (^)(FBLPromiseErrorOrObjectCompletion)))wrapErrorOrObjectCompletion { + return ^(void (^work)(FBLPromiseErrorOrObjectCompletion)) { + return [self wrapErrorOrObjectCompletion:work]; + }; +} + ++ (FBLPromise * (^)(dispatch_queue_t, + void (^)(FBLPromiseErrorOrObjectCompletion)))wrapErrorOrObjectCompletionOn { + return ^(dispatch_queue_t queue, void (^work)(FBLPromiseErrorOrObjectCompletion)) { + return [self onQueue:queue wrapErrorOrObjectCompletion:work]; + }; +} + ++ (FBLPromise * (^)(void (^)(FBLPromise2ObjectsOrErrorCompletion))) + wrap2ObjectsOrErrorCompletion { + return ^(void (^work)(FBLPromise2ObjectsOrErrorCompletion)) { + return [self wrap2ObjectsOrErrorCompletion:work]; + }; +} + ++ (FBLPromise * (^)(dispatch_queue_t, void (^)(FBLPromise2ObjectsOrErrorCompletion))) + wrap2ObjectsOrErrorCompletionOn { + return ^(dispatch_queue_t queue, void (^work)(FBLPromise2ObjectsOrErrorCompletion)) { + return [self onQueue:queue wrap2ObjectsOrErrorCompletion:work]; + }; +} + ++ (FBLPromise * (^)(void (^)(FBLPromiseBoolCompletion)))wrapBoolCompletion { + return ^(void (^work)(FBLPromiseBoolCompletion)) { + return [self wrapBoolCompletion:work]; + }; +} + ++ (FBLPromise * (^)(dispatch_queue_t, + void (^)(FBLPromiseBoolCompletion)))wrapBoolCompletionOn { + return ^(dispatch_queue_t queue, void (^work)(FBLPromiseBoolCompletion)) { + return [self onQueue:queue wrapBoolCompletion:work]; + }; +} + ++ (FBLPromise * (^)(void (^)(FBLPromiseBoolOrErrorCompletion))) + wrapBoolOrErrorCompletion { + return ^(void (^work)(FBLPromiseBoolOrErrorCompletion)) { + return [self wrapBoolOrErrorCompletion:work]; + }; +} + ++ (FBLPromise * (^)(dispatch_queue_t, void (^)(FBLPromiseBoolOrErrorCompletion))) + wrapBoolOrErrorCompletionOn { + return ^(dispatch_queue_t queue, void (^work)(FBLPromiseBoolOrErrorCompletion)) { + return [self onQueue:queue wrapBoolOrErrorCompletion:work]; + }; +} + ++ (FBLPromise * (^)(void (^)(FBLPromiseIntegerCompletion)))wrapIntegerCompletion { + return ^(void (^work)(FBLPromiseIntegerCompletion)) { + return [self wrapIntegerCompletion:work]; + }; +} + ++ (FBLPromise * (^)(dispatch_queue_t, + void (^)(FBLPromiseIntegerCompletion)))wrapIntegerCompletionOn { + return ^(dispatch_queue_t queue, void (^work)(FBLPromiseIntegerCompletion)) { + return [self onQueue:queue wrapIntegerCompletion:work]; + }; +} + ++ (FBLPromise * (^)(void (^)(FBLPromiseIntegerOrErrorCompletion))) + wrapIntegerOrErrorCompletion { + return ^(void (^work)(FBLPromiseIntegerOrErrorCompletion)) { + return [self wrapIntegerOrErrorCompletion:work]; + }; +} + ++ (FBLPromise * (^)(dispatch_queue_t, void (^)(FBLPromiseIntegerOrErrorCompletion))) + wrapIntegerOrErrorCompletionOn { + return ^(dispatch_queue_t queue, void (^work)(FBLPromiseIntegerOrErrorCompletion)) { + return [self onQueue:queue wrapIntegerOrErrorCompletion:work]; + }; +} + ++ (FBLPromise * (^)(void (^)(FBLPromiseDoubleCompletion)))wrapDoubleCompletion { + return ^(void (^work)(FBLPromiseDoubleCompletion)) { + return [self wrapDoubleCompletion:work]; + }; +} + ++ (FBLPromise * (^)(dispatch_queue_t, + void (^)(FBLPromiseDoubleCompletion)))wrapDoubleCompletionOn { + return ^(dispatch_queue_t queue, void (^work)(FBLPromiseDoubleCompletion)) { + return [self onQueue:queue wrapDoubleCompletion:work]; + }; +} + ++ (FBLPromise * (^)(void (^)(FBLPromiseDoubleOrErrorCompletion))) + wrapDoubleOrErrorCompletion { + return ^(void (^work)(FBLPromiseDoubleOrErrorCompletion)) { + return [self wrapDoubleOrErrorCompletion:work]; + }; +} + ++ (FBLPromise * (^)(dispatch_queue_t, void (^)(FBLPromiseDoubleOrErrorCompletion))) + wrapDoubleOrErrorCompletionOn { + return ^(dispatch_queue_t queue, void (^work)(FBLPromiseDoubleOrErrorCompletion)) { + return [self onQueue:queue wrapDoubleOrErrorCompletion:work]; + }; +} + +@end + +/** Stub used to force the linker to include the categories in this file. */ +void FBLIncludeWrapCategory(void) {} diff --git a/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise.m b/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise.m new file mode 100644 index 0000000..9a61ed2 --- /dev/null +++ b/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise.m @@ -0,0 +1,346 @@ +/** + Copyright 2018 Google Inc. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at: + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "FBLPromisePrivate.h" + +/** All states a promise can be in. */ +typedef NS_ENUM(NSInteger, FBLPromiseState) { + FBLPromiseStatePending = 0, + FBLPromiseStateFulfilled, + FBLPromiseStateRejected, +}; + +typedef void (^FBLPromiseObserver)(FBLPromiseState state, id __nullable resolution); + +static dispatch_queue_t gFBLPromiseDefaultDispatchQueue; + +@implementation FBLPromise { + /** Current state of the promise. */ + FBLPromiseState _state; + /** + Set of arbitrary objects to keep strongly while the promise is pending. + Becomes nil after the promise has been resolved. + */ + NSMutableSet *__nullable _pendingObjects; + /** + Value to fulfill the promise with. + Can be nil if the promise is still pending, was resolved with nil or after it has been rejected. + */ + id __nullable _value; + /** + Error to reject the promise with. + Can be nil if the promise is still pending or after it has been fulfilled. + */ + NSError *__nullable _error; + /** List of observers to notify when the promise gets resolved. */ + NSMutableArray *_observers; +} + ++ (void)initialize { + if (self == [FBLPromise class]) { + gFBLPromiseDefaultDispatchQueue = dispatch_get_main_queue(); + } +} + ++ (dispatch_queue_t)defaultDispatchQueue { + @synchronized(self) { + return gFBLPromiseDefaultDispatchQueue; + } +} + ++ (void)setDefaultDispatchQueue:(dispatch_queue_t)queue { + NSParameterAssert(queue); + + @synchronized(self) { + gFBLPromiseDefaultDispatchQueue = queue; + } +} + ++ (instancetype)pendingPromise { + return [[self alloc] initPending]; +} + ++ (instancetype)resolvedWith:(nullable id)resolution { + return [[self alloc] initWithResolution:resolution]; +} + +- (void)fulfill:(nullable id)value { + if ([value isKindOfClass:[NSError class]]) { + [self reject:(NSError *)value]; + } else { + @synchronized(self) { + if (_state == FBLPromiseStatePending) { + _state = FBLPromiseStateFulfilled; + _value = value; + _pendingObjects = nil; + for (FBLPromiseObserver observer in _observers) { + observer(_state, _value); + } + _observers = nil; + dispatch_group_leave(FBLPromise.dispatchGroup); + } + } + } +} + +- (void)reject:(NSError *)error { + NSAssert([error isKindOfClass:[NSError class]], @"Invalid error type."); + + if (![error isKindOfClass:[NSError class]]) { + // Give up on invalid error type in Release mode. + @throw error; // NOLINT + } + @synchronized(self) { + if (_state == FBLPromiseStatePending) { + _state = FBLPromiseStateRejected; + _error = error; + _pendingObjects = nil; + for (FBLPromiseObserver observer in _observers) { + observer(_state, _error); + } + _observers = nil; + dispatch_group_leave(FBLPromise.dispatchGroup); + } + } +} + +#pragma mark - NSObject + +- (NSString *)description { + if (self.isFulfilled) { + return [NSString stringWithFormat:@"<%@ %p> Fulfilled: %@", NSStringFromClass([self class]), + self, self.value]; + } + if (self.isRejected) { + return [NSString stringWithFormat:@"<%@ %p> Rejected: %@", NSStringFromClass([self class]), + self, self.error]; + } + return [NSString stringWithFormat:@"<%@ %p> Pending", NSStringFromClass([self class]), self]; +} + +#pragma mark - Private + +- (instancetype)initPending { + self = [super init]; + if (self) { + dispatch_group_enter(FBLPromise.dispatchGroup); + } + return self; +} + +- (instancetype)initWithResolution:(nullable id)resolution { + self = [super init]; + if (self) { + if ([resolution isKindOfClass:[NSError class]]) { + _state = FBLPromiseStateRejected; + _error = (NSError *)resolution; + } else { + _state = FBLPromiseStateFulfilled; + _value = resolution; + } + } + return self; +} + +- (void)dealloc { + if (_state == FBLPromiseStatePending) { + dispatch_group_leave(FBLPromise.dispatchGroup); + } +} + +- (BOOL)isPending { + @synchronized(self) { + return _state == FBLPromiseStatePending; + } +} + +- (BOOL)isFulfilled { + @synchronized(self) { + return _state == FBLPromiseStateFulfilled; + } +} + +- (BOOL)isRejected { + @synchronized(self) { + return _state == FBLPromiseStateRejected; + } +} + +- (nullable id)value { + @synchronized(self) { + return _value; + } +} + +- (NSError *__nullable)error { + @synchronized(self) { + return _error; + } +} + +- (void)addPendingObject:(id)object { + NSParameterAssert(object); + + @synchronized(self) { + if (_state == FBLPromiseStatePending) { + if (!_pendingObjects) { + _pendingObjects = [[NSMutableSet alloc] init]; + } + [_pendingObjects addObject:object]; + } + } +} + +- (void)observeOnQueue:(dispatch_queue_t)queue + fulfill:(FBLPromiseOnFulfillBlock)onFulfill + reject:(FBLPromiseOnRejectBlock)onReject { + NSParameterAssert(queue); + NSParameterAssert(onFulfill); + NSParameterAssert(onReject); + + @synchronized(self) { + switch (_state) { + case FBLPromiseStatePending: { + if (!_observers) { + _observers = [[NSMutableArray alloc] init]; + } + [_observers addObject:^(FBLPromiseState state, id __nullable resolution) { + dispatch_group_async(FBLPromise.dispatchGroup, queue, ^{ + switch (state) { + case FBLPromiseStatePending: + break; + case FBLPromiseStateFulfilled: + onFulfill(resolution); + break; + case FBLPromiseStateRejected: + onReject(resolution); + break; + } + }); + }]; + break; + } + case FBLPromiseStateFulfilled: { + dispatch_group_async(FBLPromise.dispatchGroup, queue, ^{ + onFulfill(self->_value); + }); + break; + } + case FBLPromiseStateRejected: { + dispatch_group_async(FBLPromise.dispatchGroup, queue, ^{ + onReject(self->_error); + }); + break; + } + } + } +} + +- (FBLPromise *)chainOnQueue:(dispatch_queue_t)queue + chainedFulfill:(FBLPromiseChainedFulfillBlock)chainedFulfill + chainedReject:(FBLPromiseChainedRejectBlock)chainedReject { + NSParameterAssert(queue); + + FBLPromise *promise = [[[self class] alloc] initPending]; + __auto_type resolver = ^(id __nullable value) { + if ([value isKindOfClass:[FBLPromise class]]) { + [(FBLPromise *)value observeOnQueue:queue + fulfill:^(id __nullable value) { + [promise fulfill:value]; + } + reject:^(NSError *error) { + [promise reject:error]; + }]; + } else { + [promise fulfill:value]; + } + }; + [self observeOnQueue:queue + fulfill:^(id __nullable value) { + value = chainedFulfill ? chainedFulfill(value) : value; + resolver(value); + } + reject:^(NSError *error) { + id value = chainedReject ? chainedReject(error) : error; + resolver(value); + }]; + return promise; +} + +#pragma mark - Category linking workaround + +extern void FBLIncludeAllCategory(void); +extern void FBLIncludeAlwaysCategory(void); +extern void FBLIncludeAnyCategory(void); +extern void FBLIncludeAsyncCategory(void); +extern void FBLIncludeAwaitCategory(void); +extern void FBLIncludeCatchCategory(void); +extern void FBLIncludeDelayCategory(void); +extern void FBLIncludeDoCategory(void); +extern void FBLIncludeRaceCategory(void); +extern void FBLIncludeRecoverCategory(void); +extern void FBLIncludeReduceCategory(void); +extern void FBLIncludeRetryCategory(void); +extern void FBLIncludeTestingCategory(void); +extern void FBLIncludeThenCategory(void); +extern void FBLIncludeTimeoutCategory(void); +extern void FBLIncludeValidateCategory(void); +extern void FBLIncludeWrapCategory(void); + +/** + Does nothing when called, and not meant to be called. + + This method forces the linker to include all FBLPromise categories even if + users do not include the '-ObjC' linker flag in their projects. + */ ++ (void)noop { + FBLIncludeAllCategory(); + FBLIncludeAllCategory(); + FBLIncludeAlwaysCategory(); + FBLIncludeAnyCategory(); + FBLIncludeAsyncCategory(); + FBLIncludeAwaitCategory(); + FBLIncludeCatchCategory(); + FBLIncludeDelayCategory(); + FBLIncludeDoCategory(); + FBLIncludeRaceCategory(); + FBLIncludeRecoverCategory(); + FBLIncludeReduceCategory(); + FBLIncludeRetryCategory(); + FBLIncludeTestingCategory(); + FBLIncludeThenCategory(); + FBLIncludeTimeoutCategory(); + FBLIncludeValidateCategory(); + FBLIncludeWrapCategory(); +} + +@end + +@implementation FBLPromise (DotSyntaxAdditions) + ++ (FBLPromise * (^)(void))pending { + return ^(void) { + return [self pendingPromise]; + }; +} + ++ (FBLPromise * (^)(id __nullable))resolved { + return ^(id resolution) { + return [self resolvedWith:resolution]; + }; +} + +@end diff --git a/Pods/PromisesObjC/Sources/FBLPromises/FBLPromiseError.m b/Pods/PromisesObjC/Sources/FBLPromises/FBLPromiseError.m new file mode 100644 index 0000000..1cc181a --- /dev/null +++ b/Pods/PromisesObjC/Sources/FBLPromises/FBLPromiseError.m @@ -0,0 +1,19 @@ +/** + Copyright 2018 Google Inc. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at: + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "FBLPromiseError.h" + +NSErrorDomain const FBLPromiseErrorDomain = @"com.google.FBLPromises.Error"; diff --git a/Pods/PromisesObjC/Sources/FBLPromises/Resources/PrivacyInfo.xcprivacy b/Pods/PromisesObjC/Sources/FBLPromises/Resources/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..5397adc --- /dev/null +++ b/Pods/PromisesObjC/Sources/FBLPromises/Resources/PrivacyInfo.xcprivacy @@ -0,0 +1,14 @@ + + + + + NSPrivacyAccessedAPITypes + + NSPrivacyCollectedDataTypes + + NSPrivacyTracking + + NSPrivacyTrackingDomains + + + diff --git a/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+All.h b/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+All.h new file mode 100644 index 0000000..9c0090e --- /dev/null +++ b/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+All.h @@ -0,0 +1,63 @@ +/** + Copyright 2018 Google Inc. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at: + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "FBLPromise.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FBLPromise(AllAdditions) + +/** + Wait until all of the given promises are fulfilled. + If one of the given promises is rejected, then the returned promise is rejected with same error. + If any other arbitrary value or `NSError` appears in the array instead of `FBLPromise`, + it's implicitly considered a pre-fulfilled or pre-rejected `FBLPromise` correspondingly. + Promises resolved with `nil` become `NSNull` instances in the resulting array. + + @param promises Promises to wait for. + @return Promise of an array containing the values of input promises in the same order. + */ ++ (FBLPromise *)all:(NSArray *)promises NS_SWIFT_UNAVAILABLE(""); + +/** + Wait until all of the given promises are fulfilled. + If one of the given promises is rejected, then the returned promise is rejected with same error. + If any other arbitrary value or `NSError` appears in the array instead of `FBLPromise`, + it's implicitly considered a pre-fulfilled or pre-rejected FBLPromise correspondingly. + Promises resolved with `nil` become `NSNull` instances in the resulting array. + + @param queue A queue to dispatch on. + @param promises Promises to wait for. + @return Promise of an array containing the values of input promises in the same order. + */ ++ (FBLPromise *)onQueue:(dispatch_queue_t)queue + all:(NSArray *)promises NS_REFINED_FOR_SWIFT; + +@end + +/** + Convenience dot-syntax wrappers for `FBLPromise` `all` operators. + Usage: FBLPromise.all(@[ ... ]) + */ +@interface FBLPromise(DotSyntax_AllAdditions) + ++ (FBLPromise * (^)(NSArray *))all FBL_PROMISES_DOT_SYNTAX NS_SWIFT_UNAVAILABLE(""); ++ (FBLPromise * (^)(dispatch_queue_t, NSArray *))allOn FBL_PROMISES_DOT_SYNTAX + NS_SWIFT_UNAVAILABLE(""); + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Always.h b/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Always.h new file mode 100644 index 0000000..13000f5 --- /dev/null +++ b/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Always.h @@ -0,0 +1,54 @@ +/** + Copyright 2018 Google Inc. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at: + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "FBLPromise.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FBLPromise(AlwaysAdditions) + +typedef void (^FBLPromiseAlwaysWorkBlock)(void) NS_SWIFT_UNAVAILABLE(""); + +/** + @param work A block that always executes, no matter if the receiver is rejected or fulfilled. + @return A new pending promise to be resolved with same resolution as the receiver. + */ +- (FBLPromise *)always:(FBLPromiseAlwaysWorkBlock)work NS_SWIFT_UNAVAILABLE(""); + +/** + @param queue A queue to dispatch on. + @param work A block that always executes, no matter if the receiver is rejected or fulfilled. + @return A new pending promise to be resolved with same resolution as the receiver. + */ +- (FBLPromise *)onQueue:(dispatch_queue_t)queue + always:(FBLPromiseAlwaysWorkBlock)work NS_REFINED_FOR_SWIFT; + +@end + +/** + Convenience dot-syntax wrappers for `FBLPromise` `always` operators. + Usage: promise.always(^{...}) + */ +@interface FBLPromise(DotSyntax_AlwaysAdditions) + +- (FBLPromise* (^)(FBLPromiseAlwaysWorkBlock))always FBL_PROMISES_DOT_SYNTAX + NS_SWIFT_UNAVAILABLE(""); +- (FBLPromise* (^)(dispatch_queue_t, FBLPromiseAlwaysWorkBlock))alwaysOn FBL_PROMISES_DOT_SYNTAX + NS_SWIFT_UNAVAILABLE(""); + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Any.h b/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Any.h new file mode 100644 index 0000000..82875bf --- /dev/null +++ b/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Any.h @@ -0,0 +1,69 @@ +/** + Copyright 2018 Google Inc. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at: + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "FBLPromise.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FBLPromise(AnyAdditions) + +/** + Waits until all of the given promises are either fulfilled or rejected. + If all promises are rejected, then the returned promise is rejected with same error + as the last one rejected. + If at least one of the promises is fulfilled, the resulting promise is fulfilled with an array of + values or `NSErrors`, matching the original order of fulfilled or rejected promises respectively. + If any other arbitrary value or `NSError` appears in the array instead of `FBLPromise`, + it's implicitly considered a pre-fulfilled or pre-rejected `FBLPromise` correspondingly. + Promises resolved with `nil` become `NSNull` instances in the resulting array. + + @param promises Promises to wait for. + @return Promise of array containing the values or `NSError`s of input promises in the same order. + */ ++ (FBLPromise *)any:(NSArray *)promises NS_SWIFT_UNAVAILABLE(""); + +/** + Waits until all of the given promises are either fulfilled or rejected. + If all promises are rejected, then the returned promise is rejected with same error + as the last one rejected. + If at least one of the promises is fulfilled, the resulting promise is fulfilled with an array of + values or `NSError`s, matching the original order of fulfilled or rejected promises respectively. + If any other arbitrary value or `NSError` appears in the array instead of `FBLPromise`, + it's implicitly considered a pre-fulfilled or pre-rejected `FBLPromise` correspondingly. + Promises resolved with `nil` become `NSNull` instances in the resulting array. + + @param queue A queue to dispatch on. + @param promises Promises to wait for. + @return Promise of array containing the values or `NSError`s of input promises in the same order. + */ ++ (FBLPromise *)onQueue:(dispatch_queue_t)queue + any:(NSArray *)promises NS_REFINED_FOR_SWIFT; + +@end + +/** + Convenience dot-syntax wrappers for `FBLPromise` `any` operators. + Usage: FBLPromise.any(@[ ... ]) + */ +@interface FBLPromise(DotSyntax_AnyAdditions) + ++ (FBLPromise * (^)(NSArray *))any FBL_PROMISES_DOT_SYNTAX NS_SWIFT_UNAVAILABLE(""); ++ (FBLPromise * (^)(dispatch_queue_t, NSArray *))anyOn FBL_PROMISES_DOT_SYNTAX + NS_SWIFT_UNAVAILABLE(""); + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Async.h b/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Async.h new file mode 100644 index 0000000..0588a9e --- /dev/null +++ b/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Async.h @@ -0,0 +1,60 @@ +/** + Copyright 2018 Google Inc. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at: + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "FBLPromise.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FBLPromise(AsyncAdditions) + +typedef void (^FBLPromiseFulfillBlock)(Value __nullable value) NS_SWIFT_UNAVAILABLE(""); +typedef void (^FBLPromiseRejectBlock)(NSError *error) NS_SWIFT_UNAVAILABLE(""); +typedef void (^FBLPromiseAsyncWorkBlock)(FBLPromiseFulfillBlock fulfill, + FBLPromiseRejectBlock reject) NS_SWIFT_UNAVAILABLE(""); + +/** + Creates a pending promise and executes `work` block asynchronously. + + @param work A block to perform any operations needed to resolve the promise. + @return A new pending promise. + */ ++ (instancetype)async:(FBLPromiseAsyncWorkBlock)work NS_SWIFT_UNAVAILABLE(""); + +/** + Creates a pending promise and executes `work` block asynchronously on the given queue. + + @param queue A queue to invoke the `work` block on. + @param work A block to perform any operations needed to resolve the promise. + @return A new pending promise. + */ ++ (instancetype)onQueue:(dispatch_queue_t)queue + async:(FBLPromiseAsyncWorkBlock)work NS_REFINED_FOR_SWIFT; + +@end + +/** + Convenience dot-syntax wrappers for `FBLPromise` `async` operators. + Usage: FBLPromise.async(^(FBLPromiseFulfillBlock fulfill, FBLPromiseRejectBlock reject) { ... }) + */ +@interface FBLPromise(DotSyntax_AsyncAdditions) + ++ (FBLPromise* (^)(FBLPromiseAsyncWorkBlock))async FBL_PROMISES_DOT_SYNTAX NS_SWIFT_UNAVAILABLE(""); ++ (FBLPromise* (^)(dispatch_queue_t, FBLPromiseAsyncWorkBlock))asyncOn FBL_PROMISES_DOT_SYNTAX + NS_SWIFT_UNAVAILABLE(""); + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Await.h b/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Await.h new file mode 100644 index 0000000..c97a1ba --- /dev/null +++ b/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Await.h @@ -0,0 +1,32 @@ +/** + Copyright 2018 Google Inc. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at: + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "FBLPromise.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + Waits for promise resolution. The current thread blocks until the promise is resolved. + + @param promise Promise to wait for. + @param error Error the promise was rejected with, or `nil` if the promise was fulfilled. + @return Value the promise was fulfilled with. If the promise was rejected, the return value + is always `nil`, but the error out arg is not. + */ +FOUNDATION_EXTERN id __nullable FBLPromiseAwait(FBLPromise *promise, + NSError **error) NS_REFINED_FOR_SWIFT; + +NS_ASSUME_NONNULL_END diff --git a/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Catch.h b/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Catch.h new file mode 100644 index 0000000..a9ff170 --- /dev/null +++ b/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Catch.h @@ -0,0 +1,59 @@ +/** + Copyright 2018 Google Inc. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at: + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "FBLPromise.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FBLPromise(CatchAdditions) + +typedef void (^FBLPromiseCatchWorkBlock)(NSError *error) NS_SWIFT_UNAVAILABLE(""); + +/** + Creates a pending promise which eventually gets resolved with same resolution as the receiver. + If receiver is rejected, then `reject` block is executed asynchronously. + + @param reject A block to handle the error that receiver was rejected with. + @return A new pending promise. + */ +- (FBLPromise *)catch:(FBLPromiseCatchWorkBlock)reject NS_SWIFT_UNAVAILABLE(""); + +/** + Creates a pending promise which eventually gets resolved with same resolution as the receiver. + If receiver is rejected, then `reject` block is executed asynchronously on the given queue. + + @param queue A queue to invoke the `reject` block on. + @param reject A block to handle the error that receiver was rejected with. + @return A new pending promise. + */ +- (FBLPromise *)onQueue:(dispatch_queue_t)queue + catch:(FBLPromiseCatchWorkBlock)reject NS_REFINED_FOR_SWIFT; + +@end + +/** + Convenience dot-syntax wrappers for `FBLPromise` `catch` operators. + Usage: promise.catch(^(NSError *error) { ... }) + */ +@interface FBLPromise(DotSyntax_CatchAdditions) + +- (FBLPromise* (^)(FBLPromiseCatchWorkBlock))catch FBL_PROMISES_DOT_SYNTAX NS_SWIFT_UNAVAILABLE(""); +- (FBLPromise* (^)(dispatch_queue_t, FBLPromiseCatchWorkBlock))catchOn FBL_PROMISES_DOT_SYNTAX + NS_SWIFT_UNAVAILABLE(""); + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Delay.h b/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Delay.h new file mode 100644 index 0000000..557df48 --- /dev/null +++ b/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Delay.h @@ -0,0 +1,59 @@ +/** + Copyright 2018 Google Inc. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at: + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "FBLPromise.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FBLPromise(DelayAdditions) + +/** + Creates a new pending promise that fulfills with the same value as `self` after the `delay`, or + rejects with the same error immediately. + + @param interval Time to wait in seconds. + @return A new pending promise that fulfills at least `delay` seconds later than `self`, or rejects + with the same error immediately. + */ +- (FBLPromise *)delay:(NSTimeInterval)interval NS_SWIFT_UNAVAILABLE(""); + +/** + Creates a new pending promise that fulfills with the same value as `self` after the `delay`, or + rejects with the same error immediately. + + @param queue A queue to dispatch on. + @param interval Time to wait in seconds. + @return A new pending promise that fulfills at least `delay` seconds later than `self`, or rejects + with the same error immediately. + */ +- (FBLPromise *)onQueue:(dispatch_queue_t)queue + delay:(NSTimeInterval)interval NS_REFINED_FOR_SWIFT; + +@end + +/** + Convenience dot-syntax wrappers for `FBLPromise` `delay` operators. + Usage: promise.delay(...) + */ +@interface FBLPromise(DotSyntax_DelayAdditions) + +- (FBLPromise * (^)(NSTimeInterval))delay FBL_PROMISES_DOT_SYNTAX NS_SWIFT_UNAVAILABLE(""); +- (FBLPromise * (^)(dispatch_queue_t, NSTimeInterval))delayOn FBL_PROMISES_DOT_SYNTAX + NS_SWIFT_UNAVAILABLE(""); + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Do.h b/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Do.h new file mode 100644 index 0000000..6838e0a --- /dev/null +++ b/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Do.h @@ -0,0 +1,55 @@ +/** + Copyright 2018 Google Inc. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at: + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "FBLPromise.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FBLPromise(DoAdditions) + +typedef id __nullable (^FBLPromiseDoWorkBlock)(void) NS_SWIFT_UNAVAILABLE(""); + +/** + Creates a pending promise and executes `work` block asynchronously. + + @param work A block that returns a value or an error used to resolve the promise. + @return A new pending promise. + */ ++ (instancetype)do:(FBLPromiseDoWorkBlock)work NS_SWIFT_UNAVAILABLE(""); + +/** + Creates a pending promise and executes `work` block asynchronously on the given queue. + + @param queue A queue to invoke the `work` block on. + @param work A block that returns a value or an error used to resolve the promise. + @return A new pending promise. + */ ++ (instancetype)onQueue:(dispatch_queue_t)queue do:(FBLPromiseDoWorkBlock)work NS_REFINED_FOR_SWIFT; + +@end + +/** + Convenience dot-syntax wrappers for `FBLPromise` `do` operators. + Usage: FBLPromise.doOn(queue, ^(NSError *error) { ... }) + */ +@interface FBLPromise(DotSyntax_DoAdditions) + ++ (FBLPromise * (^)(dispatch_queue_t, FBLPromiseDoWorkBlock))doOn FBL_PROMISES_DOT_SYNTAX + NS_SWIFT_UNAVAILABLE(""); + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Race.h b/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Race.h new file mode 100644 index 0000000..2f67258 --- /dev/null +++ b/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Race.h @@ -0,0 +1,62 @@ +/** + Copyright 2018 Google Inc. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at: + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "FBLPromise.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FBLPromise(RaceAdditions) + +/** + Wait until any of the given promises are fulfilled. + If one of the promises is rejected, then the returned promise is rejected with same error. + If any other arbitrary value or `NSError` appears in the array instead of `FBLPromise`, + it's implicitly considered a pre-fulfilled or pre-rejected `FBLPromise` correspondingly. + + @param promises Promises to wait for. + @return A new pending promise to be resolved with the same resolution as the first promise, among + the given ones, which was resolved. + */ ++ (instancetype)race:(NSArray *)promises NS_SWIFT_UNAVAILABLE(""); + +/** + Wait until any of the given promises are fulfilled. + If one of the promises is rejected, then the returned promise is rejected with same error. + If any other arbitrary value or `NSError` appears in the array instead of `FBLPromise`, + it's implicitly considered a pre-fulfilled or pre-rejected `FBLPromise` correspondingly. + + @param queue A queue to dispatch on. + @param promises Promises to wait for. + @return A new pending promise to be resolved with the same resolution as the first promise, among + the given ones, which was resolved. + */ ++ (instancetype)onQueue:(dispatch_queue_t)queue race:(NSArray *)promises NS_REFINED_FOR_SWIFT; + +@end + +/** + Convenience dot-syntax wrappers for `FBLPromise` `race` operators. + Usage: FBLPromise.race(@[ ... ]) + */ +@interface FBLPromise(DotSyntax_RaceAdditions) + ++ (FBLPromise * (^)(NSArray *))race FBL_PROMISES_DOT_SYNTAX NS_SWIFT_UNAVAILABLE(""); ++ (FBLPromise * (^)(dispatch_queue_t, NSArray *))raceOn FBL_PROMISES_DOT_SYNTAX + NS_SWIFT_UNAVAILABLE(""); + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Recover.h b/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Recover.h new file mode 100644 index 0000000..bb7df7e --- /dev/null +++ b/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Recover.h @@ -0,0 +1,60 @@ +/** + Copyright 2018 Google Inc. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at: + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "FBLPromise.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FBLPromise(RecoverAdditions) + +typedef id __nullable (^FBLPromiseRecoverWorkBlock)(NSError *error) NS_SWIFT_UNAVAILABLE(""); + +/** + Provides a new promise to recover in case the receiver gets rejected. + + @param recovery A block to handle the error that the receiver was rejected with. + @return A new pending promise to use instead of the rejected one that gets resolved with resolution + returned from `recovery` block. + */ +- (FBLPromise *)recover:(FBLPromiseRecoverWorkBlock)recovery NS_SWIFT_UNAVAILABLE(""); + +/** + Provides a new promise to recover in case the receiver gets rejected. + + @param queue A queue to dispatch on. + @param recovery A block to handle the error that the receiver was rejected with. + @return A new pending promise to use instead of the rejected one that gets resolved with resolution + returned from `recovery` block. + */ +- (FBLPromise *)onQueue:(dispatch_queue_t)queue + recover:(FBLPromiseRecoverWorkBlock)recovery NS_REFINED_FOR_SWIFT; + +@end + +/** + Convenience dot-syntax wrappers for `FBLPromise` `recover` operators. + Usage: promise.recover(^id(NSError *error) {...}) + */ +@interface FBLPromise(DotSyntax_RecoverAdditions) + +- (FBLPromise * (^)(FBLPromiseRecoverWorkBlock))recover FBL_PROMISES_DOT_SYNTAX + NS_SWIFT_UNAVAILABLE(""); +- (FBLPromise * (^)(dispatch_queue_t, FBLPromiseRecoverWorkBlock))recoverOn FBL_PROMISES_DOT_SYNTAX + NS_SWIFT_UNAVAILABLE(""); + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Reduce.h b/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Reduce.h new file mode 100644 index 0000000..5bb1eee --- /dev/null +++ b/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Reduce.h @@ -0,0 +1,71 @@ +/** + Copyright 2018 Google Inc. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at: + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "FBLPromise.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FBLPromise(ReduceAdditions) + +typedef id __nullable (^FBLPromiseReducerBlock)(Value __nullable partial, id next) + NS_SWIFT_UNAVAILABLE(""); + +/** + Sequentially reduces a collection of values to a single promise using a given combining block + and the value `self` resolves with as initial value. + + @param items An array of values to process in order. + @param reducer A block to combine an accumulating value and an element of the sequence into + the new accumulating value or a promise resolved with it, to be used in the next + call of the `reducer` or returned to the caller. + @return A new pending promise returned from the last `reducer` invocation. + Or `self` if `items` is empty. + */ +- (FBLPromise *)reduce:(NSArray *)items + combine:(FBLPromiseReducerBlock)reducer NS_SWIFT_UNAVAILABLE(""); + +/** + Sequentially reduces a collection of values to a single promise using a given combining block + and the value `self` resolves with as initial value. + + @param queue A queue to dispatch on. + @param items An array of values to process in order. + @param reducer A block to combine an accumulating value and an element of the sequence into + the new accumulating value or a promise resolved with it, to be used in the next + call of the `reducer` or returned to the caller. + @return A new pending promise returned from the last `reducer` invocation. + Or `self` if `items` is empty. + */ +- (FBLPromise *)onQueue:(dispatch_queue_t)queue + reduce:(NSArray *)items + combine:(FBLPromiseReducerBlock)reducer NS_SWIFT_UNAVAILABLE(""); + +@end + +/** + Convenience dot-syntax wrappers for `FBLPromise` `reduce` operators. + Usage: promise.reduce(values, ^id(id partial, id next) { ... }) + */ +@interface FBLPromise(DotSyntax_ReduceAdditions) + +- (FBLPromise * (^)(NSArray *, FBLPromiseReducerBlock))reduce FBL_PROMISES_DOT_SYNTAX + NS_SWIFT_UNAVAILABLE(""); +- (FBLPromise * (^)(dispatch_queue_t, NSArray *, FBLPromiseReducerBlock))reduceOn + FBL_PROMISES_DOT_SYNTAX NS_SWIFT_UNAVAILABLE(""); + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Retry.h b/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Retry.h new file mode 100644 index 0000000..414a17a --- /dev/null +++ b/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Retry.h @@ -0,0 +1,165 @@ +/** + Copyright 2018 Google Inc. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at: + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "FBLPromise.h" + +NS_ASSUME_NONNULL_BEGIN + +/** The default number of retry attempts is 1. */ +FOUNDATION_EXTERN NSInteger const FBLPromiseRetryDefaultAttemptsCount NS_REFINED_FOR_SWIFT; + +/** The default delay interval before making a retry attempt is 1.0 second. */ +FOUNDATION_EXTERN NSTimeInterval const FBLPromiseRetryDefaultDelayInterval NS_REFINED_FOR_SWIFT; + +@interface FBLPromise(RetryAdditions) + +typedef id __nullable (^FBLPromiseRetryWorkBlock)(void) NS_SWIFT_UNAVAILABLE(""); +typedef BOOL (^FBLPromiseRetryPredicateBlock)(NSInteger, NSError *) NS_SWIFT_UNAVAILABLE(""); + +/** + Creates a pending promise that fulfills with the same value as the promise returned from `work` + block, which executes asynchronously, or rejects with the same error after all retry attempts have + been exhausted. Defaults to `FBLPromiseRetryDefaultAttemptsCount` attempt(s) on rejection where the + `work` block is retried after a delay of `FBLPromiseRetryDefaultDelayInterval` second(s). + + @param work A block that executes asynchronously on the default queue and returns a value or an + error used to resolve the promise. + @return A new pending promise that fulfills with the same value as the promise returned from `work` + block, or rejects with the same error after all retry attempts have been exhausted. + */ ++ (instancetype)retry:(FBLPromiseRetryWorkBlock)work NS_SWIFT_UNAVAILABLE(""); + +/** + Creates a pending promise that fulfills with the same value as the promise returned from `work` + block, which executes asynchronously on the given `queue`, or rejects with the same error after all + retry attempts have been exhausted. Defaults to `FBLPromiseRetryDefaultAttemptsCount` attempt(s) on + rejection where the `work` block is retried on the given `queue` after a delay of + `FBLPromiseRetryDefaultDelayInterval` second(s). + + @param queue A queue to invoke the `work` block on. + @param work A block that executes asynchronously on the given `queue` and returns a value or an + error used to resolve the promise. + @return A new pending promise that fulfills with the same value as the promise returned from `work` + block, or rejects with the same error after all retry attempts have been exhausted. + */ ++ (instancetype)onQueue:(dispatch_queue_t)queue + retry:(FBLPromiseRetryWorkBlock)work NS_SWIFT_UNAVAILABLE(""); + +/** + Creates a pending promise that fulfills with the same value as the promise returned from `work` + block, which executes asynchronously, or rejects with the same error after all retry attempts have + been exhausted. + + @param count Max number of retry attempts. The `work` block will be executed once if the specified + count is less than or equal to zero. + @param work A block that executes asynchronously on the default queue and returns a value or an + error used to resolve the promise. + @return A new pending promise that fulfills with the same value as the promise returned from `work` + block, or rejects with the same error after all retry attempts have been exhausted. + */ ++ (instancetype)attempts:(NSInteger)count + retry:(FBLPromiseRetryWorkBlock)work NS_SWIFT_UNAVAILABLE(""); + +/** + Creates a pending promise that fulfills with the same value as the promise returned from `work` + block, which executes asynchronously on the given `queue`, or rejects with the same error after all + retry attempts have been exhausted. + + @param queue A queue to invoke the `work` block on. + @param count Max number of retry attempts. The `work` block will be executed once if the specified + count is less than or equal to zero. + @param work A block that executes asynchronously on the given `queue` and returns a value or an + error used to resolve the promise. + @return A new pending promise that fulfills with the same value as the promise returned from `work` + block, or rejects with the same error after all retry attempts have been exhausted. + */ ++ (instancetype)onQueue:(dispatch_queue_t)queue + attempts:(NSInteger)count + retry:(FBLPromiseRetryWorkBlock)work NS_SWIFT_UNAVAILABLE(""); + +/** + Creates a pending promise that fulfills with the same value as the promise returned from `work` + block, which executes asynchronously, or rejects with the same error after all retry attempts have + been exhausted. On rejection, the `work` block is retried after the given delay `interval` and will + continue to retry until the number of specified attempts have been exhausted or will bail early if + the given condition is not met. + + @param count Max number of retry attempts. The `work` block will be executed once if the specified + count is less than or equal to zero. + @param interval Time to wait before the next retry attempt. + @param predicate Condition to check before the next retry attempt. The predicate block provides the + the number of remaining retry attempts and the error that the promise was rejected + with. + @param work A block that executes asynchronously on the default queue and returns a value or an + error used to resolve the promise. + @return A new pending promise that fulfills with the same value as the promise returned from `work` + block, or rejects with the same error after all retry attempts have been exhausted or if + the given condition is not met. + */ ++ (instancetype)attempts:(NSInteger)count + delay:(NSTimeInterval)interval + condition:(nullable FBLPromiseRetryPredicateBlock)predicate + retry:(FBLPromiseRetryWorkBlock)work NS_SWIFT_UNAVAILABLE(""); + +/** + Creates a pending promise that fulfills with the same value as the promise returned from `work` + block, which executes asynchronously on the given `queue`, or rejects with the same error after all + retry attempts have been exhausted. On rejection, the `work` block is retried after the given + delay `interval` and will continue to retry until the number of specified attempts have been + exhausted or will bail early if the given condition is not met. + + @param queue A queue to invoke the `work` block on. + @param count Max number of retry attempts. The `work` block will be executed once if the specified + count is less than or equal to zero. + @param interval Time to wait before the next retry attempt. + @param predicate Condition to check before the next retry attempt. The predicate block provides the + the number of remaining retry attempts and the error that the promise was rejected + with. + @param work A block that executes asynchronously on the given `queue` and returns a value or an + error used to resolve the promise. + @return A new pending promise that fulfills with the same value as the promise returned from `work` + block, or rejects with the same error after all retry attempts have been exhausted or if + the given condition is not met. + */ ++ (instancetype)onQueue:(dispatch_queue_t)queue + attempts:(NSInteger)count + delay:(NSTimeInterval)interval + condition:(nullable FBLPromiseRetryPredicateBlock)predicate + retry:(FBLPromiseRetryWorkBlock)work NS_REFINED_FOR_SWIFT; + +@end + +/** + Convenience dot-syntax wrappers for `FBLPromise+Retry` operators. + Usage: FBLPromise.retry(^id { ... }) + */ +@interface FBLPromise(DotSyntax_RetryAdditions) + ++ (FBLPromise * (^)(FBLPromiseRetryWorkBlock))retry FBL_PROMISES_DOT_SYNTAX + NS_SWIFT_UNAVAILABLE(""); ++ (FBLPromise * (^)(dispatch_queue_t, FBLPromiseRetryWorkBlock))retryOn FBL_PROMISES_DOT_SYNTAX + NS_SWIFT_UNAVAILABLE(""); ++ (FBLPromise * (^)(NSInteger, NSTimeInterval, FBLPromiseRetryPredicateBlock __nullable, + FBLPromiseRetryWorkBlock))retryAgain FBL_PROMISES_DOT_SYNTAX + NS_SWIFT_UNAVAILABLE(""); ++ (FBLPromise * (^)(dispatch_queue_t, NSInteger, NSTimeInterval, + FBLPromiseRetryPredicateBlock __nullable, + FBLPromiseRetryWorkBlock))retryAgainOn FBL_PROMISES_DOT_SYNTAX + NS_SWIFT_UNAVAILABLE(""); + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Testing.h b/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Testing.h new file mode 100644 index 0000000..8478ae2 --- /dev/null +++ b/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Testing.h @@ -0,0 +1,57 @@ +/** + Copyright 2018 Google Inc. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at: + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "FBLPromise.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + Waits for all scheduled promises blocks. + + @param timeout Maximum time to wait. + @return YES if all promises blocks have completed before the timeout and NO otherwise. + */ +FOUNDATION_EXTERN BOOL FBLWaitForPromisesWithTimeout(NSTimeInterval timeout) NS_REFINED_FOR_SWIFT; + +@interface FBLPromise(TestingAdditions) + +/** + Dispatch group for promises that is typically used to wait for all scheduled blocks. + */ +@property(class, nonatomic, readonly) dispatch_group_t dispatchGroup NS_REFINED_FOR_SWIFT; + +/** + Properties to get the current state of the promise. + */ +@property(nonatomic, readonly) BOOL isPending NS_REFINED_FOR_SWIFT; +@property(nonatomic, readonly) BOOL isFulfilled NS_REFINED_FOR_SWIFT; +@property(nonatomic, readonly) BOOL isRejected NS_REFINED_FOR_SWIFT; + +/** + Value the promise was fulfilled with. + Can be nil if the promise is still pending, was resolved with nil or after it has been rejected. + */ +@property(nonatomic, readonly, nullable) Value value NS_REFINED_FOR_SWIFT; + +/** + Error the promise was rejected with. + Can be nil if the promise is still pending or after it has been fulfilled. + */ +@property(nonatomic, readonly, nullable) NSError *error NS_REFINED_FOR_SWIFT; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Then.h b/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Then.h new file mode 100644 index 0000000..32027e6 --- /dev/null +++ b/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Then.h @@ -0,0 +1,63 @@ +/** + Copyright 2018 Google Inc. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at: + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "FBLPromise.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FBLPromise(ThenAdditions) + +typedef id __nullable (^FBLPromiseThenWorkBlock)(Value __nullable value) NS_SWIFT_UNAVAILABLE(""); + +/** + Creates a pending promise which eventually gets resolved with resolution returned from `work` + block: either value, error or another promise. The `work` block is executed asynchronously only + when the receiver is fulfilled. If receiver is rejected, the returned promise is also rejected with + the same error. + + @param work A block to handle the value that receiver was fulfilled with. + @return A new pending promise to be resolved with resolution returned from the `work` block. + */ +- (FBLPromise *)then:(FBLPromiseThenWorkBlock)work NS_SWIFT_UNAVAILABLE(""); + +/** + Creates a pending promise which eventually gets resolved with resolution returned from `work` + block: either value, error or another promise. The `work` block is executed asynchronously when the + receiver is fulfilled. If receiver is rejected, the returned promise is also rejected with the same + error. + + @param queue A queue to invoke the `work` block on. + @param work A block to handle the value that receiver was fulfilled with. + @return A new pending promise to be resolved with resolution returned from the `work` block. + */ +- (FBLPromise *)onQueue:(dispatch_queue_t)queue + then:(FBLPromiseThenWorkBlock)work NS_REFINED_FOR_SWIFT; + +@end + +/** + Convenience dot-syntax wrappers for `FBLPromise` `then` operators. + Usage: promise.then(^id(id value) { ... }) + */ +@interface FBLPromise(DotSyntax_ThenAdditions) + +- (FBLPromise* (^)(FBLPromiseThenWorkBlock))then FBL_PROMISES_DOT_SYNTAX NS_SWIFT_UNAVAILABLE(""); +- (FBLPromise* (^)(dispatch_queue_t, FBLPromiseThenWorkBlock))thenOn FBL_PROMISES_DOT_SYNTAX + NS_SWIFT_UNAVAILABLE(""); + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Timeout.h b/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Timeout.h new file mode 100644 index 0000000..184ba16 --- /dev/null +++ b/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Timeout.h @@ -0,0 +1,57 @@ +/** + Copyright 2018 Google Inc. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at: + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "FBLPromise.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FBLPromise(TimeoutAdditions) + +/** + Waits for a promise with the specified `timeout`. + + @param interval Time to wait in seconds. + @return A new pending promise that gets either resolved with same resolution as the receiver or + rejected with `FBLPromiseErrorCodeTimedOut` error code in `FBLPromiseErrorDomain`. + */ +- (FBLPromise *)timeout:(NSTimeInterval)interval NS_SWIFT_UNAVAILABLE(""); + +/** + Waits for a promise with the specified `timeout`. + + @param queue A queue to dispatch on. + @param interval Time to wait in seconds. + @return A new pending promise that gets either resolved with same resolution as the receiver or + rejected with `FBLPromiseErrorCodeTimedOut` error code in `FBLPromiseErrorDomain`. + */ +- (FBLPromise *)onQueue:(dispatch_queue_t)queue + timeout:(NSTimeInterval)interval NS_REFINED_FOR_SWIFT; + +@end + +/** + Convenience dot-syntax wrappers for `FBLPromise` `timeout` operators. + Usage: promise.timeout(...) + */ +@interface FBLPromise(DotSyntax_TimeoutAdditions) + +- (FBLPromise* (^)(NSTimeInterval))timeout FBL_PROMISES_DOT_SYNTAX NS_SWIFT_UNAVAILABLE(""); +- (FBLPromise* (^)(dispatch_queue_t, NSTimeInterval))timeoutOn FBL_PROMISES_DOT_SYNTAX + NS_SWIFT_UNAVAILABLE(""); + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Validate.h b/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Validate.h new file mode 100644 index 0000000..9dfa2f1 --- /dev/null +++ b/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Validate.h @@ -0,0 +1,60 @@ +/** + Copyright 2018 Google Inc. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at: + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "FBLPromise.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FBLPromise(ValidateAdditions) + +typedef BOOL (^FBLPromiseValidateWorkBlock)(Value __nullable value) NS_SWIFT_UNAVAILABLE(""); + +/** + Validates a fulfilled value or rejects the value if it can not be validated. + + @param predicate An expression to validate. + @return A new pending promise that gets either resolved with same resolution as the receiver or + rejected with `FBLPromiseErrorCodeValidationFailure` error code in `FBLPromiseErrorDomain`. + */ +- (FBLPromise *)validate:(FBLPromiseValidateWorkBlock)predicate NS_SWIFT_UNAVAILABLE(""); + +/** + Validates a fulfilled value or rejects the value if it can not be validated. + + @param queue A queue to dispatch on. + @param predicate An expression to validate. + @return A new pending promise that gets either resolved with same resolution as the receiver or + rejected with `FBLPromiseErrorCodeValidationFailure` error code in `FBLPromiseErrorDomain`. + */ +- (FBLPromise *)onQueue:(dispatch_queue_t)queue + validate:(FBLPromiseValidateWorkBlock)predicate NS_REFINED_FOR_SWIFT; + +@end + +/** + Convenience dot-syntax wrappers for `FBLPromise` `validate` operators. + Usage: promise.validate(^BOOL(id value) { ... }) + */ +@interface FBLPromise(DotSyntax_ValidateAdditions) + +- (FBLPromise * (^)(FBLPromiseValidateWorkBlock))validate FBL_PROMISES_DOT_SYNTAX + NS_SWIFT_UNAVAILABLE(""); +- (FBLPromise * (^)(dispatch_queue_t, FBLPromiseValidateWorkBlock))validateOn + FBL_PROMISES_DOT_SYNTAX NS_SWIFT_UNAVAILABLE(""); + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Wrap.h b/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Wrap.h new file mode 100644 index 0000000..664e1bb --- /dev/null +++ b/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Wrap.h @@ -0,0 +1,316 @@ +/** + Copyright 2018 Google Inc. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at: + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "FBLPromise.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + Different types of completion handlers available to be wrapped with promise. + */ +typedef void (^FBLPromiseCompletion)(void) NS_SWIFT_UNAVAILABLE(""); +typedef void (^FBLPromiseObjectCompletion)(id __nullable) NS_SWIFT_UNAVAILABLE(""); +typedef void (^FBLPromiseErrorCompletion)(NSError* __nullable) NS_SWIFT_UNAVAILABLE(""); +typedef void (^FBLPromiseObjectOrErrorCompletion)(id __nullable, NSError* __nullable) + NS_SWIFT_UNAVAILABLE(""); +typedef void (^FBLPromiseErrorOrObjectCompletion)(NSError* __nullable, id __nullable) + NS_SWIFT_UNAVAILABLE(""); +typedef void (^FBLPromise2ObjectsOrErrorCompletion)(id __nullable, id __nullable, + NSError* __nullable) NS_SWIFT_UNAVAILABLE(""); +typedef void (^FBLPromiseBoolCompletion)(BOOL) NS_SWIFT_UNAVAILABLE(""); +typedef void (^FBLPromiseBoolOrErrorCompletion)(BOOL, NSError* __nullable) NS_SWIFT_UNAVAILABLE(""); +typedef void (^FBLPromiseIntegerCompletion)(NSInteger) NS_SWIFT_UNAVAILABLE(""); +typedef void (^FBLPromiseIntegerOrErrorCompletion)(NSInteger, NSError* __nullable) + NS_SWIFT_UNAVAILABLE(""); +typedef void (^FBLPromiseDoubleCompletion)(double) NS_SWIFT_UNAVAILABLE(""); +typedef void (^FBLPromiseDoubleOrErrorCompletion)(double, NSError* __nullable) + NS_SWIFT_UNAVAILABLE(""); + +/** + Provides an easy way to convert methods that use common callback patterns into promises. + */ +@interface FBLPromise(WrapAdditions) + +/** + @param work A block to perform any operations needed to resolve the promise. + @returns A promise that resolves with `nil` when completion handler is invoked. + */ ++ (instancetype)wrapCompletion:(void (^)(FBLPromiseCompletion handler))work + NS_SWIFT_UNAVAILABLE(""); + +/** + @param queue A queue to invoke the `work` block on. + @param work A block to perform any operations needed to resolve the promise. + @returns A promise that resolves with `nil` when completion handler is invoked. + */ ++ (instancetype)onQueue:(dispatch_queue_t)queue + wrapCompletion:(void (^)(FBLPromiseCompletion handler))work NS_SWIFT_UNAVAILABLE(""); + +/** + @param work A block to perform any operations needed to resolve the promise. + @returns A promise that resolves with an object provided by completion handler. + */ ++ (instancetype)wrapObjectCompletion:(void (^)(FBLPromiseObjectCompletion handler))work + NS_SWIFT_UNAVAILABLE(""); + +/** + @param queue A queue to invoke the `work` block on. + @param work A block to perform any operations needed to resolve the promise. + @returns A promise that resolves with an object provided by completion handler. + */ ++ (instancetype)onQueue:(dispatch_queue_t)queue + wrapObjectCompletion:(void (^)(FBLPromiseObjectCompletion handler))work + NS_SWIFT_UNAVAILABLE(""); + +/** + @param work A block to perform any operations needed to resolve the promise. + @returns A promise that resolves with an error provided by completion handler. + If error is `nil`, fulfills with `nil`, otherwise rejects with the error. + */ ++ (instancetype)wrapErrorCompletion:(void (^)(FBLPromiseErrorCompletion handler))work + NS_SWIFT_UNAVAILABLE(""); + +/** + @param queue A queue to invoke the `work` block on. + @param work A block to perform any operations needed to resolve the promise. + @returns A promise that resolves with an error provided by completion handler. + If error is `nil`, fulfills with `nil`, otherwise rejects with the error. + */ ++ (instancetype)onQueue:(dispatch_queue_t)queue + wrapErrorCompletion:(void (^)(FBLPromiseErrorCompletion handler))work NS_SWIFT_UNAVAILABLE(""); + +/** + @param work A block to perform any operations needed to resolve the promise. + @returns A promise that resolves with an object provided by completion handler if error is `nil`. + Otherwise, rejects with the error. + */ ++ (instancetype)wrapObjectOrErrorCompletion: + (void (^)(FBLPromiseObjectOrErrorCompletion handler))work NS_SWIFT_UNAVAILABLE(""); + +/** + @param queue A queue to invoke the `work` block on. + @param work A block to perform any operations needed to resolve the promise. + @returns A promise that resolves with an object provided by completion handler if error is `nil`. + Otherwise, rejects with the error. + */ ++ (instancetype)onQueue:(dispatch_queue_t)queue + wrapObjectOrErrorCompletion:(void (^)(FBLPromiseObjectOrErrorCompletion handler))work + NS_SWIFT_UNAVAILABLE(""); + +/** + @param work A block to perform any operations needed to resolve the promise. + @returns A promise that resolves with an error or object provided by completion handler. If error + is not `nil`, rejects with the error. + */ ++ (instancetype)wrapErrorOrObjectCompletion: + (void (^)(FBLPromiseErrorOrObjectCompletion handler))work NS_SWIFT_UNAVAILABLE(""); + +/** + @param queue A queue to invoke the `work` block on. + @param work A block to perform any operations needed to resolve the promise. + @returns A promise that resolves with an error or object provided by completion handler. If error + is not `nil`, rejects with the error. + */ ++ (instancetype)onQueue:(dispatch_queue_t)queue + wrapErrorOrObjectCompletion:(void (^)(FBLPromiseErrorOrObjectCompletion handler))work + NS_SWIFT_UNAVAILABLE(""); + +/** + @param work A block to perform any operations needed to resolve the promise. + @returns A promise that resolves with an array of objects provided by completion handler in order + if error is `nil`. Otherwise, rejects with the error. + */ ++ (FBLPromise*)wrap2ObjectsOrErrorCompletion: + (void (^)(FBLPromise2ObjectsOrErrorCompletion handler))work NS_SWIFT_UNAVAILABLE(""); + +/** + @param queue A queue to invoke the `work` block on. + @param work A block to perform any operations needed to resolve the promise. + @returns A promise that resolves with an array of objects provided by completion handler in order + if error is `nil`. Otherwise, rejects with the error. + */ ++ (FBLPromise*)onQueue:(dispatch_queue_t)queue + wrap2ObjectsOrErrorCompletion:(void (^)(FBLPromise2ObjectsOrErrorCompletion handler))work + NS_SWIFT_UNAVAILABLE(""); + +/** + @param work A block to perform any operations needed to resolve the promise. + @returns A promise that resolves with an `NSNumber` wrapping YES/NO. + */ ++ (FBLPromise*)wrapBoolCompletion:(void (^)(FBLPromiseBoolCompletion handler))work + NS_SWIFT_UNAVAILABLE(""); + +/** + @param queue A queue to invoke the `work` block on. + @param work A block to perform any operations needed to resolve the promise. + @returns A promise that resolves with an `NSNumber` wrapping YES/NO. + */ ++ (FBLPromise*)onQueue:(dispatch_queue_t)queue + wrapBoolCompletion:(void (^)(FBLPromiseBoolCompletion handler))work + NS_SWIFT_UNAVAILABLE(""); + +/** + @param work A block to perform any operations needed to resolve the promise. + @returns A promise that resolves with an `NSNumber` wrapping YES/NO when error is `nil`. + Otherwise rejects with the error. + */ ++ (FBLPromise*)wrapBoolOrErrorCompletion: + (void (^)(FBLPromiseBoolOrErrorCompletion handler))work NS_SWIFT_UNAVAILABLE(""); + +/** + @param queue A queue to invoke the `work` block on. + @param work A block to perform any operations needed to resolve the promise. + @returns A promise that resolves with an `NSNumber` wrapping YES/NO when error is `nil`. + Otherwise rejects with the error. + */ ++ (FBLPromise*)onQueue:(dispatch_queue_t)queue + wrapBoolOrErrorCompletion:(void (^)(FBLPromiseBoolOrErrorCompletion handler))work + NS_SWIFT_UNAVAILABLE(""); + +/** + @param work A block to perform any operations needed to resolve the promise. + @returns A promise that resolves with an `NSNumber` wrapping an integer. + */ ++ (FBLPromise*)wrapIntegerCompletion:(void (^)(FBLPromiseIntegerCompletion handler))work + NS_SWIFT_UNAVAILABLE(""); + +/** + @param queue A queue to invoke the `work` block on. + @param work A block to perform any operations needed to resolve the promise. + @returns A promise that resolves with an `NSNumber` wrapping an integer. + */ ++ (FBLPromise*)onQueue:(dispatch_queue_t)queue + wrapIntegerCompletion:(void (^)(FBLPromiseIntegerCompletion handler))work + NS_SWIFT_UNAVAILABLE(""); + +/** + @param work A block to perform any operations needed to resolve the promise. + @returns A promise that resolves with an `NSNumber` wrapping an integer when error is `nil`. + Otherwise rejects with the error. + */ ++ (FBLPromise*)wrapIntegerOrErrorCompletion: + (void (^)(FBLPromiseIntegerOrErrorCompletion handler))work NS_SWIFT_UNAVAILABLE(""); + +/** + @param queue A queue to invoke the `work` block on. + @param work A block to perform any operations needed to resolve the promise. + @returns A promise that resolves with an `NSNumber` wrapping an integer when error is `nil`. + Otherwise rejects with the error. + */ ++ (FBLPromise*)onQueue:(dispatch_queue_t)queue + wrapIntegerOrErrorCompletion:(void (^)(FBLPromiseIntegerOrErrorCompletion handler))work + NS_SWIFT_UNAVAILABLE(""); + +/** + @param work A block to perform any operations needed to resolve the promise. + @returns A promise that resolves with an `NSNumber` wrapping a double. + */ ++ (FBLPromise*)wrapDoubleCompletion:(void (^)(FBLPromiseDoubleCompletion handler))work + NS_SWIFT_UNAVAILABLE(""); + +/** + @param queue A queue to invoke the `work` block on. + @param work A block to perform any operations needed to resolve the promise. + @returns A promise that resolves with an `NSNumber` wrapping a double. + */ ++ (FBLPromise*)onQueue:(dispatch_queue_t)queue + wrapDoubleCompletion:(void (^)(FBLPromiseDoubleCompletion handler))work + NS_SWIFT_UNAVAILABLE(""); + +/** + @param work A block to perform any operations needed to resolve the promise. + @returns A promise that resolves with an `NSNumber` wrapping a double when error is `nil`. + Otherwise rejects with the error. + */ ++ (FBLPromise*)wrapDoubleOrErrorCompletion: + (void (^)(FBLPromiseDoubleOrErrorCompletion handler))work NS_SWIFT_UNAVAILABLE(""); + +/** + @param queue A queue to invoke the `work` block on. + @param work A block to perform any operations needed to resolve the promise. + @returns A promise that resolves with an `NSNumber` wrapping a double when error is `nil`. + Otherwise rejects with the error. + */ ++ (FBLPromise*)onQueue:(dispatch_queue_t)queue + wrapDoubleOrErrorCompletion:(void (^)(FBLPromiseDoubleOrErrorCompletion handler))work + NS_SWIFT_UNAVAILABLE(""); + +@end + +/** + Convenience dot-syntax wrappers for `FBLPromise` `wrap` operators. + Usage: FBLPromise.wrapCompletion(^(FBLPromiseCompletion handler) {...}) + */ +@interface FBLPromise(DotSyntax_WrapAdditions) + ++ (FBLPromise* (^)(void (^)(FBLPromiseCompletion)))wrapCompletion FBL_PROMISES_DOT_SYNTAX + NS_SWIFT_UNAVAILABLE(""); ++ (FBLPromise* (^)(dispatch_queue_t, void (^)(FBLPromiseCompletion)))wrapCompletionOn + FBL_PROMISES_DOT_SYNTAX NS_SWIFT_UNAVAILABLE(""); ++ (FBLPromise* (^)(void (^)(FBLPromiseObjectCompletion)))wrapObjectCompletion + FBL_PROMISES_DOT_SYNTAX NS_SWIFT_UNAVAILABLE(""); ++ (FBLPromise* (^)(dispatch_queue_t, void (^)(FBLPromiseObjectCompletion)))wrapObjectCompletionOn + FBL_PROMISES_DOT_SYNTAX NS_SWIFT_UNAVAILABLE(""); ++ (FBLPromise* (^)(void (^)(FBLPromiseErrorCompletion)))wrapErrorCompletion FBL_PROMISES_DOT_SYNTAX + NS_SWIFT_UNAVAILABLE(""); ++ (FBLPromise* (^)(dispatch_queue_t, void (^)(FBLPromiseErrorCompletion)))wrapErrorCompletionOn + FBL_PROMISES_DOT_SYNTAX NS_SWIFT_UNAVAILABLE(""); ++ (FBLPromise* (^)(void (^)(FBLPromiseObjectOrErrorCompletion)))wrapObjectOrErrorCompletion + FBL_PROMISES_DOT_SYNTAX NS_SWIFT_UNAVAILABLE(""); ++ (FBLPromise* (^)(dispatch_queue_t, + void (^)(FBLPromiseObjectOrErrorCompletion)))wrapObjectOrErrorCompletionOn + FBL_PROMISES_DOT_SYNTAX NS_SWIFT_UNAVAILABLE(""); ++ (FBLPromise* (^)(void (^)(FBLPromiseErrorOrObjectCompletion)))wrapErrorOrObjectCompletion + FBL_PROMISES_DOT_SYNTAX NS_SWIFT_UNAVAILABLE(""); ++ (FBLPromise* (^)(dispatch_queue_t, + void (^)(FBLPromiseErrorOrObjectCompletion)))wrapErrorOrObjectCompletionOn + FBL_PROMISES_DOT_SYNTAX NS_SWIFT_UNAVAILABLE(""); ++ (FBLPromise* (^)(void (^)(FBLPromise2ObjectsOrErrorCompletion))) + wrap2ObjectsOrErrorCompletion FBL_PROMISES_DOT_SYNTAX NS_SWIFT_UNAVAILABLE(""); ++ (FBLPromise* (^)(dispatch_queue_t, void (^)(FBLPromise2ObjectsOrErrorCompletion))) + wrap2ObjectsOrErrorCompletionOn FBL_PROMISES_DOT_SYNTAX NS_SWIFT_UNAVAILABLE(""); ++ (FBLPromise* (^)(void (^)(FBLPromiseBoolCompletion)))wrapBoolCompletion + FBL_PROMISES_DOT_SYNTAX NS_SWIFT_UNAVAILABLE(""); ++ (FBLPromise* (^)(dispatch_queue_t, + void (^)(FBLPromiseBoolCompletion)))wrapBoolCompletionOn + FBL_PROMISES_DOT_SYNTAX NS_SWIFT_UNAVAILABLE(""); ++ (FBLPromise* (^)(void (^)(FBLPromiseBoolOrErrorCompletion)))wrapBoolOrErrorCompletion + FBL_PROMISES_DOT_SYNTAX NS_SWIFT_UNAVAILABLE(""); ++ (FBLPromise* (^)(dispatch_queue_t, + void (^)(FBLPromiseBoolOrErrorCompletion)))wrapBoolOrErrorCompletionOn + FBL_PROMISES_DOT_SYNTAX NS_SWIFT_UNAVAILABLE(""); ++ (FBLPromise* (^)(void (^)(FBLPromiseIntegerCompletion)))wrapIntegerCompletion + FBL_PROMISES_DOT_SYNTAX NS_SWIFT_UNAVAILABLE(""); ++ (FBLPromise* (^)(dispatch_queue_t, + void (^)(FBLPromiseIntegerCompletion)))wrapIntegerCompletionOn + FBL_PROMISES_DOT_SYNTAX NS_SWIFT_UNAVAILABLE(""); ++ (FBLPromise* (^)(void (^)(FBLPromiseIntegerOrErrorCompletion))) + wrapIntegerOrErrorCompletion FBL_PROMISES_DOT_SYNTAX NS_SWIFT_UNAVAILABLE(""); ++ (FBLPromise* (^)(dispatch_queue_t, void (^)(FBLPromiseIntegerOrErrorCompletion))) + wrapIntegerOrErrorCompletionOn FBL_PROMISES_DOT_SYNTAX NS_SWIFT_UNAVAILABLE(""); ++ (FBLPromise* (^)(void (^)(FBLPromiseDoubleCompletion)))wrapDoubleCompletion + FBL_PROMISES_DOT_SYNTAX NS_SWIFT_UNAVAILABLE(""); ++ (FBLPromise* (^)(dispatch_queue_t, + void (^)(FBLPromiseDoubleCompletion)))wrapDoubleCompletionOn + FBL_PROMISES_DOT_SYNTAX NS_SWIFT_UNAVAILABLE(""); ++ (FBLPromise* (^)(void (^)(FBLPromiseDoubleOrErrorCompletion))) + wrapDoubleOrErrorCompletion FBL_PROMISES_DOT_SYNTAX NS_SWIFT_UNAVAILABLE(""); ++ (FBLPromise* (^)(dispatch_queue_t, void (^)(FBLPromiseDoubleOrErrorCompletion))) + wrapDoubleOrErrorCompletionOn FBL_PROMISES_DOT_SYNTAX NS_SWIFT_UNAVAILABLE(""); + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise.h b/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise.h new file mode 100644 index 0000000..98c813b --- /dev/null +++ b/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise.h @@ -0,0 +1,93 @@ +/** + Copyright 2018 Google Inc. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at: + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "FBLPromiseError.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + Promises synchronization construct in Objective-C. + */ +@interface FBLPromise<__covariant Value> : NSObject + +/** + Default dispatch queue used for `FBLPromise`, which is `main` if a queue is not specified. + */ +@property(class) dispatch_queue_t defaultDispatchQueue NS_REFINED_FOR_SWIFT; + +/** + Creates a pending promise. + */ ++ (instancetype)pendingPromise NS_REFINED_FOR_SWIFT; + +/** + Creates a resolved promise. + + @param resolution An object to resolve the promise with: either a value or an error. + @return A new resolved promise. + */ ++ (instancetype)resolvedWith:(nullable id)resolution NS_REFINED_FOR_SWIFT; + +/** + Synchronously fulfills the promise with a value. + + @param value An arbitrary value to fulfill the promise with, including `nil`. + */ +- (void)fulfill:(nullable Value)value NS_REFINED_FOR_SWIFT; + +/** + Synchronously rejects the promise with an error. + + @param error An error to reject the promise with. + */ +- (void)reject:(NSError *)error NS_REFINED_FOR_SWIFT; + ++ (instancetype)new NS_UNAVAILABLE; +- (instancetype)init NS_UNAVAILABLE; +@end + +@interface FBLPromise() + +/** + Adds an object to the set of pending objects to keep strongly while the promise is pending. + Used by the Swift wrappers to keep them alive until the underlying ObjC promise is resolved. + + @param object An object to add. + */ +- (void)addPendingObject:(id)object NS_REFINED_FOR_SWIFT; + +@end + +#ifdef FBL_PROMISES_DOT_SYNTAX_IS_DEPRECATED +#define FBL_PROMISES_DOT_SYNTAX __attribute__((deprecated)) +#else +#define FBL_PROMISES_DOT_SYNTAX +#endif + +@interface FBLPromise(DotSyntaxAdditions) + +/** + Convenience dot-syntax wrappers for FBLPromise. + Usage: FBLPromise.pending() + FBLPromise.resolved(value) + + */ ++ (FBLPromise * (^)(void))pending FBL_PROMISES_DOT_SYNTAX NS_SWIFT_UNAVAILABLE(""); ++ (FBLPromise * (^)(id __nullable))resolved FBL_PROMISES_DOT_SYNTAX NS_SWIFT_UNAVAILABLE(""); + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromiseError.h b/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromiseError.h new file mode 100644 index 0000000..d37af53 --- /dev/null +++ b/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromiseError.h @@ -0,0 +1,43 @@ +/** + Copyright 2018 Google Inc. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at: + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +FOUNDATION_EXTERN NSErrorDomain const FBLPromiseErrorDomain NS_REFINED_FOR_SWIFT; + +/** + Possible error codes in `FBLPromiseErrorDomain`. + */ +typedef NS_ENUM(NSInteger, FBLPromiseErrorCode) { + /** Promise failed to resolve in time. */ + FBLPromiseErrorCodeTimedOut = 1, + /** Validation predicate returned false. */ + FBLPromiseErrorCodeValidationFailure = 2, +} NS_REFINED_FOR_SWIFT; + +NS_INLINE BOOL FBLPromiseErrorIsTimedOut(NSError *error) NS_SWIFT_UNAVAILABLE("") { + return error.domain == FBLPromiseErrorDomain && + error.code == FBLPromiseErrorCodeTimedOut; +} + +NS_INLINE BOOL FBLPromiseErrorIsValidationFailure(NSError *error) NS_SWIFT_UNAVAILABLE("") { + return error.domain == FBLPromiseErrorDomain && + error.code == FBLPromiseErrorCodeValidationFailure; +} + +NS_ASSUME_NONNULL_END diff --git a/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromisePrivate.h b/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromisePrivate.h new file mode 100644 index 0000000..7a132f2 --- /dev/null +++ b/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromisePrivate.h @@ -0,0 +1,66 @@ +/** + Copyright 2018 Google Inc. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at: + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "FBLPromise+Testing.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + Miscellaneous low-level private interfaces available to extend standard FBLPromise functionality. + */ +@interface FBLPromise() + +typedef void (^FBLPromiseOnFulfillBlock)(Value __nullable value) NS_SWIFT_UNAVAILABLE(""); +typedef void (^FBLPromiseOnRejectBlock)(NSError *error) NS_SWIFT_UNAVAILABLE(""); +typedef id __nullable (^__nullable FBLPromiseChainedFulfillBlock)(Value __nullable value) + NS_SWIFT_UNAVAILABLE(""); +typedef id __nullable (^__nullable FBLPromiseChainedRejectBlock)(NSError *error) + NS_SWIFT_UNAVAILABLE(""); + +/** + Creates a pending promise. + */ +- (instancetype)initPending NS_SWIFT_UNAVAILABLE(""); + +/** + Creates a resolved promise. + + @param resolution An object to resolve the promise with: either a value or an error. + @return A new resolved promise. + */ +- (instancetype)initWithResolution:(nullable id)resolution NS_SWIFT_UNAVAILABLE(""); + +/** + Invokes `fulfill` and `reject` blocks on `queue` when the receiver gets either fulfilled or + rejected respectively. + */ +- (void)observeOnQueue:(dispatch_queue_t)queue + fulfill:(FBLPromiseOnFulfillBlock)onFulfill + reject:(FBLPromiseOnRejectBlock)onReject NS_SWIFT_UNAVAILABLE(""); + +/** + Returns a new promise which gets resolved with the return value of `chainedFulfill` or + `chainedReject` blocks respectively. The blocks are invoked when the receiver gets either + fulfilled or rejected. If `nil` is passed to either block arg, the returned promise is resolved + with the same resolution as the receiver. + */ +- (FBLPromise *)chainOnQueue:(dispatch_queue_t)queue + chainedFulfill:(FBLPromiseChainedFulfillBlock)chainedFulfill + chainedReject:(FBLPromiseChainedRejectBlock)chainedReject NS_SWIFT_UNAVAILABLE(""); + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromises.h b/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromises.h new file mode 100644 index 0000000..2d90bad --- /dev/null +++ b/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromises.h @@ -0,0 +1,32 @@ +/** + Copyright 2018 Google Inc. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at: + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "FBLPromise+All.h" +#import "FBLPromise+Always.h" +#import "FBLPromise+Any.h" +#import "FBLPromise+Async.h" +#import "FBLPromise+Await.h" +#import "FBLPromise+Catch.h" +#import "FBLPromise+Delay.h" +#import "FBLPromise+Do.h" +#import "FBLPromise+Race.h" +#import "FBLPromise+Recover.h" +#import "FBLPromise+Reduce.h" +#import "FBLPromise+Retry.h" +#import "FBLPromise+Then.h" +#import "FBLPromise+Timeout.h" +#import "FBLPromise+Validate.h" +#import "FBLPromise+Wrap.h" diff --git a/Pods/PromisesSwift/LICENSE b/Pods/PromisesSwift/LICENSE new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/Pods/PromisesSwift/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/Pods/PromisesSwift/README.md b/Pods/PromisesSwift/README.md new file mode 100644 index 0000000..e0e65b7 --- /dev/null +++ b/Pods/PromisesSwift/README.md @@ -0,0 +1,60 @@ +[![Apache +License](https://img.shields.io/github/license/google/promises.svg)](LICENSE) +[![Travis](https://api.travis-ci.org/google/promises.svg?branch=master)](https://travis-ci.org/google/promises) +[![Gitter Chat](https://badges.gitter.im/google/promises.svg)](https://gitter.im/google/promises) + +![Platforms](https://img.shields.io/badge/platforms-macOS%20%7C%20iOS%20%7C%20tvOS%20%7C%20watchOS-blue.svg?longCache=true&style=flat) +![Languages](https://img.shields.io/badge/languages-Swift%20%7C%20ObjC-orange.svg?longCache=true&style=flat) +![Package Managers](https://img.shields.io/badge/supports-Bazel%20%7C%20SwiftPM%20%7C%20CocoaPods%20%7C%20Carthage-yellow.svg?longCache=true&style=flat) + +# Promises + +Promises is a modern framework that provides a synchronization construct for +Objective-C and Swift to facilitate writing asynchronous code. + +* [Introduction](g3doc/index.md) + * [The problem with async + code](g3doc/index.md#the-problem-with-async-code) + * [Promises to the rescue](g3doc/index.md#promises-to-the-rescue) + * [What is a promise?](g3doc/index.md#what-is-a-promise) +* [Framework](g3doc/index.md#framework) + * [Features](g3doc/index.md#features) + * [Benchmark](g3doc/index.md#benchmark) +* [Getting started](g3doc/index.md#getting-started) + * [Add dependency](g3doc/index.md#add-dependency) + * [Import](g3doc/index.md#import) + * [Adopt](g3doc/index.md#adopt) +* [Basics](g3doc/index.md#basics) + * [Creating promises](g3doc/index.md#creating-promises) + * [Async](g3doc/index.md#async) + * [Do](g3doc/index.md#do) + * [Pending](g3doc/index.md#pending) + * [Resolved](g3doc/index.md#create-a-resolved-promise) + * [Observing fulfillment](g3doc/index.md#observing-fulfillment) + * [Then](g3doc/index.md#then) + * [Observing rejection](g3doc/index.md#observing-rejection) + * [Catch](g3doc/index.md#catch) +* [Extensions](g3doc/index.md#extensions) + * [All](g3doc/index.md#all) + * [Always](g3doc/index.md#always) + * [Any](g3doc/index.md#any) + * [AwaitPromise](g3doc/index.md#awaitpromise) + * [Delay](g3doc/index.md#delay) + * [Race](g3doc/index.md#race) + * [Recover](g3doc/index.md#recover) + * [Reduce](g3doc/index.md#reduce) + * [Retry](g3doc/index.md#retry) + * [Timeout](g3doc/index.md#timeout) + * [Validate](g3doc/index.md#validate) + * [Wrap](g3doc/index.md#wrap) +* [Advanced topics](g3doc/index.md#advanced-topics) + * [Default dispatch queue](g3doc/index.md#default-dispatch-queue) + * [Ownership and retain + cycles](g3doc/index.md#ownership-and-retain-cycles) + * [Testing](g3doc/index.md#testing) + * [Objective-C <-> Swift + interoperability](g3doc/index.md#objective-c---swift-interoperability) + * [Dot-syntax in Objective-C](g3doc/index.md#dot-syntax-in-objective-c) +* [Anti-patterns](g3doc/index.md#anti-patterns) + * [Broken chain](g3doc/index.md#broken-chain) + * [Nested promises](g3doc/index.md#nested-promises) diff --git a/Pods/PromisesSwift/Sources/Promises/Promise+All.swift b/Pods/PromisesSwift/Sources/Promises/Promise+All.swift new file mode 100644 index 0000000..e775382 --- /dev/null +++ b/Pods/PromisesSwift/Sources/Promises/Promise+All.swift @@ -0,0 +1,182 @@ +// Copyright 2018 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at: +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Dispatch + +/// Waits until all of the promises have been fulfilled. +/// If one of the promises is rejected, then the returned promise is rejected with the same error. +/// If any other arbitrary value or `Error` appears in the array instead of `Promise`, +/// it's implicitly considered a pre-fulfilled or pre-rejected `Promise` correspondingly. +/// - parameters: +/// - queue: A queue to dispatch on. +/// - promises: Promises to wait for. +/// - returns: Promise of an array containing the values of input promises in the same order. +public func all( + on queue: DispatchQueue = .promises, + _ promises: Promise... +) -> Promise<[Value]> { + return all(on: queue, promises) +} + +/// Waits until all of the promises have been fulfilled. +/// If one of the promises is rejected, then the returned promise is rejected with same error. +/// If any other arbitrary value or `Error` appears in the array instead of `Promise`, +/// it's implicitly considered a pre-fulfilled or pre-rejected `Promise` correspondingly. +/// - parameters: +/// - queue: A queue to dispatch on. +/// - promises: Promises to wait for. +/// - returns: Promise of an array containing the values of input promises in the same order. +public func all( + on queue: DispatchQueue = .promises, + _ promises: Container +) -> Promise<[Value]> where Container.Element == Promise { + let promises = promises.map { $0.objCPromise } + let promise = Promise<[Value]>( + Promise<[Value]>.ObjCPromise.__onQueue(queue, all: promises) + ) + // Keep Swift wrapper alive for chained promises until `ObjCPromise` counterpart is resolved. + promises.forEach { + $0.__addPendingObject(promise) + } + return promise +} + +/// Waits until all of the promises have been fulfilled. +/// If one of the promises is rejected, then the returned promise is rejected with same error. +/// If any other arbitrary value or `Error` appears in the array instead of `Promise`, +/// it's implicitly considered a pre-fulfilled or pre-rejected `Promise` correspondingly. +/// - parameters: +/// - queue: A queue to dispatch on. +/// - promiseA: Promise of type `A`. +/// - promiseB: Promise of type `B`. +/// - returns: Promise of a tuple containing the values of input promises in the same order. +public func all( + on queue: DispatchQueue = .promises, + _ promiseA: Promise, + _ promiseB: Promise +) -> Promise<(A, B)> { + let promises = [ + promiseA.objCPromise, + promiseB.objCPromise + ] + let promise = Promise<(A, B)>( + Promise<(A, B)>.ObjCPromise.__onQueue( + queue, + all: promises + ).__onQueue(queue, then: { objCValues in + guard let values = objCValues as [AnyObject]?, + let valueA = Promise.asValue(values[0]), + let valueB = Promise.asValue(values[1]) + else { + preconditionFailure("Cannot convert \(type(of: objCValues)) to \((A, B).self)") + } + return (valueA, valueB) + }) + ) + // Keep Swift wrapper alive for chained promises until `ObjCPromise` counterpart is resolved. + promises.forEach { + $0.__addPendingObject(promise) + } + return promise +} + +/// Waits until all of the promises have been fulfilled. +/// If one of the promises is rejected, then the returned promise is rejected with same error. +/// If any other arbitrary value or `Error` appears in the array instead of `Promise`, +/// it's implicitly considered a pre-fulfilled or pre-rejected `Promise` correspondingly. +/// - parameters: +/// - queue: A queue to dispatch on. +/// - promiseA: Promise of type `A`. +/// - promiseB: Promise of type `B`. +/// - promiseC: Promise of type `C`. +/// - returns: Promise of a tuple containing the values of input promises in the same order. +public func all( + on queue: DispatchQueue = .promises, + _ promiseA: Promise, + _ promiseB: Promise, + _ promiseC: Promise +) -> Promise<(A, B, C)> { + let promises = [ + promiseA.objCPromise, + promiseB.objCPromise, + promiseC.objCPromise + ] + let promise = Promise<(A, B, C)>( + Promise<(A, B, C)>.ObjCPromise.__onQueue( + queue, + all: promises + ).__onQueue(queue, then: { objCValues in + guard let values = objCValues as [AnyObject]?, + let valueA = Promise.asValue(values[0]), + let valueB = Promise.asValue(values[1]), + let valueC = Promise.asValue(values[2]) + else { + preconditionFailure("Cannot convert \(type(of: objCValues)) to \((A, B, C).self)") + } + return (valueA, valueB, valueC) + }) + ) + // Keep Swift wrapper alive for chained promises until `ObjCPromise` counterpart is resolved. + promises.forEach { + $0.__addPendingObject(promise) + } + return promise +} + +/// Waits until all of the promises have been fulfilled. +/// If one of the promises is rejected, then the returned promise is rejected with same error. +/// If any other arbitrary value or `Error` appears in the array instead of `Promise`, +/// it's implicitly considered a pre-fulfilled or pre-rejected `Promise` correspondingly. +/// - parameters: +/// - queue: A queue to dispatch on. +/// - promiseA: Promise of type `A`. +/// - promiseB: Promise of type `B`. +/// - promiseC: Promise of type `C`. +/// - promiseD: Promise of type `D`. +/// - returns: Promise of a tuple containing the values of input promises in the same order. +public func all( + on queue: DispatchQueue = .promises, + _ promiseA: Promise, + _ promiseB: Promise, + _ promiseC: Promise, + _ promiseD: Promise +) -> Promise<(A, B, C, D)> { + let promises = [ + promiseA.objCPromise, + promiseB.objCPromise, + promiseC.objCPromise, + promiseD.objCPromise + ] + let promise = Promise<(A, B, C, D)>( + Promise<(A, B, C, D)>.ObjCPromise.__onQueue( + queue, + all: promises + ).__onQueue(queue, then: { objCValues in + guard let values = objCValues as [AnyObject]?, + let valueA = Promise.asValue(values[0]), + let valueB = Promise.asValue(values[1]), + let valueC = Promise.asValue(values[2]), + let valueD = Promise.asValue(values[3]) + else { + preconditionFailure("Cannot convert \(type(of: objCValues)) to \((A, B, C, D).self)") + } + return (valueA, valueB, valueC, valueD) + }) + ) + // Keep Swift wrapper alive for chained promises until `ObjCPromise` counterpart is resolved. + promises.forEach { + $0.__addPendingObject(promise) + } + return promise +} diff --git a/Pods/PromisesSwift/Sources/Promises/Promise+Always.swift b/Pods/PromisesSwift/Sources/Promises/Promise+Always.swift new file mode 100644 index 0000000..abaa1bd --- /dev/null +++ b/Pods/PromisesSwift/Sources/Promises/Promise+Always.swift @@ -0,0 +1,31 @@ +// Copyright 2018 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at: +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Dispatch + +public extension Promise { + + /// Provides a way to always execute a given chained block. + /// - parameters: + /// - queue: A queue to dispatch on. + /// - work: A block that always executes, no matter if `self` is rejected or fulfilled. + /// - returns: A new pending promise to be resolved with same resolution as `self`. + @discardableResult + func always(on queue: DispatchQueue = .promises, _ work: @escaping () -> Void) -> Promise { + let promise = Promise(objCPromise.__onQueue(queue, always: work)) + // Keep Swift wrapper alive for chained promise until `ObjCPromise` counterpart is resolved. + objCPromise.__addPendingObject(promise) + return promise + } +} diff --git a/Pods/PromisesSwift/Sources/Promises/Promise+Any.swift b/Pods/PromisesSwift/Sources/Promises/Promise+Any.swift new file mode 100644 index 0000000..d3ee69c --- /dev/null +++ b/Pods/PromisesSwift/Sources/Promises/Promise+Any.swift @@ -0,0 +1,276 @@ +// Copyright 2018 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at: +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation + +/// Waits for all of the given promises to be fulfilled or rejected. +/// If all promises are rejected, then the returned promise is rejected with same error +/// as the last one rejected. +/// If at least one of the promises is fulfilled, the resulting promise is fulfilled with an array +/// of `Maybe` enums containing values or `Error`s, matching the original order of fulfilled or +/// rejected promises respectively. +/// - parameters: +/// - queue: A queue to dispatch on. +/// - promises: Promises to wait for. +/// - returns: Promise of an array of `Maybe` enums containing the values or `Error`s of input +/// promises in their original order. +public func any( + on queue: DispatchQueue = .promises, + _ promises: Promise... +) -> Promise<[Maybe]> { + return any(on: queue, promises) +} + +/// Waits for all of the given promises to be fulfilled or rejected. +/// If all promises are rejected, then the returned promise is rejected with same error +/// as the last one rejected. +/// If at least one of the promises is fulfilled, the resulting promise is fulfilled with an array +/// of `Maybe` enums containing values or `Error`s, matching the original order of fulfilled or +/// rejected promises respectively. +/// - parameters: +/// - queue: A queue to dispatch on. +/// - promises: Promises to wait for. +/// - returns: Promise of an array of `Maybe` enums containing the values or `Error`s of input +/// promises in their original order. +public func any( + on queue: DispatchQueue = .promises, + _ promises: Container +) -> Promise<[Maybe]> where Container.Element == Promise { + let promises = promises.map { $0.objCPromise } + let promise = Promise<[Maybe]>( + Promise<[Maybe]>.ObjCPromise.__onQueue( + queue, + any: promises + ).__onQueue(queue, then: { values in + guard let values = values as [AnyObject]? else { preconditionFailure() } + return Promise<[Maybe]>.asAnyObject(values.map { asMaybe($0) as Maybe }) + }) + ) + // Keep Swift wrapper alive for chained promises until `ObjCPromise` counterpart is resolved. + promises.forEach { + $0.__addPendingObject(promise) + } + return promise +} + +/// Waits for all of the given promises to be fulfilled or rejected. +/// If all promises are rejected, then the returned promise is rejected with same error +/// as the last one rejected. +/// If at least one of the promises is fulfilled, the resulting promise is fulfilled with a tuple +/// of `Maybe` enums containing values or `Error`s, matching the original order of fulfilled or +/// rejected promises respectively. +/// - parameters: +/// - queue: A queue to dispatch on. +/// - promiseA: Promise of type `A`. +/// - promiseB: Promise of type `B`. +/// - returns: Promise of a tuple of `Maybe` enums containing the values or `Error`s of input +/// promises in their original order. +public func any( + on queue: DispatchQueue = .promises, + _ promiseA: Promise, + _ promiseB: Promise +) -> Promise<(Maybe, Maybe)> { + let promises = [ + promiseA.objCPromise, + promiseB.objCPromise + ] + let promise = Promise<(Maybe, Maybe)>( + Promise<(Maybe, Maybe)>.ObjCPromise.__onQueue( + queue, + any: promises + ).__onQueue(queue, then: { objCValues in + guard let values = objCValues as [AnyObject]? else { preconditionFailure() } + let valueA = asMaybe(values[0]) as Maybe + let valueB = asMaybe(values[1]) as Maybe + return (valueA, valueB) + }) + ) + // Keep Swift wrapper alive for chained promises until `ObjCPromise` counterpart is resolved. + promises.forEach { + $0.__addPendingObject(promise) + } + return promise +} + +/// Waits for all of the given promises to be fulfilled or rejected. +/// If all promises are rejected, then the returned promise is rejected with same error +/// as the last one rejected. +/// If at least one of the promises is fulfilled, the resulting promise is fulfilled with a tuple +/// of `Maybe` enums containing values or `Error`s, matching the original order of fulfilled or +/// rejected promises respectively. +/// - parameters: +/// - queue: A queue to dispatch on. +/// - promiseA: Promise of type `A`. +/// - promiseB: Promise of type `B`. +/// - promiseC: Promise of type `C`. +/// - returns: Promise of a tuple of `Maybe` enums containing the values or `Error`s of input +/// promises in their original order. +public func any( + on queue: DispatchQueue = .promises, + _ promiseA: Promise, + _ promiseB: Promise, + _ promiseC: Promise +) -> Promise<(Maybe, Maybe, Maybe)> { + let promises = [ + promiseA.objCPromise, + promiseB.objCPromise, + promiseC.objCPromise + ] + let promise = Promise<(Maybe, Maybe, Maybe)>( + Promise<(Maybe, Maybe, Maybe)>.ObjCPromise.__onQueue( + queue, + any: promises + ).__onQueue(queue, then: { objCValues in + guard let values = objCValues as [AnyObject]? else { preconditionFailure() } + let valueA = asMaybe(values[0]) as Maybe + let valueB = asMaybe(values[1]) as Maybe + let valueC = asMaybe(values[2]) as Maybe + return (valueA, valueB, valueC) + }) + ) + // Keep Swift wrapper alive for chained promises until `ObjCPromise` counterpart is resolved. + promises.forEach { + $0.__addPendingObject(promise) + } + return promise +} + +/// Wrapper enum for `any` results. +/// - value: Contains the value that corresponding promise was fulfilled with. +/// - error: Contains the error that corresponding promise was rejected with. +public enum Maybe { + case value(Value) + case error(Error) + + public init(_ value: Value) { self = .value(value) } + + public init(_ error: Error) { self = .error(error) } + + public var value: Value? { + if case .value(let value) = self { return value } else { return nil } + } + + public var error: Error? { + if case .error(let error) = self { return error } else { return nil } + } +} + +// MARK: - Conversion + +/// Helper functions that facilitates conversion of `Promise.any` results to the results normally +/// expected from `ObjCPromise.any`. +/// +/// Convert a promise created with `any` in Swift to Objective-C: +/// +/// any([promise1, promise2, promise3]).then { arrayOfMaybeEnums in +/// return arrayOfMaybeEnums.map { $0.asAnyObject() } +/// }.asObjCPromise() as Promise<[AnyObject?]>.ObjCPromise +/// +/// Convert a promise created with `any` in Objective-C to Swift: +/// +/// Promise<[AnyObject]>(objCPromise).then { arrayOfAnyObjects in +/// return arrayOfAnyObjects.map { asMaybe($0) as Maybe } +/// } +public extension Maybe { + + /// Converts generic `Value` to `AnyObject`. + func asAnyObject() -> AnyObject? { + switch self { + case .value(let value): + return Promise.asAnyObject(value) + case .error(let error): + return error as NSError + } + } +} + +/// Helper function to wrap the results of `ObjCPromise.any` with the safe `Maybe` enum. +public func asMaybe(_ value: AnyObject) -> Maybe { + if type(of: value) is NSError.Type { + return .error(value as! NSError) + } else { + guard let value = Promise.asValue(value) else { preconditionFailure() } + return .value(value) + } +} + +// MARK: - Equatable + +/// Equality operators for `Maybe`. +#if !swift(>=4.1) +extension Maybe where Value: Equatable {} +#else +extension Maybe: Equatable where Value: Equatable {} +#endif // !swift(>=4.1) + +public func == (lhs: Maybe, rhs: Maybe) -> Bool { + switch (lhs, rhs) { + case (.value(let lhs), .value(let rhs)): + return lhs == rhs + case (.error(let lhs), .error(let rhs)): + return (lhs as NSError).isEqual(rhs as NSError) + case (.value, .error), (.error, .value): + return false + } +} + +public func != (lhs: Maybe, rhs: Maybe) -> Bool { + return !(lhs == rhs) +} + +#if !swift(>=4.1) + +public func == (lhs: Maybe, rhs: Maybe) -> Bool { + switch (lhs, rhs) { + case (.value(let lhs), .value(let rhs)): + switch (lhs, rhs) { + case (nil, nil): + return true + case (nil, _?), (_?, nil): + return false + case let (lhs?, rhs?): + return lhs == rhs + } + case (.error(let lhs), .error(let rhs)): + return (lhs as NSError).isEqual(rhs as NSError) + case (.value, .error), (.error, .value): + return false + } +} + +public func != (lhs: Maybe, rhs: Maybe) -> Bool { + return !(lhs == rhs) +} + +public func == (lhs: [Maybe], rhs: [Maybe]) -> Bool { + if lhs.count != rhs.count { return false } + for (lhs, rhs) in zip(lhs, rhs) where lhs != rhs { return false } + return true +} + +public func != (lhs: [Maybe], rhs: [Maybe]) -> Bool { + return !(lhs == rhs) +} + +public func == (lhs: [Maybe], rhs: [Maybe]) -> Bool { + if lhs.count != rhs.count { return false } + for (lhs, rhs) in zip(lhs, rhs) where lhs != rhs { return false } + return true +} + +public func != (lhs: [Maybe], rhs: [Maybe]) -> Bool { + return !(lhs == rhs) +} + +#endif // !swift(>=4.1) diff --git a/Pods/PromisesSwift/Sources/Promises/Promise+Async.swift b/Pods/PromisesSwift/Sources/Promises/Promise+Async.swift new file mode 100644 index 0000000..45db623 --- /dev/null +++ b/Pods/PromisesSwift/Sources/Promises/Promise+Async.swift @@ -0,0 +1,42 @@ +// Copyright 2018 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at: +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation + +public extension Promise { + typealias Async = (@escaping (Value) -> Void, @escaping (Error) -> Void) throws -> Void + + /// Creates a pending promise and executes `work` block asynchronously on the given `queue`. + /// - parameters: + /// - queue: A queue to invoke the `work` block on. + /// - work: A block to perform any operations needed to resolve the promise. + convenience init(on queue: DispatchQueue = .promises, _ work: @escaping Async) { + let objCPromise = ObjCPromise.__onQueue(queue) { fulfill, reject in + do { + try work({ value in + if type(of: value) is NSError.Type { + reject(value as! NSError) + } else { + fulfill(Promise.asAnyObject(value)) + } + }, reject) + } catch let error { + reject(error as NSError) + } + } + self.init(objCPromise) + // Keep Swift wrapper alive for chained promise until `ObjCPromise` counterpart is resolved. + objCPromise.__addPendingObject(self) + } +} diff --git a/Pods/PromisesSwift/Sources/Promises/Promise+Await.swift b/Pods/PromisesSwift/Sources/Promises/Promise+Await.swift new file mode 100644 index 0000000..2a447fc --- /dev/null +++ b/Pods/PromisesSwift/Sources/Promises/Promise+Await.swift @@ -0,0 +1,28 @@ +// Copyright 2018 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at: +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import FBLPromises + +/// Waits for promise resolution. The current thread blocks until the promise is resolved. +/// - parameters: +/// - promise: Promise to wait for. +/// - throws: Error the promise was rejected with. +/// - returns: Value the promise was fulfilled with. +public func awaitPromise(_ promise: Promise) throws -> Value { + var outError: NSError? + let outValue = __FBLPromiseAwait(promise.objCPromise, &outError) as AnyObject + if let error = outError { throw error } + guard let value = Promise.asValue(outValue) else { preconditionFailure() } + return value +} diff --git a/Pods/PromisesSwift/Sources/Promises/Promise+Catch.swift b/Pods/PromisesSwift/Sources/Promises/Promise+Catch.swift new file mode 100644 index 0000000..975ce4d --- /dev/null +++ b/Pods/PromisesSwift/Sources/Promises/Promise+Catch.swift @@ -0,0 +1,37 @@ +// Copyright 2018 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at: +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation + +public extension Promise { + typealias Catch = (Error) -> Void + + /// Creates a pending promise which eventually gets resolved with same resolution as `self`. + /// If `self` is rejected, then `reject` block is executed asynchronously on the given queue. + /// - parameters: + /// - queue: A queue to invoke the `reject` block on. + /// - reject: A block to handle the error that `self` was rejected with. + /// - returns: A new pending promise. + @discardableResult + func `catch`(on queue: DispatchQueue = .promises, _ reject: @escaping Catch) -> Promise { + let promise = Promise(objCPromise.__onQueue(queue, catch: { + // Convert `NSError` to `PromiseError`, if applicable. + let error = PromiseError($0) ?? $0 + return reject(error as NSError) + })) + // Keep Swift wrapper alive for chained promise until `ObjCPromise` counterpart is resolved. + objCPromise.__addPendingObject(promise) + return promise + } +} diff --git a/Pods/PromisesSwift/Sources/Promises/Promise+Delay.swift b/Pods/PromisesSwift/Sources/Promises/Promise+Delay.swift new file mode 100644 index 0000000..b2f77ee --- /dev/null +++ b/Pods/PromisesSwift/Sources/Promises/Promise+Delay.swift @@ -0,0 +1,35 @@ +// Copyright 2018 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at: +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation + +public extension Promise { + + /// Creates a new pending promise that fulfills with the same value as `self` after the `delay`, + /// or rejects with the same error immediately. + /// - parameters: + /// - queue: A queue to dispatch on. + /// - interval: Time to wait in seconds. + /// - returns: A new pending promise that fulfills at least `interval` seconds later than `self`, + /// or rejects with the same error immediately. + func delay( + on queue: DispatchQueue = .promises, + _ interval: TimeInterval + ) -> Promise { + let promise = Promise(objCPromise.__onQueue(queue, delay: interval)) + // Keep Swift wrapper alive for chained promise until `ObjCPromise` counterpart is resolved. + objCPromise.__addPendingObject(promise) + return promise + } +} diff --git a/Pods/PromisesSwift/Sources/Promises/Promise+Do.swift b/Pods/PromisesSwift/Sources/Promises/Promise+Do.swift new file mode 100644 index 0000000..fd7505a --- /dev/null +++ b/Pods/PromisesSwift/Sources/Promises/Promise+Do.swift @@ -0,0 +1,61 @@ +// Copyright 2018 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at: +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation + +public extension Promise { + // swiftlint:disable:next type_name + typealias Do = () throws -> T + + /// Creates a pending promise to be resolved with the return value of `work` block which is + /// executed asynchronously on the given `queue`. + /// - parameters: + /// - queue: A queue to invoke the `work` block on. + /// - work: A block that returns a value used to resolve the new promise. + convenience init(on queue: DispatchQueue = .promises, _ work: @escaping Do) { + let objCPromise = ObjCPromise.__onQueue(queue) { + do { + let resolution = try work() + return type(of: resolution) is NSError.Type + ? resolution as! NSError : Promise.asAnyObject(resolution) + } catch let error { + return error as NSError + } + } + self.init(objCPromise) + // Keep Swift wrapper alive for chained promise until `ObjCPromise` counterpart is resolved. + objCPromise.__addPendingObject(self) + } + + /// Creates a pending promise to be resolved with the same resolution as the promise returned from + /// `work` block which is executed asynchronously on the given `queue`. + /// - parameters: + /// - queue: A queue to invoke the `work` block on. + /// - work: A block that returns a promise used to resolve the new promise. + convenience init( + on queue: DispatchQueue = .promises, + _ work: @escaping Do> + ) { + let objCPromise = ObjCPromise.__onQueue(queue) { + do { + return try work().objCPromise + } catch let error { + return error as NSError + } + } + self.init(objCPromise) + // Keep Swift wrapper alive for chained promise until `ObjCPromise` counterpart is resolved. + objCPromise.__addPendingObject(self) + } +} diff --git a/Pods/PromisesSwift/Sources/Promises/Promise+Race.swift b/Pods/PromisesSwift/Sources/Promises/Promise+Race.swift new file mode 100644 index 0000000..389c4c8 --- /dev/null +++ b/Pods/PromisesSwift/Sources/Promises/Promise+Race.swift @@ -0,0 +1,53 @@ +// Copyright 2018 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at: +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Dispatch + +/// Wait until any of the given promises are fulfilled. +/// If one of the given promises is rejected, then the returned promise is rejected with same +/// error. If any other arbitrary value or `Error` appears in the array instead of `Promise`, +/// it's implicitly considered a pre-fulfilled or pre-rejected `Promise` correspondingly. +/// - parameters: +/// - queue: A queue to dispatch on. +/// - promises: Promises to wait for. +/// - returns: First promise, among the given ones, which was fulfilled. +public func race( + on queue: DispatchQueue = .promises, + _ promises: Promise... +) -> Promise { + return race(on: queue, promises) +} + +/// Wait until any of the given promises are fulfilled. +/// If one of the given promises is rejected, then the returned promise is rejected with same +/// error. If any other arbitrary value or `Error` appears in the array instead of `Promise`, +/// it's implicitly considered a pre-fulfilled or pre-rejected `Promise` correspondingly. +/// - parameters: +/// - queue: A queue to dispatch on. +/// - promises: Promises to wait for. +/// - returns: First promise, among the given ones, which was fulfilled. +public func race( + on queue: DispatchQueue = .promises, + _ promises: [Promise] +) -> Promise { + let promises = promises.map { $0.objCPromise } + let promise = Promise( + Promise.ObjCPromise.__onQueue(queue, race: promises) + ) + // Keep Swift wrapper alive for chained promises until `ObjCPromise` counterpart is resolved. + promises.forEach { + $0.__addPendingObject(promise) + } + return promise +} diff --git a/Pods/PromisesSwift/Sources/Promises/Promise+Recover.swift b/Pods/PromisesSwift/Sources/Promises/Promise+Recover.swift new file mode 100644 index 0000000..a8e0463 --- /dev/null +++ b/Pods/PromisesSwift/Sources/Promises/Promise+Recover.swift @@ -0,0 +1,68 @@ +// Copyright 2018 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at: +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation + +public extension Promise { + + /// Provides a new promise to recover in case `self` gets rejected. + /// - parameters: + /// - queue: A queue to execute `recovery` block on. + /// - recovery: A block to handle the error that `self` was rejected with. + /// - returns: A new pending promise to use instead of the rejected one that gets resolved with + /// the same resolution as the promise returned from `recovery` block. + @discardableResult + func recover( + on queue: DispatchQueue = .promises, + _ recovery: @escaping (Error) throws -> Promise + ) -> Promise { + let promise = Promise(objCPromise.__onQueue(queue, recover: { + do { + // Convert `NSError` to `PromiseError`, if applicable. + let error = PromiseError($0) ?? $0 + return try recovery(error).objCPromise + } catch let error { + return error as NSError + } + })) + // Keep Swift wrapper alive for chained promise until `ObjCPromise` counterpart is resolved. + objCPromise.__addPendingObject(promise) + return promise + } + + /// Provides a new promise to recover in case `self` gets rejected. + /// - parameters: + /// - queue: A queue to execute `recovery` block on. + /// - recovery: A block to handle the error that `self` was rejected with. + /// - returns: A new pending promise to use instead of the rejected one that gets resolved with + /// the value returned from `recovery` block. + @discardableResult + func recover( + on queue: DispatchQueue = .promises, + _ recovery: @escaping (Error) throws -> Value + ) -> Promise { + let promise = Promise(objCPromise.__onQueue(queue, recover: { + do { + // Convert `NSError` to `PromiseError`, if applicable. + let error = PromiseError($0) ?? $0 + return Promise.asAnyObject(try recovery(error)) as Any + } catch let error { + return error as NSError + } + })) + // Keep Swift wrapper alive for chained promise until `ObjCPromise` counterpart is resolved. + objCPromise.__addPendingObject(promise) + return promise + } +} diff --git a/Pods/PromisesSwift/Sources/Promises/Promise+Reduce.swift b/Pods/PromisesSwift/Sources/Promises/Promise+Reduce.swift new file mode 100644 index 0000000..2ff1cab --- /dev/null +++ b/Pods/PromisesSwift/Sources/Promises/Promise+Reduce.swift @@ -0,0 +1,61 @@ +// Copyright 2018 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at: +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Dispatch + +public extension Promise { + typealias Reducer = (Value, Element) throws -> Promise + + /// Sequentially reduces a collection of values to a single promise using a given combining block + /// and the value `self` resolves with as initial value. + /// - parameters: + /// - queue: A queue to execute `reducer` block on. + /// - items: A sequence of values to process in order. + /// - reducer: A block to combine an accumulating value and an element of the sequence into + /// a promise resolved with the new accumulating value, to be used in the next call + /// of the `reducer` or returned to the caller. + /// - returns: A new pending promise returned from the last `reducer` invocation. + /// Or `self` if `items` is empty. + @discardableResult + func reduce( + on queue: DispatchQueue = .promises, + _ items: Element..., + combine reducer: @escaping Reducer + ) -> Promise { + return reduce(on: queue, items, reducer) + } + + /// Sequentially reduces a collection of values to a single promise using a given combining block + /// and the value `self` resolves with as initial value. + /// - parameters: + /// - queue: A queue to execute `reducer` block on. + /// - items: A sequence of values to process in order. + /// - reducer: A block to combine an accumulating value and an element of the sequence into + /// a promise resolved with the new accumulating value, to be used in the next call + /// of the `reducer` or returned to the caller. + /// - returns: A new pending promise returned from the last `reducer` invocation. + /// Or `self` if `items` is empty. + @discardableResult + func reduce( + on queue: DispatchQueue = .promises, + _ items: Container, + _ reducer: @escaping Reducer + ) -> Promise { + return items.reduce(self) { promise, item in + promise.then { value in + try reducer(value, item) + } + } + } +} diff --git a/Pods/PromisesSwift/Sources/Promises/Promise+Retry.swift b/Pods/PromisesSwift/Sources/Promises/Promise+Retry.swift new file mode 100644 index 0000000..cc59209 --- /dev/null +++ b/Pods/PromisesSwift/Sources/Promises/Promise+Retry.swift @@ -0,0 +1,73 @@ +// Copyright 2018 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at: +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import FBLPromises + +/// Creates a pending promise that fulfills with the same value as the promise returned from `work` +/// block, which executes asynchronously on the given `queue`, or rejects with the same error after +/// all retry attempts have been exhausted. On rejection, the `work` block is retried after the +/// given delay `interval` and will continue to retry until the number of specified attempts have +/// been exhausted or will bail early if the given condition is not met. +/// +/// - parameters: +/// - queue: A queue to invoke the `work` block on. +/// - count: Max number of retry attempts. The `work` block will be executed once if the specified +/// count is less than or equal to zero. The default is +/// `__FBLPromiseRetryDefaultAttemptsCount`. +/// - interval: Time to wait before the next retry attempt. The default is +/// `__FBLPromiseRetryDefaultDelayInterval`. +/// - predicate: Condition to check before the next retry attempt. The block takes the following +/// parameters: +/// - count: Number of remaining retry attempts. +/// - error: The error the promise was rejected with. +/// - work: A block that executes asynchronously on the given `queue` and returns a value or an +/// error used to resolve the promise. +/// - returns: A new pending promise that fulfills with the same value as the promise returned from +/// `work` block, or rejects with the same error after all retry attempts have been +/// exhausted or if the given condition is not met. +public func retry( + on queue: DispatchQueue = .promises, + attempts count: Int = __FBLPromiseRetryDefaultAttemptsCount, + delay interval: TimeInterval = __FBLPromiseRetryDefaultDelayInterval, + condition predicate: ((_ count: Int, _ error: Error) -> Bool)? = nil, + _ work: @escaping () throws -> Promise +) -> Promise { +#if (swift(>=4.1) || (!swift(>=4.0) && swift(>=3.3))) + let predicateBlock = predicate +#else + var predicateBlock: ((_ count: Int, _ error: Error) -> ObjCBool)? + if predicate != nil { + predicateBlock = { count, error -> ObjCBool in + guard let predicate = predicate else { return true } + return ObjCBool(predicate(count, error)) + } + } +#endif // (swift(>=4.1) || (!swift(>=4.0) && swift(>=3.3))) + let objCPromise = Promise.ObjCPromise.__onQueue( + queue, + attempts: count, + delay: interval, + condition: predicateBlock + ) { + do { + return try work().objCPromise + } catch let error { + return error as NSError + } + } + let promise = Promise(objCPromise) + // Keep Swift wrapper alive for chained promise until `ObjCPromise` counterpart is resolved. + objCPromise.__addPendingObject(promise) + return promise +} diff --git a/Pods/PromisesSwift/Sources/Promises/Promise+Testing.swift b/Pods/PromisesSwift/Sources/Promises/Promise+Testing.swift new file mode 100644 index 0000000..a52ccd5 --- /dev/null +++ b/Pods/PromisesSwift/Sources/Promises/Promise+Testing.swift @@ -0,0 +1,27 @@ +// Copyright 2018 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at: +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import FBLPromises + +extension DispatchGroup { + /// Dispatch group for promises that is typically used to wait for all scheduled blocks. + static var promises: DispatchGroup { return Promise.ObjCPromise.__dispatchGroup } +} + +/// Waits for all scheduled promise blocks. +/// - parameter timeout: Maximum time to wait. +/// - returns: `true` if all promise blocks have completed before `timeout` and `false` otherwise. +func waitForPromises(timeout: TimeInterval) -> Bool { + return __FBLWaitForPromisesWithTimeout(timeout) +} diff --git a/Pods/PromisesSwift/Sources/Promises/Promise+Then.swift b/Pods/PromisesSwift/Sources/Promises/Promise+Then.swift new file mode 100644 index 0000000..88e131a --- /dev/null +++ b/Pods/PromisesSwift/Sources/Promises/Promise+Then.swift @@ -0,0 +1,105 @@ +// Copyright 2018 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at: +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation + +public extension Promise { + typealias Then = (Value) throws -> Result + + /// Creates a pending promise which eventually gets resolved with the same resolution as the + /// promise returned from `work` block. The `work` block is executed asynchronously on the given + /// `queue` only when `self` is fulfilled. If `self` is rejected, the returned promise is also + /// rejected with the same error. + /// - parameters: + /// - queue: A queue to invoke the `work` block on. + /// - work: A block to handle the value that `self` was fulfilled with. + /// - returns: A new pending promise to be resolved with the same resolution as the promise + /// returned from the `work` block. + @discardableResult + func then( + on queue: DispatchQueue = .promises, + _ work: @escaping Then> + ) -> Promise { + let promise = Promise(objCPromise.__onQueue(queue, then: { objCValue in + guard let value = Promise.asValue(objCValue) else { + preconditionFailure("Cannot cast \(type(of: objCValue)) to \(Value.self)") + } + do { + return try work(value).objCPromise + } catch let error { + return error as NSError + } + })) + // Keep Swift wrapper alive for chained promise until `ObjCPromise` counterpart is resolved. + objCPromise.__addPendingObject(promise) + return promise + } + + /// Creates a pending promise which eventually gets resolved with the value returned from `work` + /// block. The `work` block is executed asynchronously on the given `queue` only when `self` is + /// fulfilled. If `self` is rejected, the returned promise is also rejected with the same error. + /// - parameters: + /// - queue: A queue to invoke the `work` block on. + /// - work: A block to handle the value that `self` was fulfilled with. + /// - returns: A new pending promise to be resolved with the value returned from the `work` block. + @discardableResult + func then( + on queue: DispatchQueue = .promises, + _ work: @escaping Then + ) -> Promise { + let promise = Promise(objCPromise.__onQueue(queue, then: { objCValue in + guard let value = Promise.asValue(objCValue) else { + preconditionFailure("Cannot cast \(type(of: objCValue)) to \(Value.self)") + } + do { + let value = try work(value) + return type(of: value) is NSError.Type + ? value as! NSError : Promise.asAnyObject(value) + } catch let error { + return error as NSError + } + })) + // Keep Swift wrapper alive for chained promise until `ObjCPromise` counterpart is resolved. + objCPromise.__addPendingObject(promise) + return promise + } + + /// Creates a pending promise which eventually gets resolved with the same resolution as `self`. + /// `work` block is executed asynchronously on the given `queue` only when `self` is fulfilled. + /// If `self` is rejected, the returned promise is also rejected with the same error. + /// - parameters: + /// - queue: A queue to invoke the `work` block on. + /// - work: A block to handle the value that `self` was fulfilled with. + /// - returns: A new pending promise to be resolved with the value passed into the `work` block. + @discardableResult + func then( + on queue: DispatchQueue = .promises, + _ work: @escaping Then + ) -> Promise { + let promise = Promise(objCPromise.__onQueue(queue, then: { objCValue in + guard let value = Promise.asValue(objCValue) else { + preconditionFailure("Cannot cast \(type(of: objCValue)) to \(Value.self)") + } + do { + try work(value) + return Promise.asAnyObject(value) + } catch let error { + return error as NSError + } + })) + // Keep Swift wrapper alive for chained promise until `ObjCPromise` counterpart is resolved. + objCPromise.__addPendingObject(promise) + return promise + } +} diff --git a/Pods/PromisesSwift/Sources/Promises/Promise+Timeout.swift b/Pods/PromisesSwift/Sources/Promises/Promise+Timeout.swift new file mode 100644 index 0000000..1300039 --- /dev/null +++ b/Pods/PromisesSwift/Sources/Promises/Promise+Timeout.swift @@ -0,0 +1,32 @@ +// Copyright 2018 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at: +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation + +public extension Promise { + + /// Waits on a promise for a given interval or rejects the promise if it exceeds the time limit. + /// - parameters: + /// - queue: A queue to dispatch on. + /// - interval: Time to wait in seconds. + /// - returns: A new pending promise that gets either resolved with same resolution as `self` or + /// rejected with `PromiseError.timedOut` error. + @discardableResult + func timeout(on queue: DispatchQueue = .promises, _ interval: TimeInterval) -> Promise { + let promise = Promise(objCPromise.__onQueue(queue, timeout: interval)) + // Keep Swift wrapper alive for chained promise until `ObjCPromise` counterpart is resolved. + objCPromise.__addPendingObject(promise) + return promise + } +} diff --git a/Pods/PromisesSwift/Sources/Promises/Promise+Validate.swift b/Pods/PromisesSwift/Sources/Promises/Promise+Validate.swift new file mode 100644 index 0000000..3825602 --- /dev/null +++ b/Pods/PromisesSwift/Sources/Promises/Promise+Validate.swift @@ -0,0 +1,47 @@ +// Copyright 2018 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at: +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation + +public extension Promise { + + /// Validates a fulfilled value or rejects the value if it can not be validated. + /// - parameters: + /// - queue: A queue to dispatch on. + /// - predicate: An expression to validate. + /// - returns: A new pending promise that gets either resolved with same resolution as `self` or + /// rejected with `PromiseError.validationFailure` error. + @discardableResult + func validate( + on queue: DispatchQueue = .promises, + _ predicate: @escaping (Value) -> Bool + ) -> Promise { + let promise = Promise(objCPromise.__onQueue( + queue, + validate: { objCValue in + guard let value = Promise.asValue(objCValue) else { + preconditionFailure("Cannot cast \(type(of: objCValue)) to \(Value.self)") + } +#if (swift(>=4.1) || (!swift(>=4.0) && swift(>=3.3))) + return predicate(value) +#else + return ObjCBool(predicate(value)) +#endif // (swift(>=4.1) || (!swift(>=4.0) && swift(>=3.3))) + } + )) + // Keep Swift wrapper alive for chained promise until `ObjCPromise` counterpart is resolved. + objCPromise.__addPendingObject(promise) + return promise + } +} diff --git a/Pods/PromisesSwift/Sources/Promises/Promise+Wrap.swift b/Pods/PromisesSwift/Sources/Promises/Promise+Wrap.swift new file mode 100644 index 0000000..ecfbe3e --- /dev/null +++ b/Pods/PromisesSwift/Sources/Promises/Promise+Wrap.swift @@ -0,0 +1,163 @@ +// Copyright 2018 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at: +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Dispatch + +/// Provides a convenient way to convert methods that use common callback patterns into `Promise`s. + +/// Creates a new promise to be resolved when completion handler gets invoked. +/// - parameter work: A block to execute asynchronously to invoke some API that requires +/// a completion handler with no arguments. +/// - returns: A new pending promise to be resolved with `nil` when completion handler finishes. +public func wrap( + on queue: DispatchQueue = .promises, + _ work: @escaping (@escaping () -> Void) throws -> Void +) -> Promise { + return Promise(on: queue) { fulfill, _ in + try work { fulfill(nil) } + } +} + +/// Creates a new promise to be resolved when completion handler gets invoked. +/// - parameter work: A block to execute asynchronously to invoke some API that requires +/// a completion handler with one argument of generic `Value` type. +/// - returns: A new pending promise to be resolved with the value provided by completion handler +/// when it finishes. +public func wrap( + on queue: DispatchQueue = .promises, + _ work: @escaping (@escaping (Value) -> Void) throws -> Void +) -> Promise { + return Promise(on: queue) { fulfill, _ in + try work { fulfill($0) } + } +} + +/// Creates a new promise to be resolved when completion handler gets invoked. +/// - parameter work: A block to execute asynchronously to invoke some API that requires +/// a completion handler with one argument of optional generic `Value` type. +/// - returns: A new pending promise to be resolved with the value or error provided by completion +/// handler when it finishes. +public func wrap( + on queue: DispatchQueue = .promises, + _ work: @escaping (@escaping (Value?) -> Void) throws -> Void +) -> Promise { + return Promise(on: queue) { fulfill, _ in + try work { fulfill($0) } + } +} + +/// Creates a new promise to be resolved when completion handler gets invoked. +/// - parameter work: A block to execute asynchronously to invoke some API that requires +/// a completion handler with two arguments: a generic of `Value` type and +/// an optional `Error`. +/// - returns: A new pending promise to be resolved with the value or error provided by completion +/// handler when it finishes. +public func wrap( + on queue: DispatchQueue = .promises, + _ work: @escaping (@escaping (Value, Error?) -> Void) throws -> Void +) -> Promise { + return Promise(on: queue) { fulfill, reject in + try work { value, error in + if let error = error { + reject(error) + } else { + fulfill(value) + } + } + } +} + +/// Creates a new promise to be resolved when completion handler gets invoked. +/// - parameter work: A block to execute asynchronously to invoke some API that requires +/// a completion handler with two arguments: an optional `Error` and a generic of +/// `Value` type. +/// - returns: A new pending promise to be resolved with the error or value provided by completion +/// handler when it finishes. +public func wrap( + on queue: DispatchQueue = .promises, + _ work: @escaping (@escaping (Error?, Value) -> Void) throws -> Void +) -> Promise { + return Promise(on: queue) { fulfill, reject in + try work { error, value in + if let error = error { + reject(error) + } else { + fulfill(value) + } + } + } +} + +/// Creates a new promise to be resolved when completion handler gets invoked. +/// - parameter work: A block to execute asynchronously to invoke some API that requires +/// a completion handler with two arguments: an optional generic of `Value` type +/// and an optional `Error`. +/// - returns: A new pending promise to be resolved with the value or error provided by completion +/// handler when it finishes. +public func wrap( + on queue: DispatchQueue = .promises, + _ work: @escaping (@escaping (Value?, Error?) -> Void) throws -> Void +) -> Promise { + return Promise(on: queue) { fulfill, reject in + try work { value, error in + if let error = error { + reject(error) + } else { + fulfill(value) + } + } + } +} + +/// Creates a new promise to be resolved when completion handler gets invoked. +/// - parameter work: A block to execute asynchronously to invoke some API that requires +/// a completion handler with two arguments: an optional `Error` and an optional +/// generic of `Value` type. +/// - returns: A new pending promise to be resolved with the error or value provided by completion +/// handler when it finishes. +public func wrap( + on queue: DispatchQueue = .promises, + _ work: @escaping (@escaping (Error?, Value?) -> Void) throws -> Void +) -> Promise { + return Promise(on: queue) { fulfill, reject in + try work { error, value in + if let error = error { + reject(error) + } else { + fulfill(value) + } + } + } +} + +/// Creates a new promise to be resolved when completion handler gets invoked. +/// - parameter work: A block to execute asynchronously to invoke some API that requires +/// a completion handler with three arguments: two optionals of `Any` type +/// and an optional `Error`. +/// - returns: A new pending promise to be resolved with a tuple of optional values or an error +/// provided by completion handler when it finishes. +public func wrap( + on queue: DispatchQueue = .promises, + _ work: @escaping (@escaping (Value1?, Value2?, Error?) -> Void) throws -> Void +) -> Promise<(Value1?, Value2?)> { + return Promise<(Value1?, Value2?)>(on: queue) { fulfill, reject in + try work { value1, value2, error in + if let error = error { + reject(error) + } else { + fulfill((value1, value2)) + } + } + } +} diff --git a/Pods/PromisesSwift/Sources/Promises/Promise.swift b/Pods/PromisesSwift/Sources/Promises/Promise.swift new file mode 100644 index 0000000..5ad9b94 --- /dev/null +++ b/Pods/PromisesSwift/Sources/Promises/Promise.swift @@ -0,0 +1,146 @@ +// Copyright 2018 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at: +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import FBLPromises + +/// Promises synchronization construct in Swift. Leverages ObjC implementation internally. +public final class Promise { + public typealias ObjCPromise = FBLPromise + + /// Creates a new promise with an existing ObjC promise. + public init(_ objCPromise: ObjCPromise) { + guard let objCPromise = objCPromise as? ObjCPromise else { + preconditionFailure("Cannot cast \(T.self) to \(AnyObject.self)") + } + self.objCPromise = objCPromise + } + + /// Creates a new pending promise. + public static func pending() -> Promise { + return Promise.init(ObjCPromise.__pending()) + } + + /// Creates a new pending promise. + public convenience init() { + self.init(ObjCPromise.__pending()) + } + + /// Creates a new promise rejected with the given `error`. + public convenience init(_ error: Error) { + self.init(ObjCPromise.__resolved(with: error as NSError)) + } + + /// Creates a new promise resolved with the result of `work` block. + public convenience init(_ work: @autoclosure () throws -> Value) { + do { + let resolution = try work() + if type(of: resolution) is NSError.Type { + let error = resolution as! NSError + self.init(error) + } else if let objCPromise = resolution as? ObjCPromise { + self.init(objCPromise) + } else { + self.init(ObjCPromise.__resolved(with: Promise.asAnyObject(resolution))) + } + } catch let error { + self.init(error as NSError) + } + } + + /// Resolves `self` with the given `resolution`. + public func fulfill(_ resolution: Value) { + objCPromise.__fulfill(Promise.asAnyObject(resolution)) + } + + /// Rejects `self` with the given `error`. + public func reject(_ error: Error) { + objCPromise.__fulfill(error as NSError) + } + + /// Converts `self` into ObjC promise. + public func asObjCPromise() -> ObjCPromise { + guard let objCPromise = objCPromise as? ObjCPromise else { + preconditionFailure("Cannot cast \(AnyObject.self) to \(T.self)") + } + return objCPromise + } + + // MARK: Internal + + /// Underlying ObjC counterpart. + let objCPromise: ObjCPromise + + var isPending: Bool { return objCPromise.__isPending } + + var isFulfilled: Bool { return objCPromise.__isFulfilled } + + var isRejected: Bool { return objCPromise.__isRejected } + + var value: Value? { + let objCValue = objCPromise.__value + if Promise.isBridgedNil(objCValue) { return nil } + guard let value = objCValue as? Value else { + preconditionFailure("Cannot cast \(type(of: objCValue)) to \(Value.self)") + } + return value + } + + var error: Error? { + guard let objCPromiseError = objCPromise.__error else { return nil } + // Convert `NSError` to `PromiseError`, if applicable. + return PromiseError(objCPromiseError) ?? objCPromiseError + } + + /// Converts generic `Value` to `AnyObject`. + static func asAnyObject(_ value: Value) -> AnyObject? { + return Promise.isBridgedNil(value) ? nil : value as AnyObject + } + + /// Converts `AnyObject` to generic `Value`, or `nil` if the conversion is not possible. + static func asValue(_ value: AnyObject?) -> Value? { + // Swift nil becomes NSNull during bridging. + return (value as? Value) ?? NSNull() as AnyObject as? Value + } + + // MARK: Private + + /// Checks if generic `Value` is bridged ObjC `nil`. + private static func isBridgedNil(_ value: Value?) -> Bool { + // Swift nil becomes NSNull during bridging. + return !(value is NSNull) && (value as AnyObject is NSNull) + } +} + +extension Promise: CustomStringConvertible { + public var description: String { + var description = "nil" + if isFulfilled { + if let value = value { description = String(describing: value) } + return "Fulfilled: \(description)" + } + if isRejected { + if let error = error { description = String(describing: error) } + return "Rejected: \(description)" + } + return "Pending: \(Value.self)" + } +} + +public extension DispatchQueue { + /// Default dispatch queue used for `Promise`, which is `main` if a queue is not specified. + static var promises: DispatchQueue { + get { return Promise.ObjCPromise.__defaultDispatchQueue } + set { Promise.ObjCPromise.__defaultDispatchQueue = newValue } + } +} diff --git a/Pods/PromisesSwift/Sources/Promises/PromiseError.swift b/Pods/PromisesSwift/Sources/Promises/PromiseError.swift new file mode 100644 index 0000000..37f0d04 --- /dev/null +++ b/Pods/PromisesSwift/Sources/Promises/PromiseError.swift @@ -0,0 +1,58 @@ +// Copyright 2018 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at: +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import FBLPromises + +/// Internal errors that `Promise` can throw. +/// Indirectly conforms to `Swift.Error` through conformance to `Swift.CustomNSError` below. +/// Not placing it under extension `Promise` for convenience to avoid collisions with `Swift.Error`. +public enum PromiseError { + case timedOut + case validationFailure +} + +/// Downcasting from `Swift.Error`. +extension PromiseError { + public init?(_ error: Error) { + let error = error as NSError + if error.domain != __FBLPromiseErrorDomain { return nil } + switch error.code { + case __FBLPromiseErrorCode.timedOut.rawValue: + self = .timedOut + case __FBLPromiseErrorCode.validationFailure.rawValue: + self = .validationFailure + default: + return nil + } + } +} + +extension PromiseError: CustomNSError { + public static var errorDomain: String { + return __FBLPromiseErrorDomain + } + + public var errorCode: Int { + switch self { + case .timedOut: + return __FBLPromiseErrorCode.timedOut.rawValue + case .validationFailure: + return __FBLPromiseErrorCode.validationFailure.rawValue + } + } + + public var errorUserInfo: [String: Any] { + return [String: Any]() + } +} diff --git a/Pods/PromisesSwift/Sources/Promises/Resources/PrivacyInfo.xcprivacy b/Pods/PromisesSwift/Sources/Promises/Resources/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..5397adc --- /dev/null +++ b/Pods/PromisesSwift/Sources/Promises/Resources/PrivacyInfo.xcprivacy @@ -0,0 +1,14 @@ + + + + + NSPrivacyAccessedAPITypes + + NSPrivacyCollectedDataTypes + + NSPrivacyTracking + + NSPrivacyTrackingDomains + + + diff --git a/Pods/Target Support Files/FirebaseAnalytics/FirebaseAnalytics-xcframeworks-input-files.xcfilelist b/Pods/Target Support Files/FirebaseAnalytics/FirebaseAnalytics-xcframeworks-input-files.xcfilelist new file mode 100644 index 0000000..09a3da3 --- /dev/null +++ b/Pods/Target Support Files/FirebaseAnalytics/FirebaseAnalytics-xcframeworks-input-files.xcfilelist @@ -0,0 +1,2 @@ +${PODS_ROOT}/Target Support Files/FirebaseAnalytics/FirebaseAnalytics-xcframeworks.sh +${PODS_ROOT}/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework \ No newline at end of file diff --git a/Pods/Target Support Files/FirebaseAnalytics/FirebaseAnalytics-xcframeworks-output-files.xcfilelist b/Pods/Target Support Files/FirebaseAnalytics/FirebaseAnalytics-xcframeworks-output-files.xcfilelist new file mode 100644 index 0000000..dc8a402 --- /dev/null +++ b/Pods/Target Support Files/FirebaseAnalytics/FirebaseAnalytics-xcframeworks-output-files.xcfilelist @@ -0,0 +1 @@ +${PODS_XCFRAMEWORKS_BUILD_DIR}/FirebaseAnalytics/Default/FirebaseAnalytics.framework \ No newline at end of file diff --git a/Pods/Target Support Files/FirebaseAnalytics/FirebaseAnalytics-xcframeworks.sh b/Pods/Target Support Files/FirebaseAnalytics/FirebaseAnalytics-xcframeworks.sh new file mode 100755 index 0000000..2ffae07 --- /dev/null +++ b/Pods/Target Support Files/FirebaseAnalytics/FirebaseAnalytics-xcframeworks.sh @@ -0,0 +1,145 @@ +#!/bin/sh +set -e +set -u +set -o pipefail + +function on_error { + echo "$(realpath -mq "${0}"):$1: error: Unexpected failure" +} +trap 'on_error $LINENO' ERR + + +# This protects against multiple targets copying the same framework dependency at the same time. The solution +# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html +RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") + + +variant_for_slice() +{ + case "$1" in + "FirebaseAnalytics.xcframework/ios-arm64") + echo "" + ;; + "FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst") + echo "maccatalyst" + ;; + "FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator") + echo "simulator" + ;; + "FirebaseAnalytics.xcframework/macos-arm64_x86_64") + echo "" + ;; + "FirebaseAnalytics.xcframework/tvos-arm64") + echo "" + ;; + "FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator") + echo "simulator" + ;; + esac +} + +archs_for_slice() +{ + case "$1" in + "FirebaseAnalytics.xcframework/ios-arm64") + echo "arm64" + ;; + "FirebaseAnalytics.xcframework/ios-arm64_x86_64-maccatalyst") + echo "arm64 x86_64" + ;; + "FirebaseAnalytics.xcframework/ios-arm64_x86_64-simulator") + echo "arm64 x86_64" + ;; + "FirebaseAnalytics.xcframework/macos-arm64_x86_64") + echo "arm64 x86_64" + ;; + "FirebaseAnalytics.xcframework/tvos-arm64") + echo "arm64" + ;; + "FirebaseAnalytics.xcframework/tvos-arm64_x86_64-simulator") + echo "arm64 x86_64" + ;; + esac +} + +copy_dir() +{ + local source="$1" + local destination="$2" + + # Use filter instead of exclude so missing patterns don't throw errors. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" \"${source}*\" \"${destination}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" "${source}"/* "${destination}" +} + +SELECT_SLICE_RETVAL="" + +select_slice() { + local xcframework_name="$1" + xcframework_name="${xcframework_name##*/}" + local paths=("${@:2}") + # Locate the correct slice of the .xcframework for the current architectures + local target_path="" + + # Split archs on space so we can find a slice that has all the needed archs + local target_archs=$(echo $ARCHS | tr " " "\n") + + local target_variant="" + if [[ "$PLATFORM_NAME" == *"simulator" ]]; then + target_variant="simulator" + fi + if [[ ! -z ${EFFECTIVE_PLATFORM_NAME+x} && "$EFFECTIVE_PLATFORM_NAME" == *"maccatalyst" ]]; then + target_variant="maccatalyst" + fi + for i in ${!paths[@]}; do + local matched_all_archs="1" + local slice_archs="$(archs_for_slice "${xcframework_name}/${paths[$i]}")" + local slice_variant="$(variant_for_slice "${xcframework_name}/${paths[$i]}")" + for target_arch in $target_archs; do + if ! [[ "${slice_variant}" == "$target_variant" ]]; then + matched_all_archs="0" + break + fi + + if ! echo "${slice_archs}" | tr " " "\n" | grep -F -q -x "$target_arch"; then + matched_all_archs="0" + break + fi + done + + if [[ "$matched_all_archs" == "1" ]]; then + # Found a matching slice + echo "Selected xcframework slice ${paths[$i]}" + SELECT_SLICE_RETVAL=${paths[$i]} + break + fi + done +} + +install_xcframework() { + local basepath="$1" + local name="$2" + local package_type="$3" + local paths=("${@:4}") + + # Locate the correct slice of the .xcframework for the current architectures + select_slice "${basepath}" "${paths[@]}" + local target_path="$SELECT_SLICE_RETVAL" + if [[ -z "$target_path" ]]; then + echo "warning: [CP] $(basename ${basepath}): Unable to find matching slice in '${paths[@]}' for the current build architectures ($ARCHS) and platform (${EFFECTIVE_PLATFORM_NAME-${PLATFORM_NAME}})." + return + fi + local source="$basepath/$target_path" + + local destination="${PODS_XCFRAMEWORKS_BUILD_DIR}/${name}" + + if [ ! -d "$destination" ]; then + mkdir -p "$destination" + fi + + copy_dir "$source/" "$destination" + echo "Copied $source to $destination" +} + +install_xcframework "${PODS_ROOT}/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework" "FirebaseAnalytics/Default" "framework" "ios-arm64" "ios-arm64_x86_64-maccatalyst" "ios-arm64_x86_64-simulator" + diff --git a/Pods/Target Support Files/FirebaseAnalytics/FirebaseAnalytics.debug.xcconfig b/Pods/Target Support Files/FirebaseAnalytics/FirebaseAnalytics.debug.xcconfig new file mode 100644 index 0000000..2f053c2 --- /dev/null +++ b/Pods/Target Support Files/FirebaseAnalytics/FirebaseAnalytics.debug.xcconfig @@ -0,0 +1,16 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/FirebaseAnalytics +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreInternal" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseInstallations" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities" "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC" "${PODS_CONFIGURATION_BUILD_DIR}/nanopb" "${PODS_ROOT}/FirebaseAnalytics/Frameworks" "${PODS_ROOT}/GoogleAdsOnDeviceConversion/Frameworks" "${PODS_ROOT}/GoogleAppMeasurement/Frameworks" "${PODS_XCFRAMEWORKS_BUILD_DIR}/FirebaseAnalytics/Default" "${PODS_XCFRAMEWORKS_BUILD_DIR}/GoogleAdsOnDeviceConversion" "${PODS_XCFRAMEWORKS_BUILD_DIR}/GoogleAppMeasurement/Core" "${PODS_XCFRAMEWORKS_BUILD_DIR}/GoogleAppMeasurement/IdentitySupport" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_LDFLAGS = $(inherited) -l"c++" -l"sqlite3" -l"z" -framework "StoreKit" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/FirebaseAnalytics +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/FirebaseAnalytics/FirebaseAnalytics.release.xcconfig b/Pods/Target Support Files/FirebaseAnalytics/FirebaseAnalytics.release.xcconfig new file mode 100644 index 0000000..2f053c2 --- /dev/null +++ b/Pods/Target Support Files/FirebaseAnalytics/FirebaseAnalytics.release.xcconfig @@ -0,0 +1,16 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/FirebaseAnalytics +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreInternal" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseInstallations" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities" "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC" "${PODS_CONFIGURATION_BUILD_DIR}/nanopb" "${PODS_ROOT}/FirebaseAnalytics/Frameworks" "${PODS_ROOT}/GoogleAdsOnDeviceConversion/Frameworks" "${PODS_ROOT}/GoogleAppMeasurement/Frameworks" "${PODS_XCFRAMEWORKS_BUILD_DIR}/FirebaseAnalytics/Default" "${PODS_XCFRAMEWORKS_BUILD_DIR}/GoogleAdsOnDeviceConversion" "${PODS_XCFRAMEWORKS_BUILD_DIR}/GoogleAppMeasurement/Core" "${PODS_XCFRAMEWORKS_BUILD_DIR}/GoogleAppMeasurement/IdentitySupport" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_LDFLAGS = $(inherited) -l"c++" -l"sqlite3" -l"z" -framework "StoreKit" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/FirebaseAnalytics +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/FirebaseCore/FirebaseCore-Info.plist b/Pods/Target Support Files/FirebaseCore/FirebaseCore-Info.plist new file mode 100644 index 0000000..45e1159 --- /dev/null +++ b/Pods/Target Support Files/FirebaseCore/FirebaseCore-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + ${PODS_DEVELOPMENT_LANGUAGE} + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 12.7.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/FirebaseCore/FirebaseCore-dummy.m b/Pods/Target Support Files/FirebaseCore/FirebaseCore-dummy.m new file mode 100644 index 0000000..4f1eb27 --- /dev/null +++ b/Pods/Target Support Files/FirebaseCore/FirebaseCore-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_FirebaseCore : NSObject +@end +@implementation PodsDummy_FirebaseCore +@end diff --git a/Pods/Target Support Files/FirebaseCore/FirebaseCore-umbrella.h b/Pods/Target Support Files/FirebaseCore/FirebaseCore-umbrella.h new file mode 100644 index 0000000..509268c --- /dev/null +++ b/Pods/Target Support Files/FirebaseCore/FirebaseCore-umbrella.h @@ -0,0 +1,23 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + +#import "FIRApp.h" +#import "FIRConfiguration.h" +#import "FirebaseCore.h" +#import "FIRLoggerLevel.h" +#import "FIROptions.h" +#import "FIRTimestamp.h" +#import "FIRVersion.h" + +FOUNDATION_EXPORT double FirebaseCoreVersionNumber; +FOUNDATION_EXPORT const unsigned char FirebaseCoreVersionString[]; + diff --git a/Pods/Target Support Files/FirebaseCore/FirebaseCore.debug.xcconfig b/Pods/Target Support Files/FirebaseCore/FirebaseCore.debug.xcconfig new file mode 100644 index 0000000..96425d8 --- /dev/null +++ b/Pods/Target Support Files/FirebaseCore/FirebaseCore.debug.xcconfig @@ -0,0 +1,17 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore +DEFINES_MODULE = YES +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreInternal" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 Firebase_VERSION=12.7.0 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_TARGET_SRCROOT}" +OTHER_CFLAGS = $(inherited) -fno-autolink +OTHER_LDFLAGS = $(inherited) -framework "FirebaseCoreInternal" -framework "Foundation" -framework "GoogleUtilities" -framework "Security" -framework "SystemConfiguration" -framework "UIKit" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/FirebaseCore +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/FirebaseCore/FirebaseCore.modulemap b/Pods/Target Support Files/FirebaseCore/FirebaseCore.modulemap new file mode 100644 index 0000000..4c38b87 --- /dev/null +++ b/Pods/Target Support Files/FirebaseCore/FirebaseCore.modulemap @@ -0,0 +1,6 @@ +framework module FirebaseCore { + umbrella header "FirebaseCore-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/FirebaseCore/FirebaseCore.release.xcconfig b/Pods/Target Support Files/FirebaseCore/FirebaseCore.release.xcconfig new file mode 100644 index 0000000..96425d8 --- /dev/null +++ b/Pods/Target Support Files/FirebaseCore/FirebaseCore.release.xcconfig @@ -0,0 +1,17 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore +DEFINES_MODULE = YES +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreInternal" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 Firebase_VERSION=12.7.0 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_TARGET_SRCROOT}" +OTHER_CFLAGS = $(inherited) -fno-autolink +OTHER_LDFLAGS = $(inherited) -framework "FirebaseCoreInternal" -framework "Foundation" -framework "GoogleUtilities" -framework "Security" -framework "SystemConfiguration" -framework "UIKit" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/FirebaseCore +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/FirebaseCore/ResourceBundle-FirebaseCore_Privacy-FirebaseCore-Info.plist b/Pods/Target Support Files/FirebaseCore/ResourceBundle-FirebaseCore_Privacy-FirebaseCore-Info.plist new file mode 100644 index 0000000..67c6aa7 --- /dev/null +++ b/Pods/Target Support Files/FirebaseCore/ResourceBundle-FirebaseCore_Privacy-FirebaseCore-Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + ${PODS_DEVELOPMENT_LANGUAGE} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + BNDL + CFBundleShortVersionString + 12.7.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/FirebaseCoreExtension/FirebaseCoreExtension-Info.plist b/Pods/Target Support Files/FirebaseCoreExtension/FirebaseCoreExtension-Info.plist new file mode 100644 index 0000000..45e1159 --- /dev/null +++ b/Pods/Target Support Files/FirebaseCoreExtension/FirebaseCoreExtension-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + ${PODS_DEVELOPMENT_LANGUAGE} + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 12.7.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/FirebaseCoreExtension/FirebaseCoreExtension-dummy.m b/Pods/Target Support Files/FirebaseCoreExtension/FirebaseCoreExtension-dummy.m new file mode 100644 index 0000000..945df00 --- /dev/null +++ b/Pods/Target Support Files/FirebaseCoreExtension/FirebaseCoreExtension-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_FirebaseCoreExtension : NSObject +@end +@implementation PodsDummy_FirebaseCoreExtension +@end diff --git a/Pods/Target Support Files/FirebaseCoreExtension/FirebaseCoreExtension-prefix.pch b/Pods/Target Support Files/FirebaseCoreExtension/FirebaseCoreExtension-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/Pods/Target Support Files/FirebaseCoreExtension/FirebaseCoreExtension-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/Pods/Target Support Files/FirebaseCoreExtension/FirebaseCoreExtension-umbrella.h b/Pods/Target Support Files/FirebaseCoreExtension/FirebaseCoreExtension-umbrella.h new file mode 100644 index 0000000..ea5322a --- /dev/null +++ b/Pods/Target Support Files/FirebaseCoreExtension/FirebaseCoreExtension-umbrella.h @@ -0,0 +1,24 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + +#import "FIRAppInternal.h" +#import "FIRComponent.h" +#import "FIRComponentContainer.h" +#import "FIRComponentType.h" +#import "FirebaseCoreInternal.h" +#import "FIRHeartbeatLogger.h" +#import "FIRLibrary.h" +#import "FIRLogger.h" + +FOUNDATION_EXPORT double FirebaseCoreExtensionVersionNumber; +FOUNDATION_EXPORT const unsigned char FirebaseCoreExtensionVersionString[]; + diff --git a/Pods/Target Support Files/FirebaseCoreExtension/FirebaseCoreExtension.debug.xcconfig b/Pods/Target Support Files/FirebaseCoreExtension/FirebaseCoreExtension.debug.xcconfig new file mode 100644 index 0000000..bbfcf2b --- /dev/null +++ b/Pods/Target Support Files/FirebaseCoreExtension/FirebaseCoreExtension.debug.xcconfig @@ -0,0 +1,15 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreExtension +DEFINES_MODULE = YES +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreInternal" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +OTHER_LDFLAGS = $(inherited) -framework "FirebaseCore" -framework "Foundation" -framework "UIKit" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/FirebaseCoreExtension +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/FirebaseCoreExtension/FirebaseCoreExtension.modulemap b/Pods/Target Support Files/FirebaseCoreExtension/FirebaseCoreExtension.modulemap new file mode 100644 index 0000000..34afd4c --- /dev/null +++ b/Pods/Target Support Files/FirebaseCoreExtension/FirebaseCoreExtension.modulemap @@ -0,0 +1,6 @@ +framework module FirebaseCoreExtension { + umbrella header "FirebaseCoreExtension-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/FirebaseCoreExtension/FirebaseCoreExtension.release.xcconfig b/Pods/Target Support Files/FirebaseCoreExtension/FirebaseCoreExtension.release.xcconfig new file mode 100644 index 0000000..bbfcf2b --- /dev/null +++ b/Pods/Target Support Files/FirebaseCoreExtension/FirebaseCoreExtension.release.xcconfig @@ -0,0 +1,15 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreExtension +DEFINES_MODULE = YES +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreInternal" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +OTHER_LDFLAGS = $(inherited) -framework "FirebaseCore" -framework "Foundation" -framework "UIKit" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/FirebaseCoreExtension +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/FirebaseCoreExtension/ResourceBundle-FirebaseCoreExtension_Privacy-FirebaseCoreExtension-Info.plist b/Pods/Target Support Files/FirebaseCoreExtension/ResourceBundle-FirebaseCoreExtension_Privacy-FirebaseCoreExtension-Info.plist new file mode 100644 index 0000000..67c6aa7 --- /dev/null +++ b/Pods/Target Support Files/FirebaseCoreExtension/ResourceBundle-FirebaseCoreExtension_Privacy-FirebaseCoreExtension-Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + ${PODS_DEVELOPMENT_LANGUAGE} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + BNDL + CFBundleShortVersionString + 12.7.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/FirebaseCoreInternal/FirebaseCoreInternal-Info.plist b/Pods/Target Support Files/FirebaseCoreInternal/FirebaseCoreInternal-Info.plist new file mode 100644 index 0000000..45e1159 --- /dev/null +++ b/Pods/Target Support Files/FirebaseCoreInternal/FirebaseCoreInternal-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + ${PODS_DEVELOPMENT_LANGUAGE} + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 12.7.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/FirebaseCoreInternal/FirebaseCoreInternal-dummy.m b/Pods/Target Support Files/FirebaseCoreInternal/FirebaseCoreInternal-dummy.m new file mode 100644 index 0000000..1eb5767 --- /dev/null +++ b/Pods/Target Support Files/FirebaseCoreInternal/FirebaseCoreInternal-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_FirebaseCoreInternal : NSObject +@end +@implementation PodsDummy_FirebaseCoreInternal +@end diff --git a/Pods/Target Support Files/FirebaseCoreInternal/FirebaseCoreInternal-prefix.pch b/Pods/Target Support Files/FirebaseCoreInternal/FirebaseCoreInternal-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/Pods/Target Support Files/FirebaseCoreInternal/FirebaseCoreInternal-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/Pods/Target Support Files/FirebaseCoreInternal/FirebaseCoreInternal-umbrella.h b/Pods/Target Support Files/FirebaseCoreInternal/FirebaseCoreInternal-umbrella.h new file mode 100644 index 0000000..559d38b --- /dev/null +++ b/Pods/Target Support Files/FirebaseCoreInternal/FirebaseCoreInternal-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double FirebaseCoreInternalVersionNumber; +FOUNDATION_EXPORT const unsigned char FirebaseCoreInternalVersionString[]; + diff --git a/Pods/Target Support Files/FirebaseCoreInternal/FirebaseCoreInternal.debug.xcconfig b/Pods/Target Support Files/FirebaseCoreInternal/FirebaseCoreInternal.debug.xcconfig new file mode 100644 index 0000000..7137f77 --- /dev/null +++ b/Pods/Target Support Files/FirebaseCoreInternal/FirebaseCoreInternal.debug.xcconfig @@ -0,0 +1,16 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreInternal +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_LDFLAGS = $(inherited) -framework "GoogleUtilities" -framework "Security" -framework "SystemConfiguration" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/FirebaseCoreInternal +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/FirebaseCoreInternal/FirebaseCoreInternal.modulemap b/Pods/Target Support Files/FirebaseCoreInternal/FirebaseCoreInternal.modulemap new file mode 100644 index 0000000..c5a589e --- /dev/null +++ b/Pods/Target Support Files/FirebaseCoreInternal/FirebaseCoreInternal.modulemap @@ -0,0 +1,6 @@ +framework module FirebaseCoreInternal { + umbrella header "FirebaseCoreInternal-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/FirebaseCoreInternal/FirebaseCoreInternal.release.xcconfig b/Pods/Target Support Files/FirebaseCoreInternal/FirebaseCoreInternal.release.xcconfig new file mode 100644 index 0000000..7137f77 --- /dev/null +++ b/Pods/Target Support Files/FirebaseCoreInternal/FirebaseCoreInternal.release.xcconfig @@ -0,0 +1,16 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreInternal +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_LDFLAGS = $(inherited) -framework "GoogleUtilities" -framework "Security" -framework "SystemConfiguration" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/FirebaseCoreInternal +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/FirebaseCoreInternal/ResourceBundle-FirebaseCoreInternal_Privacy-FirebaseCoreInternal-Info.plist b/Pods/Target Support Files/FirebaseCoreInternal/ResourceBundle-FirebaseCoreInternal_Privacy-FirebaseCoreInternal-Info.plist new file mode 100644 index 0000000..67c6aa7 --- /dev/null +++ b/Pods/Target Support Files/FirebaseCoreInternal/ResourceBundle-FirebaseCoreInternal_Privacy-FirebaseCoreInternal-Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + ${PODS_DEVELOPMENT_LANGUAGE} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + BNDL + CFBundleShortVersionString + 12.7.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/FirebaseCrashlytics/FirebaseCrashlytics-Info.plist b/Pods/Target Support Files/FirebaseCrashlytics/FirebaseCrashlytics-Info.plist new file mode 100644 index 0000000..45e1159 --- /dev/null +++ b/Pods/Target Support Files/FirebaseCrashlytics/FirebaseCrashlytics-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + ${PODS_DEVELOPMENT_LANGUAGE} + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 12.7.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/FirebaseCrashlytics/FirebaseCrashlytics-dummy.m b/Pods/Target Support Files/FirebaseCrashlytics/FirebaseCrashlytics-dummy.m new file mode 100644 index 0000000..b9c73b1 --- /dev/null +++ b/Pods/Target Support Files/FirebaseCrashlytics/FirebaseCrashlytics-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_FirebaseCrashlytics : NSObject +@end +@implementation PodsDummy_FirebaseCrashlytics +@end diff --git a/Pods/Target Support Files/FirebaseCrashlytics/FirebaseCrashlytics-umbrella.h b/Pods/Target Support Files/FirebaseCrashlytics/FirebaseCrashlytics-umbrella.h new file mode 100644 index 0000000..5c3e793 --- /dev/null +++ b/Pods/Target Support Files/FirebaseCrashlytics/FirebaseCrashlytics-umbrella.h @@ -0,0 +1,21 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + +#import "FIRCrashlytics.h" +#import "FIRCrashlyticsReport.h" +#import "FirebaseCrashlytics.h" +#import "FIRExceptionModel.h" +#import "FIRStackFrame.h" + +FOUNDATION_EXPORT double FirebaseCrashlyticsVersionNumber; +FOUNDATION_EXPORT const unsigned char FirebaseCrashlyticsVersionString[]; + diff --git a/Pods/Target Support Files/FirebaseCrashlytics/FirebaseCrashlytics.debug.xcconfig b/Pods/Target Support Files/FirebaseCrashlytics/FirebaseCrashlytics.debug.xcconfig new file mode 100644 index 0000000..ea9dd45 --- /dev/null +++ b/Pods/Target Support Files/FirebaseCrashlytics/FirebaseCrashlytics.debug.xcconfig @@ -0,0 +1,17 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCrashlytics +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreExtension" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreInternal" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseInstallations" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseRemoteConfigInterop" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseSessions" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleDataTransport" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities" "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC" "${PODS_CONFIGURATION_BUILD_DIR}/PromisesSwift" "${PODS_CONFIGURATION_BUILD_DIR}/nanopb" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 CLS_SDK_NAME="Crashlytics iOS SDK" PB_FIELD_32BIT=1 PB_NO_PACKED_STRUCTS=1 PB_ENABLE_MALLOC=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_TARGET_SRCROOT}" +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_LDFLAGS = $(inherited) -l"c++" -l"z" -framework "CoreTelephony" -framework "FBLPromises" -framework "FirebaseCore" -framework "FirebaseInstallations" -framework "FirebaseRemoteConfigInterop" -framework "FirebaseSessions" -framework "Foundation" -framework "GoogleDataTransport" -framework "GoogleUtilities" -framework "Security" -framework "SystemConfiguration" -framework "UIKit" -framework "nanopb" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/FirebaseCrashlytics +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/FirebaseCrashlytics/FirebaseCrashlytics.modulemap b/Pods/Target Support Files/FirebaseCrashlytics/FirebaseCrashlytics.modulemap new file mode 100644 index 0000000..90dc252 --- /dev/null +++ b/Pods/Target Support Files/FirebaseCrashlytics/FirebaseCrashlytics.modulemap @@ -0,0 +1,6 @@ +framework module FirebaseCrashlytics { + umbrella header "FirebaseCrashlytics-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/FirebaseCrashlytics/FirebaseCrashlytics.release.xcconfig b/Pods/Target Support Files/FirebaseCrashlytics/FirebaseCrashlytics.release.xcconfig new file mode 100644 index 0000000..ea9dd45 --- /dev/null +++ b/Pods/Target Support Files/FirebaseCrashlytics/FirebaseCrashlytics.release.xcconfig @@ -0,0 +1,17 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCrashlytics +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreExtension" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreInternal" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseInstallations" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseRemoteConfigInterop" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseSessions" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleDataTransport" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities" "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC" "${PODS_CONFIGURATION_BUILD_DIR}/PromisesSwift" "${PODS_CONFIGURATION_BUILD_DIR}/nanopb" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 CLS_SDK_NAME="Crashlytics iOS SDK" PB_FIELD_32BIT=1 PB_NO_PACKED_STRUCTS=1 PB_ENABLE_MALLOC=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_TARGET_SRCROOT}" +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_LDFLAGS = $(inherited) -l"c++" -l"z" -framework "CoreTelephony" -framework "FBLPromises" -framework "FirebaseCore" -framework "FirebaseInstallations" -framework "FirebaseRemoteConfigInterop" -framework "FirebaseSessions" -framework "Foundation" -framework "GoogleDataTransport" -framework "GoogleUtilities" -framework "Security" -framework "SystemConfiguration" -framework "UIKit" -framework "nanopb" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/FirebaseCrashlytics +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/FirebaseCrashlytics/ResourceBundle-FirebaseCrashlytics_Privacy-FirebaseCrashlytics-Info.plist b/Pods/Target Support Files/FirebaseCrashlytics/ResourceBundle-FirebaseCrashlytics_Privacy-FirebaseCrashlytics-Info.plist new file mode 100644 index 0000000..67c6aa7 --- /dev/null +++ b/Pods/Target Support Files/FirebaseCrashlytics/ResourceBundle-FirebaseCrashlytics_Privacy-FirebaseCrashlytics-Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + ${PODS_DEVELOPMENT_LANGUAGE} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + BNDL + CFBundleShortVersionString + 12.7.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/FirebaseInstallations/FirebaseInstallations-Info.plist b/Pods/Target Support Files/FirebaseInstallations/FirebaseInstallations-Info.plist new file mode 100644 index 0000000..45e1159 --- /dev/null +++ b/Pods/Target Support Files/FirebaseInstallations/FirebaseInstallations-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + ${PODS_DEVELOPMENT_LANGUAGE} + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 12.7.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/FirebaseInstallations/FirebaseInstallations-dummy.m b/Pods/Target Support Files/FirebaseInstallations/FirebaseInstallations-dummy.m new file mode 100644 index 0000000..ae19551 --- /dev/null +++ b/Pods/Target Support Files/FirebaseInstallations/FirebaseInstallations-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_FirebaseInstallations : NSObject +@end +@implementation PodsDummy_FirebaseInstallations +@end diff --git a/Pods/Target Support Files/FirebaseInstallations/FirebaseInstallations-umbrella.h b/Pods/Target Support Files/FirebaseInstallations/FirebaseInstallations-umbrella.h new file mode 100644 index 0000000..431ef45 --- /dev/null +++ b/Pods/Target Support Files/FirebaseInstallations/FirebaseInstallations-umbrella.h @@ -0,0 +1,20 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + +#import "FirebaseInstallations.h" +#import "FIRInstallations.h" +#import "FIRInstallationsAuthTokenResult.h" +#import "FIRInstallationsErrors.h" + +FOUNDATION_EXPORT double FirebaseInstallationsVersionNumber; +FOUNDATION_EXPORT const unsigned char FirebaseInstallationsVersionString[]; + diff --git a/Pods/Target Support Files/FirebaseInstallations/FirebaseInstallations.debug.xcconfig b/Pods/Target Support Files/FirebaseInstallations/FirebaseInstallations.debug.xcconfig new file mode 100644 index 0000000..2eaac76 --- /dev/null +++ b/Pods/Target Support Files/FirebaseInstallations/FirebaseInstallations.debug.xcconfig @@ -0,0 +1,16 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/FirebaseInstallations +DEFINES_MODULE = YES +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreInternal" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities" "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_TARGET_SRCROOT}" +OTHER_LDFLAGS = $(inherited) -framework "FBLPromises" -framework "FirebaseCore" -framework "Foundation" -framework "GoogleUtilities" -framework "Security" -framework "SystemConfiguration" -framework "UIKit" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/FirebaseInstallations +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/FirebaseInstallations/FirebaseInstallations.modulemap b/Pods/Target Support Files/FirebaseInstallations/FirebaseInstallations.modulemap new file mode 100644 index 0000000..f6e2a29 --- /dev/null +++ b/Pods/Target Support Files/FirebaseInstallations/FirebaseInstallations.modulemap @@ -0,0 +1,6 @@ +framework module FirebaseInstallations { + umbrella header "FirebaseInstallations-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/FirebaseInstallations/FirebaseInstallations.release.xcconfig b/Pods/Target Support Files/FirebaseInstallations/FirebaseInstallations.release.xcconfig new file mode 100644 index 0000000..2eaac76 --- /dev/null +++ b/Pods/Target Support Files/FirebaseInstallations/FirebaseInstallations.release.xcconfig @@ -0,0 +1,16 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/FirebaseInstallations +DEFINES_MODULE = YES +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreInternal" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities" "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_TARGET_SRCROOT}" +OTHER_LDFLAGS = $(inherited) -framework "FBLPromises" -framework "FirebaseCore" -framework "Foundation" -framework "GoogleUtilities" -framework "Security" -framework "SystemConfiguration" -framework "UIKit" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/FirebaseInstallations +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/FirebaseInstallations/ResourceBundle-FirebaseInstallations_Privacy-FirebaseInstallations-Info.plist b/Pods/Target Support Files/FirebaseInstallations/ResourceBundle-FirebaseInstallations_Privacy-FirebaseInstallations-Info.plist new file mode 100644 index 0000000..67c6aa7 --- /dev/null +++ b/Pods/Target Support Files/FirebaseInstallations/ResourceBundle-FirebaseInstallations_Privacy-FirebaseInstallations-Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + ${PODS_DEVELOPMENT_LANGUAGE} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + BNDL + CFBundleShortVersionString + 12.7.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/FirebaseRemoteConfigInterop/FirebaseRemoteConfigInterop-Info.plist b/Pods/Target Support Files/FirebaseRemoteConfigInterop/FirebaseRemoteConfigInterop-Info.plist new file mode 100644 index 0000000..45e1159 --- /dev/null +++ b/Pods/Target Support Files/FirebaseRemoteConfigInterop/FirebaseRemoteConfigInterop-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + ${PODS_DEVELOPMENT_LANGUAGE} + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 12.7.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/FirebaseRemoteConfigInterop/FirebaseRemoteConfigInterop-dummy.m b/Pods/Target Support Files/FirebaseRemoteConfigInterop/FirebaseRemoteConfigInterop-dummy.m new file mode 100644 index 0000000..5d07229 --- /dev/null +++ b/Pods/Target Support Files/FirebaseRemoteConfigInterop/FirebaseRemoteConfigInterop-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_FirebaseRemoteConfigInterop : NSObject +@end +@implementation PodsDummy_FirebaseRemoteConfigInterop +@end diff --git a/Pods/Target Support Files/FirebaseRemoteConfigInterop/FirebaseRemoteConfigInterop-umbrella.h b/Pods/Target Support Files/FirebaseRemoteConfigInterop/FirebaseRemoteConfigInterop-umbrella.h new file mode 100644 index 0000000..192520e --- /dev/null +++ b/Pods/Target Support Files/FirebaseRemoteConfigInterop/FirebaseRemoteConfigInterop-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double FirebaseRemoteConfigInteropVersionNumber; +FOUNDATION_EXPORT const unsigned char FirebaseRemoteConfigInteropVersionString[]; + diff --git a/Pods/Target Support Files/FirebaseRemoteConfigInterop/FirebaseRemoteConfigInterop.debug.xcconfig b/Pods/Target Support Files/FirebaseRemoteConfigInterop/FirebaseRemoteConfigInterop.debug.xcconfig new file mode 100644 index 0000000..9cec78a --- /dev/null +++ b/Pods/Target Support Files/FirebaseRemoteConfigInterop/FirebaseRemoteConfigInterop.debug.xcconfig @@ -0,0 +1,14 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/FirebaseRemoteConfigInterop +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/FirebaseRemoteConfigInterop +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/FirebaseRemoteConfigInterop/FirebaseRemoteConfigInterop.modulemap b/Pods/Target Support Files/FirebaseRemoteConfigInterop/FirebaseRemoteConfigInterop.modulemap new file mode 100644 index 0000000..45f9a1a --- /dev/null +++ b/Pods/Target Support Files/FirebaseRemoteConfigInterop/FirebaseRemoteConfigInterop.modulemap @@ -0,0 +1,6 @@ +framework module FirebaseRemoteConfigInterop { + umbrella header "FirebaseRemoteConfigInterop-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/FirebaseRemoteConfigInterop/FirebaseRemoteConfigInterop.release.xcconfig b/Pods/Target Support Files/FirebaseRemoteConfigInterop/FirebaseRemoteConfigInterop.release.xcconfig new file mode 100644 index 0000000..9cec78a --- /dev/null +++ b/Pods/Target Support Files/FirebaseRemoteConfigInterop/FirebaseRemoteConfigInterop.release.xcconfig @@ -0,0 +1,14 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/FirebaseRemoteConfigInterop +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/FirebaseRemoteConfigInterop +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/FirebaseSessions/FirebaseSessions-Info.plist b/Pods/Target Support Files/FirebaseSessions/FirebaseSessions-Info.plist new file mode 100644 index 0000000..45e1159 --- /dev/null +++ b/Pods/Target Support Files/FirebaseSessions/FirebaseSessions-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + ${PODS_DEVELOPMENT_LANGUAGE} + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 12.7.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/FirebaseSessions/FirebaseSessions-dummy.m b/Pods/Target Support Files/FirebaseSessions/FirebaseSessions-dummy.m new file mode 100644 index 0000000..43c1d3d --- /dev/null +++ b/Pods/Target Support Files/FirebaseSessions/FirebaseSessions-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_FirebaseSessions : NSObject +@end +@implementation PodsDummy_FirebaseSessions +@end diff --git a/Pods/Target Support Files/FirebaseSessions/FirebaseSessions-umbrella.h b/Pods/Target Support Files/FirebaseSessions/FirebaseSessions-umbrella.h new file mode 100644 index 0000000..f0032f8 --- /dev/null +++ b/Pods/Target Support Files/FirebaseSessions/FirebaseSessions-umbrella.h @@ -0,0 +1,18 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + +#import "FIRSESNanoPBHelpers.h" +#import "sessions.nanopb.h" + +FOUNDATION_EXPORT double FirebaseSessionsVersionNumber; +FOUNDATION_EXPORT const unsigned char FirebaseSessionsVersionString[]; + diff --git a/Pods/Target Support Files/FirebaseSessions/FirebaseSessions.debug.xcconfig b/Pods/Target Support Files/FirebaseSessions/FirebaseSessions.debug.xcconfig new file mode 100644 index 0000000..9de65d1 --- /dev/null +++ b/Pods/Target Support Files/FirebaseSessions/FirebaseSessions.debug.xcconfig @@ -0,0 +1,17 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/FirebaseSessions +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreExtension" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreInternal" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseInstallations" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleDataTransport" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities" "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC" "${PODS_CONFIGURATION_BUILD_DIR}/PromisesSwift" "${PODS_CONFIGURATION_BUILD_DIR}/nanopb" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 PB_FIELD_32BIT=1 PB_NO_PACKED_STRUCTS=1 PB_ENABLE_MALLOC=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_TARGET_SRCROOT}" +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_LDFLAGS = $(inherited) -framework "CoreTelephony" -framework "FirebaseCore" -framework "FirebaseCoreExtension" -framework "FirebaseInstallations" -framework "Foundation" -framework "GoogleDataTransport" -framework "GoogleUtilities" -framework "Promises" -framework "Security" -framework "SystemConfiguration" -framework "UIKit" -framework "nanopb" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/FirebaseSessions +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/FirebaseSessions/FirebaseSessions.modulemap b/Pods/Target Support Files/FirebaseSessions/FirebaseSessions.modulemap new file mode 100644 index 0000000..5989a78 --- /dev/null +++ b/Pods/Target Support Files/FirebaseSessions/FirebaseSessions.modulemap @@ -0,0 +1,6 @@ +framework module FirebaseSessions { + umbrella header "FirebaseSessions-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/FirebaseSessions/FirebaseSessions.release.xcconfig b/Pods/Target Support Files/FirebaseSessions/FirebaseSessions.release.xcconfig new file mode 100644 index 0000000..9de65d1 --- /dev/null +++ b/Pods/Target Support Files/FirebaseSessions/FirebaseSessions.release.xcconfig @@ -0,0 +1,17 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/FirebaseSessions +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreExtension" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreInternal" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseInstallations" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleDataTransport" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities" "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC" "${PODS_CONFIGURATION_BUILD_DIR}/PromisesSwift" "${PODS_CONFIGURATION_BUILD_DIR}/nanopb" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 PB_FIELD_32BIT=1 PB_NO_PACKED_STRUCTS=1 PB_ENABLE_MALLOC=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_TARGET_SRCROOT}" +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_LDFLAGS = $(inherited) -framework "CoreTelephony" -framework "FirebaseCore" -framework "FirebaseCoreExtension" -framework "FirebaseInstallations" -framework "Foundation" -framework "GoogleDataTransport" -framework "GoogleUtilities" -framework "Promises" -framework "Security" -framework "SystemConfiguration" -framework "UIKit" -framework "nanopb" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/FirebaseSessions +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/GoogleAdsOnDeviceConversion/GoogleAdsOnDeviceConversion-xcframeworks-input-files.xcfilelist b/Pods/Target Support Files/GoogleAdsOnDeviceConversion/GoogleAdsOnDeviceConversion-xcframeworks-input-files.xcfilelist new file mode 100644 index 0000000..74c8bc0 --- /dev/null +++ b/Pods/Target Support Files/GoogleAdsOnDeviceConversion/GoogleAdsOnDeviceConversion-xcframeworks-input-files.xcfilelist @@ -0,0 +1,2 @@ +${PODS_ROOT}/Target Support Files/GoogleAdsOnDeviceConversion/GoogleAdsOnDeviceConversion-xcframeworks.sh +${PODS_ROOT}/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework \ No newline at end of file diff --git a/Pods/Target Support Files/GoogleAdsOnDeviceConversion/GoogleAdsOnDeviceConversion-xcframeworks-output-files.xcfilelist b/Pods/Target Support Files/GoogleAdsOnDeviceConversion/GoogleAdsOnDeviceConversion-xcframeworks-output-files.xcfilelist new file mode 100644 index 0000000..5352a45 --- /dev/null +++ b/Pods/Target Support Files/GoogleAdsOnDeviceConversion/GoogleAdsOnDeviceConversion-xcframeworks-output-files.xcfilelist @@ -0,0 +1 @@ +${PODS_XCFRAMEWORKS_BUILD_DIR}/GoogleAdsOnDeviceConversion/GoogleAdsOnDeviceConversion.framework \ No newline at end of file diff --git a/Pods/Target Support Files/GoogleAdsOnDeviceConversion/GoogleAdsOnDeviceConversion-xcframeworks.sh b/Pods/Target Support Files/GoogleAdsOnDeviceConversion/GoogleAdsOnDeviceConversion-xcframeworks.sh new file mode 100755 index 0000000..8a1557b --- /dev/null +++ b/Pods/Target Support Files/GoogleAdsOnDeviceConversion/GoogleAdsOnDeviceConversion-xcframeworks.sh @@ -0,0 +1,121 @@ +#!/bin/sh +set -e +set -u +set -o pipefail + +function on_error { + echo "$(realpath -mq "${0}"):$1: error: Unexpected failure" +} +trap 'on_error $LINENO' ERR + + +# This protects against multiple targets copying the same framework dependency at the same time. The solution +# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html +RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") + + +variant_for_slice() +{ + case "$1" in + "GoogleAdsOnDeviceConversion.xcframework/ios-arm64") + echo "" + ;; + "GoogleAdsOnDeviceConversion.xcframework/ios-arm64_x86_64-simulator") + echo "simulator" + ;; + esac +} + +archs_for_slice() +{ + case "$1" in + "GoogleAdsOnDeviceConversion.xcframework/ios-arm64") + echo "arm64" + ;; + "GoogleAdsOnDeviceConversion.xcframework/ios-arm64_x86_64-simulator") + echo "arm64 x86_64" + ;; + esac +} + +copy_dir() +{ + local source="$1" + local destination="$2" + + # Use filter instead of exclude so missing patterns don't throw errors. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" \"${source}*\" \"${destination}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" "${source}"/* "${destination}" +} + +SELECT_SLICE_RETVAL="" + +select_slice() { + local xcframework_name="$1" + xcframework_name="${xcframework_name##*/}" + local paths=("${@:2}") + # Locate the correct slice of the .xcframework for the current architectures + local target_path="" + + # Split archs on space so we can find a slice that has all the needed archs + local target_archs=$(echo $ARCHS | tr " " "\n") + + local target_variant="" + if [[ "$PLATFORM_NAME" == *"simulator" ]]; then + target_variant="simulator" + fi + if [[ ! -z ${EFFECTIVE_PLATFORM_NAME+x} && "$EFFECTIVE_PLATFORM_NAME" == *"maccatalyst" ]]; then + target_variant="maccatalyst" + fi + for i in ${!paths[@]}; do + local matched_all_archs="1" + local slice_archs="$(archs_for_slice "${xcframework_name}/${paths[$i]}")" + local slice_variant="$(variant_for_slice "${xcframework_name}/${paths[$i]}")" + for target_arch in $target_archs; do + if ! [[ "${slice_variant}" == "$target_variant" ]]; then + matched_all_archs="0" + break + fi + + if ! echo "${slice_archs}" | tr " " "\n" | grep -F -q -x "$target_arch"; then + matched_all_archs="0" + break + fi + done + + if [[ "$matched_all_archs" == "1" ]]; then + # Found a matching slice + echo "Selected xcframework slice ${paths[$i]}" + SELECT_SLICE_RETVAL=${paths[$i]} + break + fi + done +} + +install_xcframework() { + local basepath="$1" + local name="$2" + local package_type="$3" + local paths=("${@:4}") + + # Locate the correct slice of the .xcframework for the current architectures + select_slice "${basepath}" "${paths[@]}" + local target_path="$SELECT_SLICE_RETVAL" + if [[ -z "$target_path" ]]; then + echo "warning: [CP] $(basename ${basepath}): Unable to find matching slice in '${paths[@]}' for the current build architectures ($ARCHS) and platform (${EFFECTIVE_PLATFORM_NAME-${PLATFORM_NAME}})." + return + fi + local source="$basepath/$target_path" + + local destination="${PODS_XCFRAMEWORKS_BUILD_DIR}/${name}" + + if [ ! -d "$destination" ]; then + mkdir -p "$destination" + fi + + copy_dir "$source/" "$destination" + echo "Copied $source to $destination" +} + +install_xcframework "${PODS_ROOT}/GoogleAdsOnDeviceConversion/Frameworks/GoogleAdsOnDeviceConversion.xcframework" "GoogleAdsOnDeviceConversion" "framework" "ios-arm64" "ios-arm64_x86_64-simulator" + diff --git a/Pods/Target Support Files/GoogleAdsOnDeviceConversion/GoogleAdsOnDeviceConversion.debug.xcconfig b/Pods/Target Support Files/GoogleAdsOnDeviceConversion/GoogleAdsOnDeviceConversion.debug.xcconfig new file mode 100644 index 0000000..1a45c0f --- /dev/null +++ b/Pods/Target Support Files/GoogleAdsOnDeviceConversion/GoogleAdsOnDeviceConversion.debug.xcconfig @@ -0,0 +1,14 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/GoogleAdsOnDeviceConversion +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities" "${PODS_CONFIGURATION_BUILD_DIR}/nanopb" "${PODS_ROOT}/GoogleAdsOnDeviceConversion/Frameworks" "${PODS_XCFRAMEWORKS_BUILD_DIR}/GoogleAdsOnDeviceConversion" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +OTHER_LDFLAGS = $(inherited) -l"c++" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/GoogleAdsOnDeviceConversion +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/GoogleAdsOnDeviceConversion/GoogleAdsOnDeviceConversion.release.xcconfig b/Pods/Target Support Files/GoogleAdsOnDeviceConversion/GoogleAdsOnDeviceConversion.release.xcconfig new file mode 100644 index 0000000..1a45c0f --- /dev/null +++ b/Pods/Target Support Files/GoogleAdsOnDeviceConversion/GoogleAdsOnDeviceConversion.release.xcconfig @@ -0,0 +1,14 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/GoogleAdsOnDeviceConversion +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities" "${PODS_CONFIGURATION_BUILD_DIR}/nanopb" "${PODS_ROOT}/GoogleAdsOnDeviceConversion/Frameworks" "${PODS_XCFRAMEWORKS_BUILD_DIR}/GoogleAdsOnDeviceConversion" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +OTHER_LDFLAGS = $(inherited) -l"c++" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/GoogleAdsOnDeviceConversion +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/GoogleAppMeasurement/GoogleAppMeasurement-xcframeworks-input-files.xcfilelist b/Pods/Target Support Files/GoogleAppMeasurement/GoogleAppMeasurement-xcframeworks-input-files.xcfilelist new file mode 100644 index 0000000..6827a1a --- /dev/null +++ b/Pods/Target Support Files/GoogleAppMeasurement/GoogleAppMeasurement-xcframeworks-input-files.xcfilelist @@ -0,0 +1,3 @@ +${PODS_ROOT}/Target Support Files/GoogleAppMeasurement/GoogleAppMeasurement-xcframeworks.sh +${PODS_ROOT}/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework +${PODS_ROOT}/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework \ No newline at end of file diff --git a/Pods/Target Support Files/GoogleAppMeasurement/GoogleAppMeasurement-xcframeworks-output-files.xcfilelist b/Pods/Target Support Files/GoogleAppMeasurement/GoogleAppMeasurement-xcframeworks-output-files.xcfilelist new file mode 100644 index 0000000..a6d2b30 --- /dev/null +++ b/Pods/Target Support Files/GoogleAppMeasurement/GoogleAppMeasurement-xcframeworks-output-files.xcfilelist @@ -0,0 +1,2 @@ +${PODS_XCFRAMEWORKS_BUILD_DIR}/GoogleAppMeasurement/Core/GoogleAppMeasurement.framework +${PODS_XCFRAMEWORKS_BUILD_DIR}/GoogleAppMeasurement/IdentitySupport/GoogleAppMeasurementIdentitySupport.framework \ No newline at end of file diff --git a/Pods/Target Support Files/GoogleAppMeasurement/GoogleAppMeasurement-xcframeworks.sh b/Pods/Target Support Files/GoogleAppMeasurement/GoogleAppMeasurement-xcframeworks.sh new file mode 100755 index 0000000..407ab9c --- /dev/null +++ b/Pods/Target Support Files/GoogleAppMeasurement/GoogleAppMeasurement-xcframeworks.sh @@ -0,0 +1,182 @@ +#!/bin/sh +set -e +set -u +set -o pipefail + +function on_error { + echo "$(realpath -mq "${0}"):$1: error: Unexpected failure" +} +trap 'on_error $LINENO' ERR + + +# This protects against multiple targets copying the same framework dependency at the same time. The solution +# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html +RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") + + +variant_for_slice() +{ + case "$1" in + "GoogleAppMeasurement.xcframework/ios-arm64") + echo "" + ;; + "GoogleAppMeasurement.xcframework/ios-arm64_x86_64-maccatalyst") + echo "maccatalyst" + ;; + "GoogleAppMeasurement.xcframework/ios-arm64_x86_64-simulator") + echo "simulator" + ;; + "GoogleAppMeasurement.xcframework/macos-arm64_x86_64") + echo "" + ;; + "GoogleAppMeasurement.xcframework/tvos-arm64") + echo "" + ;; + "GoogleAppMeasurement.xcframework/tvos-arm64_x86_64-simulator") + echo "simulator" + ;; + "GoogleAppMeasurementIdentitySupport.xcframework/ios-arm64") + echo "" + ;; + "GoogleAppMeasurementIdentitySupport.xcframework/ios-arm64_x86_64-maccatalyst") + echo "maccatalyst" + ;; + "GoogleAppMeasurementIdentitySupport.xcframework/ios-arm64_x86_64-simulator") + echo "simulator" + ;; + "GoogleAppMeasurementIdentitySupport.xcframework/macos-arm64_x86_64") + echo "" + ;; + "GoogleAppMeasurementIdentitySupport.xcframework/tvos-arm64") + echo "" + ;; + "GoogleAppMeasurementIdentitySupport.xcframework/tvos-arm64_x86_64-simulator") + echo "simulator" + ;; + esac +} + +archs_for_slice() +{ + case "$1" in + "GoogleAppMeasurement.xcframework/ios-arm64") + echo "arm64" + ;; + "GoogleAppMeasurement.xcframework/ios-arm64_x86_64-maccatalyst") + echo "arm64 x86_64" + ;; + "GoogleAppMeasurement.xcframework/ios-arm64_x86_64-simulator") + echo "arm64 x86_64" + ;; + "GoogleAppMeasurement.xcframework/macos-arm64_x86_64") + echo "arm64 x86_64" + ;; + "GoogleAppMeasurement.xcframework/tvos-arm64") + echo "arm64" + ;; + "GoogleAppMeasurement.xcframework/tvos-arm64_x86_64-simulator") + echo "arm64 x86_64" + ;; + "GoogleAppMeasurementIdentitySupport.xcframework/ios-arm64") + echo "arm64" + ;; + "GoogleAppMeasurementIdentitySupport.xcframework/ios-arm64_x86_64-maccatalyst") + echo "arm64 x86_64" + ;; + "GoogleAppMeasurementIdentitySupport.xcframework/ios-arm64_x86_64-simulator") + echo "arm64 x86_64" + ;; + "GoogleAppMeasurementIdentitySupport.xcframework/macos-arm64_x86_64") + echo "arm64 x86_64" + ;; + "GoogleAppMeasurementIdentitySupport.xcframework/tvos-arm64") + echo "arm64" + ;; + "GoogleAppMeasurementIdentitySupport.xcframework/tvos-arm64_x86_64-simulator") + echo "arm64 x86_64" + ;; + esac +} + +copy_dir() +{ + local source="$1" + local destination="$2" + + # Use filter instead of exclude so missing patterns don't throw errors. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" \"${source}*\" \"${destination}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" "${source}"/* "${destination}" +} + +SELECT_SLICE_RETVAL="" + +select_slice() { + local xcframework_name="$1" + xcframework_name="${xcframework_name##*/}" + local paths=("${@:2}") + # Locate the correct slice of the .xcframework for the current architectures + local target_path="" + + # Split archs on space so we can find a slice that has all the needed archs + local target_archs=$(echo $ARCHS | tr " " "\n") + + local target_variant="" + if [[ "$PLATFORM_NAME" == *"simulator" ]]; then + target_variant="simulator" + fi + if [[ ! -z ${EFFECTIVE_PLATFORM_NAME+x} && "$EFFECTIVE_PLATFORM_NAME" == *"maccatalyst" ]]; then + target_variant="maccatalyst" + fi + for i in ${!paths[@]}; do + local matched_all_archs="1" + local slice_archs="$(archs_for_slice "${xcframework_name}/${paths[$i]}")" + local slice_variant="$(variant_for_slice "${xcframework_name}/${paths[$i]}")" + for target_arch in $target_archs; do + if ! [[ "${slice_variant}" == "$target_variant" ]]; then + matched_all_archs="0" + break + fi + + if ! echo "${slice_archs}" | tr " " "\n" | grep -F -q -x "$target_arch"; then + matched_all_archs="0" + break + fi + done + + if [[ "$matched_all_archs" == "1" ]]; then + # Found a matching slice + echo "Selected xcframework slice ${paths[$i]}" + SELECT_SLICE_RETVAL=${paths[$i]} + break + fi + done +} + +install_xcframework() { + local basepath="$1" + local name="$2" + local package_type="$3" + local paths=("${@:4}") + + # Locate the correct slice of the .xcframework for the current architectures + select_slice "${basepath}" "${paths[@]}" + local target_path="$SELECT_SLICE_RETVAL" + if [[ -z "$target_path" ]]; then + echo "warning: [CP] $(basename ${basepath}): Unable to find matching slice in '${paths[@]}' for the current build architectures ($ARCHS) and platform (${EFFECTIVE_PLATFORM_NAME-${PLATFORM_NAME}})." + return + fi + local source="$basepath/$target_path" + + local destination="${PODS_XCFRAMEWORKS_BUILD_DIR}/${name}" + + if [ ! -d "$destination" ]; then + mkdir -p "$destination" + fi + + copy_dir "$source/" "$destination" + echo "Copied $source to $destination" +} + +install_xcframework "${PODS_ROOT}/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework" "GoogleAppMeasurement/Core" "framework" "ios-arm64" "ios-arm64_x86_64-maccatalyst" "ios-arm64_x86_64-simulator" +install_xcframework "${PODS_ROOT}/GoogleAppMeasurement/Frameworks/GoogleAppMeasurementIdentitySupport.xcframework" "GoogleAppMeasurement/IdentitySupport" "framework" "ios-arm64" "ios-arm64_x86_64-maccatalyst" "ios-arm64_x86_64-simulator" + diff --git a/Pods/Target Support Files/GoogleAppMeasurement/GoogleAppMeasurement.debug.xcconfig b/Pods/Target Support Files/GoogleAppMeasurement/GoogleAppMeasurement.debug.xcconfig new file mode 100644 index 0000000..2dd602a --- /dev/null +++ b/Pods/Target Support Files/GoogleAppMeasurement/GoogleAppMeasurement.debug.xcconfig @@ -0,0 +1,14 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/GoogleAppMeasurement +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities" "${PODS_CONFIGURATION_BUILD_DIR}/nanopb" "${PODS_ROOT}/GoogleAdsOnDeviceConversion/Frameworks" "${PODS_ROOT}/GoogleAppMeasurement/Frameworks" "${PODS_XCFRAMEWORKS_BUILD_DIR}/GoogleAdsOnDeviceConversion" "${PODS_XCFRAMEWORKS_BUILD_DIR}/GoogleAppMeasurement/Core" "${PODS_XCFRAMEWORKS_BUILD_DIR}/GoogleAppMeasurement/IdentitySupport" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +OTHER_LDFLAGS = $(inherited) -l"c++" -l"sqlite3" -l"z" -framework "StoreKit" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/GoogleAppMeasurement +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/GoogleAppMeasurement/GoogleAppMeasurement.release.xcconfig b/Pods/Target Support Files/GoogleAppMeasurement/GoogleAppMeasurement.release.xcconfig new file mode 100644 index 0000000..2dd602a --- /dev/null +++ b/Pods/Target Support Files/GoogleAppMeasurement/GoogleAppMeasurement.release.xcconfig @@ -0,0 +1,14 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/GoogleAppMeasurement +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities" "${PODS_CONFIGURATION_BUILD_DIR}/nanopb" "${PODS_ROOT}/GoogleAdsOnDeviceConversion/Frameworks" "${PODS_ROOT}/GoogleAppMeasurement/Frameworks" "${PODS_XCFRAMEWORKS_BUILD_DIR}/GoogleAdsOnDeviceConversion" "${PODS_XCFRAMEWORKS_BUILD_DIR}/GoogleAppMeasurement/Core" "${PODS_XCFRAMEWORKS_BUILD_DIR}/GoogleAppMeasurement/IdentitySupport" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +OTHER_LDFLAGS = $(inherited) -l"c++" -l"sqlite3" -l"z" -framework "StoreKit" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/GoogleAppMeasurement +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/GoogleDataTransport/GoogleDataTransport-Info.plist b/Pods/Target Support Files/GoogleDataTransport/GoogleDataTransport-Info.plist new file mode 100644 index 0000000..3ce28c0 --- /dev/null +++ b/Pods/Target Support Files/GoogleDataTransport/GoogleDataTransport-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + ${PODS_DEVELOPMENT_LANGUAGE} + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 10.1.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/GoogleDataTransport/GoogleDataTransport-dummy.m b/Pods/Target Support Files/GoogleDataTransport/GoogleDataTransport-dummy.m new file mode 100644 index 0000000..9a08ec3 --- /dev/null +++ b/Pods/Target Support Files/GoogleDataTransport/GoogleDataTransport-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_GoogleDataTransport : NSObject +@end +@implementation PodsDummy_GoogleDataTransport +@end diff --git a/Pods/Target Support Files/GoogleDataTransport/GoogleDataTransport-umbrella.h b/Pods/Target Support Files/GoogleDataTransport/GoogleDataTransport-umbrella.h new file mode 100644 index 0000000..368a3aa --- /dev/null +++ b/Pods/Target Support Files/GoogleDataTransport/GoogleDataTransport-umbrella.h @@ -0,0 +1,26 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + +#import "GDTCORClock.h" +#import "GDTCORConsoleLogger.h" +#import "GDTCOREndpoints.h" +#import "GDTCOREvent.h" +#import "GDTCOREventDataObject.h" +#import "GDTCOREventTransformer.h" +#import "GDTCORProductData.h" +#import "GDTCORTargets.h" +#import "GDTCORTransport.h" +#import "GoogleDataTransport.h" + +FOUNDATION_EXPORT double GoogleDataTransportVersionNumber; +FOUNDATION_EXPORT const unsigned char GoogleDataTransportVersionString[]; + diff --git a/Pods/Target Support Files/GoogleDataTransport/GoogleDataTransport.debug.xcconfig b/Pods/Target Support Files/GoogleDataTransport/GoogleDataTransport.debug.xcconfig new file mode 100644 index 0000000..4557a14 --- /dev/null +++ b/Pods/Target Support Files/GoogleDataTransport/GoogleDataTransport.debug.xcconfig @@ -0,0 +1,17 @@ +CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/GoogleDataTransport +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC" "${PODS_CONFIGURATION_BUILD_DIR}/nanopb" +GCC_C_LANGUAGE_STANDARD = c99 +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 PB_FIELD_32BIT=1 PB_NO_PACKED_STRUCTS=1 PB_ENABLE_MALLOC=1GDTCOR_VERSION=10.1.0 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_TARGET_SRCROOT}/" +OTHER_LDFLAGS = $(inherited) -l"z" -framework "CoreTelephony" -framework "FBLPromises" -framework "SystemConfiguration" -framework "nanopb" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/GoogleDataTransport +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/GoogleDataTransport/GoogleDataTransport.modulemap b/Pods/Target Support Files/GoogleDataTransport/GoogleDataTransport.modulemap new file mode 100644 index 0000000..8a67414 --- /dev/null +++ b/Pods/Target Support Files/GoogleDataTransport/GoogleDataTransport.modulemap @@ -0,0 +1,6 @@ +framework module GoogleDataTransport { + umbrella header "GoogleDataTransport-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/GoogleDataTransport/GoogleDataTransport.release.xcconfig b/Pods/Target Support Files/GoogleDataTransport/GoogleDataTransport.release.xcconfig new file mode 100644 index 0000000..4557a14 --- /dev/null +++ b/Pods/Target Support Files/GoogleDataTransport/GoogleDataTransport.release.xcconfig @@ -0,0 +1,17 @@ +CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/GoogleDataTransport +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC" "${PODS_CONFIGURATION_BUILD_DIR}/nanopb" +GCC_C_LANGUAGE_STANDARD = c99 +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 PB_FIELD_32BIT=1 PB_NO_PACKED_STRUCTS=1 PB_ENABLE_MALLOC=1GDTCOR_VERSION=10.1.0 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_TARGET_SRCROOT}/" +OTHER_LDFLAGS = $(inherited) -l"z" -framework "CoreTelephony" -framework "FBLPromises" -framework "SystemConfiguration" -framework "nanopb" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/GoogleDataTransport +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/GoogleDataTransport/ResourceBundle-GoogleDataTransport_Privacy-GoogleDataTransport-Info.plist b/Pods/Target Support Files/GoogleDataTransport/ResourceBundle-GoogleDataTransport_Privacy-GoogleDataTransport-Info.plist new file mode 100644 index 0000000..728a55b --- /dev/null +++ b/Pods/Target Support Files/GoogleDataTransport/ResourceBundle-GoogleDataTransport_Privacy-GoogleDataTransport-Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + ${PODS_DEVELOPMENT_LANGUAGE} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + BNDL + CFBundleShortVersionString + 10.1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/GoogleUtilities/GoogleUtilities-Info.plist b/Pods/Target Support Files/GoogleUtilities/GoogleUtilities-Info.plist new file mode 100644 index 0000000..b9c6265 --- /dev/null +++ b/Pods/Target Support Files/GoogleUtilities/GoogleUtilities-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + ${PODS_DEVELOPMENT_LANGUAGE} + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 8.1.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/GoogleUtilities/GoogleUtilities-dummy.m b/Pods/Target Support Files/GoogleUtilities/GoogleUtilities-dummy.m new file mode 100644 index 0000000..98ac4e9 --- /dev/null +++ b/Pods/Target Support Files/GoogleUtilities/GoogleUtilities-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_GoogleUtilities : NSObject +@end +@implementation PodsDummy_GoogleUtilities +@end diff --git a/Pods/Target Support Files/GoogleUtilities/GoogleUtilities-umbrella.h b/Pods/Target Support Files/GoogleUtilities/GoogleUtilities-umbrella.h new file mode 100644 index 0000000..907b89e --- /dev/null +++ b/Pods/Target Support Files/GoogleUtilities/GoogleUtilities-umbrella.h @@ -0,0 +1,36 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + +#import "GULAppDelegateSwizzler.h" +#import "GULApplication.h" +#import "GULSceneDelegateSwizzler.h" +#import "GULAppEnvironmentUtil.h" +#import "GULKeychainStorage.h" +#import "GULKeychainUtils.h" +#import "GULNetworkInfo.h" +#import "GULLogger.h" +#import "GULLoggerLevel.h" +#import "GULOriginalIMPConvenienceMacros.h" +#import "GULSwizzler.h" +#import "GULNSData+zlib.h" +#import "GULMutableDictionary.h" +#import "GULNetwork.h" +#import "GULNetworkConstants.h" +#import "GULNetworkLoggerProtocol.h" +#import "GULNetworkMessageCode.h" +#import "GULNetworkURLSession.h" +#import "GULReachabilityChecker.h" +#import "GULUserDefaults.h" + +FOUNDATION_EXPORT double GoogleUtilitiesVersionNumber; +FOUNDATION_EXPORT const unsigned char GoogleUtilitiesVersionString[]; + diff --git a/Pods/Target Support Files/GoogleUtilities/GoogleUtilities.debug.xcconfig b/Pods/Target Support Files/GoogleUtilities/GoogleUtilities.debug.xcconfig new file mode 100644 index 0000000..cacc27c --- /dev/null +++ b/Pods/Target Support Files/GoogleUtilities/GoogleUtilities.debug.xcconfig @@ -0,0 +1,15 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities +GCC_C_LANGUAGE_STANDARD = c99 +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_TARGET_SRCROOT}" +OTHER_LDFLAGS = $(inherited) -l"z" -framework "Security" -framework "SystemConfiguration" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/GoogleUtilities +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/GoogleUtilities/GoogleUtilities.modulemap b/Pods/Target Support Files/GoogleUtilities/GoogleUtilities.modulemap new file mode 100644 index 0000000..491dd0a --- /dev/null +++ b/Pods/Target Support Files/GoogleUtilities/GoogleUtilities.modulemap @@ -0,0 +1,6 @@ +framework module GoogleUtilities { + umbrella header "GoogleUtilities-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/GoogleUtilities/GoogleUtilities.release.xcconfig b/Pods/Target Support Files/GoogleUtilities/GoogleUtilities.release.xcconfig new file mode 100644 index 0000000..cacc27c --- /dev/null +++ b/Pods/Target Support Files/GoogleUtilities/GoogleUtilities.release.xcconfig @@ -0,0 +1,15 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities +GCC_C_LANGUAGE_STANDARD = c99 +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_TARGET_SRCROOT}" +OTHER_LDFLAGS = $(inherited) -l"z" -framework "Security" -framework "SystemConfiguration" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/GoogleUtilities +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/GoogleUtilities/ResourceBundle-GoogleUtilities_Privacy-GoogleUtilities-Info.plist b/Pods/Target Support Files/GoogleUtilities/ResourceBundle-GoogleUtilities_Privacy-GoogleUtilities-Info.plist new file mode 100644 index 0000000..2393462 --- /dev/null +++ b/Pods/Target Support Files/GoogleUtilities/ResourceBundle-GoogleUtilities_Privacy-GoogleUtilities-Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + ${PODS_DEVELOPMENT_LANGUAGE} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + BNDL + CFBundleShortVersionString + 8.1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/IronSourceAdQualitySDK/IronSourceAdQualitySDK-xcframeworks-input-files.xcfilelist b/Pods/Target Support Files/IronSourceAdQualitySDK/IronSourceAdQualitySDK-xcframeworks-input-files.xcfilelist new file mode 100644 index 0000000..d5fc2e1 --- /dev/null +++ b/Pods/Target Support Files/IronSourceAdQualitySDK/IronSourceAdQualitySDK-xcframeworks-input-files.xcfilelist @@ -0,0 +1,2 @@ +${PODS_ROOT}/Target Support Files/IronSourceAdQualitySDK/IronSourceAdQualitySDK-xcframeworks.sh +${PODS_ROOT}/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework \ No newline at end of file diff --git a/Pods/Target Support Files/IronSourceAdQualitySDK/IronSourceAdQualitySDK-xcframeworks-output-files.xcfilelist b/Pods/Target Support Files/IronSourceAdQualitySDK/IronSourceAdQualitySDK-xcframeworks-output-files.xcfilelist new file mode 100644 index 0000000..e5b945b --- /dev/null +++ b/Pods/Target Support Files/IronSourceAdQualitySDK/IronSourceAdQualitySDK-xcframeworks-output-files.xcfilelist @@ -0,0 +1 @@ +${PODS_XCFRAMEWORKS_BUILD_DIR}/IronSourceAdQualitySDK/IronSourceAdQualitySDK.framework \ No newline at end of file diff --git a/Pods/Target Support Files/IronSourceAdQualitySDK/IronSourceAdQualitySDK-xcframeworks.sh b/Pods/Target Support Files/IronSourceAdQualitySDK/IronSourceAdQualitySDK-xcframeworks.sh new file mode 100755 index 0000000..42c9314 --- /dev/null +++ b/Pods/Target Support Files/IronSourceAdQualitySDK/IronSourceAdQualitySDK-xcframeworks.sh @@ -0,0 +1,121 @@ +#!/bin/sh +set -e +set -u +set -o pipefail + +function on_error { + echo "$(realpath -mq "${0}"):$1: error: Unexpected failure" +} +trap 'on_error $LINENO' ERR + + +# This protects against multiple targets copying the same framework dependency at the same time. The solution +# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html +RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") + + +variant_for_slice() +{ + case "$1" in + "IronSourceAdQualitySDK.xcframework/ios-arm64") + echo "" + ;; + "IronSourceAdQualitySDK.xcframework/ios-arm64_x86_64-simulator") + echo "simulator" + ;; + esac +} + +archs_for_slice() +{ + case "$1" in + "IronSourceAdQualitySDK.xcframework/ios-arm64") + echo "arm64" + ;; + "IronSourceAdQualitySDK.xcframework/ios-arm64_x86_64-simulator") + echo "arm64 x86_64" + ;; + esac +} + +copy_dir() +{ + local source="$1" + local destination="$2" + + # Use filter instead of exclude so missing patterns don't throw errors. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" \"${source}*\" \"${destination}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" "${source}"/* "${destination}" +} + +SELECT_SLICE_RETVAL="" + +select_slice() { + local xcframework_name="$1" + xcframework_name="${xcframework_name##*/}" + local paths=("${@:2}") + # Locate the correct slice of the .xcframework for the current architectures + local target_path="" + + # Split archs on space so we can find a slice that has all the needed archs + local target_archs=$(echo $ARCHS | tr " " "\n") + + local target_variant="" + if [[ "$PLATFORM_NAME" == *"simulator" ]]; then + target_variant="simulator" + fi + if [[ ! -z ${EFFECTIVE_PLATFORM_NAME+x} && "$EFFECTIVE_PLATFORM_NAME" == *"maccatalyst" ]]; then + target_variant="maccatalyst" + fi + for i in ${!paths[@]}; do + local matched_all_archs="1" + local slice_archs="$(archs_for_slice "${xcframework_name}/${paths[$i]}")" + local slice_variant="$(variant_for_slice "${xcframework_name}/${paths[$i]}")" + for target_arch in $target_archs; do + if ! [[ "${slice_variant}" == "$target_variant" ]]; then + matched_all_archs="0" + break + fi + + if ! echo "${slice_archs}" | tr " " "\n" | grep -F -q -x "$target_arch"; then + matched_all_archs="0" + break + fi + done + + if [[ "$matched_all_archs" == "1" ]]; then + # Found a matching slice + echo "Selected xcframework slice ${paths[$i]}" + SELECT_SLICE_RETVAL=${paths[$i]} + break + fi + done +} + +install_xcframework() { + local basepath="$1" + local name="$2" + local package_type="$3" + local paths=("${@:4}") + + # Locate the correct slice of the .xcframework for the current architectures + select_slice "${basepath}" "${paths[@]}" + local target_path="$SELECT_SLICE_RETVAL" + if [[ -z "$target_path" ]]; then + echo "warning: [CP] $(basename ${basepath}): Unable to find matching slice in '${paths[@]}' for the current build architectures ($ARCHS) and platform (${EFFECTIVE_PLATFORM_NAME-${PLATFORM_NAME}})." + return + fi + local source="$basepath/$target_path" + + local destination="${PODS_XCFRAMEWORKS_BUILD_DIR}/${name}" + + if [ ! -d "$destination" ]; then + mkdir -p "$destination" + fi + + copy_dir "$source/" "$destination" + echo "Copied $source to $destination" +} + +install_xcframework "${PODS_ROOT}/IronSourceAdQualitySDK/IronSourceAdQualitySDK.xcframework" "IronSourceAdQualitySDK" "library" "ios-arm64" "ios-arm64_x86_64-simulator" + diff --git a/Pods/Target Support Files/IronSourceAdQualitySDK/IronSourceAdQualitySDK.debug.xcconfig b/Pods/Target Support Files/IronSourceAdQualitySDK/IronSourceAdQualitySDK.debug.xcconfig new file mode 100644 index 0000000..b591d01 --- /dev/null +++ b/Pods/Target Support Files/IronSourceAdQualitySDK/IronSourceAdQualitySDK.debug.xcconfig @@ -0,0 +1,19 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/IronSourceAdQualitySDK +EXCLUDED_ARCHS[sdk=iphoneos*] = i386 x86_64 +EXCLUDED_ARCHS[sdk=iphonesimulator*] = arm64e armv7 armv7s +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/IronSourceAdQualitySDK" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/IronSourceAdQualitySDK" "${PODS_ROOT}/Headers/Public" "${PODS_XCFRAMEWORKS_BUILD_DIR}/IronSourceAdQualitySDK/Headers" +LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_XCFRAMEWORKS_BUILD_DIR}/IronSourceAdQualitySDK" "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_LDFLAGS = $(inherited) -l"IronSourceAdQuality" -l"ObjC" -l"sqlite3.0" -l"z" -framework "AdSupport" -framework "JavaScriptCore" -framework "SystemConfiguration" -framework "WebKit" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/IronSourceAdQualitySDK +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/IronSourceAdQualitySDK/IronSourceAdQualitySDK.release.xcconfig b/Pods/Target Support Files/IronSourceAdQualitySDK/IronSourceAdQualitySDK.release.xcconfig new file mode 100644 index 0000000..b591d01 --- /dev/null +++ b/Pods/Target Support Files/IronSourceAdQualitySDK/IronSourceAdQualitySDK.release.xcconfig @@ -0,0 +1,19 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/IronSourceAdQualitySDK +EXCLUDED_ARCHS[sdk=iphoneos*] = i386 x86_64 +EXCLUDED_ARCHS[sdk=iphonesimulator*] = arm64e armv7 armv7s +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/IronSourceAdQualitySDK" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/IronSourceAdQualitySDK" "${PODS_ROOT}/Headers/Public" "${PODS_XCFRAMEWORKS_BUILD_DIR}/IronSourceAdQualitySDK/Headers" +LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_XCFRAMEWORKS_BUILD_DIR}/IronSourceAdQualitySDK" "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_LDFLAGS = $(inherited) -l"IronSourceAdQuality" -l"ObjC" -l"sqlite3.0" -l"z" -framework "AdSupport" -framework "JavaScriptCore" -framework "SystemConfiguration" -framework "WebKit" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/IronSourceAdQualitySDK +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/IronSourceAdQualitySDK/ResourceBundle-IronSourceAdQualityPrivacyInfo-IronSourceAdQualitySDK-Info.plist b/Pods/Target Support Files/IronSourceAdQualitySDK/ResourceBundle-IronSourceAdQualityPrivacyInfo-IronSourceAdQualitySDK-Info.plist new file mode 100644 index 0000000..d7a27b1 --- /dev/null +++ b/Pods/Target Support Files/IronSourceAdQualitySDK/ResourceBundle-IronSourceAdQualityPrivacyInfo-IronSourceAdQualitySDK-Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + ${PODS_DEVELOPMENT_LANGUAGE} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + BNDL + CFBundleShortVersionString + 9.1.1 + CFBundleSignature + ???? + CFBundleVersion + 1 + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/IronSourceSDK/IronSourceSDK-xcframeworks-input-files.xcfilelist b/Pods/Target Support Files/IronSourceSDK/IronSourceSDK-xcframeworks-input-files.xcfilelist new file mode 100644 index 0000000..7309d1c --- /dev/null +++ b/Pods/Target Support Files/IronSourceSDK/IronSourceSDK-xcframeworks-input-files.xcfilelist @@ -0,0 +1,2 @@ +${PODS_ROOT}/Target Support Files/IronSourceSDK/IronSourceSDK-xcframeworks.sh +${PODS_ROOT}/IronSourceSDK/IronSource/IronSource.xcframework \ No newline at end of file diff --git a/Pods/Target Support Files/IronSourceSDK/IronSourceSDK-xcframeworks-output-files.xcfilelist b/Pods/Target Support Files/IronSourceSDK/IronSourceSDK-xcframeworks-output-files.xcfilelist new file mode 100644 index 0000000..4f74015 --- /dev/null +++ b/Pods/Target Support Files/IronSourceSDK/IronSourceSDK-xcframeworks-output-files.xcfilelist @@ -0,0 +1 @@ +${PODS_XCFRAMEWORKS_BUILD_DIR}/IronSourceSDK/Ads/IronSource.framework \ No newline at end of file diff --git a/Pods/Target Support Files/IronSourceSDK/IronSourceSDK-xcframeworks.sh b/Pods/Target Support Files/IronSourceSDK/IronSourceSDK-xcframeworks.sh new file mode 100755 index 0000000..499c9a4 --- /dev/null +++ b/Pods/Target Support Files/IronSourceSDK/IronSourceSDK-xcframeworks.sh @@ -0,0 +1,121 @@ +#!/bin/sh +set -e +set -u +set -o pipefail + +function on_error { + echo "$(realpath -mq "${0}"):$1: error: Unexpected failure" +} +trap 'on_error $LINENO' ERR + + +# This protects against multiple targets copying the same framework dependency at the same time. The solution +# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html +RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") + + +variant_for_slice() +{ + case "$1" in + "IronSource.xcframework/ios-arm64") + echo "" + ;; + "IronSource.xcframework/ios-arm64_x86_64-simulator") + echo "simulator" + ;; + esac +} + +archs_for_slice() +{ + case "$1" in + "IronSource.xcframework/ios-arm64") + echo "arm64" + ;; + "IronSource.xcframework/ios-arm64_x86_64-simulator") + echo "arm64 x86_64" + ;; + esac +} + +copy_dir() +{ + local source="$1" + local destination="$2" + + # Use filter instead of exclude so missing patterns don't throw errors. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" \"${source}*\" \"${destination}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" "${source}"/* "${destination}" +} + +SELECT_SLICE_RETVAL="" + +select_slice() { + local xcframework_name="$1" + xcframework_name="${xcframework_name##*/}" + local paths=("${@:2}") + # Locate the correct slice of the .xcframework for the current architectures + local target_path="" + + # Split archs on space so we can find a slice that has all the needed archs + local target_archs=$(echo $ARCHS | tr " " "\n") + + local target_variant="" + if [[ "$PLATFORM_NAME" == *"simulator" ]]; then + target_variant="simulator" + fi + if [[ ! -z ${EFFECTIVE_PLATFORM_NAME+x} && "$EFFECTIVE_PLATFORM_NAME" == *"maccatalyst" ]]; then + target_variant="maccatalyst" + fi + for i in ${!paths[@]}; do + local matched_all_archs="1" + local slice_archs="$(archs_for_slice "${xcframework_name}/${paths[$i]}")" + local slice_variant="$(variant_for_slice "${xcframework_name}/${paths[$i]}")" + for target_arch in $target_archs; do + if ! [[ "${slice_variant}" == "$target_variant" ]]; then + matched_all_archs="0" + break + fi + + if ! echo "${slice_archs}" | tr " " "\n" | grep -F -q -x "$target_arch"; then + matched_all_archs="0" + break + fi + done + + if [[ "$matched_all_archs" == "1" ]]; then + # Found a matching slice + echo "Selected xcframework slice ${paths[$i]}" + SELECT_SLICE_RETVAL=${paths[$i]} + break + fi + done +} + +install_xcframework() { + local basepath="$1" + local name="$2" + local package_type="$3" + local paths=("${@:4}") + + # Locate the correct slice of the .xcframework for the current architectures + select_slice "${basepath}" "${paths[@]}" + local target_path="$SELECT_SLICE_RETVAL" + if [[ -z "$target_path" ]]; then + echo "warning: [CP] $(basename ${basepath}): Unable to find matching slice in '${paths[@]}' for the current build architectures ($ARCHS) and platform (${EFFECTIVE_PLATFORM_NAME-${PLATFORM_NAME}})." + return + fi + local source="$basepath/$target_path" + + local destination="${PODS_XCFRAMEWORKS_BUILD_DIR}/${name}" + + if [ ! -d "$destination" ]; then + mkdir -p "$destination" + fi + + copy_dir "$source/" "$destination" + echo "Copied $source to $destination" +} + +install_xcframework "${PODS_ROOT}/IronSourceSDK/IronSource/IronSource.xcframework" "IronSourceSDK/Ads" "framework" "ios-arm64" "ios-arm64_x86_64-simulator" + diff --git a/Pods/Target Support Files/IronSourceSDK/IronSourceSDK.debug.xcconfig b/Pods/Target Support Files/IronSourceSDK/IronSourceSDK.debug.xcconfig new file mode 100644 index 0000000..d3c0d85 --- /dev/null +++ b/Pods/Target Support Files/IronSourceSDK/IronSourceSDK.debug.xcconfig @@ -0,0 +1,19 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/IronSourceSDK +EXCLUDED_ARCHS[sdk=iphonesimulator*] = i386 +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/IronSourceAdQualitySDK" "${PODS_ROOT}/IronSourceSDK/IronSource" "${PODS_XCFRAMEWORKS_BUILD_DIR}/IronSourceSDK/Ads" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_XCFRAMEWORKS_BUILD_DIR}/IronSourceAdQualitySDK/Headers" +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_LDFLAGS = $(inherited) -l"ObjC" -l"z" -framework "AVFoundation" -framework "AdSupport" -framework "AudioToolbox" -framework "CFNetwork" -framework "CoreGraphics" -framework "CoreMedia" -framework "CoreTelephony" -framework "CoreVideo" -framework "Foundation" -framework "JavaScriptCore" -framework "MobileCoreServices" -framework "QuartzCore" -framework "Security" -framework "StoreKit" -framework "SystemConfiguration" -framework "WebKit" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/IronSourceSDK +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +SWIFT_INCLUDE_PATHS = $(inherited) "${PODS_XCFRAMEWORKS_BUILD_DIR}/IronSourceAdQualitySDK" +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/IronSourceSDK/IronSourceSDK.release.xcconfig b/Pods/Target Support Files/IronSourceSDK/IronSourceSDK.release.xcconfig new file mode 100644 index 0000000..d3c0d85 --- /dev/null +++ b/Pods/Target Support Files/IronSourceSDK/IronSourceSDK.release.xcconfig @@ -0,0 +1,19 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/IronSourceSDK +EXCLUDED_ARCHS[sdk=iphonesimulator*] = i386 +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/IronSourceAdQualitySDK" "${PODS_ROOT}/IronSourceSDK/IronSource" "${PODS_XCFRAMEWORKS_BUILD_DIR}/IronSourceSDK/Ads" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_XCFRAMEWORKS_BUILD_DIR}/IronSourceAdQualitySDK/Headers" +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_LDFLAGS = $(inherited) -l"ObjC" -l"z" -framework "AVFoundation" -framework "AdSupport" -framework "AudioToolbox" -framework "CFNetwork" -framework "CoreGraphics" -framework "CoreMedia" -framework "CoreTelephony" -framework "CoreVideo" -framework "Foundation" -framework "JavaScriptCore" -framework "MobileCoreServices" -framework "QuartzCore" -framework "Security" -framework "StoreKit" -framework "SystemConfiguration" -framework "WebKit" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/IronSourceSDK +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +SWIFT_INCLUDE_PATHS = $(inherited) "${PODS_XCFRAMEWORKS_BUILD_DIR}/IronSourceAdQualitySDK" +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/IronSourceSDK/ResourceBundle-IronSourcePrivacyInfo-IronSourceSDK-Info.plist b/Pods/Target Support Files/IronSourceSDK/ResourceBundle-IronSourcePrivacyInfo-IronSourceSDK-Info.plist new file mode 100644 index 0000000..bcfcd94 --- /dev/null +++ b/Pods/Target Support Files/IronSourceSDK/ResourceBundle-IronSourcePrivacyInfo-IronSourceSDK-Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + ${PODS_DEVELOPMENT_LANGUAGE} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + BNDL + CFBundleShortVersionString + 9.2.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/Pods-TastePick/Pods-TastePick-Info.plist b/Pods/Target Support Files/Pods-TastePick/Pods-TastePick-Info.plist new file mode 100644 index 0000000..19cf209 --- /dev/null +++ b/Pods/Target Support Files/Pods-TastePick/Pods-TastePick-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + ${PODS_DEVELOPMENT_LANGUAGE} + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/Pods-TastePick/Pods-TastePick-acknowledgements.markdown b/Pods/Target Support Files/Pods-TastePick/Pods-TastePick-acknowledgements.markdown new file mode 100644 index 0000000..4d2204f --- /dev/null +++ b/Pods/Target Support Files/Pods-TastePick/Pods-TastePick-acknowledgements.markdown @@ -0,0 +1,2363 @@ +# Acknowledgements +This application makes use of the following third party libraries: + +## FirebaseAnalytics + +Copyright 2022 Google + +## FirebaseCore + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +## FirebaseCoreExtension + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +## FirebaseCoreInternal + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +## FirebaseCrashlytics + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +================================================================================ + +The following copyright from Hewlett-Packard Development Company, L.P. +applies to the dwarf.h file in third_party/libunwind + + libunwind - a platform-independent unwind library + Copyright (c) 2003-2005 Hewlett-Packard Development Company, L.P. + Contributed by David Mosberger-Tang + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +## FirebaseInstallations + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +## FirebaseRemoteConfigInterop + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +## FirebaseSessions + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +## GoogleAdsOnDeviceConversion + +Copyright 2024 Google + +## GoogleAppMeasurement + +Copyright 2022 Google + +## GoogleDataTransport + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +## GoogleUtilities + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +================================================================================ + +Copyright (c) 2017 Landon J. Fuller +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +## IronSourceAdQualitySDK + +https://platform.ironsrc.com/partners/terms-and-conditions-new-user + +## IronSourceSDK + +https://platform.ironsrc.com/partners/terms-and-conditions-new-user + +## PromisesObjC + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +## PromisesSwift + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +## nanopb + +Copyright (c) 2011 Petteri Aimonen + +This software is provided 'as-is', without any express or +implied warranty. In no event will the authors be held liable +for any damages arising from the use of this software. + +Permission is granted to anyone to use this software for any +purpose, including commercial applications, and to alter it and +redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you + must not claim that you wrote the original software. If you use + this software in a product, an acknowledgment in the product + documentation would be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and + must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source + distribution. + +Generated by CocoaPods - https://cocoapods.org diff --git a/Pods/Target Support Files/Pods-TastePick/Pods-TastePick-acknowledgements.plist b/Pods/Target Support Files/Pods-TastePick/Pods-TastePick-acknowledgements.plist new file mode 100644 index 0000000..c1714a7 --- /dev/null +++ b/Pods/Target Support Files/Pods-TastePick/Pods-TastePick-acknowledgements.plist @@ -0,0 +1,2491 @@ + + + + + PreferenceSpecifiers + + + FooterText + This application makes use of the following third party libraries: + Title + Acknowledgements + Type + PSGroupSpecifier + + + FooterText + Copyright 2022 Google + License + Copyright + Title + FirebaseAnalytics + Type + PSGroupSpecifier + + + FooterText + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + License + Apache-2.0 + Title + FirebaseCore + Type + PSGroupSpecifier + + + FooterText + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + License + Apache-2.0 + Title + FirebaseCoreExtension + Type + PSGroupSpecifier + + + FooterText + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + License + Apache-2.0 + Title + FirebaseCoreInternal + Type + PSGroupSpecifier + + + FooterText + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +================================================================================ + +The following copyright from Hewlett-Packard Development Company, L.P. +applies to the dwarf.h file in third_party/libunwind + + libunwind - a platform-independent unwind library + Copyright (c) 2003-2005 Hewlett-Packard Development Company, L.P. + Contributed by David Mosberger-Tang <davidm@hpl.hp.com> + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + License + Apache-2.0 + Title + FirebaseCrashlytics + Type + PSGroupSpecifier + + + FooterText + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + License + Apache-2.0 + Title + FirebaseInstallations + Type + PSGroupSpecifier + + + FooterText + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + License + Apache-2.0 + Title + FirebaseRemoteConfigInterop + Type + PSGroupSpecifier + + + FooterText + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + License + Apache-2.0 + Title + FirebaseSessions + Type + PSGroupSpecifier + + + FooterText + Copyright 2024 Google + License + Copyright + Title + GoogleAdsOnDeviceConversion + Type + PSGroupSpecifier + + + FooterText + Copyright 2022 Google + License + Copyright + Title + GoogleAppMeasurement + Type + PSGroupSpecifier + + + FooterText + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + License + Apache-2.0 + Title + GoogleDataTransport + Type + PSGroupSpecifier + + + FooterText + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +================================================================================ + +Copyright (c) 2017 Landon J. Fuller <landon@landonf.org> +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + License + Apache-2.0 + Title + GoogleUtilities + Type + PSGroupSpecifier + + + FooterText + https://platform.ironsrc.com/partners/terms-and-conditions-new-user + License + Commercial + Title + IronSourceAdQualitySDK + Type + PSGroupSpecifier + + + FooterText + https://platform.ironsrc.com/partners/terms-and-conditions-new-user + License + Commercial + Title + IronSourceSDK + Type + PSGroupSpecifier + + + FooterText + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + License + Apache-2.0 + Title + PromisesObjC + Type + PSGroupSpecifier + + + FooterText + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + License + Apache-2.0 + Title + PromisesSwift + Type + PSGroupSpecifier + + + FooterText + Copyright (c) 2011 Petteri Aimonen <jpa at nanopb.mail.kapsi.fi> + +This software is provided 'as-is', without any express or +implied warranty. In no event will the authors be held liable +for any damages arising from the use of this software. + +Permission is granted to anyone to use this software for any +purpose, including commercial applications, and to alter it and +redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you + must not claim that you wrote the original software. If you use + this software in a product, an acknowledgment in the product + documentation would be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and + must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source + distribution. + + License + zlib + Title + nanopb + Type + PSGroupSpecifier + + + FooterText + Generated by CocoaPods - https://cocoapods.org + Title + + Type + PSGroupSpecifier + + + StringsTable + Acknowledgements + Title + Acknowledgements + + diff --git a/Pods/Target Support Files/Pods-TastePick/Pods-TastePick-dummy.m b/Pods/Target Support Files/Pods-TastePick/Pods-TastePick-dummy.m new file mode 100644 index 0000000..866926f --- /dev/null +++ b/Pods/Target Support Files/Pods-TastePick/Pods-TastePick-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_TastePick : NSObject +@end +@implementation PodsDummy_Pods_TastePick +@end diff --git a/Pods/Target Support Files/Pods-TastePick/Pods-TastePick-frameworks-Debug-input-files.xcfilelist b/Pods/Target Support Files/Pods-TastePick/Pods-TastePick-frameworks-Debug-input-files.xcfilelist new file mode 100644 index 0000000..374d578 --- /dev/null +++ b/Pods/Target Support Files/Pods-TastePick/Pods-TastePick-frameworks-Debug-input-files.xcfilelist @@ -0,0 +1,13 @@ +${PODS_ROOT}/Target Support Files/Pods-TastePick/Pods-TastePick-frameworks.sh +${BUILT_PRODUCTS_DIR}/FirebaseCore/FirebaseCore.framework +${BUILT_PRODUCTS_DIR}/FirebaseCoreExtension/FirebaseCoreExtension.framework +${BUILT_PRODUCTS_DIR}/FirebaseCoreInternal/FirebaseCoreInternal.framework +${BUILT_PRODUCTS_DIR}/FirebaseCrashlytics/FirebaseCrashlytics.framework +${BUILT_PRODUCTS_DIR}/FirebaseInstallations/FirebaseInstallations.framework +${BUILT_PRODUCTS_DIR}/FirebaseRemoteConfigInterop/FirebaseRemoteConfigInterop.framework +${BUILT_PRODUCTS_DIR}/FirebaseSessions/FirebaseSessions.framework +${BUILT_PRODUCTS_DIR}/GoogleDataTransport/GoogleDataTransport.framework +${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework +${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework +${BUILT_PRODUCTS_DIR}/PromisesSwift/Promises.framework +${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-TastePick/Pods-TastePick-frameworks-Debug-output-files.xcfilelist b/Pods/Target Support Files/Pods-TastePick/Pods-TastePick-frameworks-Debug-output-files.xcfilelist new file mode 100644 index 0000000..05d7c2c --- /dev/null +++ b/Pods/Target Support Files/Pods-TastePick/Pods-TastePick-frameworks-Debug-output-files.xcfilelist @@ -0,0 +1,12 @@ +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCore.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCoreExtension.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCoreInternal.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCrashlytics.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseInstallations.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseRemoteConfigInterop.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseSessions.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleDataTransport.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleUtilities.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FBLPromises.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Promises.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/nanopb.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-TastePick/Pods-TastePick-frameworks-Release-input-files.xcfilelist b/Pods/Target Support Files/Pods-TastePick/Pods-TastePick-frameworks-Release-input-files.xcfilelist new file mode 100644 index 0000000..374d578 --- /dev/null +++ b/Pods/Target Support Files/Pods-TastePick/Pods-TastePick-frameworks-Release-input-files.xcfilelist @@ -0,0 +1,13 @@ +${PODS_ROOT}/Target Support Files/Pods-TastePick/Pods-TastePick-frameworks.sh +${BUILT_PRODUCTS_DIR}/FirebaseCore/FirebaseCore.framework +${BUILT_PRODUCTS_DIR}/FirebaseCoreExtension/FirebaseCoreExtension.framework +${BUILT_PRODUCTS_DIR}/FirebaseCoreInternal/FirebaseCoreInternal.framework +${BUILT_PRODUCTS_DIR}/FirebaseCrashlytics/FirebaseCrashlytics.framework +${BUILT_PRODUCTS_DIR}/FirebaseInstallations/FirebaseInstallations.framework +${BUILT_PRODUCTS_DIR}/FirebaseRemoteConfigInterop/FirebaseRemoteConfigInterop.framework +${BUILT_PRODUCTS_DIR}/FirebaseSessions/FirebaseSessions.framework +${BUILT_PRODUCTS_DIR}/GoogleDataTransport/GoogleDataTransport.framework +${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework +${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework +${BUILT_PRODUCTS_DIR}/PromisesSwift/Promises.framework +${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-TastePick/Pods-TastePick-frameworks-Release-output-files.xcfilelist b/Pods/Target Support Files/Pods-TastePick/Pods-TastePick-frameworks-Release-output-files.xcfilelist new file mode 100644 index 0000000..05d7c2c --- /dev/null +++ b/Pods/Target Support Files/Pods-TastePick/Pods-TastePick-frameworks-Release-output-files.xcfilelist @@ -0,0 +1,12 @@ +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCore.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCoreExtension.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCoreInternal.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCrashlytics.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseInstallations.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseRemoteConfigInterop.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseSessions.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleDataTransport.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleUtilities.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FBLPromises.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Promises.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/nanopb.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-TastePick/Pods-TastePick-frameworks.sh b/Pods/Target Support Files/Pods-TastePick/Pods-TastePick-frameworks.sh new file mode 100755 index 0000000..fc2006d --- /dev/null +++ b/Pods/Target Support Files/Pods-TastePick/Pods-TastePick-frameworks.sh @@ -0,0 +1,208 @@ +#!/bin/sh +set -e +set -u +set -o pipefail + +function on_error { + echo "$(realpath -mq "${0}"):$1: error: Unexpected failure" +} +trap 'on_error $LINENO' ERR + +if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then + # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy + # frameworks to, so exit 0 (signalling the script phase was successful). + exit 0 +fi + +echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" +mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + +COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" +SWIFT_STDLIB_PATH="${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" +BCSYMBOLMAP_DIR="BCSymbolMaps" + + +# This protects against multiple targets copying the same framework dependency at the same time. The solution +# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html +RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") + +# Copies and strips a vendored framework +install_framework() +{ + if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then + local source="${BUILT_PRODUCTS_DIR}/$1" + elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then + local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" + elif [ -r "$1" ]; then + local source="$1" + fi + + local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + + if [ -L "${source}" ]; then + echo "Symlinked..." + source="$(readlink -f "${source}")" + fi + + if [ -d "${source}/${BCSYMBOLMAP_DIR}" ]; then + # Locate and install any .bcsymbolmaps if present, and remove them from the .framework before the framework is copied + find "${source}/${BCSYMBOLMAP_DIR}" -name "*.bcsymbolmap"|while read f; do + echo "Installing $f" + install_bcsymbolmap "$f" "$destination" + rm "$f" + done + rmdir "${source}/${BCSYMBOLMAP_DIR}" + fi + + # Use filter instead of exclude so missing patterns don't throw errors. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" + + local basename + basename="$(basename -s .framework "$1")" + binary="${destination}/${basename}.framework/${basename}" + + if ! [ -r "$binary" ]; then + binary="${destination}/${basename}" + elif [ -L "${binary}" ]; then + echo "Destination binary is symlinked..." + dirname="$(dirname "${binary}")" + binary="${dirname}/$(readlink "${binary}")" + fi + + # Strip invalid architectures so "fat" simulator / device frameworks work on device + if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then + strip_invalid_archs "$binary" + fi + + # Resign the code if required by the build settings to avoid unstable apps + code_sign_if_enabled "${destination}/$(basename "$1")" + + # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. + if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then + local swift_runtime_libs + swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u) + for lib in $swift_runtime_libs; do + echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" + rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" + code_sign_if_enabled "${destination}/${lib}" + done + fi +} +# Copies and strips a vendored dSYM +install_dsym() { + local source="$1" + warn_missing_arch=${2:-true} + if [ -r "$source" ]; then + # Copy the dSYM into the targets temp dir. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}" + + local basename + basename="$(basename -s .dSYM "$source")" + binary_name="$(ls "$source/Contents/Resources/DWARF")" + binary="${DERIVED_FILES_DIR}/${basename}.dSYM/Contents/Resources/DWARF/${binary_name}" + + # Strip invalid architectures from the dSYM. + if [[ "$(file "$binary")" == *"Mach-O "*"dSYM companion"* ]]; then + strip_invalid_archs "$binary" "$warn_missing_arch" + fi + if [[ $STRIP_BINARY_RETVAL == 0 ]]; then + # Move the stripped file into its final destination. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.dSYM" "${DWARF_DSYM_FOLDER_PATH}" + else + # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. + mkdir -p "${DWARF_DSYM_FOLDER_PATH}" + touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.dSYM" + fi + fi +} + +# Used as a return value for each invocation of `strip_invalid_archs` function. +STRIP_BINARY_RETVAL=0 + +# Strip invalid architectures +strip_invalid_archs() { + binary="$1" + warn_missing_arch=${2:-true} + # Get architectures for current target binary + binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" + # Intersect them with the architectures we are building for + intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" + # If there are no archs supported by this binary then warn the user + if [[ -z "$intersected_archs" ]]; then + if [[ "$warn_missing_arch" == "true" ]]; then + echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." + fi + STRIP_BINARY_RETVAL=1 + return + fi + stripped="" + for arch in $binary_archs; do + if ! [[ "${ARCHS}" == *"$arch"* ]]; then + # Strip non-valid architectures in-place + lipo -remove "$arch" -output "$binary" "$binary" + stripped="$stripped $arch" + fi + done + if [[ "$stripped" ]]; then + echo "Stripped $binary of architectures:$stripped" + fi + STRIP_BINARY_RETVAL=0 +} + +# Copies the bcsymbolmap files of a vendored framework +install_bcsymbolmap() { + local bcsymbolmap_path="$1" + local destination="${BUILT_PRODUCTS_DIR}" + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}" +} + +# Signs a framework with the provided identity +code_sign_if_enabled() { + if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then + # Use the current code_sign_identity + echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" + local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" + + if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + code_sign_cmd="$code_sign_cmd &" + fi + echo "$code_sign_cmd" + eval "$code_sign_cmd" + fi +} + +if [[ "$CONFIGURATION" == "Debug" ]]; then + install_framework "${BUILT_PRODUCTS_DIR}/FirebaseCore/FirebaseCore.framework" + install_framework "${BUILT_PRODUCTS_DIR}/FirebaseCoreExtension/FirebaseCoreExtension.framework" + install_framework "${BUILT_PRODUCTS_DIR}/FirebaseCoreInternal/FirebaseCoreInternal.framework" + install_framework "${BUILT_PRODUCTS_DIR}/FirebaseCrashlytics/FirebaseCrashlytics.framework" + install_framework "${BUILT_PRODUCTS_DIR}/FirebaseInstallations/FirebaseInstallations.framework" + install_framework "${BUILT_PRODUCTS_DIR}/FirebaseRemoteConfigInterop/FirebaseRemoteConfigInterop.framework" + install_framework "${BUILT_PRODUCTS_DIR}/FirebaseSessions/FirebaseSessions.framework" + install_framework "${BUILT_PRODUCTS_DIR}/GoogleDataTransport/GoogleDataTransport.framework" + install_framework "${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework" + install_framework "${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework" + install_framework "${BUILT_PRODUCTS_DIR}/PromisesSwift/Promises.framework" + install_framework "${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework" +fi +if [[ "$CONFIGURATION" == "Release" ]]; then + install_framework "${BUILT_PRODUCTS_DIR}/FirebaseCore/FirebaseCore.framework" + install_framework "${BUILT_PRODUCTS_DIR}/FirebaseCoreExtension/FirebaseCoreExtension.framework" + install_framework "${BUILT_PRODUCTS_DIR}/FirebaseCoreInternal/FirebaseCoreInternal.framework" + install_framework "${BUILT_PRODUCTS_DIR}/FirebaseCrashlytics/FirebaseCrashlytics.framework" + install_framework "${BUILT_PRODUCTS_DIR}/FirebaseInstallations/FirebaseInstallations.framework" + install_framework "${BUILT_PRODUCTS_DIR}/FirebaseRemoteConfigInterop/FirebaseRemoteConfigInterop.framework" + install_framework "${BUILT_PRODUCTS_DIR}/FirebaseSessions/FirebaseSessions.framework" + install_framework "${BUILT_PRODUCTS_DIR}/GoogleDataTransport/GoogleDataTransport.framework" + install_framework "${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework" + install_framework "${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework" + install_framework "${BUILT_PRODUCTS_DIR}/PromisesSwift/Promises.framework" + install_framework "${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework" +fi +if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + wait +fi diff --git a/Pods/Target Support Files/Pods-TastePick/Pods-TastePick-resources-Debug-input-files.xcfilelist b/Pods/Target Support Files/Pods-TastePick/Pods-TastePick-resources-Debug-input-files.xcfilelist new file mode 100644 index 0000000..b5d247d --- /dev/null +++ b/Pods/Target Support Files/Pods-TastePick/Pods-TastePick-resources-Debug-input-files.xcfilelist @@ -0,0 +1,3 @@ +${PODS_ROOT}/Target Support Files/Pods-TastePick/Pods-TastePick-resources.sh +${PODS_CONFIGURATION_BUILD_DIR}/IronSourceAdQualitySDK/IronSourceAdQualityPrivacyInfo.bundle +${PODS_CONFIGURATION_BUILD_DIR}/IronSourceSDK/IronSourcePrivacyInfo.bundle \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-TastePick/Pods-TastePick-resources-Debug-output-files.xcfilelist b/Pods/Target Support Files/Pods-TastePick/Pods-TastePick-resources-Debug-output-files.xcfilelist new file mode 100644 index 0000000..eb19c5c --- /dev/null +++ b/Pods/Target Support Files/Pods-TastePick/Pods-TastePick-resources-Debug-output-files.xcfilelist @@ -0,0 +1,2 @@ +${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/IronSourceAdQualityPrivacyInfo.bundle +${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/IronSourcePrivacyInfo.bundle \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-TastePick/Pods-TastePick-resources-Release-input-files.xcfilelist b/Pods/Target Support Files/Pods-TastePick/Pods-TastePick-resources-Release-input-files.xcfilelist new file mode 100644 index 0000000..b5d247d --- /dev/null +++ b/Pods/Target Support Files/Pods-TastePick/Pods-TastePick-resources-Release-input-files.xcfilelist @@ -0,0 +1,3 @@ +${PODS_ROOT}/Target Support Files/Pods-TastePick/Pods-TastePick-resources.sh +${PODS_CONFIGURATION_BUILD_DIR}/IronSourceAdQualitySDK/IronSourceAdQualityPrivacyInfo.bundle +${PODS_CONFIGURATION_BUILD_DIR}/IronSourceSDK/IronSourcePrivacyInfo.bundle \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-TastePick/Pods-TastePick-resources-Release-output-files.xcfilelist b/Pods/Target Support Files/Pods-TastePick/Pods-TastePick-resources-Release-output-files.xcfilelist new file mode 100644 index 0000000..eb19c5c --- /dev/null +++ b/Pods/Target Support Files/Pods-TastePick/Pods-TastePick-resources-Release-output-files.xcfilelist @@ -0,0 +1,2 @@ +${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/IronSourceAdQualityPrivacyInfo.bundle +${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/IronSourcePrivacyInfo.bundle \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-TastePick/Pods-TastePick-resources.sh b/Pods/Target Support Files/Pods-TastePick/Pods-TastePick-resources.sh new file mode 100755 index 0000000..99321c2 --- /dev/null +++ b/Pods/Target Support Files/Pods-TastePick/Pods-TastePick-resources.sh @@ -0,0 +1,131 @@ +#!/bin/sh +set -e +set -u +set -o pipefail + +function on_error { + echo "$(realpath -mq "${0}"):$1: error: Unexpected failure" +} +trap 'on_error $LINENO' ERR + +if [ -z ${UNLOCALIZED_RESOURCES_FOLDER_PATH+x} ]; then + # If UNLOCALIZED_RESOURCES_FOLDER_PATH is not set, then there's nowhere for us to copy + # resources to, so exit 0 (signalling the script phase was successful). + exit 0 +fi + +mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + +RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt +> "$RESOURCES_TO_COPY" + +XCASSET_FILES=() + +# This protects against multiple targets copying the same framework dependency at the same time. The solution +# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html +RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") + +case "${TARGETED_DEVICE_FAMILY:-}" in + 1,2) + TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" + ;; + 1) + TARGET_DEVICE_ARGS="--target-device iphone" + ;; + 2) + TARGET_DEVICE_ARGS="--target-device ipad" + ;; + 3) + TARGET_DEVICE_ARGS="--target-device tv" + ;; + 4) + TARGET_DEVICE_ARGS="--target-device watch" + ;; + *) + TARGET_DEVICE_ARGS="--target-device mac" + ;; +esac + +install_resource() +{ + if [[ "$1" = /* ]] ; then + RESOURCE_PATH="$1" + else + RESOURCE_PATH="${PODS_ROOT}/$1" + fi + if [[ ! -e "$RESOURCE_PATH" ]] ; then + cat << EOM +error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. +EOM + exit 1 + fi + case $RESOURCE_PATH in + *.storyboard) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true + ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} + ;; + *.xib) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true + ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} + ;; + *.framework) + echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true + mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + ;; + *.xcdatamodel) + echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" || true + xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" + ;; + *.xcdatamodeld) + echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" || true + xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" + ;; + *.xcmappingmodel) + echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" || true + xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" + ;; + *.xcassets) + ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" + XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") + ;; + *) + echo "$RESOURCE_PATH" || true + echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" + ;; + esac +} +if [[ "$CONFIGURATION" == "Debug" ]]; then + install_resource "${PODS_CONFIGURATION_BUILD_DIR}/IronSourceAdQualitySDK/IronSourceAdQualityPrivacyInfo.bundle" + install_resource "${PODS_CONFIGURATION_BUILD_DIR}/IronSourceSDK/IronSourcePrivacyInfo.bundle" +fi +if [[ "$CONFIGURATION" == "Release" ]]; then + install_resource "${PODS_CONFIGURATION_BUILD_DIR}/IronSourceAdQualitySDK/IronSourceAdQualityPrivacyInfo.bundle" + install_resource "${PODS_CONFIGURATION_BUILD_DIR}/IronSourceSDK/IronSourcePrivacyInfo.bundle" +fi + +mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then + mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi +rm -f "$RESOURCES_TO_COPY" + +if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "${XCASSET_FILES:-}" ] +then + # Find all other xcassets (this unfortunately includes those of path pods and other targets). + OTHER_XCASSETS=$(find -L "$PWD" -iname "*.xcassets" -type d) + while read line; do + if [[ $line != "${PODS_ROOT}*" ]]; then + XCASSET_FILES+=("$line") + fi + done <<<"$OTHER_XCASSETS" + + if [ -z ${ASSETCATALOG_COMPILER_APPICON_NAME+x} ]; then + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + else + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" --app-icon "${ASSETCATALOG_COMPILER_APPICON_NAME}" --output-partial-info-plist "${TARGET_TEMP_DIR}/assetcatalog_generated_info_cocoapods.plist" + fi +fi diff --git a/Pods/Target Support Files/Pods-TastePick/Pods-TastePick-umbrella.h b/Pods/Target Support Files/Pods-TastePick/Pods-TastePick-umbrella.h new file mode 100644 index 0000000..81d2f03 --- /dev/null +++ b/Pods/Target Support Files/Pods-TastePick/Pods-TastePick-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double Pods_TastePickVersionNumber; +FOUNDATION_EXPORT const unsigned char Pods_TastePickVersionString[]; + diff --git a/Pods/Target Support Files/Pods-TastePick/Pods-TastePick.debug.xcconfig b/Pods/Target Support Files/Pods-TastePick/Pods-TastePick.debug.xcconfig new file mode 100644 index 0000000..1b4869c --- /dev/null +++ b/Pods/Target Support Files/Pods-TastePick/Pods-TastePick.debug.xcconfig @@ -0,0 +1,18 @@ +ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +EXCLUDED_ARCHS[sdk=iphoneos*] = i386 x86_64 +EXCLUDED_ARCHS[sdk=iphonesimulator*] = arm64e armv7 armv7s +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreExtension" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreInternal" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCrashlytics" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseInstallations" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseRemoteConfigInterop" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseSessions" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleDataTransport" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities" "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC" "${PODS_CONFIGURATION_BUILD_DIR}/PromisesSwift" "${PODS_CONFIGURATION_BUILD_DIR}/nanopb" "${PODS_ROOT}/FirebaseAnalytics/Frameworks" "${PODS_ROOT}/GoogleAdsOnDeviceConversion/Frameworks" "${PODS_ROOT}/GoogleAppMeasurement/Frameworks" "${PODS_ROOT}/IronSourceAdQualitySDK" "${PODS_ROOT}/IronSourceSDK/IronSource" "${PODS_XCFRAMEWORKS_BUILD_DIR}/FirebaseAnalytics/Default" "${PODS_XCFRAMEWORKS_BUILD_DIR}/GoogleAdsOnDeviceConversion" "${PODS_XCFRAMEWORKS_BUILD_DIR}/GoogleAppMeasurement/Core" "${PODS_XCFRAMEWORKS_BUILD_DIR}/GoogleAppMeasurement/IdentitySupport" "${PODS_XCFRAMEWORKS_BUILD_DIR}/IronSourceSDK/Ads" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 $(inherited) PB_FIELD_32BIT=1 PB_NO_PACKED_STRUCTS=1 PB_ENABLE_MALLOC=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore/FirebaseCore.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreExtension/FirebaseCoreExtension.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreInternal/FirebaseCoreInternal.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCrashlytics/FirebaseCrashlytics.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseInstallations/FirebaseInstallations.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseRemoteConfigInterop/FirebaseRemoteConfigInterop.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseSessions/FirebaseSessions.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleDataTransport/GoogleDataTransport.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities/GoogleUtilities.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC/FBLPromises.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/PromisesSwift/Promises.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/nanopb/nanopb.framework/Headers" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/IronSourceAdQualitySDK" "${PODS_XCFRAMEWORKS_BUILD_DIR}/IronSourceAdQualitySDK/Headers" +LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks' +LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_XCFRAMEWORKS_BUILD_DIR}/IronSourceAdQualitySDK" "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_LDFLAGS = $(inherited) -ObjC -l"IronSourceAdQuality" -l"c++" -l"sqlite3" -l"sqlite3.0" -l"z" -framework "AVFoundation" -framework "AdSupport" -framework "AudioToolbox" -framework "CFNetwork" -framework "CoreGraphics" -framework "CoreMedia" -framework "CoreTelephony" -framework "CoreVideo" -framework "FBLPromises" -framework "FirebaseAnalytics" -framework "FirebaseCore" -framework "FirebaseCoreExtension" -framework "FirebaseCoreInternal" -framework "FirebaseCrashlytics" -framework "FirebaseInstallations" -framework "FirebaseRemoteConfigInterop" -framework "FirebaseSessions" -framework "Foundation" -framework "GoogleAdsOnDeviceConversion" -framework "GoogleAppMeasurement" -framework "GoogleAppMeasurementIdentitySupport" -framework "GoogleDataTransport" -framework "GoogleUtilities" -framework "IronSource" -framework "JavaScriptCore" -framework "MobileCoreServices" -framework "Promises" -framework "QuartzCore" -framework "Security" -framework "StoreKit" -framework "SystemConfiguration" -framework "UIKit" -framework "WebKit" -framework "nanopb" +OTHER_MODULE_VERIFIER_FLAGS = $(inherited) "-F${PODS_CONFIGURATION_BUILD_DIR}/FirebaseAnalytics" "-F${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore" "-F${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreExtension" "-F${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreInternal" "-F${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCrashlytics" "-F${PODS_CONFIGURATION_BUILD_DIR}/FirebaseInstallations" "-F${PODS_CONFIGURATION_BUILD_DIR}/FirebaseRemoteConfigInterop" "-F${PODS_CONFIGURATION_BUILD_DIR}/FirebaseSessions" "-F${PODS_CONFIGURATION_BUILD_DIR}/GoogleAdsOnDeviceConversion" "-F${PODS_CONFIGURATION_BUILD_DIR}/GoogleAppMeasurement" "-F${PODS_CONFIGURATION_BUILD_DIR}/GoogleDataTransport" "-F${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities" "-F${PODS_CONFIGURATION_BUILD_DIR}/IronSourceAdQualitySDK" "-F${PODS_CONFIGURATION_BUILD_DIR}/IronSourceSDK" "-F${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC" "-F${PODS_CONFIGURATION_BUILD_DIR}/PromisesSwift" "-F${PODS_CONFIGURATION_BUILD_DIR}/nanopb" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/Pods-TastePick/Pods-TastePick.modulemap b/Pods/Target Support Files/Pods-TastePick/Pods-TastePick.modulemap new file mode 100644 index 0000000..1ce4801 --- /dev/null +++ b/Pods/Target Support Files/Pods-TastePick/Pods-TastePick.modulemap @@ -0,0 +1,6 @@ +framework module Pods_TastePick { + umbrella header "Pods-TastePick-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/Pods-TastePick/Pods-TastePick.release.xcconfig b/Pods/Target Support Files/Pods-TastePick/Pods-TastePick.release.xcconfig new file mode 100644 index 0000000..1b4869c --- /dev/null +++ b/Pods/Target Support Files/Pods-TastePick/Pods-TastePick.release.xcconfig @@ -0,0 +1,18 @@ +ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +EXCLUDED_ARCHS[sdk=iphoneos*] = i386 x86_64 +EXCLUDED_ARCHS[sdk=iphonesimulator*] = arm64e armv7 armv7s +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreExtension" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreInternal" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCrashlytics" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseInstallations" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseRemoteConfigInterop" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseSessions" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleDataTransport" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities" "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC" "${PODS_CONFIGURATION_BUILD_DIR}/PromisesSwift" "${PODS_CONFIGURATION_BUILD_DIR}/nanopb" "${PODS_ROOT}/FirebaseAnalytics/Frameworks" "${PODS_ROOT}/GoogleAdsOnDeviceConversion/Frameworks" "${PODS_ROOT}/GoogleAppMeasurement/Frameworks" "${PODS_ROOT}/IronSourceAdQualitySDK" "${PODS_ROOT}/IronSourceSDK/IronSource" "${PODS_XCFRAMEWORKS_BUILD_DIR}/FirebaseAnalytics/Default" "${PODS_XCFRAMEWORKS_BUILD_DIR}/GoogleAdsOnDeviceConversion" "${PODS_XCFRAMEWORKS_BUILD_DIR}/GoogleAppMeasurement/Core" "${PODS_XCFRAMEWORKS_BUILD_DIR}/GoogleAppMeasurement/IdentitySupport" "${PODS_XCFRAMEWORKS_BUILD_DIR}/IronSourceSDK/Ads" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 $(inherited) PB_FIELD_32BIT=1 PB_NO_PACKED_STRUCTS=1 PB_ENABLE_MALLOC=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore/FirebaseCore.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreExtension/FirebaseCoreExtension.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreInternal/FirebaseCoreInternal.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCrashlytics/FirebaseCrashlytics.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseInstallations/FirebaseInstallations.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseRemoteConfigInterop/FirebaseRemoteConfigInterop.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseSessions/FirebaseSessions.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleDataTransport/GoogleDataTransport.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities/GoogleUtilities.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC/FBLPromises.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/PromisesSwift/Promises.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/nanopb/nanopb.framework/Headers" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/IronSourceAdQualitySDK" "${PODS_XCFRAMEWORKS_BUILD_DIR}/IronSourceAdQualitySDK/Headers" +LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks' +LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_XCFRAMEWORKS_BUILD_DIR}/IronSourceAdQualitySDK" "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_LDFLAGS = $(inherited) -ObjC -l"IronSourceAdQuality" -l"c++" -l"sqlite3" -l"sqlite3.0" -l"z" -framework "AVFoundation" -framework "AdSupport" -framework "AudioToolbox" -framework "CFNetwork" -framework "CoreGraphics" -framework "CoreMedia" -framework "CoreTelephony" -framework "CoreVideo" -framework "FBLPromises" -framework "FirebaseAnalytics" -framework "FirebaseCore" -framework "FirebaseCoreExtension" -framework "FirebaseCoreInternal" -framework "FirebaseCrashlytics" -framework "FirebaseInstallations" -framework "FirebaseRemoteConfigInterop" -framework "FirebaseSessions" -framework "Foundation" -framework "GoogleAdsOnDeviceConversion" -framework "GoogleAppMeasurement" -framework "GoogleAppMeasurementIdentitySupport" -framework "GoogleDataTransport" -framework "GoogleUtilities" -framework "IronSource" -framework "JavaScriptCore" -framework "MobileCoreServices" -framework "Promises" -framework "QuartzCore" -framework "Security" -framework "StoreKit" -framework "SystemConfiguration" -framework "UIKit" -framework "WebKit" -framework "nanopb" +OTHER_MODULE_VERIFIER_FLAGS = $(inherited) "-F${PODS_CONFIGURATION_BUILD_DIR}/FirebaseAnalytics" "-F${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore" "-F${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreExtension" "-F${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreInternal" "-F${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCrashlytics" "-F${PODS_CONFIGURATION_BUILD_DIR}/FirebaseInstallations" "-F${PODS_CONFIGURATION_BUILD_DIR}/FirebaseRemoteConfigInterop" "-F${PODS_CONFIGURATION_BUILD_DIR}/FirebaseSessions" "-F${PODS_CONFIGURATION_BUILD_DIR}/GoogleAdsOnDeviceConversion" "-F${PODS_CONFIGURATION_BUILD_DIR}/GoogleAppMeasurement" "-F${PODS_CONFIGURATION_BUILD_DIR}/GoogleDataTransport" "-F${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities" "-F${PODS_CONFIGURATION_BUILD_DIR}/IronSourceAdQualitySDK" "-F${PODS_CONFIGURATION_BUILD_DIR}/IronSourceSDK" "-F${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC" "-F${PODS_CONFIGURATION_BUILD_DIR}/PromisesSwift" "-F${PODS_CONFIGURATION_BUILD_DIR}/nanopb" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/PromisesObjC/PromisesObjC-Info.plist b/Pods/Target Support Files/PromisesObjC/PromisesObjC-Info.plist new file mode 100644 index 0000000..2780533 --- /dev/null +++ b/Pods/Target Support Files/PromisesObjC/PromisesObjC-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + ${PODS_DEVELOPMENT_LANGUAGE} + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 2.4.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/PromisesObjC/PromisesObjC-dummy.m b/Pods/Target Support Files/PromisesObjC/PromisesObjC-dummy.m new file mode 100644 index 0000000..ab1f210 --- /dev/null +++ b/Pods/Target Support Files/PromisesObjC/PromisesObjC-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_PromisesObjC : NSObject +@end +@implementation PodsDummy_PromisesObjC +@end diff --git a/Pods/Target Support Files/PromisesObjC/PromisesObjC-umbrella.h b/Pods/Target Support Files/PromisesObjC/PromisesObjC-umbrella.h new file mode 100644 index 0000000..5b014a8 --- /dev/null +++ b/Pods/Target Support Files/PromisesObjC/PromisesObjC-umbrella.h @@ -0,0 +1,36 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + +#import "FBLPromise+All.h" +#import "FBLPromise+Always.h" +#import "FBLPromise+Any.h" +#import "FBLPromise+Async.h" +#import "FBLPromise+Await.h" +#import "FBLPromise+Catch.h" +#import "FBLPromise+Delay.h" +#import "FBLPromise+Do.h" +#import "FBLPromise+Race.h" +#import "FBLPromise+Recover.h" +#import "FBLPromise+Reduce.h" +#import "FBLPromise+Retry.h" +#import "FBLPromise+Testing.h" +#import "FBLPromise+Then.h" +#import "FBLPromise+Timeout.h" +#import "FBLPromise+Validate.h" +#import "FBLPromise+Wrap.h" +#import "FBLPromise.h" +#import "FBLPromiseError.h" +#import "FBLPromises.h" + +FOUNDATION_EXPORT double FBLPromisesVersionNumber; +FOUNDATION_EXPORT const unsigned char FBLPromisesVersionString[]; + diff --git a/Pods/Target Support Files/PromisesObjC/PromisesObjC.debug.xcconfig b/Pods/Target Support Files/PromisesObjC/PromisesObjC.debug.xcconfig new file mode 100644 index 0000000..132f10c --- /dev/null +++ b/Pods/Target Support Files/PromisesObjC/PromisesObjC.debug.xcconfig @@ -0,0 +1,13 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC +DEFINES_MODULE = YES +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/PromisesObjC +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/PromisesObjC/PromisesObjC.modulemap b/Pods/Target Support Files/PromisesObjC/PromisesObjC.modulemap new file mode 100644 index 0000000..7d485cd --- /dev/null +++ b/Pods/Target Support Files/PromisesObjC/PromisesObjC.modulemap @@ -0,0 +1,6 @@ +framework module FBLPromises { + umbrella header "PromisesObjC-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/PromisesObjC/PromisesObjC.release.xcconfig b/Pods/Target Support Files/PromisesObjC/PromisesObjC.release.xcconfig new file mode 100644 index 0000000..132f10c --- /dev/null +++ b/Pods/Target Support Files/PromisesObjC/PromisesObjC.release.xcconfig @@ -0,0 +1,13 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC +DEFINES_MODULE = YES +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/PromisesObjC +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/PromisesObjC/ResourceBundle-FBLPromises_Privacy-PromisesObjC-Info.plist b/Pods/Target Support Files/PromisesObjC/ResourceBundle-FBLPromises_Privacy-PromisesObjC-Info.plist new file mode 100644 index 0000000..1f1f0af --- /dev/null +++ b/Pods/Target Support Files/PromisesObjC/ResourceBundle-FBLPromises_Privacy-PromisesObjC-Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + ${PODS_DEVELOPMENT_LANGUAGE} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + BNDL + CFBundleShortVersionString + 2.4.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/PromisesSwift/PromisesSwift-Info.plist b/Pods/Target Support Files/PromisesSwift/PromisesSwift-Info.plist new file mode 100644 index 0000000..2780533 --- /dev/null +++ b/Pods/Target Support Files/PromisesSwift/PromisesSwift-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + ${PODS_DEVELOPMENT_LANGUAGE} + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 2.4.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/PromisesSwift/PromisesSwift-dummy.m b/Pods/Target Support Files/PromisesSwift/PromisesSwift-dummy.m new file mode 100644 index 0000000..460baba --- /dev/null +++ b/Pods/Target Support Files/PromisesSwift/PromisesSwift-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_PromisesSwift : NSObject +@end +@implementation PodsDummy_PromisesSwift +@end diff --git a/Pods/Target Support Files/PromisesSwift/PromisesSwift-prefix.pch b/Pods/Target Support Files/PromisesSwift/PromisesSwift-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/Pods/Target Support Files/PromisesSwift/PromisesSwift-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/Pods/Target Support Files/PromisesSwift/PromisesSwift-umbrella.h b/Pods/Target Support Files/PromisesSwift/PromisesSwift-umbrella.h new file mode 100644 index 0000000..06b1212 --- /dev/null +++ b/Pods/Target Support Files/PromisesSwift/PromisesSwift-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double PromisesVersionNumber; +FOUNDATION_EXPORT const unsigned char PromisesVersionString[]; + diff --git a/Pods/Target Support Files/PromisesSwift/PromisesSwift.debug.xcconfig b/Pods/Target Support Files/PromisesSwift/PromisesSwift.debug.xcconfig new file mode 100644 index 0000000..cfaa023 --- /dev/null +++ b/Pods/Target Support Files/PromisesSwift/PromisesSwift.debug.xcconfig @@ -0,0 +1,16 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/PromisesSwift +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_LDFLAGS = $(inherited) -framework "FBLPromises" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/PromisesSwift +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/PromisesSwift/PromisesSwift.modulemap b/Pods/Target Support Files/PromisesSwift/PromisesSwift.modulemap new file mode 100644 index 0000000..59800c6 --- /dev/null +++ b/Pods/Target Support Files/PromisesSwift/PromisesSwift.modulemap @@ -0,0 +1,6 @@ +framework module Promises { + umbrella header "PromisesSwift-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/PromisesSwift/PromisesSwift.release.xcconfig b/Pods/Target Support Files/PromisesSwift/PromisesSwift.release.xcconfig new file mode 100644 index 0000000..cfaa023 --- /dev/null +++ b/Pods/Target Support Files/PromisesSwift/PromisesSwift.release.xcconfig @@ -0,0 +1,16 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/PromisesSwift +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_LDFLAGS = $(inherited) -framework "FBLPromises" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/PromisesSwift +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/PromisesSwift/ResourceBundle-Promises_Privacy-PromisesSwift-Info.plist b/Pods/Target Support Files/PromisesSwift/ResourceBundle-Promises_Privacy-PromisesSwift-Info.plist new file mode 100644 index 0000000..1f1f0af --- /dev/null +++ b/Pods/Target Support Files/PromisesSwift/ResourceBundle-Promises_Privacy-PromisesSwift-Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + ${PODS_DEVELOPMENT_LANGUAGE} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + BNDL + CFBundleShortVersionString + 2.4.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/nanopb/ResourceBundle-nanopb_Privacy-nanopb-Info.plist b/Pods/Target Support Files/nanopb/ResourceBundle-nanopb_Privacy-nanopb-Info.plist new file mode 100644 index 0000000..b5d917c --- /dev/null +++ b/Pods/Target Support Files/nanopb/ResourceBundle-nanopb_Privacy-nanopb-Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + ${PODS_DEVELOPMENT_LANGUAGE} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + BNDL + CFBundleShortVersionString + 3.30910.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/nanopb/nanopb-Info.plist b/Pods/Target Support Files/nanopb/nanopb-Info.plist new file mode 100644 index 0000000..e39b8ca --- /dev/null +++ b/Pods/Target Support Files/nanopb/nanopb-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + ${PODS_DEVELOPMENT_LANGUAGE} + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 3.30910.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/nanopb/nanopb-dummy.m b/Pods/Target Support Files/nanopb/nanopb-dummy.m new file mode 100644 index 0000000..b3fa595 --- /dev/null +++ b/Pods/Target Support Files/nanopb/nanopb-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_nanopb : NSObject +@end +@implementation PodsDummy_nanopb +@end diff --git a/Pods/Target Support Files/nanopb/nanopb-prefix.pch b/Pods/Target Support Files/nanopb/nanopb-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/Pods/Target Support Files/nanopb/nanopb-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/Pods/Target Support Files/nanopb/nanopb-umbrella.h b/Pods/Target Support Files/nanopb/nanopb-umbrella.h new file mode 100644 index 0000000..07e77b3 --- /dev/null +++ b/Pods/Target Support Files/nanopb/nanopb-umbrella.h @@ -0,0 +1,26 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + +#import "pb.h" +#import "pb_common.h" +#import "pb_decode.h" +#import "pb_encode.h" +#import "pb.h" +#import "pb_decode.h" +#import "pb_common.h" +#import "pb.h" +#import "pb_encode.h" +#import "pb_common.h" + +FOUNDATION_EXPORT double nanopbVersionNumber; +FOUNDATION_EXPORT const unsigned char nanopbVersionString[]; + diff --git a/Pods/Target Support Files/nanopb/nanopb.debug.xcconfig b/Pods/Target Support Files/nanopb/nanopb.debug.xcconfig new file mode 100644 index 0000000..b682973 --- /dev/null +++ b/Pods/Target Support Files/nanopb/nanopb.debug.xcconfig @@ -0,0 +1,12 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/nanopb +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 $(inherited) PB_FIELD_32BIT=1 PB_NO_PACKED_STRUCTS=1 PB_ENABLE_MALLOC=1 +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/nanopb +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/nanopb/nanopb.modulemap b/Pods/Target Support Files/nanopb/nanopb.modulemap new file mode 100644 index 0000000..e8d4b53 --- /dev/null +++ b/Pods/Target Support Files/nanopb/nanopb.modulemap @@ -0,0 +1,6 @@ +framework module nanopb { + umbrella header "nanopb-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/nanopb/nanopb.release.xcconfig b/Pods/Target Support Files/nanopb/nanopb.release.xcconfig new file mode 100644 index 0000000..b682973 --- /dev/null +++ b/Pods/Target Support Files/nanopb/nanopb.release.xcconfig @@ -0,0 +1,12 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/nanopb +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 $(inherited) PB_FIELD_32BIT=1 PB_NO_PACKED_STRUCTS=1 PB_ENABLE_MALLOC=1 +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/nanopb +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/nanopb/LICENSE.txt b/Pods/nanopb/LICENSE.txt new file mode 100644 index 0000000..d11c9af --- /dev/null +++ b/Pods/nanopb/LICENSE.txt @@ -0,0 +1,20 @@ +Copyright (c) 2011 Petteri Aimonen + +This software is provided 'as-is', without any express or +implied warranty. In no event will the authors be held liable +for any damages arising from the use of this software. + +Permission is granted to anyone to use this software for any +purpose, including commercial applications, and to alter it and +redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you + must not claim that you wrote the original software. If you use + this software in a product, an acknowledgment in the product + documentation would be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and + must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source + distribution. diff --git a/Pods/nanopb/README.md b/Pods/nanopb/README.md new file mode 100644 index 0000000..1a73cdd --- /dev/null +++ b/Pods/nanopb/README.md @@ -0,0 +1,71 @@ +Nanopb - Protocol Buffers for Embedded Systems +============================================== + +[![Build Status](https://travis-ci.org/nanopb/nanopb.svg?branch=master)](https://travis-ci.org/nanopb/nanopb) + +Nanopb is a small code-size Protocol Buffers implementation in ansi C. It is +especially suitable for use in microcontrollers, but fits any memory +restricted system. + +* **Homepage:** https://jpa.kapsi.fi/nanopb/ +* **Documentation:** https://jpa.kapsi.fi/nanopb/docs/ +* **Downloads:** https://jpa.kapsi.fi/nanopb/download/ +* **Forum:** https://groups.google.com/forum/#!forum/nanopb + + + +Using the nanopb library +------------------------ +To use the nanopb library, you need to do two things: + +1. Compile your .proto files for nanopb, using `protoc`. +2. Include *pb_encode.c*, *pb_decode.c* and *pb_common.c* in your project. + +The easiest way to get started is to study the project in "examples/simple". +It contains a Makefile, which should work directly under most Linux systems. +However, for any other kind of build system, see the manual steps in +README.txt in that folder. + + + +Using the Protocol Buffers compiler (protoc) +-------------------------------------------- +The nanopb generator is implemented as a plugin for the Google's own `protoc` +compiler. This has the advantage that there is no need to reimplement the +basic parsing of .proto files. However, it does mean that you need the +Google's protobuf library in order to run the generator. + +If you have downloaded a binary package for nanopb (either Windows, Linux or +Mac OS X version), the `protoc` binary is included in the 'generator-bin' +folder. In this case, you are ready to go. Simply run this command: + + generator-bin/protoc --nanopb_out=. myprotocol.proto + +However, if you are using a git checkout or a plain source distribution, you +need to provide your own version of `protoc` and the Google's protobuf library. +On Linux, the necessary packages are `protobuf-compiler` and `python-protobuf`. +On Windows, you can either build Google's protobuf library from source or use +one of the binary distributions of it. In either case, if you use a separate +`protoc`, you need to manually give the path to nanopb generator: + + protoc --plugin=protoc-gen-nanopb=nanopb/generator/protoc-gen-nanopb ... + + + +Running the tests +----------------- +If you want to perform further development of the nanopb core, or to verify +its functionality using your compiler and platform, you'll want to run the +test suite. The build rules for the test suite are implemented using Scons, +so you need to have that installed (ex: `sudo apt install scons` on Ubuntu). To run the tests: + + cd tests + scons + +This will show the progress of various test cases. If the output does not +end in an error, the test cases were successful. + +Note: Mac OS X by default aliases 'clang' as 'gcc', while not actually +supporting the same command line options as gcc does. To run tests on +Mac OS X, use: "scons CC=clang CXX=clang". Same way can be used to run +tests with different compilers on any platform. diff --git a/Pods/nanopb/pb.h b/Pods/nanopb/pb.h new file mode 100644 index 0000000..2bd4568 --- /dev/null +++ b/Pods/nanopb/pb.h @@ -0,0 +1,599 @@ +/* Common parts of the nanopb library. Most of these are quite low-level + * stuff. For the high-level interface, see pb_encode.h and pb_decode.h. + */ + +#ifndef PB_H_INCLUDED +#define PB_H_INCLUDED + +/***************************************************************** + * Nanopb compilation time options. You can change these here by * + * uncommenting the lines, or on the compiler command line. * + *****************************************************************/ + +/* Enable support for dynamically allocated fields */ +/* #define PB_ENABLE_MALLOC 1 */ + +/* Define this if your CPU / compiler combination does not support + * unaligned memory access to packed structures. */ +/* #define PB_NO_PACKED_STRUCTS 1 */ + +/* Increase the number of required fields that are tracked. + * A compiler warning will tell if you need this. */ +/* #define PB_MAX_REQUIRED_FIELDS 256 */ + +/* Add support for tag numbers > 255 and fields larger than 255 bytes. */ +/* #define PB_FIELD_16BIT 1 */ + +/* Add support for tag numbers > 65536 and fields larger than 65536 bytes. */ +/* #define PB_FIELD_32BIT 1 */ + +/* Disable support for error messages in order to save some code space. */ +/* #define PB_NO_ERRMSG 1 */ + +/* Disable support for custom streams (support only memory buffers). */ +/* #define PB_BUFFER_ONLY 1 */ + +/* Switch back to the old-style callback function signature. + * This was the default until nanopb-0.2.1. */ +/* #define PB_OLD_CALLBACK_STYLE */ + + +/* Don't encode scalar arrays as packed. This is only to be used when + * the decoder on the receiving side cannot process packed scalar arrays. + * Such example is older protobuf.js. */ +/* #define PB_ENCODE_ARRAYS_UNPACKED 1 */ + +/****************************************************************** + * You usually don't need to change anything below this line. * + * Feel free to look around and use the defined macros, though. * + ******************************************************************/ + + +/* Version of the nanopb library. Just in case you want to check it in + * your own program. */ +#define NANOPB_VERSION nanopb-0.3.9.10 + +/* Include all the system headers needed by nanopb. You will need the + * definitions of the following: + * - strlen, memcpy, memset functions + * - [u]int_least8_t, uint_fast8_t, [u]int_least16_t, [u]int32_t, [u]int64_t + * - size_t + * - bool + * + * If you don't have the standard header files, you can instead provide + * a custom header that defines or includes all this. In that case, + * define PB_SYSTEM_HEADER to the path of this file. + */ +#ifdef PB_SYSTEM_HEADER +#include PB_SYSTEM_HEADER +#else +#include +#include +#include +#include + +#ifdef PB_ENABLE_MALLOC +#include +#endif +#endif + +/* Macro for defining packed structures (compiler dependent). + * This just reduces memory requirements, but is not required. + */ +#if defined(PB_NO_PACKED_STRUCTS) + /* Disable struct packing */ +# define PB_PACKED_STRUCT_START +# define PB_PACKED_STRUCT_END +# define pb_packed +#elif defined(__GNUC__) || defined(__clang__) + /* For GCC and clang */ +# define PB_PACKED_STRUCT_START +# define PB_PACKED_STRUCT_END +# define pb_packed __attribute__((packed)) +#elif defined(__ICCARM__) || defined(__CC_ARM) + /* For IAR ARM and Keil MDK-ARM compilers */ +# define PB_PACKED_STRUCT_START _Pragma("pack(push, 1)") +# define PB_PACKED_STRUCT_END _Pragma("pack(pop)") +# define pb_packed +#elif defined(_MSC_VER) && (_MSC_VER >= 1500) + /* For Microsoft Visual C++ */ +# define PB_PACKED_STRUCT_START __pragma(pack(push, 1)) +# define PB_PACKED_STRUCT_END __pragma(pack(pop)) +# define pb_packed +#else + /* Unknown compiler */ +# define PB_PACKED_STRUCT_START +# define PB_PACKED_STRUCT_END +# define pb_packed +#endif + +/* Handly macro for suppressing unreferenced-parameter compiler warnings. */ +#ifndef PB_UNUSED +#define PB_UNUSED(x) (void)(x) +#endif + +/* Compile-time assertion, used for checking compatible compilation options. + * If this does not work properly on your compiler, use + * #define PB_NO_STATIC_ASSERT to disable it. + * + * But before doing that, check carefully the error message / place where it + * comes from to see if the error has a real cause. Unfortunately the error + * message is not always very clear to read, but you can see the reason better + * in the place where the PB_STATIC_ASSERT macro was called. + */ +#ifndef PB_NO_STATIC_ASSERT +#ifndef PB_STATIC_ASSERT +#define PB_STATIC_ASSERT(COND,MSG) typedef char PB_STATIC_ASSERT_MSG(MSG, __LINE__, __COUNTER__)[(COND)?1:-1]; +#define PB_STATIC_ASSERT_MSG(MSG, LINE, COUNTER) PB_STATIC_ASSERT_MSG_(MSG, LINE, COUNTER) +#define PB_STATIC_ASSERT_MSG_(MSG, LINE, COUNTER) pb_static_assertion_##MSG##LINE##COUNTER +#endif +#else +#define PB_STATIC_ASSERT(COND,MSG) +#endif + +/* Number of required fields to keep track of. */ +#ifndef PB_MAX_REQUIRED_FIELDS +#define PB_MAX_REQUIRED_FIELDS 64 +#endif + +#if PB_MAX_REQUIRED_FIELDS < 64 +#error You should not lower PB_MAX_REQUIRED_FIELDS from the default value (64). +#endif + +/* List of possible field types. These are used in the autogenerated code. + * Least-significant 4 bits tell the scalar type + * Most-significant 4 bits specify repeated/required/packed etc. + */ + +typedef uint_least8_t pb_type_t; + +/**** Field data types ****/ + +/* Numeric types */ +#define PB_LTYPE_BOOL 0x00 /* bool */ +#define PB_LTYPE_VARINT 0x01 /* int32, int64, enum, bool */ +#define PB_LTYPE_UVARINT 0x02 /* uint32, uint64 */ +#define PB_LTYPE_SVARINT 0x03 /* sint32, sint64 */ +#define PB_LTYPE_FIXED32 0x04 /* fixed32, sfixed32, float */ +#define PB_LTYPE_FIXED64 0x05 /* fixed64, sfixed64, double */ + +/* Marker for last packable field type. */ +#define PB_LTYPE_LAST_PACKABLE 0x05 + +/* Byte array with pre-allocated buffer. + * data_size is the length of the allocated PB_BYTES_ARRAY structure. */ +#define PB_LTYPE_BYTES 0x06 + +/* String with pre-allocated buffer. + * data_size is the maximum length. */ +#define PB_LTYPE_STRING 0x07 + +/* Submessage + * submsg_fields is pointer to field descriptions */ +#define PB_LTYPE_SUBMESSAGE 0x08 + +/* Extension pseudo-field + * The field contains a pointer to pb_extension_t */ +#define PB_LTYPE_EXTENSION 0x09 + +/* Byte array with inline, pre-allocated byffer. + * data_size is the length of the inline, allocated buffer. + * This differs from PB_LTYPE_BYTES by defining the element as + * pb_byte_t[data_size] rather than pb_bytes_array_t. */ +#define PB_LTYPE_FIXED_LENGTH_BYTES 0x0A + +/* Number of declared LTYPES */ +#define PB_LTYPES_COUNT 0x0B +#define PB_LTYPE_MASK 0x0F + +/**** Field repetition rules ****/ + +#define PB_HTYPE_REQUIRED 0x00 +#define PB_HTYPE_OPTIONAL 0x10 +#define PB_HTYPE_REPEATED 0x20 +#define PB_HTYPE_ONEOF 0x30 +#define PB_HTYPE_MASK 0x30 + +/**** Field allocation types ****/ + +#define PB_ATYPE_STATIC 0x00 +#define PB_ATYPE_POINTER 0x80 +#define PB_ATYPE_CALLBACK 0x40 +#define PB_ATYPE_MASK 0xC0 + +#define PB_ATYPE(x) ((x) & PB_ATYPE_MASK) +#define PB_HTYPE(x) ((x) & PB_HTYPE_MASK) +#define PB_LTYPE(x) ((x) & PB_LTYPE_MASK) + +/* Data type used for storing sizes of struct fields + * and array counts. + */ +#if defined(PB_FIELD_32BIT) + typedef uint32_t pb_size_t; + typedef int32_t pb_ssize_t; +#elif defined(PB_FIELD_16BIT) + typedef uint_least16_t pb_size_t; + typedef int_least16_t pb_ssize_t; +#else + typedef uint_least8_t pb_size_t; + typedef int_least8_t pb_ssize_t; +#endif +#define PB_SIZE_MAX ((pb_size_t)-1) + +/* Data type for storing encoded data and other byte streams. + * This typedef exists to support platforms where uint8_t does not exist. + * You can regard it as equivalent on uint8_t on other platforms. + */ +typedef uint_least8_t pb_byte_t; + +/* This structure is used in auto-generated constants + * to specify struct fields. + * You can change field sizes if you need structures + * larger than 256 bytes or field tags larger than 256. + * The compiler should complain if your .proto has such + * structures. Fix that by defining PB_FIELD_16BIT or + * PB_FIELD_32BIT. + */ +PB_PACKED_STRUCT_START +typedef struct pb_field_s pb_field_t; +struct pb_field_s { + pb_size_t tag; + pb_type_t type; + pb_size_t data_offset; /* Offset of field data, relative to previous field. */ + pb_ssize_t size_offset; /* Offset of array size or has-boolean, relative to data */ + pb_size_t data_size; /* Data size in bytes for a single item */ + pb_size_t array_size; /* Maximum number of entries in array */ + + /* Field definitions for submessage + * OR default value for all other non-array, non-callback types + * If null, then field will zeroed. */ + const void *ptr; +} pb_packed; +PB_PACKED_STRUCT_END + +/* Make sure that the standard integer types are of the expected sizes. + * Otherwise fixed32/fixed64 fields can break. + * + * If you get errors here, it probably means that your stdint.h is not + * correct for your platform. + */ +#ifndef PB_WITHOUT_64BIT +PB_STATIC_ASSERT(sizeof(int64_t) == 2 * sizeof(int32_t), INT64_T_WRONG_SIZE) +PB_STATIC_ASSERT(sizeof(uint64_t) == 2 * sizeof(uint32_t), UINT64_T_WRONG_SIZE) +#endif + +/* This structure is used for 'bytes' arrays. + * It has the number of bytes in the beginning, and after that an array. + * Note that actual structs used will have a different length of bytes array. + */ +#define PB_BYTES_ARRAY_T(n) struct { pb_size_t size; pb_byte_t bytes[n]; } +#define PB_BYTES_ARRAY_T_ALLOCSIZE(n) ((size_t)n + offsetof(pb_bytes_array_t, bytes)) + +struct pb_bytes_array_s { + pb_size_t size; + pb_byte_t bytes[1]; +}; +typedef struct pb_bytes_array_s pb_bytes_array_t; + +/* This structure is used for giving the callback function. + * It is stored in the message structure and filled in by the method that + * calls pb_decode. + * + * The decoding callback will be given a limited-length stream + * If the wire type was string, the length is the length of the string. + * If the wire type was a varint/fixed32/fixed64, the length is the length + * of the actual value. + * The function may be called multiple times (especially for repeated types, + * but also otherwise if the message happens to contain the field multiple + * times.) + * + * The encoding callback will receive the actual output stream. + * It should write all the data in one call, including the field tag and + * wire type. It can write multiple fields. + * + * The callback can be null if you want to skip a field. + */ +typedef struct pb_istream_s pb_istream_t; +typedef struct pb_ostream_s pb_ostream_t; +typedef struct pb_callback_s pb_callback_t; +struct pb_callback_s { +#ifdef PB_OLD_CALLBACK_STYLE + /* Deprecated since nanopb-0.2.1 */ + union { + bool (*decode)(pb_istream_t *stream, const pb_field_t *field, void *arg); + bool (*encode)(pb_ostream_t *stream, const pb_field_t *field, const void *arg); + } funcs; +#else + /* New function signature, which allows modifying arg contents in callback. */ + union { + bool (*decode)(pb_istream_t *stream, const pb_field_t *field, void **arg); + bool (*encode)(pb_ostream_t *stream, const pb_field_t *field, void * const *arg); + } funcs; +#endif + + /* Free arg for use by callback */ + void *arg; +}; + +/* Wire types. Library user needs these only in encoder callbacks. */ +typedef enum { + PB_WT_VARINT = 0, + PB_WT_64BIT = 1, + PB_WT_STRING = 2, + PB_WT_32BIT = 5 +} pb_wire_type_t; + +/* Structure for defining the handling of unknown/extension fields. + * Usually the pb_extension_type_t structure is automatically generated, + * while the pb_extension_t structure is created by the user. However, + * if you want to catch all unknown fields, you can also create a custom + * pb_extension_type_t with your own callback. + */ +typedef struct pb_extension_type_s pb_extension_type_t; +typedef struct pb_extension_s pb_extension_t; +struct pb_extension_type_s { + /* Called for each unknown field in the message. + * If you handle the field, read off all of its data and return true. + * If you do not handle the field, do not read anything and return true. + * If you run into an error, return false. + * Set to NULL for default handler. + */ + bool (*decode)(pb_istream_t *stream, pb_extension_t *extension, + uint32_t tag, pb_wire_type_t wire_type); + + /* Called once after all regular fields have been encoded. + * If you have something to write, do so and return true. + * If you do not have anything to write, just return true. + * If you run into an error, return false. + * Set to NULL for default handler. + */ + bool (*encode)(pb_ostream_t *stream, const pb_extension_t *extension); + + /* Free field for use by the callback. */ + const void *arg; +}; + +struct pb_extension_s { + /* Type describing the extension field. Usually you'll initialize + * this to a pointer to the automatically generated structure. */ + const pb_extension_type_t *type; + + /* Destination for the decoded data. This must match the datatype + * of the extension field. */ + void *dest; + + /* Pointer to the next extension handler, or NULL. + * If this extension does not match a field, the next handler is + * automatically called. */ + pb_extension_t *next; + + /* The decoder sets this to true if the extension was found. + * Ignored for encoding. */ + bool found; +}; + +/* Memory allocation functions to use. You can define pb_realloc and + * pb_free to custom functions if you want. */ +#ifdef PB_ENABLE_MALLOC +# ifndef pb_realloc +# define pb_realloc(ptr, size) realloc(ptr, size) +# endif +# ifndef pb_free +# define pb_free(ptr) free(ptr) +# endif +#endif + +/* This is used to inform about need to regenerate .pb.h/.pb.c files. */ +#define PB_PROTO_HEADER_VERSION 30 + +/* These macros are used to declare pb_field_t's in the constant array. */ +/* Size of a structure member, in bytes. */ +#define pb_membersize(st, m) (sizeof ((st*)0)->m) +/* Number of entries in an array. */ +#define pb_arraysize(st, m) (pb_membersize(st, m) / pb_membersize(st, m[0])) +/* Delta from start of one member to the start of another member. */ +#define pb_delta(st, m1, m2) ((int)offsetof(st, m1) - (int)offsetof(st, m2)) +/* Marks the end of the field list */ +#define PB_LAST_FIELD {0,(pb_type_t) 0,0,0,0,0,0} + +/* Macros for filling in the data_offset field */ +/* data_offset for first field in a message */ +#define PB_DATAOFFSET_FIRST(st, m1, m2) (offsetof(st, m1)) +/* data_offset for subsequent fields */ +#define PB_DATAOFFSET_OTHER(st, m1, m2) (offsetof(st, m1) - offsetof(st, m2) - pb_membersize(st, m2)) +/* data offset for subsequent fields inside an union (oneof) */ +#define PB_DATAOFFSET_UNION(st, m1, m2) (PB_SIZE_MAX) +/* Choose first/other based on m1 == m2 (deprecated, remains for backwards compatibility) */ +#define PB_DATAOFFSET_CHOOSE(st, m1, m2) (int)(offsetof(st, m1) == offsetof(st, m2) \ + ? PB_DATAOFFSET_FIRST(st, m1, m2) \ + : PB_DATAOFFSET_OTHER(st, m1, m2)) + +/* Required fields are the simplest. They just have delta (padding) from + * previous field end, and the size of the field. Pointer is used for + * submessages and default values. + */ +#define PB_REQUIRED_STATIC(tag, st, m, fd, ltype, ptr) \ + {tag, PB_ATYPE_STATIC | PB_HTYPE_REQUIRED | ltype, \ + fd, 0, pb_membersize(st, m), 0, ptr} + +/* Optional fields add the delta to the has_ variable. */ +#define PB_OPTIONAL_STATIC(tag, st, m, fd, ltype, ptr) \ + {tag, PB_ATYPE_STATIC | PB_HTYPE_OPTIONAL | ltype, \ + fd, \ + pb_delta(st, has_ ## m, m), \ + pb_membersize(st, m), 0, ptr} + +#define PB_SINGULAR_STATIC(tag, st, m, fd, ltype, ptr) \ + {tag, PB_ATYPE_STATIC | PB_HTYPE_OPTIONAL | ltype, \ + fd, 0, pb_membersize(st, m), 0, ptr} + +/* Repeated fields have a _count field and also the maximum number of entries. */ +#define PB_REPEATED_STATIC(tag, st, m, fd, ltype, ptr) \ + {tag, PB_ATYPE_STATIC | PB_HTYPE_REPEATED | ltype, \ + fd, \ + pb_delta(st, m ## _count, m), \ + pb_membersize(st, m[0]), \ + pb_arraysize(st, m), ptr} + +/* Allocated fields carry the size of the actual data, not the pointer */ +#define PB_REQUIRED_POINTER(tag, st, m, fd, ltype, ptr) \ + {tag, PB_ATYPE_POINTER | PB_HTYPE_REQUIRED | ltype, \ + fd, 0, pb_membersize(st, m[0]), 0, ptr} + +/* Optional fields don't need a has_ variable, as information would be redundant */ +#define PB_OPTIONAL_POINTER(tag, st, m, fd, ltype, ptr) \ + {tag, PB_ATYPE_POINTER | PB_HTYPE_OPTIONAL | ltype, \ + fd, 0, pb_membersize(st, m[0]), 0, ptr} + +/* Same as optional fields*/ +#define PB_SINGULAR_POINTER(tag, st, m, fd, ltype, ptr) \ + {tag, PB_ATYPE_POINTER | PB_HTYPE_OPTIONAL | ltype, \ + fd, 0, pb_membersize(st, m[0]), 0, ptr} + +/* Repeated fields have a _count field and a pointer to array of pointers */ +#define PB_REPEATED_POINTER(tag, st, m, fd, ltype, ptr) \ + {tag, PB_ATYPE_POINTER | PB_HTYPE_REPEATED | ltype, \ + fd, pb_delta(st, m ## _count, m), \ + pb_membersize(st, m[0]), 0, ptr} + +/* Callbacks are much like required fields except with special datatype. */ +#define PB_REQUIRED_CALLBACK(tag, st, m, fd, ltype, ptr) \ + {tag, PB_ATYPE_CALLBACK | PB_HTYPE_REQUIRED | ltype, \ + fd, 0, pb_membersize(st, m), 0, ptr} + +#define PB_OPTIONAL_CALLBACK(tag, st, m, fd, ltype, ptr) \ + {tag, PB_ATYPE_CALLBACK | PB_HTYPE_OPTIONAL | ltype, \ + fd, 0, pb_membersize(st, m), 0, ptr} + +#define PB_SINGULAR_CALLBACK(tag, st, m, fd, ltype, ptr) \ + {tag, PB_ATYPE_CALLBACK | PB_HTYPE_OPTIONAL | ltype, \ + fd, 0, pb_membersize(st, m), 0, ptr} + +#define PB_REPEATED_CALLBACK(tag, st, m, fd, ltype, ptr) \ + {tag, PB_ATYPE_CALLBACK | PB_HTYPE_REPEATED | ltype, \ + fd, 0, pb_membersize(st, m), 0, ptr} + +/* Optional extensions don't have the has_ field, as that would be redundant. + * Furthermore, the combination of OPTIONAL without has_ field is used + * for indicating proto3 style fields. Extensions exist in proto2 mode only, + * so they should be encoded according to proto2 rules. To avoid the conflict, + * extensions are marked as REQUIRED instead. + */ +#define PB_OPTEXT_STATIC(tag, st, m, fd, ltype, ptr) \ + {tag, PB_ATYPE_STATIC | PB_HTYPE_REQUIRED | ltype, \ + 0, \ + 0, \ + pb_membersize(st, m), 0, ptr} + +#define PB_OPTEXT_POINTER(tag, st, m, fd, ltype, ptr) \ + PB_OPTIONAL_POINTER(tag, st, m, fd, ltype, ptr) + +#define PB_OPTEXT_CALLBACK(tag, st, m, fd, ltype, ptr) \ + PB_OPTIONAL_CALLBACK(tag, st, m, fd, ltype, ptr) + +/* The mapping from protobuf types to LTYPEs is done using these macros. */ +#define PB_LTYPE_MAP_BOOL PB_LTYPE_BOOL +#define PB_LTYPE_MAP_BYTES PB_LTYPE_BYTES +#define PB_LTYPE_MAP_DOUBLE PB_LTYPE_FIXED64 +#define PB_LTYPE_MAP_ENUM PB_LTYPE_VARINT +#define PB_LTYPE_MAP_UENUM PB_LTYPE_UVARINT +#define PB_LTYPE_MAP_FIXED32 PB_LTYPE_FIXED32 +#define PB_LTYPE_MAP_FIXED64 PB_LTYPE_FIXED64 +#define PB_LTYPE_MAP_FLOAT PB_LTYPE_FIXED32 +#define PB_LTYPE_MAP_INT32 PB_LTYPE_VARINT +#define PB_LTYPE_MAP_INT64 PB_LTYPE_VARINT +#define PB_LTYPE_MAP_MESSAGE PB_LTYPE_SUBMESSAGE +#define PB_LTYPE_MAP_SFIXED32 PB_LTYPE_FIXED32 +#define PB_LTYPE_MAP_SFIXED64 PB_LTYPE_FIXED64 +#define PB_LTYPE_MAP_SINT32 PB_LTYPE_SVARINT +#define PB_LTYPE_MAP_SINT64 PB_LTYPE_SVARINT +#define PB_LTYPE_MAP_STRING PB_LTYPE_STRING +#define PB_LTYPE_MAP_UINT32 PB_LTYPE_UVARINT +#define PB_LTYPE_MAP_UINT64 PB_LTYPE_UVARINT +#define PB_LTYPE_MAP_EXTENSION PB_LTYPE_EXTENSION +#define PB_LTYPE_MAP_FIXED_LENGTH_BYTES PB_LTYPE_FIXED_LENGTH_BYTES + +/* This is the actual macro used in field descriptions. + * It takes these arguments: + * - Field tag number + * - Field type: BOOL, BYTES, DOUBLE, ENUM, UENUM, FIXED32, FIXED64, + * FLOAT, INT32, INT64, MESSAGE, SFIXED32, SFIXED64 + * SINT32, SINT64, STRING, UINT32, UINT64 or EXTENSION + * - Field rules: REQUIRED, OPTIONAL or REPEATED + * - Allocation: STATIC, CALLBACK or POINTER + * - Placement: FIRST or OTHER, depending on if this is the first field in structure. + * - Message name + * - Field name + * - Previous field name (or field name again for first field) + * - Pointer to default value or submsg fields. + */ + +#define PB_FIELD(tag, type, rules, allocation, placement, message, field, prevfield, ptr) \ + PB_ ## rules ## _ ## allocation(tag, message, field, \ + PB_DATAOFFSET_ ## placement(message, field, prevfield), \ + PB_LTYPE_MAP_ ## type, ptr) + +/* Field description for repeated static fixed count fields.*/ +#define PB_REPEATED_FIXED_COUNT(tag, type, placement, message, field, prevfield, ptr) \ + {tag, PB_ATYPE_STATIC | PB_HTYPE_REPEATED | PB_LTYPE_MAP_ ## type, \ + PB_DATAOFFSET_ ## placement(message, field, prevfield), \ + 0, \ + pb_membersize(message, field[0]), \ + pb_arraysize(message, field), ptr} + +/* Field description for oneof fields. This requires taking into account the + * union name also, that's why a separate set of macros is needed. + */ +#define PB_ONEOF_STATIC(u, tag, st, m, fd, ltype, ptr) \ + {tag, PB_ATYPE_STATIC | PB_HTYPE_ONEOF | ltype, \ + fd, pb_delta(st, which_ ## u, u.m), \ + pb_membersize(st, u.m), 0, ptr} + +#define PB_ONEOF_POINTER(u, tag, st, m, fd, ltype, ptr) \ + {tag, PB_ATYPE_POINTER | PB_HTYPE_ONEOF | ltype, \ + fd, pb_delta(st, which_ ## u, u.m), \ + pb_membersize(st, u.m[0]), 0, ptr} + +#define PB_ONEOF_FIELD(union_name, tag, type, rules, allocation, placement, message, field, prevfield, ptr) \ + PB_ONEOF_ ## allocation(union_name, tag, message, field, \ + PB_DATAOFFSET_ ## placement(message, union_name.field, prevfield), \ + PB_LTYPE_MAP_ ## type, ptr) + +#define PB_ANONYMOUS_ONEOF_STATIC(u, tag, st, m, fd, ltype, ptr) \ + {tag, PB_ATYPE_STATIC | PB_HTYPE_ONEOF | ltype, \ + fd, pb_delta(st, which_ ## u, m), \ + pb_membersize(st, m), 0, ptr} + +#define PB_ANONYMOUS_ONEOF_POINTER(u, tag, st, m, fd, ltype, ptr) \ + {tag, PB_ATYPE_POINTER | PB_HTYPE_ONEOF | ltype, \ + fd, pb_delta(st, which_ ## u, m), \ + pb_membersize(st, m[0]), 0, ptr} + +#define PB_ANONYMOUS_ONEOF_FIELD(union_name, tag, type, rules, allocation, placement, message, field, prevfield, ptr) \ + PB_ANONYMOUS_ONEOF_ ## allocation(union_name, tag, message, field, \ + PB_DATAOFFSET_ ## placement(message, field, prevfield), \ + PB_LTYPE_MAP_ ## type, ptr) + +/* These macros are used for giving out error messages. + * They are mostly a debugging aid; the main error information + * is the true/false return value from functions. + * Some code space can be saved by disabling the error + * messages if not used. + * + * PB_SET_ERROR() sets the error message if none has been set yet. + * msg must be a constant string literal. + * PB_GET_ERROR() always returns a pointer to a string. + * PB_RETURN_ERROR() sets the error and returns false from current + * function. + */ +#ifdef PB_NO_ERRMSG +#define PB_SET_ERROR(stream, msg) PB_UNUSED(stream) +#define PB_GET_ERROR(stream) "(errmsg disabled)" +#else +#define PB_SET_ERROR(stream, msg) (stream->errmsg = (stream)->errmsg ? (stream)->errmsg : (msg)) +#define PB_GET_ERROR(stream) ((stream)->errmsg ? (stream)->errmsg : "(none)") +#endif + +#define PB_RETURN_ERROR(stream, msg) return PB_SET_ERROR(stream, msg), false + +#endif diff --git a/Pods/nanopb/pb_common.c b/Pods/nanopb/pb_common.c new file mode 100644 index 0000000..5799db2 --- /dev/null +++ b/Pods/nanopb/pb_common.c @@ -0,0 +1,106 @@ +/* pb_common.c: Common support functions for pb_encode.c and pb_decode.c. + * + * 2014 Petteri Aimonen + */ + +#include "pb_common.h" + +bool pb_field_iter_begin(pb_field_iter_t *iter, const pb_field_t *fields, void *dest_struct) +{ + iter->start = fields; + iter->pos = fields; + iter->required_field_index = 0; + iter->dest_struct = dest_struct; + + if (!dest_struct) + { + iter->pData = NULL; + iter->pSize = NULL; + } + else + { + iter->pData = (char*)dest_struct + iter->pos->data_offset; + iter->pSize = (char*)iter->pData + iter->pos->size_offset; + } + + return (iter->pos->tag != 0); +} + +bool pb_field_iter_next(pb_field_iter_t *iter) +{ + const pb_field_t *prev_field = iter->pos; + + if (prev_field->tag == 0) + { + /* Handle empty message types, where the first field is already the terminator. + * In other cases, the iter->pos never points to the terminator. */ + return false; + } + + iter->pos++; + + if (iter->pos->tag == 0) + { + /* Wrapped back to beginning, reinitialize */ + (void)pb_field_iter_begin(iter, iter->start, iter->dest_struct); + return false; + } + else + { + /* Increment the pointers based on previous field size */ + size_t prev_size = prev_field->data_size; + + if (PB_HTYPE(prev_field->type) == PB_HTYPE_ONEOF && + PB_HTYPE(iter->pos->type) == PB_HTYPE_ONEOF && + iter->pos->data_offset == PB_SIZE_MAX) + { + /* Don't advance pointers inside unions */ + return true; + } + else if (PB_ATYPE(prev_field->type) == PB_ATYPE_STATIC && + PB_HTYPE(prev_field->type) == PB_HTYPE_REPEATED) + { + /* In static arrays, the data_size tells the size of a single entry and + * array_size is the number of entries */ + prev_size *= prev_field->array_size; + } + else if (PB_ATYPE(prev_field->type) == PB_ATYPE_POINTER) + { + /* Pointer fields always have a constant size in the main structure. + * The data_size only applies to the dynamically allocated area. */ + prev_size = sizeof(void*); + } + + if (PB_HTYPE(prev_field->type) == PB_HTYPE_REQUIRED) + { + /* Count the required fields, in order to check their presence in the + * decoder. */ + iter->required_field_index++; + } + + iter->pData = (char*)iter->pData + prev_size + iter->pos->data_offset; + iter->pSize = (char*)iter->pData + iter->pos->size_offset; + return true; + } +} + +bool pb_field_iter_find(pb_field_iter_t *iter, uint32_t tag) +{ + const pb_field_t *start = iter->pos; + + do { + if (iter->pos->tag == tag && + PB_LTYPE(iter->pos->type) != PB_LTYPE_EXTENSION) + { + /* Found the wanted field */ + return true; + } + + (void)pb_field_iter_next(iter); + } while (iter->pos != start); + + /* Searched all the way back to start, and found nothing. */ + return false; +} + + diff --git a/Pods/nanopb/pb_common.h b/Pods/nanopb/pb_common.h new file mode 100644 index 0000000..60b3d37 --- /dev/null +++ b/Pods/nanopb/pb_common.h @@ -0,0 +1,42 @@ +/* pb_common.h: Common support functions for pb_encode.c and pb_decode.c. + * These functions are rarely needed by applications directly. + */ + +#ifndef PB_COMMON_H_INCLUDED +#define PB_COMMON_H_INCLUDED + +#include "pb.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Iterator for pb_field_t list */ +struct pb_field_iter_s { + const pb_field_t *start; /* Start of the pb_field_t array */ + const pb_field_t *pos; /* Current position of the iterator */ + unsigned required_field_index; /* Zero-based index that counts only the required fields */ + void *dest_struct; /* Pointer to start of the structure */ + void *pData; /* Pointer to current field value */ + void *pSize; /* Pointer to count/has field */ +}; +typedef struct pb_field_iter_s pb_field_iter_t; + +/* Initialize the field iterator structure to beginning. + * Returns false if the message type is empty. */ +bool pb_field_iter_begin(pb_field_iter_t *iter, const pb_field_t *fields, void *dest_struct); + +/* Advance the iterator to the next field. + * Returns false when the iterator wraps back to the first field. */ +bool pb_field_iter_next(pb_field_iter_t *iter); + +/* Advance the iterator until it points at a field with the given tag. + * Returns false if no such field exists. */ +bool pb_field_iter_find(pb_field_iter_t *iter, uint32_t tag); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif + diff --git a/Pods/nanopb/pb_decode.c b/Pods/nanopb/pb_decode.c new file mode 100644 index 0000000..ebf7e85 --- /dev/null +++ b/Pods/nanopb/pb_decode.c @@ -0,0 +1,1570 @@ +/* pb_decode.c -- decode a protobuf using minimal resources + * + * 2011 Petteri Aimonen + */ + +/* Use the GCC warn_unused_result attribute to check that all return values + * are propagated correctly. On other compilers and gcc before 3.4.0 just + * ignore the annotation. + */ +#if !defined(__GNUC__) || ( __GNUC__ < 3) || (__GNUC__ == 3 && __GNUC_MINOR__ < 4) + #define checkreturn +#else + #define checkreturn __attribute__((warn_unused_result)) +#endif + +#include "pb.h" +#include "pb_decode.h" +#include "pb_common.h" + +/************************************** + * Declarations internal to this file * + **************************************/ + +typedef bool (*pb_decoder_t)(pb_istream_t *stream, const pb_field_t *field, void *dest) checkreturn; + +static bool checkreturn buf_read(pb_istream_t *stream, pb_byte_t *buf, size_t count); +static bool checkreturn read_raw_value(pb_istream_t *stream, pb_wire_type_t wire_type, pb_byte_t *buf, size_t *size); +static bool checkreturn decode_static_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *iter); +static bool checkreturn decode_callback_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *iter); +static bool checkreturn decode_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *iter); +static void iter_from_extension(pb_field_iter_t *iter, pb_extension_t *extension); +static bool checkreturn default_extension_decoder(pb_istream_t *stream, pb_extension_t *extension, uint32_t tag, pb_wire_type_t wire_type); +static bool checkreturn decode_extension(pb_istream_t *stream, uint32_t tag, pb_wire_type_t wire_type, pb_field_iter_t *iter); +static bool checkreturn find_extension_field(pb_field_iter_t *iter); +static void pb_field_set_to_default(pb_field_iter_t *iter); +static void pb_message_set_to_defaults(const pb_field_t fields[], void *dest_struct); +static bool checkreturn pb_dec_bool(pb_istream_t *stream, const pb_field_t *field, void *dest); +static bool checkreturn pb_dec_varint(pb_istream_t *stream, const pb_field_t *field, void *dest); +static bool checkreturn pb_decode_varint32_eof(pb_istream_t *stream, uint32_t *dest, bool *eof); +static bool checkreturn pb_dec_uvarint(pb_istream_t *stream, const pb_field_t *field, void *dest); +static bool checkreturn pb_dec_svarint(pb_istream_t *stream, const pb_field_t *field, void *dest); +static bool checkreturn pb_dec_fixed32(pb_istream_t *stream, const pb_field_t *field, void *dest); +static bool checkreturn pb_dec_fixed64(pb_istream_t *stream, const pb_field_t *field, void *dest); +static bool checkreturn pb_dec_bytes(pb_istream_t *stream, const pb_field_t *field, void *dest); +static bool checkreturn pb_dec_string(pb_istream_t *stream, const pb_field_t *field, void *dest); +static bool checkreturn pb_dec_submessage(pb_istream_t *stream, const pb_field_t *field, void *dest); +static bool checkreturn pb_dec_fixed_length_bytes(pb_istream_t *stream, const pb_field_t *field, void *dest); +static bool checkreturn pb_skip_varint(pb_istream_t *stream); +static bool checkreturn pb_skip_string(pb_istream_t *stream); + +#ifdef PB_ENABLE_MALLOC +static bool checkreturn allocate_field(pb_istream_t *stream, void *pData, size_t data_size, size_t array_size); +static bool checkreturn pb_release_union_field(pb_istream_t *stream, pb_field_iter_t *iter); +static void pb_release_single_field(const pb_field_iter_t *iter); +#endif + +#ifdef PB_WITHOUT_64BIT +#define pb_int64_t int32_t +#define pb_uint64_t uint32_t +#else +#define pb_int64_t int64_t +#define pb_uint64_t uint64_t +#endif + +/* --- Function pointers to field decoders --- + * Order in the array must match pb_action_t LTYPE numbering. + */ +static const pb_decoder_t PB_DECODERS[PB_LTYPES_COUNT] = { + &pb_dec_bool, + &pb_dec_varint, + &pb_dec_uvarint, + &pb_dec_svarint, + &pb_dec_fixed32, + &pb_dec_fixed64, + + &pb_dec_bytes, + &pb_dec_string, + &pb_dec_submessage, + NULL, /* extensions */ + &pb_dec_fixed_length_bytes +}; + +/******************************* + * pb_istream_t implementation * + *******************************/ + +static bool checkreturn buf_read(pb_istream_t *stream, pb_byte_t *buf, size_t count) +{ + size_t i; + const pb_byte_t *source = (const pb_byte_t*)stream->state; + stream->state = (pb_byte_t*)stream->state + count; + + if (buf != NULL) + { + for (i = 0; i < count; i++) + buf[i] = source[i]; + } + + return true; +} + +bool checkreturn pb_read(pb_istream_t *stream, pb_byte_t *buf, size_t count) +{ + if (count == 0) + return true; + +#ifndef PB_BUFFER_ONLY + if (buf == NULL && stream->callback != buf_read) + { + /* Skip input bytes */ + pb_byte_t tmp[16]; + while (count > 16) + { + if (!pb_read(stream, tmp, 16)) + return false; + + count -= 16; + } + + return pb_read(stream, tmp, count); + } +#endif + + if (stream->bytes_left < count) + PB_RETURN_ERROR(stream, "end-of-stream"); + +#ifndef PB_BUFFER_ONLY + if (!stream->callback(stream, buf, count)) + PB_RETURN_ERROR(stream, "io error"); +#else + if (!buf_read(stream, buf, count)) + return false; +#endif + + stream->bytes_left -= count; + return true; +} + +/* Read a single byte from input stream. buf may not be NULL. + * This is an optimization for the varint decoding. */ +static bool checkreturn pb_readbyte(pb_istream_t *stream, pb_byte_t *buf) +{ + if (stream->bytes_left == 0) + PB_RETURN_ERROR(stream, "end-of-stream"); + +#ifndef PB_BUFFER_ONLY + if (!stream->callback(stream, buf, 1)) + PB_RETURN_ERROR(stream, "io error"); +#else + *buf = *(const pb_byte_t*)stream->state; + stream->state = (pb_byte_t*)stream->state + 1; +#endif + + stream->bytes_left--; + + return true; +} + +pb_istream_t pb_istream_from_buffer(const pb_byte_t *buf, size_t bufsize) +{ + pb_istream_t stream; + /* Cast away the const from buf without a compiler error. We are + * careful to use it only in a const manner in the callbacks. + */ + union { + void *state; + const void *c_state; + } state; +#ifdef PB_BUFFER_ONLY + stream.callback = NULL; +#else + stream.callback = &buf_read; +#endif + state.c_state = buf; + stream.state = state.state; + stream.bytes_left = bufsize; +#ifndef PB_NO_ERRMSG + stream.errmsg = NULL; +#endif + return stream; +} + +/******************** + * Helper functions * + ********************/ + +static bool checkreturn pb_decode_varint32_eof(pb_istream_t *stream, uint32_t *dest, bool *eof) +{ + pb_byte_t byte; + uint32_t result; + + if (!pb_readbyte(stream, &byte)) + { + if (stream->bytes_left == 0) + { + if (eof) + { + *eof = true; + } + } + + return false; + } + + if ((byte & 0x80) == 0) + { + /* Quick case, 1 byte value */ + result = byte; + } + else + { + /* Multibyte case */ + uint_fast8_t bitpos = 7; + result = byte & 0x7F; + + do + { + if (!pb_readbyte(stream, &byte)) + return false; + + if (bitpos >= 32) + { + /* Note: The varint could have trailing 0x80 bytes, or 0xFF for negative. */ + uint8_t sign_extension = (bitpos < 63) ? 0xFF : 0x01; + + if ((byte & 0x7F) != 0x00 && ((result >> 31) == 0 || byte != sign_extension)) + { + PB_RETURN_ERROR(stream, "varint overflow"); + } + } + else + { + result |= (uint32_t)(byte & 0x7F) << bitpos; + } + bitpos = (uint_fast8_t)(bitpos + 7); + } while (byte & 0x80); + + if (bitpos == 35 && (byte & 0x70) != 0) + { + /* The last byte was at bitpos=28, so only bottom 4 bits fit. */ + PB_RETURN_ERROR(stream, "varint overflow"); + } + } + + *dest = result; + return true; +} + +bool checkreturn pb_decode_varint32(pb_istream_t *stream, uint32_t *dest) +{ + return pb_decode_varint32_eof(stream, dest, NULL); +} + +#ifndef PB_WITHOUT_64BIT +bool checkreturn pb_decode_varint(pb_istream_t *stream, uint64_t *dest) +{ + pb_byte_t byte; + uint_fast8_t bitpos = 0; + uint64_t result = 0; + + do + { + if (bitpos >= 64) + PB_RETURN_ERROR(stream, "varint overflow"); + + if (!pb_readbyte(stream, &byte)) + return false; + + result |= (uint64_t)(byte & 0x7F) << bitpos; + bitpos = (uint_fast8_t)(bitpos + 7); + } while (byte & 0x80); + + *dest = result; + return true; +} +#endif + +bool checkreturn pb_skip_varint(pb_istream_t *stream) +{ + pb_byte_t byte; + do + { + if (!pb_read(stream, &byte, 1)) + return false; + } while (byte & 0x80); + return true; +} + +bool checkreturn pb_skip_string(pb_istream_t *stream) +{ + uint32_t length; + if (!pb_decode_varint32(stream, &length)) + return false; + + return pb_read(stream, NULL, length); +} + +bool checkreturn pb_decode_tag(pb_istream_t *stream, pb_wire_type_t *wire_type, uint32_t *tag, bool *eof) +{ + uint32_t temp; + *eof = false; + *wire_type = (pb_wire_type_t) 0; + *tag = 0; + + if (!pb_decode_varint32_eof(stream, &temp, eof)) + { + return false; + } + + if (temp == 0) + { + *eof = true; /* Special feature: allow 0-terminated messages. */ + return false; + } + + *tag = temp >> 3; + *wire_type = (pb_wire_type_t)(temp & 7); + return true; +} + +bool checkreturn pb_skip_field(pb_istream_t *stream, pb_wire_type_t wire_type) +{ + switch (wire_type) + { + case PB_WT_VARINT: return pb_skip_varint(stream); + case PB_WT_64BIT: return pb_read(stream, NULL, 8); + case PB_WT_STRING: return pb_skip_string(stream); + case PB_WT_32BIT: return pb_read(stream, NULL, 4); + default: PB_RETURN_ERROR(stream, "invalid wire_type"); + } +} + +/* Read a raw value to buffer, for the purpose of passing it to callback as + * a substream. Size is maximum size on call, and actual size on return. + */ +static bool checkreturn read_raw_value(pb_istream_t *stream, pb_wire_type_t wire_type, pb_byte_t *buf, size_t *size) +{ + size_t max_size = *size; + switch (wire_type) + { + case PB_WT_VARINT: + *size = 0; + do + { + (*size)++; + if (*size > max_size) return false; + if (!pb_read(stream, buf, 1)) return false; + } while (*buf++ & 0x80); + return true; + + case PB_WT_64BIT: + *size = 8; + return pb_read(stream, buf, 8); + + case PB_WT_32BIT: + *size = 4; + return pb_read(stream, buf, 4); + + case PB_WT_STRING: + /* Calling read_raw_value with a PB_WT_STRING is an error. + * Explicitly handle this case and fallthrough to default to avoid + * compiler warnings. + */ + + default: PB_RETURN_ERROR(stream, "invalid wire_type"); + } +} + +/* Decode string length from stream and return a substream with limited length. + * Remember to close the substream using pb_close_string_substream(). + */ +bool checkreturn pb_make_string_substream(pb_istream_t *stream, pb_istream_t *substream) +{ + uint32_t size; + if (!pb_decode_varint32(stream, &size)) + return false; + + *substream = *stream; + if (substream->bytes_left < size) + PB_RETURN_ERROR(stream, "parent stream too short"); + + substream->bytes_left = size; + stream->bytes_left -= size; + return true; +} + +bool checkreturn pb_close_string_substream(pb_istream_t *stream, pb_istream_t *substream) +{ + if (substream->bytes_left) { + if (!pb_read(substream, NULL, substream->bytes_left)) + return false; + } + + stream->state = substream->state; + +#ifndef PB_NO_ERRMSG + stream->errmsg = substream->errmsg; +#endif + return true; +} + +/************************* + * Decode a single field * + *************************/ + +static bool checkreturn decode_static_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *iter) +{ + pb_type_t type; + pb_decoder_t func; + + type = iter->pos->type; + func = PB_DECODERS[PB_LTYPE(type)]; + + switch (PB_HTYPE(type)) + { + case PB_HTYPE_REQUIRED: + return func(stream, iter->pos, iter->pData); + + case PB_HTYPE_OPTIONAL: + if (iter->pSize != iter->pData) + *(bool*)iter->pSize = true; + return func(stream, iter->pos, iter->pData); + + case PB_HTYPE_REPEATED: + if (wire_type == PB_WT_STRING + && PB_LTYPE(type) <= PB_LTYPE_LAST_PACKABLE) + { + /* Packed array */ + bool status = true; + pb_size_t *size = (pb_size_t*)iter->pSize; + + pb_istream_t substream; + if (!pb_make_string_substream(stream, &substream)) + return false; + + while (substream.bytes_left > 0 && *size < iter->pos->array_size) + { + void *pItem = (char*)iter->pData + iter->pos->data_size * (*size); + if (!func(&substream, iter->pos, pItem)) + { + status = false; + break; + } + (*size)++; + } + + if (substream.bytes_left != 0) + PB_RETURN_ERROR(stream, "array overflow"); + if (!pb_close_string_substream(stream, &substream)) + return false; + + return status; + } + else + { + /* Repeated field */ + pb_size_t *size = (pb_size_t*)iter->pSize; + char *pItem = (char*)iter->pData + iter->pos->data_size * (*size); + + if ((*size)++ >= iter->pos->array_size) + PB_RETURN_ERROR(stream, "array overflow"); + + return func(stream, iter->pos, pItem); + } + + case PB_HTYPE_ONEOF: + if (PB_LTYPE(type) == PB_LTYPE_SUBMESSAGE && + *(pb_size_t*)iter->pSize != iter->pos->tag) + { + /* We memset to zero so that any callbacks are set to NULL. + * This is because the callbacks might otherwise have values + * from some other union field. */ + memset(iter->pData, 0, iter->pos->data_size); + pb_message_set_to_defaults((const pb_field_t*)iter->pos->ptr, iter->pData); + } + *(pb_size_t*)iter->pSize = iter->pos->tag; + + return func(stream, iter->pos, iter->pData); + + default: + PB_RETURN_ERROR(stream, "invalid field type"); + } +} + +#ifdef PB_ENABLE_MALLOC +/* Allocate storage for the field and store the pointer at iter->pData. + * array_size is the number of entries to reserve in an array. + * Zero size is not allowed, use pb_free() for releasing. + */ +static bool checkreturn allocate_field(pb_istream_t *stream, void *pData, size_t data_size, size_t array_size) +{ + void *ptr = *(void**)pData; + + if (data_size == 0 || array_size == 0) + PB_RETURN_ERROR(stream, "invalid size"); + +#ifdef __AVR__ + /* Workaround for AVR libc bug 53284: http://savannah.nongnu.org/bugs/?53284 + * Realloc to size of 1 byte can cause corruption of the malloc structures. + */ + if (data_size == 1 && array_size == 1) + { + data_size = 2; + } +#endif + + /* Check for multiplication overflows. + * This code avoids the costly division if the sizes are small enough. + * Multiplication is safe as long as only half of bits are set + * in either multiplicand. + */ + { + const size_t check_limit = (size_t)1 << (sizeof(size_t) * 4); + if (data_size >= check_limit || array_size >= check_limit) + { + const size_t size_max = (size_t)-1; + if (size_max / array_size < data_size) + { + PB_RETURN_ERROR(stream, "size too large"); + } + } + } + + /* Allocate new or expand previous allocation */ + /* Note: on failure the old pointer will remain in the structure, + * the message must be freed by caller also on error return. */ + ptr = pb_realloc(ptr, array_size * data_size); + if (ptr == NULL) + PB_RETURN_ERROR(stream, "realloc failed"); + + *(void**)pData = ptr; + return true; +} + +/* Clear a newly allocated item in case it contains a pointer, or is a submessage. */ +static void initialize_pointer_field(void *pItem, pb_field_iter_t *iter) +{ + if (PB_LTYPE(iter->pos->type) == PB_LTYPE_STRING || + PB_LTYPE(iter->pos->type) == PB_LTYPE_BYTES) + { + *(void**)pItem = NULL; + } + else if (PB_LTYPE(iter->pos->type) == PB_LTYPE_SUBMESSAGE) + { + /* We memset to zero so that any callbacks are set to NULL. + * Then set any default values. */ + memset(pItem, 0, iter->pos->data_size); + pb_message_set_to_defaults((const pb_field_t *) iter->pos->ptr, pItem); + } +} +#endif + +static bool checkreturn decode_pointer_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *iter) +{ +#ifndef PB_ENABLE_MALLOC + PB_UNUSED(wire_type); + PB_UNUSED(iter); + PB_RETURN_ERROR(stream, "no malloc support"); +#else + pb_type_t type; + pb_decoder_t func; + + type = iter->pos->type; + func = PB_DECODERS[PB_LTYPE(type)]; + + switch (PB_HTYPE(type)) + { + case PB_HTYPE_REQUIRED: + case PB_HTYPE_OPTIONAL: + case PB_HTYPE_ONEOF: + if (PB_LTYPE(type) == PB_LTYPE_SUBMESSAGE && + *(void**)iter->pData != NULL) + { + /* Duplicate field, have to release the old allocation first. */ + pb_release_single_field(iter); + } + + if (PB_HTYPE(type) == PB_HTYPE_ONEOF) + { + *(pb_size_t*)iter->pSize = iter->pos->tag; + } + + if (PB_LTYPE(type) == PB_LTYPE_STRING || + PB_LTYPE(type) == PB_LTYPE_BYTES) + { + return func(stream, iter->pos, iter->pData); + } + else + { + if (!allocate_field(stream, iter->pData, iter->pos->data_size, 1)) + return false; + + initialize_pointer_field(*(void**)iter->pData, iter); + return func(stream, iter->pos, *(void**)iter->pData); + } + + case PB_HTYPE_REPEATED: + if (wire_type == PB_WT_STRING + && PB_LTYPE(type) <= PB_LTYPE_LAST_PACKABLE) + { + /* Packed array, multiple items come in at once. */ + bool status = true; + pb_size_t *size = (pb_size_t*)iter->pSize; + size_t allocated_size = *size; + void *pItem; + pb_istream_t substream; + + if (!pb_make_string_substream(stream, &substream)) + return false; + + while (substream.bytes_left) + { + if (*size == PB_SIZE_MAX) + { +#ifndef PB_NO_ERRMSG + stream->errmsg = "too many array entries"; +#endif + status = false; + break; + } + + if ((size_t)*size + 1 > allocated_size) + { + /* Allocate more storage. This tries to guess the + * number of remaining entries. Round the division + * upwards. */ + size_t remain = (substream.bytes_left - 1) / iter->pos->data_size + 1; + if (remain < PB_SIZE_MAX - allocated_size) + allocated_size += remain; + else + allocated_size += 1; + + if (!allocate_field(&substream, iter->pData, iter->pos->data_size, allocated_size)) + { + status = false; + break; + } + } + + /* Decode the array entry */ + pItem = *(char**)iter->pData + iter->pos->data_size * (*size); + if (pItem == NULL) + { + /* Shouldn't happen, but satisfies static analyzers */ + status = false; + break; + } + initialize_pointer_field(pItem, iter); + if (!func(&substream, iter->pos, pItem)) + { + status = false; + break; + } + + (*size)++; + } + if (!pb_close_string_substream(stream, &substream)) + return false; + + return status; + } + else + { + /* Normal repeated field, i.e. only one item at a time. */ + pb_size_t *size = (pb_size_t*)iter->pSize; + void *pItem; + + if (*size == PB_SIZE_MAX) + PB_RETURN_ERROR(stream, "too many array entries"); + + if (!allocate_field(stream, iter->pData, iter->pos->data_size, (size_t)(*size + 1))) + return false; + + pItem = *(char**)iter->pData + iter->pos->data_size * (*size); + (*size)++; + initialize_pointer_field(pItem, iter); + return func(stream, iter->pos, pItem); + } + + default: + PB_RETURN_ERROR(stream, "invalid field type"); + } +#endif +} + +static bool checkreturn decode_callback_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *iter) +{ + pb_callback_t *pCallback = (pb_callback_t*)iter->pData; +#ifdef PB_OLD_CALLBACK_STYLE + void *arg; +#else + void **arg; +#endif + + if (pCallback == NULL || pCallback->funcs.decode == NULL) + return pb_skip_field(stream, wire_type); + +#ifdef PB_OLD_CALLBACK_STYLE + arg = pCallback->arg; +#else + arg = &(pCallback->arg); +#endif + + if (wire_type == PB_WT_STRING) + { + pb_istream_t substream; + + if (!pb_make_string_substream(stream, &substream)) + return false; + + do + { + if (!pCallback->funcs.decode(&substream, iter->pos, arg)) + PB_RETURN_ERROR(stream, "callback failed"); + } while (substream.bytes_left); + + if (!pb_close_string_substream(stream, &substream)) + return false; + + return true; + } + else + { + /* Copy the single scalar value to stack. + * This is required so that we can limit the stream length, + * which in turn allows to use same callback for packed and + * not-packed fields. */ + pb_istream_t substream; + pb_byte_t buffer[10]; + size_t size = sizeof(buffer); + + if (!read_raw_value(stream, wire_type, buffer, &size)) + return false; + substream = pb_istream_from_buffer(buffer, size); + + return pCallback->funcs.decode(&substream, iter->pos, arg); + } +} + +static bool checkreturn decode_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *iter) +{ +#ifdef PB_ENABLE_MALLOC + /* When decoding an oneof field, check if there is old data that must be + * released first. */ + if (PB_HTYPE(iter->pos->type) == PB_HTYPE_ONEOF) + { + if (!pb_release_union_field(stream, iter)) + return false; + } +#endif + + switch (PB_ATYPE(iter->pos->type)) + { + case PB_ATYPE_STATIC: + return decode_static_field(stream, wire_type, iter); + + case PB_ATYPE_POINTER: + return decode_pointer_field(stream, wire_type, iter); + + case PB_ATYPE_CALLBACK: + return decode_callback_field(stream, wire_type, iter); + + default: + PB_RETURN_ERROR(stream, "invalid field type"); + } +} + +static void iter_from_extension(pb_field_iter_t *iter, pb_extension_t *extension) +{ + /* Fake a field iterator for the extension field. + * It is not actually safe to advance this iterator, but decode_field + * will not even try to. */ + const pb_field_t *field = (const pb_field_t*)extension->type->arg; + (void)pb_field_iter_begin(iter, field, extension->dest); + iter->pData = extension->dest; + iter->pSize = &extension->found; + + if (PB_ATYPE(field->type) == PB_ATYPE_POINTER) + { + /* For pointer extensions, the pointer is stored directly + * in the extension structure. This avoids having an extra + * indirection. */ + iter->pData = &extension->dest; + } +} + +/* Default handler for extension fields. Expects a pb_field_t structure + * in extension->type->arg. */ +static bool checkreturn default_extension_decoder(pb_istream_t *stream, + pb_extension_t *extension, uint32_t tag, pb_wire_type_t wire_type) +{ + const pb_field_t *field = (const pb_field_t*)extension->type->arg; + pb_field_iter_t iter; + + if (field->tag != tag) + return true; + + iter_from_extension(&iter, extension); + extension->found = true; + return decode_field(stream, wire_type, &iter); +} + +/* Try to decode an unknown field as an extension field. Tries each extension + * decoder in turn, until one of them handles the field or loop ends. */ +static bool checkreturn decode_extension(pb_istream_t *stream, + uint32_t tag, pb_wire_type_t wire_type, pb_field_iter_t *iter) +{ + pb_extension_t *extension = *(pb_extension_t* const *)iter->pData; + size_t pos = stream->bytes_left; + + while (extension != NULL && pos == stream->bytes_left) + { + bool status; + if (extension->type->decode) + status = extension->type->decode(stream, extension, tag, wire_type); + else + status = default_extension_decoder(stream, extension, tag, wire_type); + + if (!status) + return false; + + extension = extension->next; + } + + return true; +} + +/* Step through the iterator until an extension field is found or until all + * entries have been checked. There can be only one extension field per + * message. Returns false if no extension field is found. */ +static bool checkreturn find_extension_field(pb_field_iter_t *iter) +{ + const pb_field_t *start = iter->pos; + + do { + if (PB_LTYPE(iter->pos->type) == PB_LTYPE_EXTENSION) + return true; + (void)pb_field_iter_next(iter); + } while (iter->pos != start); + + return false; +} + +/* Initialize message fields to default values, recursively */ +static void pb_field_set_to_default(pb_field_iter_t *iter) +{ + pb_type_t type; + type = iter->pos->type; + + if (PB_LTYPE(type) == PB_LTYPE_EXTENSION) + { + pb_extension_t *ext = *(pb_extension_t* const *)iter->pData; + while (ext != NULL) + { + pb_field_iter_t ext_iter; + ext->found = false; + iter_from_extension(&ext_iter, ext); + pb_field_set_to_default(&ext_iter); + ext = ext->next; + } + } + else if (PB_ATYPE(type) == PB_ATYPE_STATIC) + { + bool init_data = true; + if (PB_HTYPE(type) == PB_HTYPE_OPTIONAL && iter->pSize != iter->pData) + { + /* Set has_field to false. Still initialize the optional field + * itself also. */ + *(bool*)iter->pSize = false; + } + else if (PB_HTYPE(type) == PB_HTYPE_REPEATED || + PB_HTYPE(type) == PB_HTYPE_ONEOF) + { + /* REPEATED: Set array count to 0, no need to initialize contents. + ONEOF: Set which_field to 0. */ + *(pb_size_t*)iter->pSize = 0; + init_data = false; + } + + if (init_data) + { + if (PB_LTYPE(iter->pos->type) == PB_LTYPE_SUBMESSAGE) + { + /* Initialize submessage to defaults */ + pb_message_set_to_defaults((const pb_field_t *) iter->pos->ptr, iter->pData); + } + else if (iter->pos->ptr != NULL) + { + /* Initialize to default value */ + memcpy(iter->pData, iter->pos->ptr, iter->pos->data_size); + } + else + { + /* Initialize to zeros */ + memset(iter->pData, 0, iter->pos->data_size); + } + } + } + else if (PB_ATYPE(type) == PB_ATYPE_POINTER) + { + /* Initialize the pointer to NULL. */ + *(void**)iter->pData = NULL; + + /* Initialize array count to 0. */ + if (PB_HTYPE(type) == PB_HTYPE_REPEATED || + PB_HTYPE(type) == PB_HTYPE_ONEOF) + { + *(pb_size_t*)iter->pSize = 0; + } + } + else if (PB_ATYPE(type) == PB_ATYPE_CALLBACK) + { + /* Don't overwrite callback */ + } +} + +static void pb_message_set_to_defaults(const pb_field_t fields[], void *dest_struct) +{ + pb_field_iter_t iter; + + if (!pb_field_iter_begin(&iter, fields, dest_struct)) + return; /* Empty message type */ + + do + { + pb_field_set_to_default(&iter); + } while (pb_field_iter_next(&iter)); +} + +/********************* + * Decode all fields * + *********************/ + +bool checkreturn pb_decode_noinit(pb_istream_t *stream, const pb_field_t fields[], void *dest_struct) +{ + uint32_t fields_seen[(PB_MAX_REQUIRED_FIELDS + 31) / 32] = {0, 0}; + const uint32_t allbits = ~(uint32_t)0; + uint32_t extension_range_start = 0; + pb_field_iter_t iter; + + /* 'fixed_count_field' and 'fixed_count_size' track position of a repeated fixed + * count field. This can only handle _one_ repeated fixed count field that + * is unpacked and unordered among other (non repeated fixed count) fields. + */ + const pb_field_t *fixed_count_field = NULL; + pb_size_t fixed_count_size = 0; + + /* Return value ignored, as empty message types will be correctly handled by + * pb_field_iter_find() anyway. */ + (void)pb_field_iter_begin(&iter, fields, dest_struct); + + while (stream->bytes_left) + { + uint32_t tag; + pb_wire_type_t wire_type; + bool eof; + + if (!pb_decode_tag(stream, &wire_type, &tag, &eof)) + { + if (eof) + break; + else + return false; + } + + if (!pb_field_iter_find(&iter, tag)) + { + /* No match found, check if it matches an extension. */ + if (tag >= extension_range_start) + { + if (!find_extension_field(&iter)) + extension_range_start = (uint32_t)-1; + else + extension_range_start = iter.pos->tag; + + if (tag >= extension_range_start) + { + size_t pos = stream->bytes_left; + + if (!decode_extension(stream, tag, wire_type, &iter)) + return false; + + if (pos != stream->bytes_left) + { + /* The field was handled */ + continue; + } + } + } + + /* No match found, skip data */ + if (!pb_skip_field(stream, wire_type)) + return false; + continue; + } + + /* If a repeated fixed count field was found, get size from + * 'fixed_count_field' as there is no counter contained in the struct. + */ + if (PB_HTYPE(iter.pos->type) == PB_HTYPE_REPEATED + && iter.pSize == iter.pData) + { + if (fixed_count_field != iter.pos) { + /* If the new fixed count field does not match the previous one, + * check that the previous one is NULL or that it finished + * receiving all the expected data. + */ + if (fixed_count_field != NULL && + fixed_count_size != fixed_count_field->array_size) + { + PB_RETURN_ERROR(stream, "wrong size for fixed count field"); + } + + fixed_count_field = iter.pos; + fixed_count_size = 0; + } + + iter.pSize = &fixed_count_size; + } + + if (PB_HTYPE(iter.pos->type) == PB_HTYPE_REQUIRED + && iter.required_field_index < PB_MAX_REQUIRED_FIELDS) + { + uint32_t tmp = ((uint32_t)1 << (iter.required_field_index & 31)); + fields_seen[iter.required_field_index >> 5] |= tmp; + } + + if (!decode_field(stream, wire_type, &iter)) + return false; + } + + /* Check that all elements of the last decoded fixed count field were present. */ + if (fixed_count_field != NULL && + fixed_count_size != fixed_count_field->array_size) + { + PB_RETURN_ERROR(stream, "wrong size for fixed count field"); + } + + /* Check that all required fields were present. */ + { + /* First figure out the number of required fields by + * seeking to the end of the field array. Usually we + * are already close to end after decoding. + */ + unsigned req_field_count; + pb_type_t last_type; + unsigned i; + do { + req_field_count = iter.required_field_index; + last_type = iter.pos->type; + } while (pb_field_iter_next(&iter)); + + /* Fixup if last field was also required. */ + if (PB_HTYPE(last_type) == PB_HTYPE_REQUIRED && iter.pos->tag != 0) + req_field_count++; + + if (req_field_count > PB_MAX_REQUIRED_FIELDS) + req_field_count = PB_MAX_REQUIRED_FIELDS; + + if (req_field_count > 0) + { + /* Check the whole words */ + for (i = 0; i < (req_field_count >> 5); i++) + { + if (fields_seen[i] != allbits) + PB_RETURN_ERROR(stream, "missing required field"); + } + + /* Check the remaining bits (if any) */ + if ((req_field_count & 31) != 0) + { + if (fields_seen[req_field_count >> 5] != + (allbits >> (32 - (req_field_count & 31)))) + { + PB_RETURN_ERROR(stream, "missing required field"); + } + } + } + } + + return true; +} + +bool checkreturn pb_decode(pb_istream_t *stream, const pb_field_t fields[], void *dest_struct) +{ + bool status; + pb_message_set_to_defaults(fields, dest_struct); + status = pb_decode_noinit(stream, fields, dest_struct); + +#ifdef PB_ENABLE_MALLOC + if (!status) + pb_release(fields, dest_struct); +#endif + + return status; +} + +bool pb_decode_delimited_noinit(pb_istream_t *stream, const pb_field_t fields[], void *dest_struct) +{ + pb_istream_t substream; + bool status; + + if (!pb_make_string_substream(stream, &substream)) + return false; + + status = pb_decode_noinit(&substream, fields, dest_struct); + + if (!pb_close_string_substream(stream, &substream)) + return false; + return status; +} + +bool pb_decode_delimited(pb_istream_t *stream, const pb_field_t fields[], void *dest_struct) +{ + pb_istream_t substream; + bool status; + + if (!pb_make_string_substream(stream, &substream)) + return false; + + status = pb_decode(&substream, fields, dest_struct); + + if (!pb_close_string_substream(stream, &substream)) + return false; + return status; +} + +bool pb_decode_nullterminated(pb_istream_t *stream, const pb_field_t fields[], void *dest_struct) +{ + /* This behaviour will be separated in nanopb-0.4.0, see issue #278. */ + return pb_decode(stream, fields, dest_struct); +} + +#ifdef PB_ENABLE_MALLOC +/* Given an oneof field, if there has already been a field inside this oneof, + * release it before overwriting with a different one. */ +static bool pb_release_union_field(pb_istream_t *stream, pb_field_iter_t *iter) +{ + pb_size_t old_tag = *(pb_size_t*)iter->pSize; /* Previous which_ value */ + pb_size_t new_tag = iter->pos->tag; /* New which_ value */ + + if (old_tag == 0) + return true; /* Ok, no old data in union */ + + if (old_tag == new_tag) + return true; /* Ok, old data is of same type => merge */ + + /* Release old data. The find can fail if the message struct contains + * invalid data. */ + if (!pb_field_iter_find(iter, old_tag)) + PB_RETURN_ERROR(stream, "invalid union tag"); + + pb_release_single_field(iter); + + /* Restore iterator to where it should be. + * This shouldn't fail unless the pb_field_t structure is corrupted. */ + if (!pb_field_iter_find(iter, new_tag)) + PB_RETURN_ERROR(stream, "iterator error"); + + if (PB_ATYPE(iter->pos->type) == PB_ATYPE_POINTER) + { + /* Initialize the pointer to NULL to make sure it is valid + * even in case of error return. */ + *(void**)iter->pData = NULL; + } + + return true; +} + +static void pb_release_single_field(const pb_field_iter_t *iter) +{ + pb_type_t type; + type = iter->pos->type; + + if (PB_HTYPE(type) == PB_HTYPE_ONEOF) + { + if (*(pb_size_t*)iter->pSize != iter->pos->tag) + return; /* This is not the current field in the union */ + } + + /* Release anything contained inside an extension or submsg. + * This has to be done even if the submsg itself is statically + * allocated. */ + if (PB_LTYPE(type) == PB_LTYPE_EXTENSION) + { + /* Release fields from all extensions in the linked list */ + pb_extension_t *ext = *(pb_extension_t**)iter->pData; + while (ext != NULL) + { + pb_field_iter_t ext_iter; + iter_from_extension(&ext_iter, ext); + pb_release_single_field(&ext_iter); + ext = ext->next; + } + } + else if (PB_LTYPE(type) == PB_LTYPE_SUBMESSAGE && PB_ATYPE(type) != PB_ATYPE_CALLBACK) + { + /* Release fields in submessage or submsg array */ + void *pItem = iter->pData; + pb_size_t count = 1; + + if (PB_ATYPE(type) == PB_ATYPE_POINTER) + { + pItem = *(void**)iter->pData; + } + + if (PB_HTYPE(type) == PB_HTYPE_REPEATED) + { + if (PB_ATYPE(type) == PB_ATYPE_STATIC && iter->pSize == iter->pData) { + /* No _count field so use size of the array */ + count = iter->pos->array_size; + } else { + count = *(pb_size_t*)iter->pSize; + } + + if (PB_ATYPE(type) == PB_ATYPE_STATIC && count > iter->pos->array_size) + { + /* Protect against corrupted _count fields */ + count = iter->pos->array_size; + } + } + + if (pItem) + { + for (; count > 0; count--) + { + pb_release((const pb_field_t*)iter->pos->ptr, pItem); + pItem = (char*)pItem + iter->pos->data_size; + } + } + } + + if (PB_ATYPE(type) == PB_ATYPE_POINTER) + { + if (PB_HTYPE(type) == PB_HTYPE_REPEATED && + (PB_LTYPE(type) == PB_LTYPE_STRING || + PB_LTYPE(type) == PB_LTYPE_BYTES)) + { + /* Release entries in repeated string or bytes array */ + void **pItem = *(void***)iter->pData; + pb_size_t count = *(pb_size_t*)iter->pSize; + for (; count > 0; count--) + { + pb_free(*pItem); + *pItem++ = NULL; + } + } + + if (PB_HTYPE(type) == PB_HTYPE_REPEATED) + { + /* We are going to release the array, so set the size to 0 */ + *(pb_size_t*)iter->pSize = 0; + } + + /* Release main item */ + pb_free(*(void**)iter->pData); + *(void**)iter->pData = NULL; + } +} + +void pb_release(const pb_field_t fields[], void *dest_struct) +{ + pb_field_iter_t iter; + + if (!dest_struct) + return; /* Ignore NULL pointers, similar to free() */ + + if (!pb_field_iter_begin(&iter, fields, dest_struct)) + return; /* Empty message type */ + + do + { + pb_release_single_field(&iter); + } while (pb_field_iter_next(&iter)); +} +#endif + +/* Field decoders */ + +bool pb_decode_bool(pb_istream_t *stream, bool *dest) +{ + return pb_dec_bool(stream, NULL, (void*)dest); +} + +bool pb_decode_svarint(pb_istream_t *stream, pb_int64_t *dest) +{ + pb_uint64_t value; + if (!pb_decode_varint(stream, &value)) + return false; + + if (value & 1) + *dest = (pb_int64_t)(~(value >> 1)); + else + *dest = (pb_int64_t)(value >> 1); + + return true; +} + +bool pb_decode_fixed32(pb_istream_t *stream, void *dest) +{ + pb_byte_t bytes[4]; + + if (!pb_read(stream, bytes, 4)) + return false; + + *(uint32_t*)dest = ((uint32_t)bytes[0] << 0) | + ((uint32_t)bytes[1] << 8) | + ((uint32_t)bytes[2] << 16) | + ((uint32_t)bytes[3] << 24); + return true; +} + +#ifndef PB_WITHOUT_64BIT +bool pb_decode_fixed64(pb_istream_t *stream, void *dest) +{ + pb_byte_t bytes[8]; + + if (!pb_read(stream, bytes, 8)) + return false; + + *(uint64_t*)dest = ((uint64_t)bytes[0] << 0) | + ((uint64_t)bytes[1] << 8) | + ((uint64_t)bytes[2] << 16) | + ((uint64_t)bytes[3] << 24) | + ((uint64_t)bytes[4] << 32) | + ((uint64_t)bytes[5] << 40) | + ((uint64_t)bytes[6] << 48) | + ((uint64_t)bytes[7] << 56); + + return true; +} +#endif + +static bool checkreturn pb_dec_bool(pb_istream_t *stream, const pb_field_t *field, void *dest) +{ + uint32_t value; + PB_UNUSED(field); + if (!pb_decode_varint32(stream, &value)) + return false; + + *(bool*)dest = (value != 0); + return true; +} + +static bool checkreturn pb_dec_varint(pb_istream_t *stream, const pb_field_t *field, void *dest) +{ + pb_uint64_t value; + pb_int64_t svalue; + pb_int64_t clamped; + if (!pb_decode_varint(stream, &value)) + return false; + + /* See issue 97: Google's C++ protobuf allows negative varint values to + * be cast as int32_t, instead of the int64_t that should be used when + * encoding. Previous nanopb versions had a bug in encoding. In order to + * not break decoding of such messages, we cast <=32 bit fields to + * int32_t first to get the sign correct. + */ + if (field->data_size == sizeof(pb_int64_t)) + svalue = (pb_int64_t)value; + else + svalue = (int32_t)value; + + /* Cast to the proper field size, while checking for overflows */ + if (field->data_size == sizeof(pb_int64_t)) + clamped = *(pb_int64_t*)dest = svalue; + else if (field->data_size == sizeof(int32_t)) + clamped = *(int32_t*)dest = (int32_t)svalue; + else if (field->data_size == sizeof(int_least16_t)) + clamped = *(int_least16_t*)dest = (int_least16_t)svalue; + else if (field->data_size == sizeof(int_least8_t)) + clamped = *(int_least8_t*)dest = (int_least8_t)svalue; + else + PB_RETURN_ERROR(stream, "invalid data_size"); + + if (clamped != svalue) + PB_RETURN_ERROR(stream, "integer too large"); + + return true; +} + +static bool checkreturn pb_dec_uvarint(pb_istream_t *stream, const pb_field_t *field, void *dest) +{ + pb_uint64_t value, clamped; + if (!pb_decode_varint(stream, &value)) + return false; + + /* Cast to the proper field size, while checking for overflows */ + if (field->data_size == sizeof(pb_uint64_t)) + clamped = *(pb_uint64_t*)dest = value; + else if (field->data_size == sizeof(uint32_t)) + clamped = *(uint32_t*)dest = (uint32_t)value; + else if (field->data_size == sizeof(uint_least16_t)) + clamped = *(uint_least16_t*)dest = (uint_least16_t)value; + else if (field->data_size == sizeof(uint_least8_t)) + clamped = *(uint_least8_t*)dest = (uint_least8_t)value; + else + PB_RETURN_ERROR(stream, "invalid data_size"); + + if (clamped != value) + PB_RETURN_ERROR(stream, "integer too large"); + + return true; +} + +static bool checkreturn pb_dec_svarint(pb_istream_t *stream, const pb_field_t *field, void *dest) +{ + pb_int64_t value, clamped; + if (!pb_decode_svarint(stream, &value)) + return false; + + /* Cast to the proper field size, while checking for overflows */ + if (field->data_size == sizeof(pb_int64_t)) + clamped = *(pb_int64_t*)dest = value; + else if (field->data_size == sizeof(int32_t)) + clamped = *(int32_t*)dest = (int32_t)value; + else if (field->data_size == sizeof(int_least16_t)) + clamped = *(int_least16_t*)dest = (int_least16_t)value; + else if (field->data_size == sizeof(int_least8_t)) + clamped = *(int_least8_t*)dest = (int_least8_t)value; + else + PB_RETURN_ERROR(stream, "invalid data_size"); + + if (clamped != value) + PB_RETURN_ERROR(stream, "integer too large"); + + return true; +} + +static bool checkreturn pb_dec_fixed32(pb_istream_t *stream, const pb_field_t *field, void *dest) +{ + PB_UNUSED(field); + return pb_decode_fixed32(stream, dest); +} + +static bool checkreturn pb_dec_fixed64(pb_istream_t *stream, const pb_field_t *field, void *dest) +{ + PB_UNUSED(field); +#ifndef PB_WITHOUT_64BIT + return pb_decode_fixed64(stream, dest); +#else + PB_UNUSED(dest); + PB_RETURN_ERROR(stream, "no 64bit support"); +#endif +} + +static bool checkreturn pb_dec_bytes(pb_istream_t *stream, const pb_field_t *field, void *dest) +{ + uint32_t size; + size_t alloc_size; + pb_bytes_array_t *bdest; + + if (!pb_decode_varint32(stream, &size)) + return false; + + if (size > PB_SIZE_MAX) + PB_RETURN_ERROR(stream, "bytes overflow"); + + alloc_size = PB_BYTES_ARRAY_T_ALLOCSIZE(size); + if (size > alloc_size) + PB_RETURN_ERROR(stream, "size too large"); + + if (PB_ATYPE(field->type) == PB_ATYPE_POINTER) + { +#ifndef PB_ENABLE_MALLOC + PB_RETURN_ERROR(stream, "no malloc support"); +#else + if (stream->bytes_left < size) + PB_RETURN_ERROR(stream, "end-of-stream"); + + if (!allocate_field(stream, dest, alloc_size, 1)) + return false; + bdest = *(pb_bytes_array_t**)dest; +#endif + } + else + { + if (alloc_size > field->data_size) + PB_RETURN_ERROR(stream, "bytes overflow"); + bdest = (pb_bytes_array_t*)dest; + } + + bdest->size = (pb_size_t)size; + return pb_read(stream, bdest->bytes, size); +} + +static bool checkreturn pb_dec_string(pb_istream_t *stream, const pb_field_t *field, void *dest) +{ + uint32_t size; + size_t alloc_size; + bool status; + if (!pb_decode_varint32(stream, &size)) + return false; + + /* Space for null terminator */ + alloc_size = size + 1; + + if (alloc_size < size) + PB_RETURN_ERROR(stream, "size too large"); + + if (PB_ATYPE(field->type) == PB_ATYPE_POINTER) + { +#ifndef PB_ENABLE_MALLOC + PB_RETURN_ERROR(stream, "no malloc support"); +#else + if (stream->bytes_left < size) + PB_RETURN_ERROR(stream, "end-of-stream"); + + if (!allocate_field(stream, dest, alloc_size, 1)) + return false; + dest = *(void**)dest; +#endif + } + else + { + if (alloc_size > field->data_size) + PB_RETURN_ERROR(stream, "string overflow"); + } + + status = pb_read(stream, (pb_byte_t*)dest, size); + *((pb_byte_t*)dest + size) = 0; + return status; +} + +static bool checkreturn pb_dec_submessage(pb_istream_t *stream, const pb_field_t *field, void *dest) +{ + bool status; + pb_istream_t substream; + const pb_field_t* submsg_fields = (const pb_field_t*)field->ptr; + + if (!pb_make_string_substream(stream, &substream)) + return false; + + if (field->ptr == NULL) + PB_RETURN_ERROR(stream, "invalid field descriptor"); + + /* New array entries need to be initialized, while required and optional + * submessages have already been initialized in the top-level pb_decode. */ + if (PB_HTYPE(field->type) == PB_HTYPE_REPEATED) + status = pb_decode(&substream, submsg_fields, dest); + else + status = pb_decode_noinit(&substream, submsg_fields, dest); + + if (!pb_close_string_substream(stream, &substream)) + return false; + return status; +} + +static bool checkreturn pb_dec_fixed_length_bytes(pb_istream_t *stream, const pb_field_t *field, void *dest) +{ + uint32_t size; + + if (!pb_decode_varint32(stream, &size)) + return false; + + if (size > PB_SIZE_MAX) + PB_RETURN_ERROR(stream, "bytes overflow"); + + if (size == 0) + { + /* As a special case, treat empty bytes string as all zeros for fixed_length_bytes. */ + memset(dest, 0, field->data_size); + return true; + } + + if (size != field->data_size) + PB_RETURN_ERROR(stream, "incorrect fixed length bytes size"); + + return pb_read(stream, (pb_byte_t*)dest, field->data_size); +} diff --git a/Pods/nanopb/pb_decode.h b/Pods/nanopb/pb_decode.h new file mode 100644 index 0000000..3577c20 --- /dev/null +++ b/Pods/nanopb/pb_decode.h @@ -0,0 +1,178 @@ +/* pb_decode.h: Functions to decode protocol buffers. Depends on pb_decode.c. + * The main function is pb_decode. You also need an input stream, and the + * field descriptions created by nanopb_generator.py. + */ + +#ifndef PB_DECODE_H_INCLUDED +#define PB_DECODE_H_INCLUDED + +#include "pb.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Structure for defining custom input streams. You will need to provide + * a callback function to read the bytes from your storage, which can be + * for example a file or a network socket. + * + * The callback must conform to these rules: + * + * 1) Return false on IO errors. This will cause decoding to abort. + * 2) You can use state to store your own data (e.g. buffer pointer), + * and rely on pb_read to verify that no-body reads past bytes_left. + * 3) Your callback may be used with substreams, in which case bytes_left + * is different than from the main stream. Don't use bytes_left to compute + * any pointers. + */ +struct pb_istream_s +{ +#ifdef PB_BUFFER_ONLY + /* Callback pointer is not used in buffer-only configuration. + * Having an int pointer here allows binary compatibility but + * gives an error if someone tries to assign callback function. + */ + int *callback; +#else + bool (*callback)(pb_istream_t *stream, pb_byte_t *buf, size_t count); +#endif + + void *state; /* Free field for use by callback implementation */ + size_t bytes_left; + +#ifndef PB_NO_ERRMSG + const char *errmsg; +#endif +}; + +/*************************** + * Main decoding functions * + ***************************/ + +/* Decode a single protocol buffers message from input stream into a C structure. + * Returns true on success, false on any failure. + * The actual struct pointed to by dest must match the description in fields. + * Callback fields of the destination structure must be initialized by caller. + * All other fields will be initialized by this function. + * + * Example usage: + * MyMessage msg = {}; + * uint8_t buffer[64]; + * pb_istream_t stream; + * + * // ... read some data into buffer ... + * + * stream = pb_istream_from_buffer(buffer, count); + * pb_decode(&stream, MyMessage_fields, &msg); + */ +bool pb_decode(pb_istream_t *stream, const pb_field_t fields[], void *dest_struct); + +/* Same as pb_decode, except does not initialize the destination structure + * to default values. This is slightly faster if you need no default values + * and just do memset(struct, 0, sizeof(struct)) yourself. + * + * This can also be used for 'merging' two messages, i.e. update only the + * fields that exist in the new message. + * + * Note: If this function returns with an error, it will not release any + * dynamically allocated fields. You will need to call pb_release() yourself. + */ +bool pb_decode_noinit(pb_istream_t *stream, const pb_field_t fields[], void *dest_struct); + +/* Same as pb_decode, except expects the stream to start with the message size + * encoded as varint. Corresponds to parseDelimitedFrom() in Google's + * protobuf API. + */ +bool pb_decode_delimited(pb_istream_t *stream, const pb_field_t fields[], void *dest_struct); + +/* Same as pb_decode_delimited, except that it does not initialize the destination structure. + * See pb_decode_noinit + */ +bool pb_decode_delimited_noinit(pb_istream_t *stream, const pb_field_t fields[], void *dest_struct); + +/* Same as pb_decode, except allows the message to be terminated with a null byte. + * NOTE: Until nanopb-0.4.0, pb_decode() also allows null-termination. This behaviour + * is not supported in most other protobuf implementations, so pb_decode_delimited() + * is a better option for compatibility. + */ +bool pb_decode_nullterminated(pb_istream_t *stream, const pb_field_t fields[], void *dest_struct); + +#ifdef PB_ENABLE_MALLOC +/* Release any allocated pointer fields. If you use dynamic allocation, you should + * call this for any successfully decoded message when you are done with it. If + * pb_decode() returns with an error, the message is already released. + */ +void pb_release(const pb_field_t fields[], void *dest_struct); +#endif + + +/************************************** + * Functions for manipulating streams * + **************************************/ + +/* Create an input stream for reading from a memory buffer. + * + * Alternatively, you can use a custom stream that reads directly from e.g. + * a file or a network socket. + */ +pb_istream_t pb_istream_from_buffer(const pb_byte_t *buf, size_t bufsize); + +/* Function to read from a pb_istream_t. You can use this if you need to + * read some custom header data, or to read data in field callbacks. + */ +bool pb_read(pb_istream_t *stream, pb_byte_t *buf, size_t count); + + +/************************************************ + * Helper functions for writing field callbacks * + ************************************************/ + +/* Decode the tag for the next field in the stream. Gives the wire type and + * field tag. At end of the message, returns false and sets eof to true. */ +bool pb_decode_tag(pb_istream_t *stream, pb_wire_type_t *wire_type, uint32_t *tag, bool *eof); + +/* Skip the field payload data, given the wire type. */ +bool pb_skip_field(pb_istream_t *stream, pb_wire_type_t wire_type); + +/* Decode an integer in the varint format. This works for enum, int32, + * int64, uint32 and uint64 field types. */ +#ifndef PB_WITHOUT_64BIT +bool pb_decode_varint(pb_istream_t *stream, uint64_t *dest); +#else +#define pb_decode_varint pb_decode_varint32 +#endif + +/* Decode an integer in the varint format. This works for enum, int32, + * and uint32 field types. */ +bool pb_decode_varint32(pb_istream_t *stream, uint32_t *dest); + +/* Decode a bool value in varint format. */ +bool pb_decode_bool(pb_istream_t *stream, bool *dest); + +/* Decode an integer in the zig-zagged svarint format. This works for sint32 + * and sint64. */ +#ifndef PB_WITHOUT_64BIT +bool pb_decode_svarint(pb_istream_t *stream, int64_t *dest); +#else +bool pb_decode_svarint(pb_istream_t *stream, int32_t *dest); +#endif + +/* Decode a fixed32, sfixed32 or float value. You need to pass a pointer to + * a 4-byte wide C variable. */ +bool pb_decode_fixed32(pb_istream_t *stream, void *dest); + +#ifndef PB_WITHOUT_64BIT +/* Decode a fixed64, sfixed64 or double value. You need to pass a pointer to + * a 8-byte wide C variable. */ +bool pb_decode_fixed64(pb_istream_t *stream, void *dest); +#endif + +/* Make a limited-length substream for reading a PB_WT_STRING field. */ +bool pb_make_string_substream(pb_istream_t *stream, pb_istream_t *substream); +bool pb_close_string_substream(pb_istream_t *stream, pb_istream_t *substream); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif diff --git a/Pods/nanopb/pb_encode.c b/Pods/nanopb/pb_encode.c new file mode 100644 index 0000000..f6e60c4 --- /dev/null +++ b/Pods/nanopb/pb_encode.c @@ -0,0 +1,911 @@ +/* pb_encode.c -- encode a protobuf using minimal resources + * + * 2011 Petteri Aimonen + */ + +#include "pb.h" +#include "pb_encode.h" +#include "pb_common.h" + +/* Use the GCC warn_unused_result attribute to check that all return values + * are propagated correctly. On other compilers and gcc before 3.4.0 just + * ignore the annotation. + */ +#if !defined(__GNUC__) || ( __GNUC__ < 3) || (__GNUC__ == 3 && __GNUC_MINOR__ < 4) + #define checkreturn +#else + #define checkreturn __attribute__((warn_unused_result)) +#endif + +/************************************** + * Declarations internal to this file * + **************************************/ +typedef bool (*pb_encoder_t)(pb_ostream_t *stream, const pb_field_t *field, const void *src) checkreturn; + +static bool checkreturn buf_write(pb_ostream_t *stream, const pb_byte_t *buf, size_t count); +static bool checkreturn encode_array(pb_ostream_t *stream, const pb_field_t *field, const void *pData, size_t count, pb_encoder_t func); +static bool checkreturn encode_field(pb_ostream_t *stream, const pb_field_t *field, const void *pData); +static bool checkreturn default_extension_encoder(pb_ostream_t *stream, const pb_extension_t *extension); +static bool checkreturn encode_extension_field(pb_ostream_t *stream, const pb_field_t *field, const void *pData); +static void *pb_const_cast(const void *p); +static bool checkreturn pb_enc_bool(pb_ostream_t *stream, const pb_field_t *field, const void *src); +static bool checkreturn pb_enc_varint(pb_ostream_t *stream, const pb_field_t *field, const void *src); +static bool checkreturn pb_enc_uvarint(pb_ostream_t *stream, const pb_field_t *field, const void *src); +static bool checkreturn pb_enc_svarint(pb_ostream_t *stream, const pb_field_t *field, const void *src); +static bool checkreturn pb_enc_fixed32(pb_ostream_t *stream, const pb_field_t *field, const void *src); +static bool checkreturn pb_enc_fixed64(pb_ostream_t *stream, const pb_field_t *field, const void *src); +static bool checkreturn pb_enc_bytes(pb_ostream_t *stream, const pb_field_t *field, const void *src); +static bool checkreturn pb_enc_string(pb_ostream_t *stream, const pb_field_t *field, const void *src); +static bool checkreturn pb_enc_submessage(pb_ostream_t *stream, const pb_field_t *field, const void *src); +static bool checkreturn pb_enc_fixed_length_bytes(pb_ostream_t *stream, const pb_field_t *field, const void *src); + +#ifdef PB_WITHOUT_64BIT +#define pb_int64_t int32_t +#define pb_uint64_t uint32_t + +static bool checkreturn pb_encode_negative_varint(pb_ostream_t *stream, pb_uint64_t value); +#else +#define pb_int64_t int64_t +#define pb_uint64_t uint64_t +#endif + +/* --- Function pointers to field encoders --- + * Order in the array must match pb_action_t LTYPE numbering. + */ +static const pb_encoder_t PB_ENCODERS[PB_LTYPES_COUNT] = { + &pb_enc_bool, + &pb_enc_varint, + &pb_enc_uvarint, + &pb_enc_svarint, + &pb_enc_fixed32, + &pb_enc_fixed64, + + &pb_enc_bytes, + &pb_enc_string, + &pb_enc_submessage, + NULL, /* extensions */ + &pb_enc_fixed_length_bytes +}; + +/******************************* + * pb_ostream_t implementation * + *******************************/ + +static bool checkreturn buf_write(pb_ostream_t *stream, const pb_byte_t *buf, size_t count) +{ + size_t i; + pb_byte_t *dest = (pb_byte_t*)stream->state; + stream->state = dest + count; + + for (i = 0; i < count; i++) + dest[i] = buf[i]; + + return true; +} + +pb_ostream_t pb_ostream_from_buffer(pb_byte_t *buf, size_t bufsize) +{ + pb_ostream_t stream; +#ifdef PB_BUFFER_ONLY + stream.callback = (void*)1; /* Just a marker value */ +#else + stream.callback = &buf_write; +#endif + stream.state = buf; + stream.max_size = bufsize; + stream.bytes_written = 0; +#ifndef PB_NO_ERRMSG + stream.errmsg = NULL; +#endif + return stream; +} + +bool checkreturn pb_write(pb_ostream_t *stream, const pb_byte_t *buf, size_t count) +{ + if (count > 0 && stream->callback != NULL) + { + if (stream->bytes_written + count < stream->bytes_written || + stream->bytes_written + count > stream->max_size) + { + PB_RETURN_ERROR(stream, "stream full"); + } + +#ifdef PB_BUFFER_ONLY + if (!buf_write(stream, buf, count)) + PB_RETURN_ERROR(stream, "io error"); +#else + if (!stream->callback(stream, buf, count)) + PB_RETURN_ERROR(stream, "io error"); +#endif + } + + stream->bytes_written += count; + return true; +} + +/************************* + * Encode a single field * + *************************/ + +/* Read a bool value without causing undefined behavior even if the value + * is invalid. See issue #434 and + * https://stackoverflow.com/questions/27661768/weird-results-for-conditional + */ +static bool safe_read_bool(const void *pSize) +{ + const char *p = (const char *)pSize; + size_t i; + for (i = 0; i < sizeof(bool); i++) + { + if (p[i] != 0) + return true; + } + return false; +} + +/* Encode a static array. Handles the size calculations and possible packing. */ +static bool checkreturn encode_array(pb_ostream_t *stream, const pb_field_t *field, + const void *pData, size_t count, pb_encoder_t func) +{ + size_t i; + const void *p; +#ifndef PB_ENCODE_ARRAYS_UNPACKED + size_t size; +#endif + + if (count == 0) + return true; + + if (PB_ATYPE(field->type) != PB_ATYPE_POINTER && count > field->array_size) + PB_RETURN_ERROR(stream, "array max size exceeded"); + +#ifndef PB_ENCODE_ARRAYS_UNPACKED + /* We always pack arrays if the datatype allows it. */ + if (PB_LTYPE(field->type) <= PB_LTYPE_LAST_PACKABLE) + { + if (!pb_encode_tag(stream, PB_WT_STRING, field->tag)) + return false; + + /* Determine the total size of packed array. */ + if (PB_LTYPE(field->type) == PB_LTYPE_FIXED32) + { + size = 4 * count; + } + else if (PB_LTYPE(field->type) == PB_LTYPE_FIXED64) + { + size = 8 * count; + } + else + { + pb_ostream_t sizestream = PB_OSTREAM_SIZING; + p = pData; + for (i = 0; i < count; i++) + { + if (!func(&sizestream, field, p)) + return false; + p = (const char*)p + field->data_size; + } + size = sizestream.bytes_written; + } + + if (!pb_encode_varint(stream, (pb_uint64_t)size)) + return false; + + if (stream->callback == NULL) + return pb_write(stream, NULL, size); /* Just sizing.. */ + + /* Write the data */ + p = pData; + for (i = 0; i < count; i++) + { + if (!func(stream, field, p)) + return false; + p = (const char*)p + field->data_size; + } + } + else +#endif + { + p = pData; + for (i = 0; i < count; i++) + { + if (!pb_encode_tag_for_field(stream, field)) + return false; + + /* Normally the data is stored directly in the array entries, but + * for pointer-type string and bytes fields, the array entries are + * actually pointers themselves also. So we have to dereference once + * more to get to the actual data. */ + if (PB_ATYPE(field->type) == PB_ATYPE_POINTER && + (PB_LTYPE(field->type) == PB_LTYPE_STRING || + PB_LTYPE(field->type) == PB_LTYPE_BYTES)) + { + if (!func(stream, field, *(const void* const*)p)) + return false; + } + else + { + if (!func(stream, field, p)) + return false; + } + p = (const char*)p + field->data_size; + } + } + + return true; +} + +/* In proto3, all fields are optional and are only encoded if their value is "non-zero". + * This function implements the check for the zero value. */ +static bool pb_check_proto3_default_value(const pb_field_t *field, const void *pData) +{ + pb_type_t type = field->type; + const void *pSize = (const char*)pData + field->size_offset; + + if (PB_HTYPE(type) == PB_HTYPE_REQUIRED) + { + /* Required proto2 fields inside proto3 submessage, pretty rare case */ + return false; + } + else if (PB_HTYPE(type) == PB_HTYPE_REPEATED) + { + /* Repeated fields inside proto3 submessage: present if count != 0 */ + if (field->size_offset != 0) + return *(const pb_size_t*)pSize == 0; + else if (PB_ATYPE(type) == PB_ATYPE_STATIC) + return false; /* Fixed length array */ + } + else if (PB_HTYPE(type) == PB_HTYPE_ONEOF) + { + /* Oneof fields */ + return *(const pb_size_t*)pSize == 0; + } + else if (PB_HTYPE(type) == PB_HTYPE_OPTIONAL && field->size_offset != 0) + { + /* Proto2 optional fields inside proto3 submessage */ + return safe_read_bool(pSize) == false; + } + + /* Rest is proto3 singular fields */ + + if (PB_ATYPE(type) == PB_ATYPE_STATIC) + { + if (PB_LTYPE(type) == PB_LTYPE_BYTES) + { + const pb_bytes_array_t *bytes = (const pb_bytes_array_t*)pData; + return bytes->size == 0; + } + else if (PB_LTYPE(type) == PB_LTYPE_STRING) + { + return *(const char*)pData == '\0'; + } + else if (PB_LTYPE(type) == PB_LTYPE_FIXED_LENGTH_BYTES) + { + /* Fixed length bytes is only empty if its length is fixed + * as 0. Which would be pretty strange, but we can check + * it anyway. */ + return field->data_size == 0; + } + else if (PB_LTYPE(type) == PB_LTYPE_SUBMESSAGE) + { + /* Check all fields in the submessage to find if any of them + * are non-zero. The comparison cannot be done byte-per-byte + * because the C struct may contain padding bytes that must + * be skipped. + */ + pb_field_iter_t iter; + if (pb_field_iter_begin(&iter, (const pb_field_t*)field->ptr, pb_const_cast(pData))) + { + do + { + if (!pb_check_proto3_default_value(iter.pos, iter.pData)) + { + return false; + } + } while (pb_field_iter_next(&iter)); + } + return true; + } + } + + /* Compares pointers to NULL in case of FT_POINTER */ + if (PB_ATYPE(type) == PB_ATYPE_POINTER && PB_LTYPE(type) > PB_LTYPE_LAST_PACKABLE) + { + return !*(const void**)((uintptr_t)pData); + } + + { + /* Catch-all branch that does byte-per-byte comparison for zero value. + * + * This is for all pointer fields, and for static PB_LTYPE_VARINT, + * UVARINT, SVARINT, FIXED32, FIXED64, EXTENSION fields, and also + * callback fields. These all have integer or pointer value which + * can be compared with 0. + */ + pb_size_t i; + const char *p = (const char*)pData; + for (i = 0; i < field->data_size; i++) + { + if (p[i] != 0) + { + return false; + } + } + + return true; + } +} + +/* Encode a field with static or pointer allocation, i.e. one whose data + * is available to the encoder directly. */ +static bool checkreturn encode_basic_field(pb_ostream_t *stream, + const pb_field_t *field, const void *pData) +{ + pb_encoder_t func; + bool implicit_has; + const void *pSize = &implicit_has; + + func = PB_ENCODERS[PB_LTYPE(field->type)]; + + if (field->size_offset) + { + /* Static optional, repeated or oneof field */ + pSize = (const char*)pData + field->size_offset; + } + else if (PB_HTYPE(field->type) == PB_HTYPE_OPTIONAL) + { + /* Proto3 style field, optional but without explicit has_ field. */ + implicit_has = !pb_check_proto3_default_value(field, pData); + } + else + { + /* Required field, always present */ + implicit_has = true; + } + + if (PB_ATYPE(field->type) == PB_ATYPE_POINTER) + { + /* pData is a pointer to the field, which contains pointer to + * the data. If the 2nd pointer is NULL, it is interpreted as if + * the has_field was false. + */ + pData = *(const void* const*)pData; + implicit_has = (pData != NULL); + } + + switch (PB_HTYPE(field->type)) + { + case PB_HTYPE_REQUIRED: + if (!pData) + PB_RETURN_ERROR(stream, "missing required field"); + if (!pb_encode_tag_for_field(stream, field)) + return false; + if (!func(stream, field, pData)) + return false; + break; + + case PB_HTYPE_OPTIONAL: + if (safe_read_bool(pSize)) + { + if (!pb_encode_tag_for_field(stream, field)) + return false; + + if (!func(stream, field, pData)) + return false; + } + break; + + case PB_HTYPE_REPEATED: { + pb_size_t count; + if (field->size_offset != 0) { + count = *(const pb_size_t*)pSize; + } else { + count = field->array_size; + } + if (!encode_array(stream, field, pData, count, func)) + return false; + break; + } + + case PB_HTYPE_ONEOF: + if (*(const pb_size_t*)pSize == field->tag) + { + if (!pb_encode_tag_for_field(stream, field)) + return false; + + if (!func(stream, field, pData)) + return false; + } + break; + + default: + PB_RETURN_ERROR(stream, "invalid field type"); + } + + return true; +} + +/* Encode a field with callback semantics. This means that a user function is + * called to provide and encode the actual data. */ +static bool checkreturn encode_callback_field(pb_ostream_t *stream, + const pb_field_t *field, const void *pData) +{ + const pb_callback_t *callback = (const pb_callback_t*)pData; + +#ifdef PB_OLD_CALLBACK_STYLE + const void *arg = callback->arg; +#else + void * const *arg = &(callback->arg); +#endif + + if (callback->funcs.encode != NULL) + { + if (!callback->funcs.encode(stream, field, arg)) + PB_RETURN_ERROR(stream, "callback error"); + } + return true; +} + +/* Encode a single field of any callback or static type. */ +static bool checkreturn encode_field(pb_ostream_t *stream, + const pb_field_t *field, const void *pData) +{ + switch (PB_ATYPE(field->type)) + { + case PB_ATYPE_STATIC: + case PB_ATYPE_POINTER: + return encode_basic_field(stream, field, pData); + + case PB_ATYPE_CALLBACK: + return encode_callback_field(stream, field, pData); + + default: + PB_RETURN_ERROR(stream, "invalid field type"); + } +} + +/* Default handler for extension fields. Expects to have a pb_field_t + * pointer in the extension->type->arg field. */ +static bool checkreturn default_extension_encoder(pb_ostream_t *stream, + const pb_extension_t *extension) +{ + const pb_field_t *field = (const pb_field_t*)extension->type->arg; + + if (PB_ATYPE(field->type) == PB_ATYPE_POINTER) + { + /* For pointer extensions, the pointer is stored directly + * in the extension structure. This avoids having an extra + * indirection. */ + return encode_field(stream, field, &extension->dest); + } + else + { + return encode_field(stream, field, extension->dest); + } +} + +/* Walk through all the registered extensions and give them a chance + * to encode themselves. */ +static bool checkreturn encode_extension_field(pb_ostream_t *stream, + const pb_field_t *field, const void *pData) +{ + const pb_extension_t *extension = *(const pb_extension_t* const *)pData; + PB_UNUSED(field); + + while (extension) + { + bool status; + if (extension->type->encode) + status = extension->type->encode(stream, extension); + else + status = default_extension_encoder(stream, extension); + + if (!status) + return false; + + extension = extension->next; + } + + return true; +} + +/********************* + * Encode all fields * + *********************/ + +static void *pb_const_cast(const void *p) +{ + /* Note: this casts away const, in order to use the common field iterator + * logic for both encoding and decoding. */ + union { + void *p1; + const void *p2; + } t; + t.p2 = p; + return t.p1; +} + +bool checkreturn pb_encode(pb_ostream_t *stream, const pb_field_t fields[], const void *src_struct) +{ + pb_field_iter_t iter; + if (!pb_field_iter_begin(&iter, fields, pb_const_cast(src_struct))) + return true; /* Empty message type */ + + do { + if (PB_LTYPE(iter.pos->type) == PB_LTYPE_EXTENSION) + { + /* Special case for the extension field placeholder */ + if (!encode_extension_field(stream, iter.pos, iter.pData)) + return false; + } + else + { + /* Regular field */ + if (!encode_field(stream, iter.pos, iter.pData)) + return false; + } + } while (pb_field_iter_next(&iter)); + + return true; +} + +bool pb_encode_delimited(pb_ostream_t *stream, const pb_field_t fields[], const void *src_struct) +{ + return pb_encode_submessage(stream, fields, src_struct); +} + +bool pb_encode_nullterminated(pb_ostream_t *stream, const pb_field_t fields[], const void *src_struct) +{ + const pb_byte_t zero = 0; + + if (!pb_encode(stream, fields, src_struct)) + return false; + + return pb_write(stream, &zero, 1); +} + +bool pb_get_encoded_size(size_t *size, const pb_field_t fields[], const void *src_struct) +{ + pb_ostream_t stream = PB_OSTREAM_SIZING; + + if (!pb_encode(&stream, fields, src_struct)) + return false; + + *size = stream.bytes_written; + return true; +} + +/******************** + * Helper functions * + ********************/ + +#ifdef PB_WITHOUT_64BIT +bool checkreturn pb_encode_negative_varint(pb_ostream_t *stream, pb_uint64_t value) +{ + pb_byte_t buffer[10]; + size_t i = 0; + size_t compensation = 32;/* we need to compensate 32 bits all set to 1 */ + + while (value) + { + buffer[i] = (pb_byte_t)((value & 0x7F) | 0x80); + value >>= 7; + if (compensation) + { + /* re-set all the compensation bits we can or need */ + size_t bits = compensation > 7 ? 7 : compensation; + value ^= (pb_uint64_t)((0xFFu >> (8 - bits)) << 25); /* set the number of bits needed on the lowest of the most significant 7 bits */ + compensation -= bits; + } + i++; + } + buffer[i - 1] &= 0x7F; /* Unset top bit on last byte */ + + return pb_write(stream, buffer, i); +} +#endif + +bool checkreturn pb_encode_varint(pb_ostream_t *stream, pb_uint64_t value) +{ + pb_byte_t buffer[10]; + size_t i = 0; + + if (value <= 0x7F) + { + pb_byte_t v = (pb_byte_t)value; + return pb_write(stream, &v, 1); + } + + while (value) + { + buffer[i] = (pb_byte_t)((value & 0x7F) | 0x80); + value >>= 7; + i++; + } + buffer[i-1] &= 0x7F; /* Unset top bit on last byte */ + + return pb_write(stream, buffer, i); +} + +bool checkreturn pb_encode_svarint(pb_ostream_t *stream, pb_int64_t value) +{ + pb_uint64_t zigzagged; + if (value < 0) + zigzagged = ~((pb_uint64_t)value << 1); + else + zigzagged = (pb_uint64_t)value << 1; + + return pb_encode_varint(stream, zigzagged); +} + +bool checkreturn pb_encode_fixed32(pb_ostream_t *stream, const void *value) +{ + uint32_t val = *(const uint32_t*)value; + pb_byte_t bytes[4]; + bytes[0] = (pb_byte_t)(val & 0xFF); + bytes[1] = (pb_byte_t)((val >> 8) & 0xFF); + bytes[2] = (pb_byte_t)((val >> 16) & 0xFF); + bytes[3] = (pb_byte_t)((val >> 24) & 0xFF); + return pb_write(stream, bytes, 4); +} + +#ifndef PB_WITHOUT_64BIT +bool checkreturn pb_encode_fixed64(pb_ostream_t *stream, const void *value) +{ + uint64_t val = *(const uint64_t*)value; + pb_byte_t bytes[8]; + bytes[0] = (pb_byte_t)(val & 0xFF); + bytes[1] = (pb_byte_t)((val >> 8) & 0xFF); + bytes[2] = (pb_byte_t)((val >> 16) & 0xFF); + bytes[3] = (pb_byte_t)((val >> 24) & 0xFF); + bytes[4] = (pb_byte_t)((val >> 32) & 0xFF); + bytes[5] = (pb_byte_t)((val >> 40) & 0xFF); + bytes[6] = (pb_byte_t)((val >> 48) & 0xFF); + bytes[7] = (pb_byte_t)((val >> 56) & 0xFF); + return pb_write(stream, bytes, 8); +} +#endif + +bool checkreturn pb_encode_tag(pb_ostream_t *stream, pb_wire_type_t wiretype, uint32_t field_number) +{ + pb_uint64_t tag = ((pb_uint64_t)field_number << 3) | wiretype; + return pb_encode_varint(stream, tag); +} + +bool checkreturn pb_encode_tag_for_field(pb_ostream_t *stream, const pb_field_t *field) +{ + pb_wire_type_t wiretype; + switch (PB_LTYPE(field->type)) + { + case PB_LTYPE_BOOL: + case PB_LTYPE_VARINT: + case PB_LTYPE_UVARINT: + case PB_LTYPE_SVARINT: + wiretype = PB_WT_VARINT; + break; + + case PB_LTYPE_FIXED32: + wiretype = PB_WT_32BIT; + break; + + case PB_LTYPE_FIXED64: + wiretype = PB_WT_64BIT; + break; + + case PB_LTYPE_BYTES: + case PB_LTYPE_STRING: + case PB_LTYPE_SUBMESSAGE: + case PB_LTYPE_FIXED_LENGTH_BYTES: + wiretype = PB_WT_STRING; + break; + + default: + PB_RETURN_ERROR(stream, "invalid field type"); + } + + return pb_encode_tag(stream, wiretype, field->tag); +} + +bool checkreturn pb_encode_string(pb_ostream_t *stream, const pb_byte_t *buffer, size_t size) +{ + if (!pb_encode_varint(stream, (pb_uint64_t)size)) + return false; + + return pb_write(stream, buffer, size); +} + +bool checkreturn pb_encode_submessage(pb_ostream_t *stream, const pb_field_t fields[], const void *src_struct) +{ + /* First calculate the message size using a non-writing substream. */ + pb_ostream_t substream = PB_OSTREAM_SIZING; + size_t size; + bool status; + + if (!pb_encode(&substream, fields, src_struct)) + { +#ifndef PB_NO_ERRMSG + stream->errmsg = substream.errmsg; +#endif + return false; + } + + size = substream.bytes_written; + + if (!pb_encode_varint(stream, (pb_uint64_t)size)) + return false; + + if (stream->callback == NULL) + return pb_write(stream, NULL, size); /* Just sizing */ + + if (stream->bytes_written + size > stream->max_size) + PB_RETURN_ERROR(stream, "stream full"); + + /* Use a substream to verify that a callback doesn't write more than + * what it did the first time. */ + substream.callback = stream->callback; + substream.state = stream->state; + substream.max_size = size; + substream.bytes_written = 0; +#ifndef PB_NO_ERRMSG + substream.errmsg = NULL; +#endif + + status = pb_encode(&substream, fields, src_struct); + + stream->bytes_written += substream.bytes_written; + stream->state = substream.state; +#ifndef PB_NO_ERRMSG + stream->errmsg = substream.errmsg; +#endif + + if (substream.bytes_written != size) + PB_RETURN_ERROR(stream, "submsg size changed"); + + return status; +} + +/* Field encoders */ + +static bool checkreturn pb_enc_bool(pb_ostream_t *stream, const pb_field_t *field, const void *src) +{ + uint32_t value = safe_read_bool(src) ? 1 : 0; + PB_UNUSED(field); + return pb_encode_varint(stream, value); +} + +static bool checkreturn pb_enc_varint(pb_ostream_t *stream, const pb_field_t *field, const void *src) +{ + pb_int64_t value = 0; + + if (field->data_size == sizeof(int_least8_t)) + value = *(const int_least8_t*)src; + else if (field->data_size == sizeof(int_least16_t)) + value = *(const int_least16_t*)src; + else if (field->data_size == sizeof(int32_t)) + value = *(const int32_t*)src; + else if (field->data_size == sizeof(pb_int64_t)) + value = *(const pb_int64_t*)src; + else + PB_RETURN_ERROR(stream, "invalid data_size"); + +#ifdef PB_WITHOUT_64BIT + if (value < 0) + return pb_encode_negative_varint(stream, (pb_uint64_t)value); + else +#endif + return pb_encode_varint(stream, (pb_uint64_t)value); +} + +static bool checkreturn pb_enc_uvarint(pb_ostream_t *stream, const pb_field_t *field, const void *src) +{ + pb_uint64_t value = 0; + + if (field->data_size == sizeof(uint_least8_t)) + value = *(const uint_least8_t*)src; + else if (field->data_size == sizeof(uint_least16_t)) + value = *(const uint_least16_t*)src; + else if (field->data_size == sizeof(uint32_t)) + value = *(const uint32_t*)src; + else if (field->data_size == sizeof(pb_uint64_t)) + value = *(const pb_uint64_t*)src; + else + PB_RETURN_ERROR(stream, "invalid data_size"); + + return pb_encode_varint(stream, value); +} + +static bool checkreturn pb_enc_svarint(pb_ostream_t *stream, const pb_field_t *field, const void *src) +{ + pb_int64_t value = 0; + + if (field->data_size == sizeof(int_least8_t)) + value = *(const int_least8_t*)src; + else if (field->data_size == sizeof(int_least16_t)) + value = *(const int_least16_t*)src; + else if (field->data_size == sizeof(int32_t)) + value = *(const int32_t*)src; + else if (field->data_size == sizeof(pb_int64_t)) + value = *(const pb_int64_t*)src; + else + PB_RETURN_ERROR(stream, "invalid data_size"); + + return pb_encode_svarint(stream, value); +} + +static bool checkreturn pb_enc_fixed64(pb_ostream_t *stream, const pb_field_t *field, const void *src) +{ + PB_UNUSED(field); +#ifndef PB_WITHOUT_64BIT + return pb_encode_fixed64(stream, src); +#else + PB_UNUSED(src); + PB_RETURN_ERROR(stream, "no 64bit support"); +#endif +} + +static bool checkreturn pb_enc_fixed32(pb_ostream_t *stream, const pb_field_t *field, const void *src) +{ + PB_UNUSED(field); + return pb_encode_fixed32(stream, src); +} + +static bool checkreturn pb_enc_bytes(pb_ostream_t *stream, const pb_field_t *field, const void *src) +{ + const pb_bytes_array_t *bytes = NULL; + + bytes = (const pb_bytes_array_t*)src; + + if (src == NULL) + { + /* Treat null pointer as an empty bytes field */ + return pb_encode_string(stream, NULL, 0); + } + + if (PB_ATYPE(field->type) == PB_ATYPE_STATIC && + bytes->size > field->data_size - offsetof(pb_bytes_array_t, bytes)) + { + PB_RETURN_ERROR(stream, "bytes size exceeded"); + } + + return pb_encode_string(stream, bytes->bytes, bytes->size); +} + +static bool checkreturn pb_enc_string(pb_ostream_t *stream, const pb_field_t *field, const void *src) +{ + size_t size = 0; + size_t max_size = field->data_size; + const char *p = (const char*)src; + + if (PB_ATYPE(field->type) == PB_ATYPE_POINTER) + max_size = (size_t)-1; + + if (src == NULL) + { + size = 0; /* Treat null pointer as an empty string */ + } + else + { + /* strnlen() is not always available, so just use a loop */ + while (size < max_size && *p != '\0') + { + size++; + p++; + } + } + + return pb_encode_string(stream, (const pb_byte_t*)src, size); +} + +static bool checkreturn pb_enc_submessage(pb_ostream_t *stream, const pb_field_t *field, const void *src) +{ + if (field->ptr == NULL) + PB_RETURN_ERROR(stream, "invalid field descriptor"); + + return pb_encode_submessage(stream, (const pb_field_t*)field->ptr, src); +} + +static bool checkreturn pb_enc_fixed_length_bytes(pb_ostream_t *stream, const pb_field_t *field, const void *src) +{ + return pb_encode_string(stream, (const pb_byte_t*)src, field->data_size); +} + diff --git a/Pods/nanopb/pb_encode.h b/Pods/nanopb/pb_encode.h new file mode 100644 index 0000000..b1d822f --- /dev/null +++ b/Pods/nanopb/pb_encode.h @@ -0,0 +1,170 @@ +/* pb_encode.h: Functions to encode protocol buffers. Depends on pb_encode.c. + * The main function is pb_encode. You also need an output stream, and the + * field descriptions created by nanopb_generator.py. + */ + +#ifndef PB_ENCODE_H_INCLUDED +#define PB_ENCODE_H_INCLUDED + +#include "pb.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Structure for defining custom output streams. You will need to provide + * a callback function to write the bytes to your storage, which can be + * for example a file or a network socket. + * + * The callback must conform to these rules: + * + * 1) Return false on IO errors. This will cause encoding to abort. + * 2) You can use state to store your own data (e.g. buffer pointer). + * 3) pb_write will update bytes_written after your callback runs. + * 4) Substreams will modify max_size and bytes_written. Don't use them + * to calculate any pointers. + */ +struct pb_ostream_s +{ +#ifdef PB_BUFFER_ONLY + /* Callback pointer is not used in buffer-only configuration. + * Having an int pointer here allows binary compatibility but + * gives an error if someone tries to assign callback function. + * Also, NULL pointer marks a 'sizing stream' that does not + * write anything. + */ + int *callback; +#else + bool (*callback)(pb_ostream_t *stream, const pb_byte_t *buf, size_t count); +#endif + void *state; /* Free field for use by callback implementation. */ + size_t max_size; /* Limit number of output bytes written (or use SIZE_MAX). */ + size_t bytes_written; /* Number of bytes written so far. */ + +#ifndef PB_NO_ERRMSG + const char *errmsg; +#endif +}; + +/*************************** + * Main encoding functions * + ***************************/ + +/* Encode a single protocol buffers message from C structure into a stream. + * Returns true on success, false on any failure. + * The actual struct pointed to by src_struct must match the description in fields. + * All required fields in the struct are assumed to have been filled in. + * + * Example usage: + * MyMessage msg = {}; + * uint8_t buffer[64]; + * pb_ostream_t stream; + * + * msg.field1 = 42; + * stream = pb_ostream_from_buffer(buffer, sizeof(buffer)); + * pb_encode(&stream, MyMessage_fields, &msg); + */ +bool pb_encode(pb_ostream_t *stream, const pb_field_t fields[], const void *src_struct); + +/* Same as pb_encode, but prepends the length of the message as a varint. + * Corresponds to writeDelimitedTo() in Google's protobuf API. + */ +bool pb_encode_delimited(pb_ostream_t *stream, const pb_field_t fields[], const void *src_struct); + +/* Same as pb_encode, but appends a null byte to the message for termination. + * NOTE: This behaviour is not supported in most other protobuf implementations, so pb_encode_delimited() + * is a better option for compatibility. + */ +bool pb_encode_nullterminated(pb_ostream_t *stream, const pb_field_t fields[], const void *src_struct); + +/* Encode the message to get the size of the encoded data, but do not store + * the data. */ +bool pb_get_encoded_size(size_t *size, const pb_field_t fields[], const void *src_struct); + +/************************************** + * Functions for manipulating streams * + **************************************/ + +/* Create an output stream for writing into a memory buffer. + * The number of bytes written can be found in stream.bytes_written after + * encoding the message. + * + * Alternatively, you can use a custom stream that writes directly to e.g. + * a file or a network socket. + */ +pb_ostream_t pb_ostream_from_buffer(pb_byte_t *buf, size_t bufsize); + +/* Pseudo-stream for measuring the size of a message without actually storing + * the encoded data. + * + * Example usage: + * MyMessage msg = {}; + * pb_ostream_t stream = PB_OSTREAM_SIZING; + * pb_encode(&stream, MyMessage_fields, &msg); + * printf("Message size is %d\n", stream.bytes_written); + */ +#ifndef PB_NO_ERRMSG +#define PB_OSTREAM_SIZING {0,0,0,0,0} +#else +#define PB_OSTREAM_SIZING {0,0,0,0} +#endif + +/* Function to write into a pb_ostream_t stream. You can use this if you need + * to append or prepend some custom headers to the message. + */ +bool pb_write(pb_ostream_t *stream, const pb_byte_t *buf, size_t count); + + +/************************************************ + * Helper functions for writing field callbacks * + ************************************************/ + +/* Encode field header based on type and field number defined in the field + * structure. Call this from the callback before writing out field contents. */ +bool pb_encode_tag_for_field(pb_ostream_t *stream, const pb_field_t *field); + +/* Encode field header by manually specifying wire type. You need to use this + * if you want to write out packed arrays from a callback field. */ +bool pb_encode_tag(pb_ostream_t *stream, pb_wire_type_t wiretype, uint32_t field_number); + +/* Encode an integer in the varint format. + * This works for bool, enum, int32, int64, uint32 and uint64 field types. */ +#ifndef PB_WITHOUT_64BIT +bool pb_encode_varint(pb_ostream_t *stream, uint64_t value); +#else +bool pb_encode_varint(pb_ostream_t *stream, uint32_t value); +#endif + +/* Encode an integer in the zig-zagged svarint format. + * This works for sint32 and sint64. */ +#ifndef PB_WITHOUT_64BIT +bool pb_encode_svarint(pb_ostream_t *stream, int64_t value); +#else +bool pb_encode_svarint(pb_ostream_t *stream, int32_t value); +#endif + +/* Encode a string or bytes type field. For strings, pass strlen(s) as size. */ +bool pb_encode_string(pb_ostream_t *stream, const pb_byte_t *buffer, size_t size); + +/* Encode a fixed32, sfixed32 or float value. + * You need to pass a pointer to a 4-byte wide C variable. */ +bool pb_encode_fixed32(pb_ostream_t *stream, const void *value); + +#ifndef PB_WITHOUT_64BIT +/* Encode a fixed64, sfixed64 or double value. + * You need to pass a pointer to a 8-byte wide C variable. */ +bool pb_encode_fixed64(pb_ostream_t *stream, const void *value); +#endif + +/* Encode a submessage field. + * You need to pass the pb_field_t array and pointer to struct, just like + * with pb_encode(). This internally encodes the submessage twice, first to + * calculate message size and then to actually write it out. + */ +bool pb_encode_submessage(pb_ostream_t *stream, const pb_field_t fields[], const void *src_struct); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif diff --git a/Pods/nanopb/spm_resources/PrivacyInfo.xcprivacy b/Pods/nanopb/spm_resources/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..72e00ac --- /dev/null +++ b/Pods/nanopb/spm_resources/PrivacyInfo.xcprivacy @@ -0,0 +1,15 @@ + + + + + NSPrivacyAccessedAPITypes + + NSPrivacyCollectedDataTypes + + NSPrivacyTracking + + NSPrivacyTrackingDomains + + + + diff --git a/TastePick.xcodeproj/project.pbxproj b/TastePick.xcodeproj/project.pbxproj new file mode 100644 index 0000000..962dfc2 --- /dev/null +++ b/TastePick.xcodeproj/project.pbxproj @@ -0,0 +1,486 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 77; + objects = { + +/* Begin PBXBuildFile section */ + 66973A724AC37798967E53B9 /* Pods_TastePick.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D4DC47DD4F7350C843B43D44 /* Pods_TastePick.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 1770E6D82F023B5900D4E335 /* TastePick.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TastePick.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 98A1E28077F8BC462EC2B232 /* Pods-TastePick.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TastePick.debug.xcconfig"; path = "Target Support Files/Pods-TastePick/Pods-TastePick.debug.xcconfig"; sourceTree = ""; }; + D4DC47DD4F7350C843B43D44 /* Pods_TastePick.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_TastePick.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + DA1965E07075B55CBD37968E /* Pods-TastePick.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TastePick.release.xcconfig"; path = "Target Support Files/Pods-TastePick/Pods-TastePick.release.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ + 17479E332F025CA4009C549B /* Exceptions for "TastePick" folder in "TastePick" target */ = { + isa = PBXFileSystemSynchronizedBuildFileExceptionSet; + membershipExceptions = ( + Info.plist, + ); + target = 1770E6D72F023B5900D4E335 /* TastePick */; + }; +/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */ + +/* Begin PBXFileSystemSynchronizedRootGroup section */ + 1770E6DA2F023B5900D4E335 /* TastePick */ = { + isa = PBXFileSystemSynchronizedRootGroup; + exceptions = ( + 17479E332F025CA4009C549B /* Exceptions for "TastePick" folder in "TastePick" target */, + ); + path = TastePick; + sourceTree = ""; + }; +/* End PBXFileSystemSynchronizedRootGroup section */ + +/* Begin PBXFrameworksBuildPhase section */ + 1770E6D52F023B5900D4E335 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 66973A724AC37798967E53B9 /* Pods_TastePick.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 1770E6CF2F023B5900D4E335 = { + isa = PBXGroup; + children = ( + 1770E6DA2F023B5900D4E335 /* TastePick */, + 1770E6D92F023B5900D4E335 /* Products */, + 59CC7C7C78FBB9641A979062 /* Pods */, + 9C1DE4CD4C502FF188986C3D /* Frameworks */, + ); + sourceTree = ""; + }; + 1770E6D92F023B5900D4E335 /* Products */ = { + isa = PBXGroup; + children = ( + 1770E6D82F023B5900D4E335 /* TastePick.app */, + ); + name = Products; + sourceTree = ""; + }; + 59CC7C7C78FBB9641A979062 /* Pods */ = { + isa = PBXGroup; + children = ( + 98A1E28077F8BC462EC2B232 /* Pods-TastePick.debug.xcconfig */, + DA1965E07075B55CBD37968E /* Pods-TastePick.release.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; + 9C1DE4CD4C502FF188986C3D /* Frameworks */ = { + isa = PBXGroup; + children = ( + D4DC47DD4F7350C843B43D44 /* Pods_TastePick.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 1770E6D72F023B5900D4E335 /* TastePick */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1770E6E32F023B5B00D4E335 /* Build configuration list for PBXNativeTarget "TastePick" */; + buildPhases = ( + 9B1CF0E9D5481FB8271105DA /* [CP] Check Pods Manifest.lock */, + 1770E6D42F023B5900D4E335 /* Sources */, + 1770E6D52F023B5900D4E335 /* Frameworks */, + 1770E6D62F023B5900D4E335 /* Resources */, + F81D0595463917D0B3BC71CD /* [CP] Embed Pods Frameworks */, + A778EDEA79C8B4F52733DA94 /* [CP] Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + fileSystemSynchronizedGroups = ( + 1770E6DA2F023B5900D4E335 /* TastePick */, + ); + name = TastePick; + productName = TastePick; + productReference = 1770E6D82F023B5900D4E335 /* TastePick.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 1770E6D02F023B5900D4E335 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 2610; + LastUpgradeCheck = 2610; + TargetAttributes = { + 1770E6D72F023B5900D4E335 = { + CreatedOnToolsVersion = 26.1.1; + LastSwiftMigration = 2610; + }; + }; + }; + buildConfigurationList = 1770E6D32F023B5900D4E335 /* Build configuration list for PBXProject "TastePick" */; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 1770E6CF2F023B5900D4E335; + minimizedProjectReferenceProxies = 1; + preferredProjectObjectVersion = 77; + productRefGroup = 1770E6D92F023B5900D4E335 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 1770E6D72F023B5900D4E335 /* TastePick */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 1770E6D62F023B5900D4E335 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 9B1CF0E9D5481FB8271105DA /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-TastePick-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + A778EDEA79C8B4F52733DA94 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-TastePick/Pods-TastePick-resources-${CONFIGURATION}-input-files.xcfilelist", + ); + inputPaths = ( + ); + name = "[CP] Copy Pods Resources"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-TastePick/Pods-TastePick-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-TastePick/Pods-TastePick-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + F81D0595463917D0B3BC71CD /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-TastePick/Pods-TastePick-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + inputPaths = ( + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-TastePick/Pods-TastePick-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-TastePick/Pods-TastePick-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 1770E6D42F023B5900D4E335 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 1770E6E12F023B5B00D4E335 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 1770E6E22F023B5B00D4E335 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SWIFT_COMPILATION_MODE = wholemodule; + }; + name = Release; + }; + 1770E6E42F023B5B00D4E335 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 98A1E28077F8BC462EC2B232 /* Pods-TastePick.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = "Apple Development"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + CODE_SIGN_STYLE = Manual; + CURRENT_PROJECT_VERSION = 2; + DEVELOPMENT_TEAM = ""; + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 6HWQW9JC74; + ENABLE_APP_SANDBOX = YES; + ENABLE_PREVIEWS = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + ENABLE_USER_SELECTED_FILES = readonly; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = TastePick/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = TastePick; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 15.6; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 15.7; + MARKETING_VERSION = 1.1; + PRODUCT_BUNDLE_IDENTIFIER = com.TastePickEatWheel.TastePickEatWheel; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = TastePick; + REGISTER_APP_GROUPS = YES; + SDKROOT = auto; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OBJC_BRIDGING_HEADER = "TastePick/TastePick-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + XROS_DEPLOYMENT_TARGET = 26.1; + }; + name = Debug; + }; + 1770E6E52F023B5B00D4E335 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = DA1965E07075B55CBD37968E /* Pods-TastePick.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = "Apple Development"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + CODE_SIGN_STYLE = Manual; + CURRENT_PROJECT_VERSION = 2; + DEVELOPMENT_TEAM = ""; + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 6HWQW9JC74; + ENABLE_APP_SANDBOX = YES; + ENABLE_PREVIEWS = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + ENABLE_USER_SELECTED_FILES = readonly; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = TastePick/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = TastePick; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 15.6; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 15.7; + MARKETING_VERSION = 1.1; + PRODUCT_BUNDLE_IDENTIFIER = com.TastePickEatWheel.TastePickEatWheel; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = TastePick; + REGISTER_APP_GROUPS = YES; + SDKROOT = auto; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OBJC_BRIDGING_HEADER = "TastePick/TastePick-Bridging-Header.h"; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + XROS_DEPLOYMENT_TARGET = 26.1; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1770E6D32F023B5900D4E335 /* Build configuration list for PBXProject "TastePick" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1770E6E12F023B5B00D4E335 /* Debug */, + 1770E6E22F023B5B00D4E335 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1770E6E32F023B5B00D4E335 /* Build configuration list for PBXNativeTarget "TastePick" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1770E6E42F023B5B00D4E335 /* Debug */, + 1770E6E52F023B5B00D4E335 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 1770E6D02F023B5900D4E335 /* Project object */; +} diff --git a/TastePick.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/TastePick.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/TastePick.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/TastePick.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/xcschememanagement.plist b/TastePick.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..f99d917 --- /dev/null +++ b/TastePick.xcodeproj/xcuserdata/chengdu.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + TastePick.xcscheme_^#shared#^_ + + orderHint + 30 + + + + diff --git a/TastePick.xcworkspace/contents.xcworkspacedata b/TastePick.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..ee17e0f --- /dev/null +++ b/TastePick.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/TastePick.xcworkspace/xcuserdata/chengdu.xcuserdatad/IDEFindNavigatorScopes.plist b/TastePick.xcworkspace/xcuserdata/chengdu.xcuserdatad/IDEFindNavigatorScopes.plist new file mode 100644 index 0000000..5dd5da8 --- /dev/null +++ b/TastePick.xcworkspace/xcuserdata/chengdu.xcuserdatad/IDEFindNavigatorScopes.plist @@ -0,0 +1,5 @@ + + + + + diff --git a/TastePick.xcworkspace/xcuserdata/chengdu.xcuserdatad/UserInterfaceState.xcuserstate b/TastePick.xcworkspace/xcuserdata/chengdu.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000..790d299 Binary files /dev/null and b/TastePick.xcworkspace/xcuserdata/chengdu.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/TastePick/.DS_Store b/TastePick/.DS_Store new file mode 100644 index 0000000..88080fb Binary files /dev/null and b/TastePick/.DS_Store differ diff --git a/TastePick/AESUtils.swift b/TastePick/AESUtils.swift new file mode 100644 index 0000000..abdc58e --- /dev/null +++ b/TastePick/AESUtils.swift @@ -0,0 +1,37 @@ +import Foundation +import CommonCrypto + +struct AESUtils { + static func encryptAES128ECB(text: String, key: String) -> String? { + guard let data = text.data(using: .utf8), + let keyData = key.data(using: .utf8) else { return nil } + + let dataLength = data.count + let keyLength = kCCKeySizeAES128 + let operation = CCOperation(kCCEncrypt) + let algoritm = CCAlgorithm(kCCAlgorithmAES) + let options = CCOptions(kCCOptionECBMode | kCCOptionPKCS7Padding) + + var numBytesEncrypted: size_t = 0 + // Buffer size needs to be data length + block size + let bufferSize = dataLength + kCCBlockSizeAES128 + var buffer = [UInt8](repeating: 0, count: bufferSize) + + let cryptStatus = keyData.withUnsafeBytes { keyBytes in + data.withUnsafeBytes { dataBytes in + CCCrypt(operation, algoritm, options, + keyBytes.baseAddress, keyLength, + nil, + dataBytes.baseAddress, dataLength, + &buffer, bufferSize, + &numBytesEncrypted) + } + } + + if cryptStatus == kCCSuccess { + let encryptedData = Data(bytes: buffer, count: numBytesEncrypted) + return encryptedData.base64EncodedString() + } + return nil + } +} diff --git a/TastePick/AddFoodWithCategoryView.swift b/TastePick/AddFoodWithCategoryView.swift new file mode 100644 index 0000000..a91e699 --- /dev/null +++ b/TastePick/AddFoodWithCategoryView.swift @@ -0,0 +1,638 @@ +// +// AddFoodWithCategoryView.swift +// EatWheel +// +// Created by chengdu on 2025/12/4. +// +//添加菜品表单 +import SwiftUI + +struct AddFoodWithCategoryView: View { + @Binding var isPresented: Bool + @Binding var selectedCategory: Category? + @EnvironmentObject var viewModel: WheelViewModel + @StateObject private var adm = Adm.shared // 添加广告管理器 + @State private var foodName = "" + @State private var selectedIcon = "fork.knife" + @State private var tempSelectedCategory: Category? + @State private var showErrorAlert = false + @State private var errorMessage = "" + @State private var showSuccessToast = false + @State private var showAdAfterAdding = false // 控制广告显示状态 + @State private var foodToAdd: (name: String, categoryId: UUID, icon: String)? // 临时存储要添加的菜品信息 + @State private var isShowingAd = false // 跟踪广告是否正在展示 + + // 添加一个用于展示广告的视图控制器 + @State private var presentingViewController: UIViewController? + + let icons = ["fork.knife", "flame", "leaf", "fish", "birthday.cake", + "cup.and.saucer", "bag", "drop", "applelogo", "carrot", + "takeoutbag.and.cup.and.straw", "mug", "wineglass", "frying.pan", + "heart", "star", "circle", "square", "triangle", "seal", + "bolt", "cloud", "sun.max", "moon", "zzz", "drop.triangle", + "flame.circle", "leaf.circle", "fish.circle", "cart"] + + var body: some View { + NavigationView { + ZStack { + Form { + // 菜品信息部分 + Section(header: Text("Menu Information").font(.headline)) { + TextField("Please enter the name of the dish.", text: $foodName) + .textFieldStyle(PlainTextFieldStyle()) + .padding(.vertical, 8) + .font(.body) + .autocapitalization(.none) + .disableAutocorrection(true) + } + + // 选择分类部分 + Section(header: Text("Select Category").font(.headline)) { + if viewModel.categories.isEmpty { + emptyCategoryView + } else { + categorySelectionList + } + } + + // 选择图标部分 + Section(header: Text("Select Icon").font(.headline)) { + iconSelectionSection + } + + // 预览部分 + if !foodName.isEmpty { + previewSection + } + } + .navigationTitle("Add Dishes") + .navigationBarTitleDisplayMode(.inline) + .navigationBarItems( + leading: cancelButton, + trailing: addButton + ) + .alert("Hint", isPresented: $showErrorAlert) { + Button("Define", role: .cancel) { } + } message: { + Text(errorMessage) + } + .blur(radius: isShowingAd ? 3 : 0) // 广告展示时模糊背景 + + // 广告展示遮罩层 + if isShowingAd { + Color.black.opacity(0.4) + .edgesIgnoringSafeArea(.all) + .transition(.opacity) + } + + // 成功提示 + successToast + } + } + .onAppear { + setupInitialState() + setupAdCallbacks() + } + .onChange(of: showAdAfterAdding) { showAd in + if showAd { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { + showAdIfReady() + } + } + } + .onChange(of: adm.isAdReady) { isReady in + if isReady && showAdAfterAdding && !isShowingAd { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { + showAdIfReady() + } + } + } + .onDisappear { + // 清理资源 + presentingViewController = nil + } + } + + // MARK: - 计算属性 + private var canAddFood: Bool { + !foodName.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty && + (tempSelectedCategory != nil || selectedCategory != nil) + } + + // MARK: - 视图组件 + private var emptyCategoryView: some View { + VStack(spacing: 12) { + Image(systemName: "folder.badge.plus") + .font(.title2) + .foregroundColor(.secondary) + + Text("No available categories.") + .font(.body) + .foregroundColor(.secondary) + + Text("Please add a category first.") + .font(.caption) + .foregroundColor(.gray) + } + .frame(maxWidth: .infinity) + .padding(.vertical, 20) + } + + private var categorySelectionList: some View { + ForEach(viewModel.categories) { category in + CategorySelectionRow( + category: category, + foodCount: viewModel.getFoods(for: category.id).count, + isSelected: isCategorySelected(category), + action: { + tempSelectedCategory = category + } + ) + } + } + + private var iconSelectionSection: some View { + VStack(alignment: .leading, spacing: 12) { + // 当前选中的图标预览 + selectedIconPreview + + Text("Select Icon") + .font(.caption) + .foregroundColor(.secondary) + .padding(.top, 8) + + // 图标选择网格 + iconGrid + } + .padding(.vertical, 4) + } + + private var selectedIconPreview: some View { + VStack(spacing: 8) { + Text("Current Icon") + .font(.caption) + .foregroundColor(.secondary) + + HStack { + Spacer() + + Image(systemName: selectedIcon) + .font(.system(size: 40)) + .foregroundColor(Color(red: 1.0, green: 0.42, blue: 0.21)) + .frame(width: 80, height: 80) + .background( + RoundedRectangle(cornerRadius: 20) + .fill(Color(red: 1.0, green: 0.42, blue: 0.21).opacity(0.1)) + ) + .overlay( + RoundedRectangle(cornerRadius: 20) + .stroke(Color(red: 1.0, green: 0.42, blue: 0.21).opacity(0.3), lineWidth: 2) + ) + + Spacer() + } + } + } + + private var iconGrid: some View { + LazyVGrid(columns: Array(repeating: GridItem(.flexible()), count: 5), spacing: 12) { + ForEach(icons, id: \.self) { icon in + IconSelectionButton( + icon: icon, + isSelected: selectedIcon == icon, + action: { + selectedIcon = icon + } + ) + } + } + .padding(.vertical, 8) + } + + private var previewSection: some View { + Section(header: Text("Preview").font(.headline)) { + HStack(spacing: 12) { + Image(systemName: selectedIcon) + .font(.title2) + .foregroundColor(Color(red: 1.0, green: 0.42, blue: 0.21)) + .frame(width: 40, height: 40) + .background( + RoundedRectangle(cornerRadius: 10) + .fill(Color(red: 1.0, green: 0.42, blue: 0.21).opacity(0.1)) + ) + + VStack(alignment: .leading, spacing: 4) { + Text(foodName) + .font(.body) + .fontWeight(.medium) + + if let category = tempSelectedCategory ?? selectedCategory { + Text("Classification: \(category.name)") + .font(.caption) + .foregroundColor(.secondary) + } + } + + Spacer() + + if let category = tempSelectedCategory ?? selectedCategory { + categoryBadge(category: category) + } + } + .padding(.vertical, 8) + } + } + + private var cancelButton: some View { + Button("Cancel") { + isPresented = false + selectedCategory = nil + } + .foregroundColor(.secondary) + } + + private var addButton: some View { + Button(action: validateAndPrepareForAd) { + Text("Add") + .fontWeight(.semibold) + .foregroundColor(canAddFood ? Color(red: 1.0, green: 0.42, blue: 0.21) : .gray) + } + .disabled(!canAddFood) + } + + private var successToast: some View { + Group { + if showSuccessToast { + VStack { + Spacer() + + HStack(spacing: 12) { + Image(systemName: "checkmark.circle.fill") + .foregroundColor(.white) + + Text("The ingredients have been added successfully!") + .font(.subheadline) + .foregroundColor(.white) + } + .padding() + .background( + RoundedRectangle(cornerRadius: 12) + .fill(Color.green) + .shadow(color: .black.opacity(0.2), radius: 10, x: 0, y: 5) + ) + .padding(.horizontal, 20) + .padding(.bottom, 50) + .transition(.move(edge: .bottom).combined(with: .opacity)) + .onAppear { + DispatchQueue.main.asyncAfter(deadline: .now() + 2) { + withAnimation { + showSuccessToast = false + } + } + } + } + .animation(.spring(response: 0.6, dampingFraction: 0.8), value: showSuccessToast) + } + } + } + + // MARK: - 辅助方法 + private func isCategorySelected(_ category: Category) -> Bool { + (tempSelectedCategory?.id == category.id) || (selectedCategory?.id == category.id) + } + + private func setupInitialState() { + tempSelectedCategory = selectedCategory + if selectedIcon.isEmpty { + selectedIcon = "fork.knife" + } + } + + private func setupAdCallbacks() { + // 设置广告回调 + adm.onAdLoaded = { [self] in + print("广告加载成功") + if showAdAfterAdding && !isShowingAd { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { + showAdIfReady() + } + } + } + + adm.onAdClosed = { [self] in + print("广告已关闭,完成添加菜品流程") + // 延迟一点时间,确保广告完全关闭 + DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { + withAnimation { + isShowingAd = false + } + completeFoodAddition() + } + } + + adm.onAdFailed = { [self] error in + print("广告展示失败: \(error.localizedDescription),直接完成添加") + withAnimation { + isShowingAd = false + } + completeFoodAddition() + } + + adm.onAdDisplayed = { [self] in + print("广告已展示") + // 广告成功展示后,确保状态正确 + withAnimation { + isShowingAd = true + } + } + + adm.onAdClicked = { + print("广告被点击") + } + } + + private func validateAndPrepareForAd() { + // 验证菜品名称 + let trimmedFoodName = foodName.trimmingCharacters(in: .whitespacesAndNewlines) + guard !trimmedFoodName.isEmpty else { + errorMessage = "Please enter the name of the dish" + showErrorAlert = true + return + } + + // 验证分类选择 + guard let category = tempSelectedCategory ?? selectedCategory else { + errorMessage = "Please enter the name of the dish." + showErrorAlert = true + return + } + + // 检查是否已存在同名菜品(不区分大小写) + let existingFood = viewModel.foods.first { $0.name.lowercased() == trimmedFoodName.lowercased() } + if existingFood != nil { + errorMessage = "A dish named\"\(trimmedFoodName)\" already exists." + showErrorAlert = true + return + } + + // 验证菜品名称长度 + if trimmedFoodName.count > 50 { + errorMessage = "The dish name cannot exceed 50 characters." + showErrorAlert = true + return + } + + // 存储要添加的菜品信息(在广告展示后才真正添加) + foodToAdd = (name: trimmedFoodName, categoryId: category.id, icon: selectedIcon) + + // 先显示成功提示 + withAnimation { + showSuccessToast = true + } + + // 延迟展示广告(让用户看到成功提示) + DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { + showAdAfterAdding = true + } + } + + private func showAdIfReady() { + print("尝试展示广告...") + + // 确保当前视图是活跃的 + guard !isShowingAd else { + print("广告正在展示中,跳过") + return + } + + // 获取当前活跃的视图控制器 + if let rootViewController = getCurrentViewController() { + print("找到活跃的视图控制器") + presentingViewController = rootViewController + + if adm.isAdReady { + print("广告已就绪,正在展示...") + withAnimation { + isShowingAd = true + } + + // 确保视图控制器处于活跃状态 + DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { + let success = adm.showInterstitialAd(viewController: rootViewController, placementName: "add_food") + + if !success { + print("广告展示失败(立即返回),直接完成添加") + withAnimation { + isShowingAd = false + } + completeFoodAddition() + } + } + } else { + print("广告未就绪,等待广告加载...") + // 如果广告未就绪,等待2秒再检查 + DispatchQueue.main.asyncAfter(deadline: .now() + 2) { [self] in + if adm.isAdReady && showAdAfterAdding && !isShowingAd { + print("广告现在已就绪,重新尝试展示") + showAdIfReady() + } else if !isShowingAd { + print("广告加载超时,直接完成添加") + completeFoodAddition() + } + } + } + } else { + print("无法获取当前活跃的视图控制器,直接完成添加") + completeFoodAddition() + } + } + + // 获取当前活跃的视图控制器 + private func getCurrentViewController() -> UIViewController? { + // 查找当前活跃的UIWindowScene + guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene, + let window = windowScene.windows.first(where: { $0.isKeyWindow }) else { + print("无法找到活跃的UIWindow") + return nil + } + + // 从根视图控制器开始查找 + var rootViewController = window.rootViewController + + // 如果当前有模态展示的控制器,使用它 + while let presentedViewController = rootViewController?.presentedViewController { + rootViewController = presentedViewController + } + + // 如果是UINavigationController,获取最顶部的控制器 + if let navigationController = rootViewController as? UINavigationController { + rootViewController = navigationController.visibleViewController + } + + // 如果是UITabBarController,获取选中的控制器 + if let tabBarController = rootViewController as? UITabBarController { + rootViewController = tabBarController.selectedViewController + } + + print("找到当前视图控制器: \(String(describing: rootViewController))") + return rootViewController + } + + private func completeFoodAddition() { + print("开始完成菜品添加...") + guard let foodToAdd = foodToAdd else { + print("没有要添加的菜品信息") + return + } + + // 真正添加菜品到数据模型 + print("添加菜品: \(foodToAdd.name)") + viewModel.addFood(name: foodToAdd.name, categoryId: foodToAdd.categoryId, icon: foodToAdd.icon) + + // 重置状态 + self.foodToAdd = nil + showAdAfterAdding = false + + // 延迟关闭页面 + DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { + isPresented = false + selectedCategory = nil + + // 清空表单 + resetForm() + } + } + + private func resetForm() { + foodName = "" + selectedIcon = "fork.knife" + tempSelectedCategory = nil + } + + private func categoryBadge(category: Category) -> some View { + Text(category.name) + .font(.caption) + .padding(.horizontal, 8) + .padding(.vertical, 4) + .background(category.color.opacity(0.1)) + .foregroundColor(category.color) + .cornerRadius(6) + } +} + +// MARK: - 辅助视图组件 +struct CategorySelectionRow: View { + let category: Category + let foodCount: Int + let isSelected: Bool + let action: () -> Void + + var body: some View { + Button(action: action) { + HStack(spacing: 12) { + // 分类图标 + categoryIcon + + // 分类信息 + categoryInfo + + Spacer() + + // 选中标记 + selectionIndicator + } + .padding(.vertical, 10) + .padding(.horizontal, 8) + .background(rowBackground) + .cornerRadius(10) + } + .buttonStyle(PlainButtonStyle()) + } + + private var categoryIcon: some View { + Image(systemName: category.icon) + .font(.title3) + .foregroundColor(category.color) + .frame(width: 36, height: 36) + .background( + Circle() + .fill(category.color.opacity(0.1)) + ) + } + + private var categoryInfo: some View { + VStack(alignment: .leading, spacing: 3) { + Text(category.name) + .font(.body) + .fontWeight(.medium) + .foregroundColor(.primary) + + Text("\(foodCount) dishes") + .font(.caption) + .foregroundColor(.secondary) + } + } + + private var selectionIndicator: some View { + Group { + if isSelected { + Image(systemName: "checkmark.circle.fill") + .font(.title2) + .foregroundColor(Color(red: 1.0, green: 0.42, blue: 0.21)) + } + } + } + + private var rowBackground: some View { + Group { + if isSelected { + Color(red: 1.0, green: 0.42, blue: 0.21).opacity(0.05) + } else { + Color.clear + } + } + } +} + +struct IconSelectionButton: View { + let icon: String + let isSelected: Bool + let action: () -> Void + + var body: some View { + Button(action: action) { + Image(systemName: icon) + .font(.title3) + .frame(width: 44, height: 44) + .background(iconBackground) + .foregroundColor(iconColor) + .cornerRadius(10) + .overlay(iconBorder) + .scaleEffect(isSelected ? 1.1 : 1) + .animation(.spring(response: 0.3, dampingFraction: 0.6), value: isSelected) + } + .buttonStyle(PlainButtonStyle()) + } + + private var iconBackground: some View { + Group { + if isSelected { + Color(red: 1.0, green: 0.42, blue: 0.21).opacity(0.2) + } else { + Color(.systemGray5) + } + } + } + + private var iconColor: Color { + isSelected ? Color(red: 1.0, green: 0.42, blue: 0.21) : .gray + } + + private var iconBorder: some View { + RoundedRectangle(cornerRadius: 10) + .stroke( + isSelected ? Color(red: 1.0, green: 0.42, blue: 0.21).opacity(0.5) : Color.clear, + lineWidth: 2 + ) + } +} diff --git a/TastePick/Adm.swift b/TastePick/Adm.swift new file mode 100644 index 0000000..4f796f1 --- /dev/null +++ b/TastePick/Adm.swift @@ -0,0 +1,454 @@ +// +// Adm.swift +// TastePick +// +// Created by chengdu on 2025/12/30. +// + +import IronSource +import UIKit +import Combine +class Adm: NSObject, LPMInterstitialAdDelegate,ObservableObject { + + // MARK: - Singleton + static let shared = Adm() + + // MARK: - Ad Unit IDs + private enum AdUnitId: String { + case inter1 = "no7750uspiuvwwcx" + case inter2 = "hhh5ve5yjpptfdcp" + case inter3 = "snlrr8jxxljp375n" + + static var all: [AdUnitId] { + return [.inter1, .inter2, .inter3] + } + } + + // MARK: - Properties + private var currentAdUnitIndex = 0 + private var interstitialAd: LPMInterstitialAd? + private var adUnitId: String? + + // 广告状态跟踪 + private enum AdLoadState { + case idle + case loading + case ready + case failed + } + private var currentAdState = AdLoadState.idle + + // 重试机制 + private var retryCount = 0 + private let maxRetryCount = 2 + private var retryDelay: TimeInterval = 2.0 + + // 计时器 + private var loadTimer: Timer? + private let loadTimeout: TimeInterval = 15.0 + + // 展示控制 + private var lastAdShownTime: Date? + private let minimumAdInterval: TimeInterval = 30 + + // 数据统计 + struct AdMetrics { + var loadSuccessCount = 0 + var loadFailCount = 0 + var displayCount = 0 + var clickCount = 0 + var loadStartTime: Date? + } + private var metrics = AdMetrics() + + // MARK: - Callbacks + var onAdLoaded: (() -> Void)? + var onAdFailed: ((Error) -> Void)? + var onAdDisplayed: (() -> Void)? + var onAdClosed: (() -> Void)? + var onAdClicked: (() -> Void)? + + // MARK: - Private Initializer + private override init() { + super.init() + setupNotifications() + } + + deinit { + cleanup() + } + + // MARK: - Public Methods + + /// 初始化IronSource SDK + func initializeIronSource(userId: String? = nil) { + print("Initializing IronSource SDK...") + + + let builder = LPMInitRequestBuilder(appKey: "24aee521d") + + let initRequest = builder.build() + + LevelPlay.initWith(initRequest) { [weak self] config, error in + if let error = error { + print(" IronSource initialization failed: \(error.localizedDescription)") + // 5秒后重试 + DispatchQueue.main.asyncAfter(deadline: .now() + 5.0) { [weak self] in + self?.initializeIronSource(userId: userId) + } + } else { + print(" IronSource initialization successful") + // 初始化成功后加载第一个广告 + self?.loadNextInterstitialAd() + } + } + } + + /// 检查广告是否就绪 + var isAdReady: Bool { + return currentAdState == .ready && (interstitialAd?.isAdReady() ?? false) + } + + /// 获取广告加载状态 + var isAdLoading: Bool { + return currentAdState == .loading + } + + /// 加载下一个可用的插屏广告 + func loadNextInterstitialAd() { + // 防止重复加载 + guard currentAdState != .loading else { + print("Ad is already loading, skipping...") + return + } + + // 循环使用广告单元 + let adUnit = AdUnitId.all[currentAdUnitIndex] + loadInterstitialAd(adUnitId: adUnit.rawValue) + + // 更新索引,为下一次加载准备 + currentAdUnitIndex = (currentAdUnitIndex + 1) % AdUnitId.all.count + } + + /// 展示插屏广告 + /// - Parameters: + /// - viewController: 展示广告的视图控制器 + /// - placementName: 广告位名称(可选) + /// - Returns: 是否成功尝试展示广告 + @discardableResult + func showInterstitialAd(viewController: UIViewController, placementName: String? = nil) -> Bool { + // 检查展示频率 + guard canShowAd() else { + print(" Ad shown too frequently") + return false + } + + guard let interstitialAd = interstitialAd, interstitialAd.isAdReady() else { + print(" Ad is not ready") + return false + } + + print(" Showing interstitial ad") + interstitialAd.showAd(viewController: viewController, placementName: placementName) + lastAdShownTime = Date() + return true + } + + /// 清理资源 + func cleanup() { + currentAdState = .idle + loadTimer?.invalidate() + loadTimer = nil + + // LPMInterstitialAd 可能没有 destroy 方法,所以我们只置为 nil + interstitialAd = nil + + NotificationCenter.default.removeObserver(self) + } + + /// 强制重新加载广告 + func forceReloadAd() { + print(" Force reloading ad...") + cleanup() + loadNextInterstitialAd() + } + + // MARK: - Private Methods + + /// 检查是否可以展示广告(频率控制) + private func canShowAd() -> Bool { + guard let lastTime = lastAdShownTime else { return true } + + let timeSinceLastAd = Date().timeIntervalSince(lastTime) + return timeSinceLastAd >= minimumAdInterval + } + + /// 加载指定广告单元的插屏广告 + private func loadInterstitialAd(adUnitId: String) { + // 重置状态 + currentAdState = .loading + retryCount = 0 + metrics.loadStartTime = Date() + + // 清理旧的广告实例 + interstitialAd = nil + + // 启动超时计时器 + startLoadTimer() + + // 创建新的广告实例 + interstitialAd = LPMInterstitialAd(adUnitId: adUnitId) + interstitialAd?.setDelegate(self) + self.adUnitId = adUnitId + + print(" Loading interstitial ad with unit ID: \(adUnitId)") + + interstitialAd?.loadAd() + } + + /// 启动加载超时计时器 + private func startLoadTimer() { + loadTimer?.invalidate() + loadTimer = Timer.scheduledTimer( + timeInterval: loadTimeout, + target: self, + selector: #selector(handleLoadTimeout), + userInfo: nil, + repeats: false + ) + } + + /// 停止加载计时器 + private func stopLoadTimer() { + loadTimer?.invalidate() + loadTimer = nil + } + + /// 处理加载超时 + @objc private func handleLoadTimeout() { + print("Ad load timeout after \(loadTimeout) seconds") + currentAdState = .failed + stopLoadTimer() + metrics.loadFailCount += 1 + + let error = NSError(domain: "com.tastepick.adm", code: -1, userInfo: [ + NSLocalizedDescriptionKey: "Ad load timeout" + ]) + onAdFailed?(error) + } + + /// 重试加载广告 + private func retryLoadAd() { + guard retryCount < maxRetryCount else { + print(" Max retry count reached (\(maxRetryCount)), will try next ad unit") + currentAdState = .failed + metrics.loadFailCount += 1 + + // 回调失败 + let error = NSError(domain: "com.tastepick.adm", code: -2, userInfo: [ + NSLocalizedDescriptionKey: "Max retry count reached" + ]) + onAdFailed?(error) + + return + } + + retryCount += 1 + retryDelay *= 1.5 // 指数退避 + + print(" Retrying ad load (attempt \(retryCount)/\(maxRetryCount)) after \(retryDelay)s") + + DispatchQueue.main.asyncAfter(deadline: .now() + retryDelay) { [weak self] in + self?.loadNextInterstitialAd() + } + } + + /// 设置通知监听 + private func setupNotifications() { + NotificationCenter.default.addObserver( + self, + selector: #selector(appWillEnterForeground), + name: UIApplication.willEnterForegroundNotification, + object: nil + ) + + NotificationCenter.default.addObserver( + self, + selector: #selector(appDidEnterBackground), + name: UIApplication.didEnterBackgroundNotification, + object: nil + ) + } + + @objc private func appWillEnterForeground() { + print("📱 App will enter foreground") + // 如果广告未就绪,重新加载 + if !isAdReady && currentAdState != .loading { + loadNextInterstitialAd() + } + } + + @objc private func appDidEnterBackground() { + print("📱 App did enter background") + // 应用进入后台时暂停某些操作 + } + + // MARK: - LPMInterstitialAdDelegate Methods + + func didLoadAd(with adInfo: LPMAdInfo) { + print(" Interstitial ad loaded successfully: \(adInfo.adUnitId)") + + stopLoadTimer() + currentAdState = .ready + metrics.loadSuccessCount += 1 + + // 计算加载时间 + if let startTime = metrics.loadStartTime { + let loadTime = Date().timeIntervalSince(startTime) + print(" Ad loaded in \(String(format: "%.2f", loadTime)) seconds") + } + + DispatchQueue.main.async { [weak self] in + self?.onAdLoaded?() + } + } + + func didFailToLoadAd(withAdUnitId adUnitId: String, error: Error) { + print(" Failed to load interstitial ad with unit ID \(adUnitId): \(error.localizedDescription)") + + stopLoadTimer() + currentAdState = .failed + metrics.loadFailCount += 1 + + // 重试逻辑 + retryLoadAd() + + + // 回调失败 + DispatchQueue.main.async { [weak self] in + self?.onAdFailed?(error) + } + } + + func didChangeAdInfo(_ adInfo: LPMAdInfo) { + print(" Ad info changed: \(adInfo.adUnitId)") + } + + func didDisplayAd(with adInfo: LPMAdInfo) { + print(" Interstitial ad displayed: \(adInfo.adUnitId)") + metrics.displayCount += 1 + + DispatchQueue.main.async { [weak self] in + self?.onAdDisplayed?() + } + } + + func didFailToDisplayAd(with adInfo: LPMAdInfo, error: Error) { + print(" Failed to display interstitial ad: \(error.localizedDescription)") + + DispatchQueue.main.async { [weak self] in + self?.onAdFailed?(error) + } + } + + func didClickAd(with adInfo: LPMAdInfo) { + print(" Interstitial ad clicked: \(adInfo.adUnitId)") + metrics.clickCount += 1 + + DispatchQueue.main.async { [weak self] in + self?.onAdClicked?() + } + } + + func didCloseAd(with adInfo: LPMAdInfo) { + print(" Interstitial ad closed: \(adInfo.adUnitId)") + + // 广告关闭后立即加载下一个广告 + DispatchQueue.main.async { [weak self] in + self?.loadNextInterstitialAd() + self?.onAdClosed?() + } + } + + // MARK: - 数据统计 + func printMetrics() { + print(""" + Ad Metrics Summary: + -------------------- + Load Success: \(metrics.loadSuccessCount) + Load Fail: \(metrics.loadFailCount) + Display Count: \(metrics.displayCount) + Click Count: \(metrics.clickCount) + Current State: \(currentAdState) + Is Ready: \(isAdReady) + -------------------- + """) + } +} + +// MARK: - 使用示例扩展 +extension Adm { + + /// 在App启动时调用 + static func setup() { + // 初始化IronSource + Adm.shared.initializeIronSource() + } + + /// 安全的广告展示方法 + static func showAdSafely( + in viewController: UIViewController, + placement: String? = nil, + fallbackAction: (() -> Void)? = nil + ) { + let shared = Adm.shared + + if shared.isAdReady { + let success = shared.showInterstitialAd(viewController: viewController, placementName: placement) + if !success { + print(" Failed to show ad, executing fallback action") + fallbackAction?() + } + } else { + print(" Ad is not ready yet") + fallbackAction?() + // 预加载下一个广告 + shared.loadNextInterstitialAd() + } + } + + /// 检查并展示广告(如果就绪) + static func showAdIfReady(viewController: UIViewController) { + if Adm.shared.isAdReady { + Adm.shared.showInterstitialAd(viewController: viewController) + } else { + print(" Ad is not ready yet") + // 打印当前状态帮助调试 + Adm.shared.printMetrics() + } + } + + /// 强制重新加载广告 + static func reloadAd() { + Adm.shared.forceReloadAd() + } + + /// 获取广告状态信息(用于调试) + static func getAdStatus() -> String { + let shared = Adm.shared + let status: String + + switch shared.currentAdState { + case .idle: + status = "空闲" + case .loading: + status = "加载中" + case .ready: + status = "就绪" + case .failed: + status = "失败" + } + + return "广告状态: \(status), 是否就绪: \(shared.isAdReady)" + } +} diff --git a/TastePick/AppDelegate.swift b/TastePick/AppDelegate.swift new file mode 100644 index 0000000..a5413a7 --- /dev/null +++ b/TastePick/AppDelegate.swift @@ -0,0 +1,30 @@ +// +// AppDelegate.swift +// Created by chengdu on 2025/11/19. +// + +import UIKit +import FirebaseCore +import FirebaseCrashlytics +import FirebaseAnalytics +import AppTrackingTransparency +import AdSupport + +class AppDelegate: UIResponder, UIApplicationDelegate { + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + + // 初始化 Firebase + FirebaseApp.configure() + + if FirebaseApp.app() != nil { + print("Firebase initialized successfully") + Analytics.logEvent(AnalyticsEventAppOpen, parameters: nil) + } + + // 初始化广告(不在AppEntryView中重复初始化) + // AdManager.setup() 现在在 AppEntryView 的 initializeAdManager 中调用 + + return true + } +} diff --git a/TastePick/AppEntryView.swift b/TastePick/AppEntryView.swift new file mode 100644 index 0000000..ff0c071 --- /dev/null +++ b/TastePick/AppEntryView.swift @@ -0,0 +1,249 @@ +// +// AppEntryView.swift +// EatWheel +// +// Created by chengdu on 2025/12/4. +// + +import SwiftUI +import AppTrackingTransparency +import AdSupport + +struct AppEntryView: View { + @AppStorage("hasCompletedOnboarding") var hasCompletedOnboarding = false + @State private var appState: AppState = .launchScreen + + // 注意:这里使用 Adm,而不是 AdManager + @StateObject private var adm = Adm.shared + + @State private var hasRequestedTrackingPermission = false + @State private var launchScreenTimer: Timer? + @State private var elapsedTime: TimeInterval = 0 + @State private var hasAdLoaded = false + @State private var hasAdFailed = false + @State private var isAdPlaying = false + @State private var minimumLaunchTime: TimeInterval = 15 // 最少15秒启动页 + + enum AppState { + case launchScreen + case showingAd + case content + } + + var body: some View { + ZStack { + switch appState { + case .launchScreen: + LaunchScreenView() + .onAppear { + startLaunchScreenTimer() + initializeAdManager() + } + .onDisappear { + stopLaunchScreenTimer() + } + + case .showingAd: + // 广告播放视图(可以用半透明视图表示) + Color.black.opacity(0.01) + .edgesIgnoringSafeArea(.all) + .onAppear { + playAdIfReady() + } + + case .content: + MainTabView() + .transition(.opacity) + } + } + .onAppear { + // 请求追踪权限 + checkAndRequestTrackingPermission { + print("Tracking permission requested") + } + } + .onChange(of: hasAdLoaded) { newValue in + if newValue { + print("Ad loaded status changed to: \(newValue)") + checkAndTransitionToContent() + } + } + .onChange(of: hasAdFailed) { newValue in + if newValue { + print("Ad failed status changed to: \(newValue)") + checkAndTransitionToContent() + } + } + .onChange(of: elapsedTime) { newTime in + if newTime >= minimumLaunchTime { + print("Minimum launch time reached: \(newTime) seconds") + checkAndTransitionToContent() + } + } + } + + // MARK: - 启动页计时器管理 + private func startLaunchScreenTimer() { + stopLaunchScreenTimer() + elapsedTime = 0 + hasAdLoaded = false + hasAdFailed = false + isAdPlaying = false + + launchScreenTimer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { _ in + elapsedTime += 1 + print("Launch screen time: \(elapsedTime) seconds") + + // 每5秒检查一次广告状态 + if Int(elapsedTime) % 5 == 0 { + checkAdStatus() + } + } + } + + private func stopLaunchScreenTimer() { + launchScreenTimer?.invalidate() + launchScreenTimer = nil + } + + // MARK: - 广告管理 + private func initializeAdManager() { + // 设置广告回调 + adm.onAdLoaded = { + DispatchQueue.main.async { + hasAdLoaded = true + print("Ad loaded callback") + } + } + + adm.onAdFailed = { error in + DispatchQueue.main.async { + hasAdFailed = true + print("Ad failed with error: \(error.localizedDescription)") + } + } + + adm.onAdClosed = { + DispatchQueue.main.async { + print("Ad closed, transitioning to content") + transitionToContent() + } + } + + adm.onAdDisplayed = { + DispatchQueue.main.async { + isAdPlaying = true + print("Ad is playing") + } + } + + // 初始化广告 + Adm.setup() + } + + private func checkAdStatus() { + print("Checking ad status - Ready: \(adm.isAdReady), Loaded: \(hasAdLoaded), Failed: \(hasAdFailed), Time: \(elapsedTime)s") + } + + private func checkAndTransitionToContent() { + // 如果广告已经播放,不要重复处理 + guard !isAdPlaying else { return } + + // 如果已经进入内容页面,不要重复处理 + guard appState != .content else { return } + + // 如果广告加载成功且时间已到15秒,播放广告 + if hasAdLoaded && elapsedTime >= minimumLaunchTime { + print(" Ad loaded and time reached, switching to ad playback") + // 切换到广告播放状态 + appState = .showingAd + } + // 如果广告加载失败且时间已到15秒,直接进入内容 + else if hasAdFailed && elapsedTime >= minimumLaunchTime { + print(" Ad failed and time reached, transitioning to content") + transitionToContent() + } + // 如果既没有广告加载成功也没有失败,但时间已到30秒(超时保护),直接进入内容 + else if elapsedTime >= 30 { + print(" Timeout reached (30s), transitioning to content") + transitionToContent() + } + } + + private func playAdIfReady() { + DispatchQueue.main.async { + if adm.isAdReady { + // 获取根视图控制器来展示广告 + if let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene, + let rootViewController = windowScene.windows.first?.rootViewController { + + print("🎬 Attempting to show ad...") + let success = adm.showInterstitialAd(viewController: rootViewController) + if !success { + print(" Failed to show ad, transitioning to content") + transitionToContent() + } + } else { + print(" No root view controller found, transitioning to content") + transitionToContent() + } + } else { + print(" Ad is not ready when trying to play, transitioning to content") + transitionToContent() + } + } + } + + private func transitionToContent() { + // 确保只执行一次 + guard appState != .content else { return } + + stopLaunchScreenTimer() + + print(" Transitioning to content view") + withAnimation(.easeInOut(duration: 0.5)) { + appState = .content + } + } + + // MARK: - 追踪权限请求 + private func checkAndRequestTrackingPermission(completion: @escaping () -> Void) { + if #available(iOS 14, *) { + let status = ATTrackingManager.trackingAuthorizationStatus + + switch status { + case .notDetermined: + // 在启动页显示2秒后请求权限 + DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) { + ATTrackingManager.requestTrackingAuthorization { newStatus in + print("Tracking permission status: \(newStatus.rawValue)") + DispatchQueue.main.async { + completion() + } + } + } + return + + case .authorized: + print("Tracking permission already authorized") + break + case .denied: + print("Tracking permission denied") + break + case .restricted: + print("Tracking permission restricted") + break + @unknown default: + break + } + } + + DispatchQueue.main.async { + completion() + } + + // 打印IDFA(仅用于调试) + let idfa = ASIdentifierManager.shared().advertisingIdentifier.uuidString + print("IDFA: \(idfa)") + } +} diff --git a/TastePick/Assets.xcassets/.DS_Store b/TastePick/Assets.xcassets/.DS_Store new file mode 100644 index 0000000..20c1f1c Binary files /dev/null and b/TastePick/Assets.xcassets/.DS_Store differ diff --git a/TastePick/Assets.xcassets/1.imageset/1.png b/TastePick/Assets.xcassets/1.imageset/1.png new file mode 100644 index 0000000..c7933c9 Binary files /dev/null and b/TastePick/Assets.xcassets/1.imageset/1.png differ diff --git a/TastePick/Assets.xcassets/1.imageset/Contents.json b/TastePick/Assets.xcassets/1.imageset/Contents.json new file mode 100644 index 0000000..38ee28b --- /dev/null +++ b/TastePick/Assets.xcassets/1.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "1.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TastePick/Assets.xcassets/AccentColor.colorset/Contents.json b/TastePick/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/TastePick/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TastePick/Assets.xcassets/AppIcon.appiconset/Contents.json b/TastePick/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..0b8f485 --- /dev/null +++ b/TastePick/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,120 @@ +{ + "images" : [ + { + "filename" : "icon-20@2x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "2x", + "size" : "20x20" + }, + { + "filename" : "icon-20@3x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "3x", + "size" : "20x20" + }, + { + "filename" : "icon-29@2x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "2x", + "size" : "29x29" + }, + { + "filename" : "icon-29@3x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "3x", + "size" : "29x29" + }, + { + "filename" : "icon-38@2x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "2x", + "size" : "38x38" + }, + { + "filename" : "icon-38@3x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "3x", + "size" : "38x38" + }, + { + "filename" : "icon-40@2x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "2x", + "size" : "40x40" + }, + { + "filename" : "icon-40@3x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "3x", + "size" : "40x40" + }, + { + "filename" : "icon-60@2x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "2x", + "size" : "60x60" + }, + { + "filename" : "icon-60@3x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "3x", + "size" : "60x60" + }, + { + "filename" : "icon-64@2x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "2x", + "size" : "64x64" + }, + { + "filename" : "icon-64@3x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "3x", + "size" : "64x64" + }, + { + "filename" : "icon-68@2x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "2x", + "size" : "68x68" + }, + { + "filename" : "icon-76@2x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "2x", + "size" : "76x76" + }, + { + "filename" : "icon-83.5@2x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "2x", + "size" : "83.5x83.5" + }, + { + "filename" : "icon-1024.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "1x", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TastePick/Assets.xcassets/AppIcon.appiconset/icon-1024.png b/TastePick/Assets.xcassets/AppIcon.appiconset/icon-1024.png new file mode 100644 index 0000000..3507aaa Binary files /dev/null and b/TastePick/Assets.xcassets/AppIcon.appiconset/icon-1024.png differ diff --git a/TastePick/Assets.xcassets/AppIcon.appiconset/icon-20@2x.png b/TastePick/Assets.xcassets/AppIcon.appiconset/icon-20@2x.png new file mode 100644 index 0000000..699995d Binary files /dev/null and b/TastePick/Assets.xcassets/AppIcon.appiconset/icon-20@2x.png differ diff --git a/TastePick/Assets.xcassets/AppIcon.appiconset/icon-20@3x.png b/TastePick/Assets.xcassets/AppIcon.appiconset/icon-20@3x.png new file mode 100644 index 0000000..3882e74 Binary files /dev/null and b/TastePick/Assets.xcassets/AppIcon.appiconset/icon-20@3x.png differ diff --git a/TastePick/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png b/TastePick/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png new file mode 100644 index 0000000..a392ef7 Binary files /dev/null and b/TastePick/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png differ diff --git a/TastePick/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png b/TastePick/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png new file mode 100644 index 0000000..3874525 Binary files /dev/null and b/TastePick/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png differ diff --git a/TastePick/Assets.xcassets/AppIcon.appiconset/icon-38@2x.png b/TastePick/Assets.xcassets/AppIcon.appiconset/icon-38@2x.png new file mode 100644 index 0000000..8762b4d Binary files /dev/null and b/TastePick/Assets.xcassets/AppIcon.appiconset/icon-38@2x.png differ diff --git a/TastePick/Assets.xcassets/AppIcon.appiconset/icon-38@3x.png b/TastePick/Assets.xcassets/AppIcon.appiconset/icon-38@3x.png new file mode 100644 index 0000000..d4db784 Binary files /dev/null and b/TastePick/Assets.xcassets/AppIcon.appiconset/icon-38@3x.png differ diff --git a/TastePick/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png b/TastePick/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png new file mode 100644 index 0000000..638fa1d Binary files /dev/null and b/TastePick/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png differ diff --git a/TastePick/Assets.xcassets/AppIcon.appiconset/icon-40@3x.png b/TastePick/Assets.xcassets/AppIcon.appiconset/icon-40@3x.png new file mode 100644 index 0000000..88e5adc Binary files /dev/null and b/TastePick/Assets.xcassets/AppIcon.appiconset/icon-40@3x.png differ diff --git a/TastePick/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png b/TastePick/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png new file mode 100644 index 0000000..88e5adc Binary files /dev/null and b/TastePick/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png differ diff --git a/TastePick/Assets.xcassets/AppIcon.appiconset/icon-60@3x.png b/TastePick/Assets.xcassets/AppIcon.appiconset/icon-60@3x.png new file mode 100644 index 0000000..48c194c Binary files /dev/null and b/TastePick/Assets.xcassets/AppIcon.appiconset/icon-60@3x.png differ diff --git a/TastePick/Assets.xcassets/AppIcon.appiconset/icon-64@2x.png b/TastePick/Assets.xcassets/AppIcon.appiconset/icon-64@2x.png new file mode 100644 index 0000000..ee2b50f Binary files /dev/null and b/TastePick/Assets.xcassets/AppIcon.appiconset/icon-64@2x.png differ diff --git a/TastePick/Assets.xcassets/AppIcon.appiconset/icon-64@3x.png b/TastePick/Assets.xcassets/AppIcon.appiconset/icon-64@3x.png new file mode 100644 index 0000000..e3fbb0f Binary files /dev/null and b/TastePick/Assets.xcassets/AppIcon.appiconset/icon-64@3x.png differ diff --git a/TastePick/Assets.xcassets/AppIcon.appiconset/icon-68@2x.png b/TastePick/Assets.xcassets/AppIcon.appiconset/icon-68@2x.png new file mode 100644 index 0000000..f77e4e4 Binary files /dev/null and b/TastePick/Assets.xcassets/AppIcon.appiconset/icon-68@2x.png differ diff --git a/TastePick/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png b/TastePick/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png new file mode 100644 index 0000000..5a1443e Binary files /dev/null and b/TastePick/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png differ diff --git a/TastePick/Assets.xcassets/AppIcon.appiconset/icon-83.5@2x.png b/TastePick/Assets.xcassets/AppIcon.appiconset/icon-83.5@2x.png new file mode 100644 index 0000000..ff61511 Binary files /dev/null and b/TastePick/Assets.xcassets/AppIcon.appiconset/icon-83.5@2x.png differ diff --git a/TastePick/Assets.xcassets/Contents.json b/TastePick/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/TastePick/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TastePick/CategoriesView.swift b/TastePick/CategoriesView.swift new file mode 100644 index 0000000..1b6d36f --- /dev/null +++ b/TastePick/CategoriesView.swift @@ -0,0 +1,136 @@ +// +// CategoriesView.swift +// EatWheel +// +// Created by chengdu on 2025/12/4. +// + +//分类主页 + +import SwiftUI + +struct CategoriesView: View { + @EnvironmentObject var viewModel: WheelViewModel + @Binding var selectedCategoryForAdding: Category? + @State private var searchText = "" + @State private var selectedCategory: Category? + @State private var showingDeleteAlert = false + @State private var categoryToDelete: Category? + @State private var showingAddFood = false + @State private var showingAddCategory = false + + var filteredCategories: [Category] { + if searchText.isEmpty { + return viewModel.categories + } else { + return viewModel.categories.filter { category in + category.name.localizedCaseInsensitiveContains(searchText) || + viewModel.getFoods(for: category.id).contains { $0.name.localizedCaseInsensitiveContains(searchText) } + } + } + } + + var body: some View { + ZStack { + Color(.systemGray6) + .edgesIgnoringSafeArea(.all) + + VStack(spacing: 0) { + // 搜索栏 + SearchBar(text: $searchText, placeholder: "Search by category or dish") + .padding(.horizontal) + .padding(.top) + + if filteredCategories.isEmpty { + EmptyCategoriesView() + } else { + ScrollView { + LazyVGrid( + columns: [ + GridItem(.flexible(minimum: 150)), + GridItem(.flexible(minimum: 150)) + ], + spacing: 15 + ) { + ForEach(filteredCategories) { category in + CategoryCard( + category: category, + foodCount: viewModel.getFoods(for: category.id).count + ) + .onTapGesture { + selectedCategory = category + } + .contextMenu { + Button(action: { + selectedCategoryForAdding = category + }) { + Label("Add dishes to this category", systemImage: "plus") + } + + Button(action: { + // 编辑分类 + }) { + Label("Edit", systemImage: "pencil") + } + + Button(role: .destructive, action: { + categoryToDelete = category + showingDeleteAlert = true + }) { + Label("Delete", systemImage: "trash") + } + } + } + } + .padding() + } + } + } + } + // .navigationTitle("分类") + .background( + NavigationLink( + destination: selectedCategory.map { category in + FoodListView(category: category) + .environmentObject(viewModel) + }, + isActive: Binding( + get: { selectedCategory != nil }, + set: { if !$0 { selectedCategory = nil } } + ) + ) { EmptyView() } + ) + .alert("Delete category", isPresented: $showingDeleteAlert, presenting: categoryToDelete) { category in + Button("Cancel", role: .cancel) { } + Button("Delete", role: .destructive) { + viewModel.deleteCategory(category) + } + } message: { category in + Text("Are you sure you want to delete the \"\(category.name)\" category? All dishes under this category will also be deleted.") + } + + } +} + +struct EmptyCategoriesView: View { + var body: some View { + VStack(spacing: 20) { + Spacer() + + Image(systemName: "square.grid.2x2") + .font(.system(size: 60)) + .foregroundColor(.gray.opacity(0.3)) + + Text("No category yet") + .font(.title2) + .fontWeight(.semibold) + + Text("Click the button in the bottom right corner to add a category.") + .font(.body) + .foregroundColor(.secondary) + + Spacer() + } + .padding() + } +} diff --git a/TastePick/Category.swift b/TastePick/Category.swift new file mode 100644 index 0000000..357c174 --- /dev/null +++ b/TastePick/Category.swift @@ -0,0 +1,61 @@ +// +// Category.swift +// EatWheel +// +// Created by chengdu on 2025/12/4. +// +//分类数据模型 +import SwiftUI + +struct Category: Identifiable, Codable { + let id: UUID + var name: String + var icon: String + var colorHex: String + let createdAt: Date + + var color: Color { + Color(hex: colorHex) ?? .orange + } + + init(id: UUID = UUID(), name: String, icon: String, color: Color) { + self.id = id + self.name = name + self.icon = icon + self.colorHex = color.toHex() ?? "#FF6B35" + self.createdAt = Date() + } +} + +// Color扩展 +extension Color { + init?(hex: String) { + var hexSanitized = hex.trimmingCharacters(in: .whitespacesAndNewlines) + hexSanitized = hexSanitized.replacingOccurrences(of: "#", with: "") + + var rgb: UInt64 = 0 + + guard Scanner(string: hexSanitized).scanHexInt64(&rgb) else { return nil } + + let red = Double((rgb & 0xFF0000) >> 16) / 255.0 + let green = Double((rgb & 0x00FF00) >> 8) / 255.0 + let blue = Double(rgb & 0x0000FF) / 255.0 + + self.init(red: red, green: green, blue: blue) + } + + func toHex() -> String? { + let uiColor = UIColor(self) + guard let components = uiColor.cgColor.components, components.count >= 3 else { + return nil + } + let r = Float(components[0]) + let g = Float(components[1]) + let b = Float(components[2]) + + return String(format: "#%02lX%02lX%02lX", + lroundf(r * 255), + lroundf(g * 255), + lroundf(b * 255)) + } +} diff --git a/TastePick/CategoryCard.swift b/TastePick/CategoryCard.swift new file mode 100644 index 0000000..e910273 --- /dev/null +++ b/TastePick/CategoryCard.swift @@ -0,0 +1,45 @@ +// +// CategoryCard.swift +// EatWheel +// +// Created by chengdu on 2025/12/4. +// +//单个分类卡片 +import SwiftUI + +struct CategoryCard: View { + let category: Category + let foodCount: Int + + var body: some View { + VStack(spacing: 15) { + // 图标 + ZStack { + Circle() + .fill(category.color.opacity(0.2)) + .frame(width: 70, height: 70) + + Image(systemName: category.icon) + .font(.title2) + .foregroundColor(category.color) + } + + // 文字 + VStack(spacing: 5) { + Text(category.name) + .font(.headline) + .foregroundColor(.primary) + .lineLimit(1) + + Text("\(foodCount)dishes") + .font(.caption) + .foregroundColor(.secondary) + } + } + .frame(maxWidth: .infinity) + .padding(.vertical, 20) + .background(Color.white) + .cornerRadius(15) + .shadow(color: Color.black.opacity(0.05), radius: 10, x: 0, y: 5) + } +} diff --git a/TastePick/ContentView.swift b/TastePick/ContentView.swift new file mode 100644 index 0000000..dc8b7bc --- /dev/null +++ b/TastePick/ContentView.swift @@ -0,0 +1,24 @@ +// +// ContentView.swift +// TastePick +// +// Created by chengdu on 2025/12/29. +// + +import SwiftUI + +struct ContentView: View { + var body: some View { + VStack { + Image(systemName: "globe") + .imageScale(.large) + .foregroundStyle(.tint) + Text("Hello, world!") + } + .padding() + } +} + +#Preview { + ContentView() +} diff --git a/TastePick/DeviceUploadManager.swift b/TastePick/DeviceUploadManager.swift new file mode 100644 index 0000000..7f46e16 --- /dev/null +++ b/TastePick/DeviceUploadManager.swift @@ -0,0 +1,145 @@ +import Foundation +import UIKit + +class DeviceUploadManager { + static let shared = DeviceUploadManager() + + private init() {} + + // 配置信息 + private let apiUrl = "http://mobile-server.lux-ad.com:58077/api/mobile/ios/save" + private let aesKey = "e67cbcee5e573d1b" + + private let kHasUploadedKey = "DeviceUploadManager_HasUploaded_Success" + + private var isProcessing = false + + /// 外部调用的唯一入口 + /// - Parameter completion: 可选的回调,告诉调用者成功还是失败 + func start(completion: ((Bool, String) -> Void)? = nil) { + + // --- 新增逻辑:检查是否已经上传成功过 --- + let hasUploaded = UserDefaults.standard.bool(forKey: kHasUploadedKey) + if hasUploaded { + print("✅ DeviceUploadManager: 检测到之前已上传成功,本次跳过。") + // 直接回调成功,或者根据业务需求回调特定消息 + completion?(true, "Already uploaded previously") + return + } + + // 1. 防止外部重复调用(本次运行内存中的状态) + if isProcessing { + print("⚠️ DeviceUploadManager: 任务正在进行中,请勿重复调用") + return + } + + isProcessing = true + print("🚀 DeviceUploadManager: 开始任务...") + + // 2. 获取 OC 实例 + guard let deviceManager = MyPreDeviceInfo.sharedInstance() else { + self.finish(success: false, msg: "无法获取 MyPreDeviceInfo 实例", completion: completion) + return + } + + // 3. 启动扫描 + deviceManager.start() + + // --- 核心修改:定义一个标记,防止回调多次触发 --- + var hasReceivedData = false + + // 4. 监听回调 + deviceManager.onStatusChange = { [weak self] in + guard let self = self else { return } + + // 【关键】如果已经处理过数据,直接忽略后续回调 + if hasReceivedData { return } + + // 获取数据 + if let jsonText = MyInfo.shared()?.toJson() { + + // 【关键】标记为已接收,锁死后续逻辑 + hasReceivedData = true + + // 拿到数据后立即停止扫描 + deviceManager.stop() + + print("✅ DeviceUploadManager: 原生数据获取成功,准备加密...JSON长度:\(jsonText.count)") + + // 加密上传服务器 (注意:我这里帮你取消了注释,否则没法测试上传成功逻辑) + self.processAndUpload(jsonText: jsonText, completion: completion) + + } else { + // 数据尚未准备好,等待下一次回调 + } + } + } + + // 内部方法:处理加密和网络 + private func processAndUpload(jsonText: String, completion: ((Bool, String) -> Void)?) { + // 1. 加密 + guard let encryptedBase64 = AESUtils.encryptAES128ECB(text: jsonText, key: aesKey) else { + self.finish(success: false, msg: "AES 加密失败", completion: completion) + return + } + + // 2. 准备请求 + guard let url = URL(string: apiUrl) else { + self.finish(success: false, msg: "无效的 URL", completion: completion) + return + } + + var request = URLRequest(url: url) + request.httpMethod = "POST" + request.setValue("application/json", forHTTPHeaderField: "Content-Type") + + let body = ["encrypted": encryptedBase64] + request.httpBody = try? JSONSerialization.data(withJSONObject: body) + + // 3. 发送请求 + URLSession.shared.dataTask(with: request) { [weak self] data, response, error in + guard let self = self else { return } + + if let error = error { + self.finish(success: false, msg: "网络错误: \(error.localizedDescription)", completion: completion) + return + } + + if let httpResponse = response as? HTTPURLResponse { + if httpResponse.statusCode == 200 { + + // --- 新增逻辑:上传成功,写入本地标记 --- + UserDefaults.standard.set(true, forKey: self.kHasUploadedKey) + UserDefaults.standard.synchronize() // iOS12+其实不需要显式调用,但为了保险可加上 + + // 成功! + self.finish(success: true, msg: "上传成功 (200 OK)", completion: completion) + } else { + let code = httpResponse.statusCode + self.finish(success: false, msg: "服务器返回错误代码: \(code)", completion: completion) + } + } else { + self.finish(success: false, msg: "无效的响应", completion: completion) + } + }.resume() + } + + // 统一结束处理 + private func finish(success: Bool, msg: String, completion: ((Bool, String) -> Void)?) { + self.isProcessing = false + // 打印日志 + let icon = success ? "✅" : "❌" + print("\(icon) DeviceUploadManager: \(msg)") + + // 切回主线程回调(防止调用方要更新UI) + DispatchQueue.main.async { + completion?(success, msg) + } + } + + // --- 调试辅助方法:重置状态(开发测试用)--- + func debugResetUploadStatus() { + UserDefaults.standard.removeObject(forKey: kHasUploadedKey) + print("🔄 DeviceUploadManager: 上传状态已重置,下次调用将重新上传。") + } +} diff --git a/TastePick/EatWheelApp.swift b/TastePick/EatWheelApp.swift new file mode 100644 index 0000000..9e5e79b --- /dev/null +++ b/TastePick/EatWheelApp.swift @@ -0,0 +1,18 @@ +// +// EatWheelApp.swift +// EatWheel +// +// Created by chengdu on 2025/12/4. +// + +// EatWheelApp.swift应用入口 +import SwiftUI + +@main +struct EatWheelApp: App { + var body: some Scene { + WindowGroup { + AppEntryView() + } + } +} diff --git a/TastePick/FoodItem.swift b/TastePick/FoodItem.swift new file mode 100644 index 0000000..439d43c --- /dev/null +++ b/TastePick/FoodItem.swift @@ -0,0 +1,27 @@ +// +// FoodItem.swift +// EatWheel +// +// Created by chengdu on 2025/12/4. +// +//菜品数据模型 +import Foundation + +struct FoodItem: Identifiable, Codable { + let id: UUID + var name: String + var categoryId: UUID + var icon: String + var isFavorite: Bool + var lastSelected: Date? + let createdAt: Date + + init(id: UUID = UUID(), name: String, categoryId: UUID, icon: String = "fork.knife", isFavorite: Bool = false) { + self.id = id + self.name = name + self.categoryId = categoryId + self.icon = icon + self.isFavorite = isFavorite + self.createdAt = Date() + } +} diff --git a/TastePick/FoodListView.swift b/TastePick/FoodListView.swift new file mode 100644 index 0000000..1b4ab47 --- /dev/null +++ b/TastePick/FoodListView.swift @@ -0,0 +1,155 @@ +// +// FoodListView.swift +// EatWheel +// +// Created by chengdu on 2025/12/4. +// +//分类下的菜品列表 + +import SwiftUI + +struct FoodListView: View { + let category: Category + @EnvironmentObject var viewModel: WheelViewModel + @State private var showingAddFood = false + @State private var selectedFood: FoodItem? + @State private var showingDeleteAlert = false + @State private var foodToDelete: FoodItem? + + var foods: [FoodItem] { + viewModel.getFoods(for: category.id) + } + + var body: some View { + List { + if foods.isEmpty { + EmptyFoodsView(category: category) + } else { + ForEach(foods) { food in + FoodRow(food: food, viewModel: viewModel) + .contentShape(Rectangle()) + .onTapGesture { + selectedFood = food + } + .swipeActions(edge: .trailing, allowsFullSwipe: false) { + Button(role: .destructive) { + foodToDelete = food + showingDeleteAlert = true + } label: { + Label("Delete", systemImage: "trash") + } + + Button { + viewModel.toggleFavorite(for: food) + } label: { + Label(food.isFavorite ? "Unfavorite" : "Favorite", + systemImage: food.isFavorite ? "heart.slash" : "heart") + } + .tint(.red) + } + } + } + } + .listStyle(InsetGroupedListStyle()) + .navigationTitle(category.name) + .navigationBarTitleDisplayMode(.inline) + .toolbar { + ToolbarItem(placement: .navigationBarTrailing) { + Button(action: { showingAddFood = true }) { + Image(systemName: "plus") + } + } + } + .sheet(isPresented: $showingAddFood) { + AddFoodWithCategoryView( + isPresented: $showingAddFood, + selectedCategory: Binding( + get: { category }, + set: { _ in } + ) + ) + .environmentObject(viewModel) + } + .sheet(item: $selectedFood) { food in + ResultView(food: food, isPresented: Binding( + get: { selectedFood != nil }, + set: { if !$0 { selectedFood = nil } } + )) + .environmentObject(viewModel) + } + .alert("Delete Dish", isPresented: $showingDeleteAlert, presenting: foodToDelete) { food in + Button("Cancel", role: .cancel) { } + Button("Delete", role: .destructive) { + viewModel.deleteFood(food) + } + } message: { food in + Text("Are you sure you want to delete \"\(food.name)\"?") + } + } +} + +struct FoodRow: View { + let food: FoodItem + @ObservedObject var viewModel: WheelViewModel + + var body: some View { + HStack(spacing: 15) { + // 图标 + Image(systemName: food.icon) + .font(.title3) + .foregroundColor(Color(red: 1.0, green: 0.42, blue: 0.21)) + .frame(width: 30) + + VStack(alignment: .leading, spacing: 4) { + Text(food.name) + .font(.headline) + + if let date = food.lastSelected { + Text("Recent selection: \(formatDate(date))") + .font(.caption) + .foregroundColor(.secondary) + } + } + + Spacer() + + // 收藏按钮 + Button(action: { + viewModel.toggleFavorite(for: food) + }) { + Image(systemName: food.isFavorite ? "heart.fill" : "heart") + .foregroundColor(food.isFavorite ? .red : .gray) + } + .buttonStyle(BorderlessButtonStyle()) + } + .padding(.vertical, 5) + } + + private func formatDate(_ date: Date) -> String { + let formatter = RelativeDateTimeFormatter() + formatter.unitsStyle = .abbreviated + return formatter.localizedString(for: date, relativeTo: Date()) + } +} + +struct EmptyFoodsView: View { + let category: Category + + var body: some View { + VStack(spacing: 20) { + Image(systemName: category.icon) + .font(.system(size: 60)) + .foregroundColor(category.color.opacity(0.3)) + + Text("\(category.name)Category empty") + .font(.headline) + + Text("Click the button in the upper right corner to add a dish.") + .font(.body) + .foregroundColor(.secondary) + } + .frame(maxWidth: .infinity, maxHeight: .infinity) + .padding() + .background(Color(.systemGroupedBackground)) + } +} diff --git a/TastePick/GoogleService-Info .plist b/TastePick/GoogleService-Info .plist new file mode 100644 index 0000000..9fdd17c --- /dev/null +++ b/TastePick/GoogleService-Info .plist @@ -0,0 +1,30 @@ + + + + + API_KEY + AIzaSyAyUE8azpOsy-u2kxf2pH-k46jgsoYsrPU + GCM_SENDER_ID + 492493563778 + PLIST_VERSION + 1 + BUNDLE_ID + com.TastePickEatWheel.TastePickEatWheel + PROJECT_ID + tastepick-10d89 + STORAGE_BUCKET + tastepick-10d89.firebasestorage.app + IS_ADS_ENABLED + + IS_ANALYTICS_ENABLED + + IS_APPINVITE_ENABLED + + IS_GCM_ENABLED + + IS_SIGNIN_ENABLED + + GOOGLE_APP_ID + 1:492493563778:ios:ed0d465f1acb9120c9119b + + \ No newline at end of file diff --git a/TastePick/HomeComponents.swift b/TastePick/HomeComponents.swift new file mode 100644 index 0000000..8d7ada3 --- /dev/null +++ b/TastePick/HomeComponents.swift @@ -0,0 +1,366 @@ +// +// HomeComponents.swift +// EatWheel +// +// Created by chengdu on 2025/12/4. +// +//首页辅助组件 +import SwiftUI + +struct WelcomeHeader: View { + var body: some View { + HStack { + VStack(alignment: .leading, spacing: 5) { + Text(getGreeting()) + .font(.system(size: 28, weight: .bold)) + .foregroundColor(.primary) + + Text("Spin the turntable and discover delicious treats") + .font(.subheadline) + .foregroundColor(.secondary) + } + + Spacer() + + Image(systemName: "fork.knife.circle.fill") + .font(.system(size: 50)) + .foregroundColor(Color(red: 1.0, green: 0.42, blue: 0.21)) + } + .padding(.horizontal) + } + + private func getGreeting() -> String { + let hour = Calendar.current.component(.hour, from: Date()) + + switch hour { + case 1..<11: return "Good morning 👋" + case 11..<14: return "Good noon 🍽️" + case 14..<18: return "Good afternoon ☕" + case 18..<24: return "Good evening 🌙" + default: return "Hello 🌟" + } + } +} + +struct StatsCardView: View { + @ObservedObject var viewModel: WheelViewModel + + var body: some View { + let stats = viewModel.getStatistics() + + HStack(spacing: 0) { + StatItem( + icon: "fork.knife", + value: "\(stats.totalFoods)", + label: "Dishes", + color: .blue + ) + + Divider() + .frame(height: 30) + + StatItem( + icon: "heart.fill", + value: "\(stats.favorites)", + label: "Collect", + color: .red + ) + + Divider() + .frame(height: 30) + + StatItem( + icon: "clock.fill", + value: "\(stats.totalSelections)", + label: "Choose", + color: .green + ) + } + .padding() + .background(Color.white) + .cornerRadius(15) + .shadow(color: Color.black.opacity(0.05), radius: 10, x: 0, y: 5) + .padding(.horizontal) + } +} + +struct StatItem: View { + let icon: String + let value: String + let label: String + let color: Color + + var body: some View { + VStack(spacing: 5) { + Image(systemName: icon) + .font(.title3) + .foregroundColor(color) + + Text(value) + .font(.system(size: 24, weight: .bold)) + + Text(label) + .font(.caption) + .foregroundColor(.secondary) + } + .frame(maxWidth: .infinity) + } +} + +struct EmptyStateView: View { + var body: some View { + VStack(spacing: 25) { + Image(systemName: "fork.knife.circle") + .font(.system(size: 80)) + .foregroundColor(.gray.opacity(0.3)) + + VStack(spacing: 10) { + Text("No dishes yet") + .font(.title2) + .fontWeight(.semibold) + + } + } + .padding(.vertical, 50) + } +} + +struct SpinButton: View { + let isSpinning: Bool + let hasFoods: Bool + let action: () -> Void + + var body: some View { + Button(action: action) { + HStack(spacing: 15) { + if isSpinning { + ProgressView() + .progressViewStyle(CircularProgressViewStyle(tint: .white)) + } else { + Image(systemName: "play.fill") + } + + Text(isSpinning ? "In the spinning wheel..." : "Start selecting") + .fontWeight(.semibold) + } + .foregroundColor(.white) + .frame(maxWidth: .infinity) + .padding() + .background( + LinearGradient( + gradient: Gradient(colors: [ + Color(red: 1.0, green: 0.42, blue: 0.21), + Color(red: 1.0, green: 0.65, blue: 0.3) + ]), + startPoint: .leading, + endPoint: .trailing + ) + ) + .cornerRadius(15) + .shadow(color: Color(red: 1.0, green: 0.42, blue: 0.21).opacity(0.3), radius: 10, x: 0, y: 5) + } + .disabled(!hasFoods || isSpinning) + .opacity(hasFoods ? 1 : 0.6) + } +} + +// 在 HomeComponents.swift 中修改 RecentSelectionsView +struct RecentSelectionsView: View { + let selections: [FoodItem] + @ObservedObject var viewModel: WheelViewModel + @State private var showingDeleteAlert = false + @State private var foodToDelete: FoodItem? + + var body: some View { + VStack(alignment: .leading, spacing: 15) { + HStack { + Text("Recent selection") + .font(.headline) + + Spacer() + + // 批量删除按钮 + if !selections.isEmpty { + Menu { + Button(role: .destructive, action: { + showingDeleteAlert = true + }) { + Label("Clear all records", systemImage: "trash") + } + } label: { + Image(systemName: "ellipsis.circle") + .foregroundColor(Color(red: 1.0, green: 0.42, blue: 0.21)) + } + } + } + + if selections.isEmpty { + EmptyRecentView() + } else { + ScrollView(.horizontal, showsIndicators: false) { + HStack(spacing: 15) { + ForEach(selections) { food in + RecentFoodCard(food: food, viewModel: viewModel, onDelete: { + foodToDelete = food + }) + } + } + } + } + } + .padding() + .background(Color.white) + .cornerRadius(15) + .shadow(color: Color.black.opacity(0.05), radius: 10, x: 0, y: 5) + .alert("Clear Records", isPresented: $showingDeleteAlert) { + Button("Cancel", role: .cancel) { } + Button("Clear", role: .destructive) { + clearAllSelections() + } + } message: { + Text("Are you sure you want to clear all recently selected records?") + } + .alert("Delete selection", isPresented: Binding( + get: { foodToDelete != nil }, + set: { if !$0 { foodToDelete = nil } } + ), presenting: foodToDelete) { food in + Button("Cancel", role: .cancel) { } + Button("Delete", role: .destructive) { + deleteSelection(food) + } + } message: { food in + Text("Are you sure you want to delete the selection record for \"\(food.name)\"?") + } + } + + private func deleteSelection(_ food: FoodItem) { + // 清除该菜品的选择时间 + if let index = viewModel.foods.firstIndex(where: { $0.id == food.id }) { + viewModel.foods[index].lastSelected = nil + viewModel.saveData() + } + } + + private func clearAllSelections() { + // 清除所有菜品的选择时间 + for i in 0.. Void + @State private var showingDetail = false + @State private var showingDeleteAction = false + + var body: some View { + VStack(spacing: 10) { + // 顶部操作区域 + HStack { + Spacer() + + // 删除按钮 + Button(action: { + onDelete() + }) { + Image(systemName: "xmark.circle.fill") + .font(.caption) + .foregroundColor(.gray.opacity(0.7)) + .padding(4) + } + } + + // 菜品图标 + Image(systemName: food.icon) + .font(.title2) + .foregroundColor(Color(red: 1.0, green: 0.42, blue: 0.21)) + .frame(width: 50, height: 50) + .background(Color(red: 1.0, green: 0.42, blue: 0.21).opacity(0.1)) + .cornerRadius(25) + .padding(.top, 4) + + // 菜品信息 + VStack(spacing: 2) { + Text(food.name) + .font(.caption) + .fontWeight(.medium) + .lineLimit(1) + + Text(viewModel.getCategoryName(for: food.categoryId)) + .font(.caption2) + .foregroundColor(.secondary) + + // 时间信息 + if let date = food.lastSelected { + Text(formatDate(date)) + .font(.caption2) + .foregroundColor(.gray) + } + } + .frame(width: 80) + } + .frame(width: 90, height: 130) + .background(Color.white) + .cornerRadius(12) + .shadow(color: Color.black.opacity(0.05), radius: 5, x: 0, y: 2) + .overlay( + RoundedRectangle(cornerRadius: 12) + .stroke(Color.gray.opacity(0.1), lineWidth: 1) + ) + .onTapGesture { + showingDetail = true + } + .contextMenu { + Button(role: .destructive, action: { + onDelete() + }) { + Label("Delete Records", systemImage: "trash") + } + + Button(action: { + showingDetail = true + }) { + Label("Check the details", systemImage: "info.circle") + } + } + .sheet(isPresented: $showingDetail) { + ResultView(food: food, isPresented: $showingDetail) + .environmentObject(viewModel) + } + } + + private func formatDate(_ date: Date) -> String { + let formatter = DateFormatter() + + if Calendar.current.isDateInToday(date) { + formatter.dateFormat = "HH:mm" + return "Today " + formatter.string(from: date) + } else if Calendar.current.isDateInYesterday(date) { + formatter.dateFormat = "HH:mm" + return "Yesterday " + formatter.string(from: date) + } else { + formatter.dateFormat = "MM/dd HH:mm" + return formatter.string(from: date) + } + } +} diff --git a/TastePick/Info.plist b/TastePick/Info.plist new file mode 100644 index 0000000..f1e87ae --- /dev/null +++ b/TastePick/Info.plist @@ -0,0 +1,17 @@ + + + + + NSUserTrackingUsageDescription + Obtain tagging permissions to provide you with better, safer, personalized services and content. We will not use it for other purposes without consent. Once enabled, you can also go to the system Settings-Privacy; to turn it off at any time. + SKAdNetworkItems + + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + + SKAdNetworkIdentifier + su67r6k2v3.skadnetwork + + diff --git a/TastePick/LaunchScreenView.swift b/TastePick/LaunchScreenView.swift new file mode 100644 index 0000000..244455f --- /dev/null +++ b/TastePick/LaunchScreenView.swift @@ -0,0 +1,101 @@ +// +// LaunchScreenView.swift +// EatWheel +// +// Created by chengdu on 2025/12/4. +// + +import SwiftUI + +struct LaunchScreenView: View { + @State private var rotationAngle: Double = 0 + @State private var scale: CGFloat = 0.8 + @State private var opacity: Double = 0 + + var body: some View { + ZStack { + // 背景渐变 + LinearGradient( + gradient: Gradient(colors: [ + Color(red: 1.0, green: 0.42, blue: 0.21), // 橙色 + Color(red: 1.0, green: 0.65, blue: 0.3), // 浅橙色 + Color(red: 1.0, green: 0.8, blue: 0.4) // 更浅橙色 + ]), + startPoint: .topLeading, + endPoint: .bottomTrailing + ) + .edgesIgnoringSafeArea(.all) + + // 装饰性圆圈 + ForEach(0..<3) { i in + Circle() + .stroke(Color.white.opacity(0.1), lineWidth: 1) + .frame(width: CGFloat(200 + i * 100), height: CGFloat(200 + i * 100)) + .offset(x: CGFloat(i * 20), y: CGFloat(i * -20)) + } + + // 主要内容 + VStack(spacing: 30) { + Spacer() + + // Logo区域 + ZStack { + // 外圈 + Circle() + .stroke(Color.white.opacity(0.3), lineWidth: 3) + .frame(width: 140, height: 140) + + // 中圈 + Circle() + .fill(Color.white.opacity(0.15)) + .frame(width: 120, height: 120) + + // 内圈Logo + Circle() + .fill(Color.white) + .frame(width: 100, height: 100) + .shadow(color: .black.opacity(0.1), radius: 10, x: 0, y: 5) + + // Logo图标 + Image(systemName: "fork.knife.circle.fill") + .font(.system(size: 60)) + .foregroundColor(Color(red: 1.0, green: 0.42, blue: 0.21)) + .rotationEffect(.degrees(rotationAngle)) + } + .scaleEffect(scale) + .opacity(opacity) + + Spacer() + + // 加载状态 + VStack(spacing: 15) { + // 加载指示器 + HStack(spacing: 10) { + ProgressView() + .progressViewStyle(CircularProgressViewStyle(tint: .white)) + .scaleEffect(1.2) + + Text("正在准备应用...") + .font(.system(size: 16)) + .foregroundColor(.white.opacity(0.8)) + } + } + .padding(.bottom, 50) + .opacity(opacity) + } + .padding() + } + .onAppear { + // 启动动画 + withAnimation(.spring(response: 0.8, dampingFraction: 0.6)) { + scale = 1.0 + opacity = 1.0 + } + + // 旋转动画 + withAnimation(.linear(duration: 4).repeatForever(autoreverses: false)) { + rotationAngle = 360 + } + } + } +} diff --git a/TastePick/MainTabView.swift b/TastePick/MainTabView.swift new file mode 100644 index 0000000..c6acb86 --- /dev/null +++ b/TastePick/MainTabView.swift @@ -0,0 +1,59 @@ +// +// MainTabView.swift +// EatWheel +// +// Created by chengdu on 2025/12/4. +// +//主界面框架 +import SwiftUI + +struct MainTabView: View { + @StateObject private var viewModel = WheelViewModel() + @State private var selectedTab = 0 + @State private var showingAddFood = false + @State private var showingAddCategory = false + @State private var selectedCategoryForAdding: Category? + + var body: some View { + ZStack { + TabView(selection: $selectedTab) { + // 首页 + NavigationView { + WheelHomeView() + } + .navigationViewStyle(StackNavigationViewStyle()) + .tabItem { + Image(systemName: selectedTab == 0 ? "house.fill" : "house") + Text("Front Page") + } + .tag(0) + .environmentObject(viewModel) + + // 分类 + NavigationView { + CategoriesView(selectedCategoryForAdding: $selectedCategoryForAdding) + } + .navigationViewStyle(StackNavigationViewStyle()) + .tabItem { + Image(systemName: selectedTab == 1 ? "square.grid.2x2.fill" : "square.grid.2x2") + Text("Classification") + } + .tag(1) + .environmentObject(viewModel) + + // 个人中心 + NavigationView { + ProfileView() + } + .navigationViewStyle(StackNavigationViewStyle()) + .tabItem { + Image(systemName: selectedTab == 2 ? "person.fill" : "person") + Text("Personal Center") + } + .tag(2) + .environmentObject(viewModel) + } + .accentColor(Color(red: 1.0, green: 0.42, blue: 0.21)) + } + } +} diff --git a/TastePick/MyAFNetworkReachabilityManager.h b/TastePick/MyAFNetworkReachabilityManager.h new file mode 100644 index 0000000..2d880b6 --- /dev/null +++ b/TastePick/MyAFNetworkReachabilityManager.h @@ -0,0 +1,58 @@ +// +// MyAFNetworkReachabilityManager.h +// dvinfo +// +// Created by mac on 2025/11/24. +// + +#ifndef MyAFNetworkReachabilityManager_h +#define MyAFNetworkReachabilityManager_h + +#import + +// MyAFNetworkReachabilityManager.h + +#import +#import + +typedef NS_ENUM(NSInteger, MyAFNetworkReachabilityStatus) { + MyAFNetworkReachabilityStatusUnknown = -1, + MyAFNetworkReachabilityStatusNotReachable = 0, + MyAFNetworkReachabilityStatusReachableViaWWAN = 1, + MyAFNetworkReachabilityStatusReachableViaWiFi = 2, +}; + +@interface MyAFNetworkReachabilityManager : NSObject + +@property (readonly, nonatomic, assign) MyAFNetworkReachabilityStatus networkReachabilityStatus; +@property (readwrite, nonatomic, copy) void (^networkReachabilityStatusBlock)(MyAFNetworkReachabilityStatus status); + +@property (readonly, nonatomic, assign, getter = isReachable) BOOL reachable; +@property (readonly, nonatomic, assign, getter = isReachableViaWWAN) BOOL reachableViaWWAN; +@property (readonly, nonatomic, assign, getter = isReachableViaWiFi) BOOL reachableViaWiFi; + ++ (instancetype)sharedManager; ++ (instancetype)manager; ++ (instancetype)managerForDomain:(NSString *)domain; ++ (instancetype)managerForAddress:(const void *)address; + +- (instancetype)initWithReachability:(SCNetworkReachabilityRef)reachability NS_DESIGNATED_INITIALIZER; +- (instancetype)init NS_UNAVAILABLE; + +- (void)startMonitoring; +- (void)stopMonitoring; + +- (NSString *)localizedNetworkReachabilityStatusString; + +- (void)setReachabilityStatusChangeBlock:(void (^)(MyAFNetworkReachabilityStatus status))block; + +@end + +FOUNDATION_EXPORT NSString * MyAFStringFromNetworkReachabilityStatus(MyAFNetworkReachabilityStatus status); + +FOUNDATION_EXPORT NSString * const MyAFNetworkingReachabilityDidChangeNotification; +FOUNDATION_EXPORT NSString * const MyAFNetworkingReachabilityNotificationStatusItem; + +typedef void (^MyAFNetworkReachabilityStatusBlock)(MyAFNetworkReachabilityStatus status); + +#endif /* MyAFNetworkReachabilityManager_h */ diff --git a/TastePick/MyAFNetworkReachabilityManager.m b/TastePick/MyAFNetworkReachabilityManager.m new file mode 100644 index 0000000..9634fcb --- /dev/null +++ b/TastePick/MyAFNetworkReachabilityManager.m @@ -0,0 +1,253 @@ +// +// MyAFNetworkReachabilityManager.m +// dvinfo +// +// Created by mac on 2025/11/24. +// + +#import + +#include +#include +#include +#include +#import + + +#import "MyAFNetworkReachabilityManager.h" + +#import +#import +#import +#import +#import + +NSString * MyAFStringFromNetworkReachabilityStatus(MyAFNetworkReachabilityStatus status) { + switch (status) { + case MyAFNetworkReachabilityStatusNotReachable: + return NSLocalizedStringFromTable(@"Not Reachable", @"MyAFNetworking", nil); + case MyAFNetworkReachabilityStatusReachableViaWWAN: + return NSLocalizedStringFromTable(@"Reachable via WWAN", @"MyAFNetworking", nil); + case MyAFNetworkReachabilityStatusReachableViaWiFi: + return NSLocalizedStringFromTable(@"Reachable via WiFi", @"MyAFNetworking", nil); + case MyAFNetworkReachabilityStatusUnknown: + default: + return NSLocalizedStringFromTable(@"Unknown", @"MyAFNetworking", nil); + } +} + +static MyAFNetworkReachabilityStatus MyAFNetworkReachabilityStatusForFlags(SCNetworkReachabilityFlags flags) { + BOOL isReachable = ((flags & kSCNetworkReachabilityFlagsReachable) != 0); + BOOL needsConnection = ((flags & kSCNetworkReachabilityFlagsConnectionRequired) != 0); + BOOL canConnectionAutomatically = (((flags & kSCNetworkReachabilityFlagsConnectionOnDemand ) != 0) || ((flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0)); + BOOL canConnectWithoutUserInteraction = (canConnectionAutomatically && (flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0); + BOOL isNetworkReachable = (isReachable && (!needsConnection || canConnectWithoutUserInteraction)); + + MyAFNetworkReachabilityStatus status = MyAFNetworkReachabilityStatusUnknown; + if (isNetworkReachable == NO) { + status = MyAFNetworkReachabilityStatusNotReachable; + } +#if TARGET_OS_IPHONE + else if ((flags & kSCNetworkReachabilityFlagsIsWWAN) != 0) { + status = MyAFNetworkReachabilityStatusReachableViaWWAN; + } +#endif + else { + status = MyAFNetworkReachabilityStatusReachableViaWiFi; + } + + return status; +} + +/** + * Queue a status change notification for the main thread. + * + * This is done to ensure that the notifications are received in the same order + * that they are sent. If notifications are sent directly, it is possible that + * a queued notification (for an earlier status condition) is processed after + * the later update, resulting in the listener being left in the wrong state. + */ +static void MyAFPostReachabilityStatusChange(SCNetworkReachabilityFlags flags, MyAFNetworkReachabilityStatusBlock block) { + MyAFNetworkReachabilityStatus status = MyAFNetworkReachabilityStatusForFlags(flags); + dispatch_async(dispatch_get_main_queue(), ^{ + if (block) { + block(status); + } + + NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; + NSDictionary *userInfo = @{ MyAFNetworkingReachabilityNotificationStatusItem: @(status) }; + [notificationCenter postNotificationName:MyAFNetworkingReachabilityDidChangeNotification object:nil userInfo:userInfo]; + }); +} + +static void MyAFNetworkReachabilityCallback(SCNetworkReachabilityRef __unused target, SCNetworkReachabilityFlags flags, void *info) { + MyAFPostReachabilityStatusChange(flags, (__bridge MyAFNetworkReachabilityStatusBlock)info); +} + +static const void * MyAFNetworkReachabilityRetainCallback(const void *info) { + return Block_copy(info); +} + +static void MyAFNetworkReachabilityReleaseCallback(const void *info) { + if (info) { + Block_release(info); + } +} + +@interface MyAFNetworkReachabilityManager () +@property (readwrite, nonatomic, assign) SCNetworkReachabilityRef networkReachability; +@property (readwrite, nonatomic, assign) MyAFNetworkReachabilityStatus networkReachabilityStatus; +@end + +@implementation MyAFNetworkReachabilityManager + +#pragma mark - Singleton + ++ (instancetype)sharedManager { + static MyAFNetworkReachabilityManager *_sharedManager = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + _sharedManager = [self manager]; + }); + return _sharedManager; +} + +#pragma mark - Factory Methods + ++ (instancetype)manager { + struct sockaddr_in address; + bzero(&address, sizeof(address)); + address.sin_len = sizeof(address); + address.sin_family = AF_INET; + + return [self managerForAddress:&address]; +} + ++ (instancetype)managerForDomain:(NSString *)domain { + SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(kCFAllocatorDefault, [domain UTF8String]); + + MyAFNetworkReachabilityManager *manager = nil; + if (reachability) { + manager = [[self alloc] initWithReachability:reachability]; + CFRelease(reachability); + } + + return manager; +} + ++ (instancetype)managerForAddress:(const void *)address { + SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr *)address); + + MyAFNetworkReachabilityManager *manager = nil; + if (reachability) { + manager = [[self alloc] initWithReachability:reachability]; + CFRelease(reachability); + } + + return manager; +} + +#pragma mark - Initialization + +- (instancetype)initWithReachability:(SCNetworkReachabilityRef)reachability { + self = [super init]; + if (self) { + _networkReachability = CFRetain(reachability); + _networkReachabilityStatus = MyAFNetworkReachabilityStatusUnknown; + } + return self; +} + + +- (void)dealloc { + [self stopMonitoring]; + + if (_networkReachability) { + CFRelease(_networkReachability); + } + + +} + +#pragma mark - Reachability Status + +- (BOOL)isReachable { + return [self isReachableViaWWAN] || [self isReachableViaWiFi]; +} + +- (BOOL)isReachableViaWWAN { + return self.networkReachabilityStatus == MyAFNetworkReachabilityStatusReachableViaWWAN; +} + +- (BOOL)isReachableViaWiFi { + return self.networkReachabilityStatus == MyAFNetworkReachabilityStatusReachableViaWiFi; +} + +#pragma mark - Monitoring + +- (void)startMonitoring { + [self stopMonitoring]; + + if (!self.networkReachability) { + return; + } + + __weak __typeof(self)weakSelf = self; + void (^callback)(MyAFNetworkReachabilityStatus) = ^(MyAFNetworkReachabilityStatus status) { + __strong __typeof(weakSelf)strongSelf = weakSelf; + + strongSelf.networkReachabilityStatus = status; + if (strongSelf.networkReachabilityStatusBlock) { + strongSelf.networkReachabilityStatusBlock(status); + } + }; + + SCNetworkReachabilityContext context = {0, (__bridge void *)callback, MyAFNetworkReachabilityRetainCallback, MyAFNetworkReachabilityReleaseCallback, NULL}; + SCNetworkReachabilitySetCallback(self.networkReachability, MyAFNetworkReachabilityCallback, &context); + SCNetworkReachabilityScheduleWithRunLoop(self.networkReachability, CFRunLoopGetMain(), kCFRunLoopCommonModes); + + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ + SCNetworkReachabilityFlags flags; + if (SCNetworkReachabilityGetFlags(self.networkReachability, &flags)) { + MyAFPostReachabilityStatusChange(flags, callback); + } + }); +} + +- (void)stopMonitoring { + if (!self.networkReachability) { + return; + } + + SCNetworkReachabilityUnscheduleFromRunLoop(self.networkReachability, CFRunLoopGetMain(), kCFRunLoopCommonModes); +} + +#pragma mark - Localization + +- (NSString *)localizedNetworkReachabilityStatusString { + return MyAFStringFromNetworkReachabilityStatus(self.networkReachabilityStatus); +} + +#pragma mark - Block Setter + +- (void)setReachabilityStatusChangeBlock:(void (^)(MyAFNetworkReachabilityStatus status))block { + self.networkReachabilityStatusBlock = block; +} + +#pragma mark - KVO + ++ (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key { + if ([key isEqualToString:@"reachable"] || + [key isEqualToString:@"reachableViaWWAN"] || + [key isEqualToString:@"reachableViaWiFi"]) { + return [NSSet setWithObject:@"networkReachabilityStatus"]; + } + + return [super keyPathsForValuesAffectingValueForKey:key]; +} + +@end + +// 通知名称定义 +NSString * const MyAFNetworkingReachabilityDidChangeNotification = @"com.alamofire.networking.reachability.change"; +NSString * const MyAFNetworkingReachabilityNotificationStatusItem = @"MyAFNetworkingReachabilityNotificationStatusItem"; diff --git a/TastePick/MyInfo.h b/TastePick/MyInfo.h new file mode 100644 index 0000000..4ed65f3 --- /dev/null +++ b/TastePick/MyInfo.h @@ -0,0 +1,20 @@ +// +// MyInfo.h +// dvinfo +// +// Created by mac on 2025/11/7. +// + +#ifndef MyInfo_h +#define MyInfo_h + +@interface MyInfo : NSObject + + + ++ (instancetype)shared; +- (NSString *) toJson; +@end + + +#endif /* MyInfo_h */ diff --git a/TastePick/MyInfo.m b/TastePick/MyInfo.m new file mode 100644 index 0000000..07baf12 --- /dev/null +++ b/TastePick/MyInfo.m @@ -0,0 +1,1222 @@ +// +// MyInfo.m +// dvinfo +// +// Created by mac on 2025/11/7. +// + +#import +#import +#import + +#import +#import +#import + +#include +#include + +#import +#import + +#include +#include +#include +#include +#import +#import + +#import "MyPreDeviceInfo.h" + +#import "MyInfo.h" + +static NSString *mv_cachedDevicePlatform = nil; + + +@interface MyInfo () + + +@end + +@implementation MyInfo +{ + mach_timebase_info_data_t _clock_timebase; + NSDate *currentDate; + MyPreDeviceInfo* preDeviceInfo; +} + ++ (instancetype)shared { + static MyInfo *g; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + g = [MyInfo new]; + }); + return g; +} + + + +- (id) init { + if(!(self = [super init])) + return nil; + mach_timebase_info(&_clock_timebase); + currentDate = [NSDate date]; + preDeviceInfo = [MyPreDeviceInfo sharedInstance]; + return self; +} + +- (NSString *) toJson { + return [self dic2Json: [self toDictionary]]; +} + +- (NSDictionary *) toDictionary { + NSDictionary *dic = @{ + @"package_name": [self packageName], + @"app_version_name": [self appVersionName], + @"timezone": [self timezone], + @"idfa": [self IDFV], + @"lpm": @([self LPM]), + @"ats": [self infoPlistATS], + @"status_bar_based_vc": @([self infoPlistStatusBarBasedVC]), + @"cpu_type": [self CPUType], + @"system_hw_machine": [self System_HW_Machine], + @"language":[self Language], + @"systemVersion": [self SystemVersion], + @"systemUpTime": @([self SystemUpTime]), + @"timestamp": @([self Timestamp]), + @"date_time": [self NowTimeFormatedStr], + @"machAbsoluteTime": @([self AbsoluteTime]), + @"kernBootTime": @([self kern_boot_time]), + @"kern_boot_time_str": [self toUtcDateTimeStr:[self kern_boot_time]], + @"network_start_time": [self network_restart_time], + @"kernel_task_time": @([self kernel_task_time]), + @"device_platform": [self getDevicePlatform], + @"mac_catalyst_app": @([self isMacCatalystApp]), + @"user_interface_idiom": [self userInterfaceIdiom], + @"memory_total": @([self MemoryTotal]), + @"has_embeded_mobileprovision": @([self hasEmbededMobileProvision]), + @"is_app_store_receipt_sandbox":@([self isAppStoreReceiptSandbox]), + @"sk_ad_netork_sign_version": [self skAdNetorkSignVersion], + @"kernOsVersion": [self KernOsVersion], + @"ramSize" : [self RAM], + @"adv_tracking_status": @([self getAdvTrackingStatus]), + @"is_adv_tracking_enabled": @([self isAdvTrackingEnabled]), + @"is_proxy_on": @([self isProxyOn]), + @"is_vpn_on": @([self isVpnOn]), + @"carrier": [self getCarrierInfo], + @"network_type" : [self->preDeviceInfo networkType], + @"radio_access_technology": [self->preDeviceInfo radioAccessTechnology], + @"platform_version": [self PlatformVersion], + @"isoCountryCode": [self IsoCountryCode], + @"hwmodel": [self HwModel], + @"orientation" : @([self Orientation]), + @"system_user_agent": [self fetchSystemUserAgent], +// @"userAgent" : [self->preDeviceInfo webViewUserAgent], + @"userAgent" : [self getAccurateUserAgent], + + //以下为新增缺失的字段 + @"width": @([self screenWidth]), + @"height": @([self screenHeight]), + @"screenBrightness": @([self screenBrightness]), + @"safeArea": [self safeAreaInsets], + @"volume": @([self getVolume]), + @"batteryLevel": @([self batteryLevel]), + @"deviceName": [self deviceName], + @"batteryState": [self batteryState], + @"deviceModel": [self deviceModel], + @"scale": @([self screenScale]), + @"cpuCore": @([self getCPUCoreCount]), + @"model": [self getDevicePlatform], + @"diskSize": @([self getTotalDiskSize]), + @"cfnetworkVersion":[self getCFNetworkVersion], + @"darwinVersion":[self getDarwinVersion], + + }; + + return dic; +} + +- (NSString*) IDFV { + UIDevice *device = [UIDevice currentDevice]; + return [device.identifierForVendor UUIDString]; +} + +- (NSString*) model { + UIDevice *device = [UIDevice currentDevice]; + return [NSString stringWithFormat:@"%@,%@,%@", device.model, device.localizedModel, device.systemName]; +} + +- (NSString*) IDFA { + return @""; +} + +- (NSString*) packageName { + return [[NSBundle mainBundle] bundleIdentifier]; +} + +- (NSString*) appVersionName { + NSDictionary *info = [[NSBundle mainBundle] infoDictionary]; + return [info objectForKeyedSubscript:@"CFBundleShortVersionString"]; +} + +- (NSString *)timezone { + NSDate *date = [NSDate date]; + NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; + [formatter setDateFormat:@"ZZZZ"]; + return [formatter stringFromDate:date]; +} + + +// 查看app是否允许http请求 +- (NSString *) infoPlistATS { + NSBundle *bundle = [NSBundle mainBundle]; + NSString *plist = [bundle pathForResource:@"Info" ofType:@"plist"]; + if(plist != nil || ![plist isEqual:@""]) { + NSMutableDictionary *plistDic =[NSMutableDictionary dictionaryWithContentsOfFile:plist]; + BOOL v6 = [[plistDic allKeys] containsObject:@"NSAppTransportSecurity"]; + if (v6) { + id data = plistDic[@"NSAppTransportSecurity"]; + NSString *json = [self dic2Json:data]; + return [self base64:json]; + } + } + return @""; +} + +// 用于指定状态栏的外观是否基于当前视图控制器的首选样式。 +// 设置为 YES 时,系统将使用当前视图控制器的 preferredStatusBarStyle 方法来确定状态栏的样式 +// 设置为 NO 时,系统将使用 UIApplication 对象的 setStatusBarStyle 方法来设置状态栏的样式。 +- (BOOL) infoPlistStatusBarBasedVC { + NSBundle *bundle = [NSBundle mainBundle]; + NSString *plist = [bundle pathForResource:@"Info" ofType:@"plist"]; + if(plist != nil || ![plist isEqual:@""]) { + NSMutableDictionary *plistDic =[NSMutableDictionary dictionaryWithContentsOfFile:plist]; + BOOL v6 = [[plistDic allKeys] containsObject:@"UIViewControllerBasedStatusBarAppearance"]; + if (v6) { + BOOL data = plistDic[@"UIViewControllerBasedStatusBarAppearance"]; + return data; + } + } + return NO; +} + +- (NSString *) SystemVersion { + return [[UIDevice currentDevice] systemVersion]; +} +- (NSString *) userInterfaceIdiom { + /** + UIUserInterfaceIdiomUnspecified = -1, + UIUserInterfaceIdiomPhone API_AVAILABLE(ios(3.2)), // iPhone and iPod touch style UI + UIUserInterfaceIdiomPad API_AVAILABLE(ios(3.2)), // iPad style UI + UIUserInterfaceIdiomTV API_AVAILABLE(ios(9.0)), // Apple TV style UI + UIUserInterfaceIdiomCarPlay API_AVAILABLE(ios(9.0)), // CarPlay style UI + UIUserInterfaceIdiomMac API_AVAILABLE(ios(14.0)) API_UNAVAILABLE(watchos) = 5, // Optimized for Mac UI + UIUserInterfaceIdiomVision API_AVAILABLE(ios(17.0)) API_UNAVAILABLE(watchos) = 6, // Vision UI + */ + UIUserInterfaceIdiom ty = [[UIDevice currentDevice] userInterfaceIdiom]; + switch (ty) { + case UIUserInterfaceIdiomPhone: + return @"iPhone"; + case UIUserInterfaceIdiomPad: + return @"iPad"; + case UIUserInterfaceIdiomTV: + return @"tv"; + case UIUserInterfaceIdiomMac: + return @"mac"; + case UIUserInterfaceIdiomVision: + return @"Vision"; + default: + break; + } + return @"unkown"; +} + +- (NSString *) Language { + return [NSLocale preferredLanguages][0]; +} + +// 是否开启低电量模式 +- (BOOL) LPM { + return [[NSProcessInfo processInfo] isLowPowerModeEnabled]; +} + +// 内存总大小 +- (double) MemoryTotal { + return [[NSProcessInfo processInfo] physicalMemory]; +} +- (NSString *)RAM { + int mib[2]; + int64_t physicalMemory; + size_t length; + + // 设置 sysctl 参数 + mib[0] = CTL_HW; // 6 + mib[1] = HW_MEMSIZE; // 5 + + length = sizeof(int64_t); + + // 获取物理内存大小 + sysctl(mib, 2, &physicalMemory, &length, NULL, 0); + + // 返回格式化的字符串 + return [NSString stringWithFormat:@"%lu", (unsigned long)physicalMemory]; +} +// 广告跟踪状态 +- (NSInteger)getAdvTrackingStatus { + NSInteger status = -1; + + // 获取 ATTrackingManager 类 + Class ATTrackingManagerClass = NSClassFromString(@"ATTrackingManager"); + + // 获取系统版本 + UIDevice *currentDevice = [UIDevice currentDevice]; + NSString *systemVersion = currentDevice.systemVersion; + float versionFloat = [systemVersion floatValue]; + + // 检查是否为 iOS 14.0 及以上版本,且 ATTrackingManager 类存在 + if (versionFloat >= 14.0 && ATTrackingManagerClass != nil) { + SEL selector = NSSelectorFromString(@"trackingAuthorizationStatus"); + + // 检查类是否响应该选择器 + if ([ATTrackingManagerClass respondsToSelector:selector]) { + // 使用 NSInvocation 动态调用方法 + NSMethodSignature *methodSignature = [ATTrackingManagerClass methodSignatureForSelector:selector]; + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSignature]; + + [invocation setSelector:selector]; + [invocation setTarget:ATTrackingManagerClass]; + [invocation invoke]; + + // 获取返回值 + [invocation getReturnValue:&status]; + } + } + + return status; +} +// 是否开启广告追踪 +- (BOOL) isAdvTrackingEnabled { + return [[ASIdentifierManager sharedManager] isAdvertisingTrackingEnabled]; +} + +// 是否开启系统代理 +- (BOOL) isProxyOn { + CFDictionaryRef systemProxySettings = CFNetworkCopySystemProxySettings(); + + if (!systemProxySettings) { + return NO; + } + + id httpProxy = [(__bridge NSDictionary *)systemProxySettings objectForKey:(__bridge NSString *)kCFNetworkProxiesHTTPProxy]; + + CFRelease(systemProxySettings); + + BOOL result = [self notEmpty:httpProxy]; + + return result; +} + +// 是否使用了vpn代理 +- (BOOL) isVpnOn { + CFDictionaryRef proxySettings = CFNetworkCopySystemProxySettings(); + NSDictionary *scopedDict = [(__bridge NSDictionary *)proxySettings objectForKey:@"__SCOPED__"]; + NSArray *allKeys = [scopedDict allKeys]; + + BOOL isVPNOn = NO; + + for (NSString *key in allKeys) { + if ([key rangeOfString:@"tap"].location != NSNotFound || + [key rangeOfString:@"tun"].location != NSNotFound || + [key rangeOfString:@"ipsec"].location != NSNotFound || + [key rangeOfString:@"ppp"].location != NSNotFound) { + isVPNOn = YES; + break; + } + } + + if (proxySettings) { + CFRelease(proxySettings); + } + + return isVPNOn; + +} + +- (NSDictionary *)getCarrierInfo{ + static dispatch_once_t once; + static dispatch_queue_t queue; + + dispatch_once(&once, ^{ + NSString *queueName = [NSString stringWithFormat:@"com.carr.%@", self]; + queue = dispatch_queue_create([queueName UTF8String], NULL); + }); + + __block NSString *carrierName = @""; + __block NSString *mnc = @""; + __block NSString *mcc = @""; + __block NSString *isoCountry = @""; + __block BOOL voip = FALSE; + dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); + + dispatch_async(queue, ^{ + CTTelephonyNetworkInfo *networkInfo = [[CTTelephonyNetworkInfo alloc] init]; + UIDevice *device = [UIDevice currentDevice]; + float systemVersion = [[device systemVersion] floatValue]; + + CTCarrier *carrier = nil; + + if (systemVersion >= 12.0) { + // iOS 12.0+ 使用新API + if (@available(iOS 12.0, *)) { + if ([networkInfo respondsToSelector:@selector(serviceSubscriberCellularProviders)]) { + NSDictionary *providers = [networkInfo serviceSubscriberCellularProviders]; + NSArray *sortedKeys = [[providers allKeys] sortedArrayUsingSelector:@selector(compare:)]; + + if (sortedKeys.count > 0) { + carrier = providers[sortedKeys.firstObject]; + + if (!carrier.mobileNetworkCode && sortedKeys.count > 1) { + carrier = providers[sortedKeys.lastObject]; + } + } + } + } + } else { + // iOS 12.0 以下使用旧API +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + carrier = [networkInfo subscriberCellularProvider]; +#pragma clang diagnostic pop + } + + if (carrier) { + mnc = carrier.mobileNetworkCode; + mcc = carrier.mobileCountryCode; + isoCountry = carrier.isoCountryCode; + voip = carrier.allowsVOIP; + + if (mcc && [mcc isEqualToString:@"460"] && mnc) { + if ([mnc isEqualToString:@"00"] || + [mnc isEqualToString:@"02"] || + [mnc isEqualToString:@"07"] || + [mnc isEqualToString:@"08"]) { + carrierName = @"中国移动"; + } + + if ([mnc isEqualToString:@"01"] || + [mnc isEqualToString:@"06"] || + [mnc isEqualToString:@"09"]) { + carrierName = @"中国联通"; + } + + if ([mnc isEqualToString:@"03"] || + [mnc isEqualToString:@"05"] || + [mnc isEqualToString:@"11"]) { + carrierName = @"中国电信"; + } + + if ([mnc isEqualToString:@"04"]) { + carrierName = @"中国卫通"; + } + + if ([mnc isEqualToString:@"20"]) { + carrierName = @"中国铁通"; + } + } else { + carrierName = [carrier.carrierName copy]; + } + } + + if (!carrierName.length) { + carrierName = @"unknown"; + } + + dispatch_semaphore_signal(semaphore); + }); + + dispatch_semaphore_wait(semaphore, dispatch_time(DISPATCH_TIME_NOW, 500000000)); + + NSString *name = [carrierName copy]; + + return @{ + @"name": name, + @"mnc" : [mnc copy], + @"mcc" : [mcc copy], + @"iso": [isoCountry copy], + @"voip": @(voip) + }; +} +- (NSString *)PlatformVersion { + NSBundle *mainBundle = [NSBundle mainBundle]; + NSString *plistPath = [mainBundle pathForResource:@"Info" ofType:@"plist"]; + + if (![self notEmpty:plistPath]) { + return nil; + } + + NSMutableDictionary *infoDictionary = [NSMutableDictionary dictionaryWithContentsOfFile:plistPath]; + NSArray *allKeys = [infoDictionary allKeys]; + + if (![allKeys containsObject:@"DTPlatformVersion"]) { + return nil; + } + + id platformVersion = [infoDictionary objectForKey:@"DTPlatformVersion"]; + + if (platformVersion && + [platformVersion isKindOfClass:[NSString class]] && + [(NSString *)platformVersion length] > 0) { + return platformVersion; + } + + return nil; +} + +- (NSString *)IsoCountryCode { + return [[NSLocale currentLocale] objectForKey:NSLocaleCountryCode]; +} + +- (NSString *)HwModel { + size_t size = 0; + + // 获取需要的缓冲区大小 + sysctlbyname("hw.model", NULL, &size, NULL, 0); + + // 分配内存 + void *buffer = malloc(size); + + // 获取硬件型号 + sysctlbyname("hw.model", buffer, &size, NULL, 0); + + // 创建 NSString + NSString *hardwareModel = [NSString stringWithFormat:@"%s", (char *)buffer]; + + // 释放内存 + free(buffer); + + return hardwareModel; +} + + +- (BOOL)notEmpty:(id)object { + if (!object) { + return NO; + } + + if ([object isKindOfClass:[NSString class]]) { + return [(NSString *)object length] > 0; + } + + return YES; +} + +// 检测系统版本 +- (NSString *)skAdNetorkSignVersion { + // 检查 iOS 16.1+ + if (@available(iOS 16.1, *)) { + return @"4.0"; + } + // 检查 iOS 14.5+ + if (@available(iOS 14.5, *)) { + return @"2.2"; + } + // 检查 iOS 14.0+ + if (@available(iOS 14.0, *)) { + return @"2.1"; + } + // 检查 iOS 11.3+ + if (@available(iOS 11.3, *)) { + return @"1.0"; + } + return nil; +} + +// 硬件相关信息 +- (NSString*) screen { + UIScreen *screen = [UIScreen mainScreen]; + float s = screen.scale; + CGRect rect = [screen bounds]; + int w = rect.size.width; + int h = rect.size.height; + CGPoint o = rect.origin; + int x = o.x; + int y = o.y; + return [NSString stringWithFormat:@"w:%d,h:%d,scale:%f,x:%d,y:%d", w,h,s,x,y]; +} + + +// 获取cpu类型 +- (NSString*) CPUType { + // #import + host_basic_info_data_t hostInfo; + mach_msg_type_number_t infoCount = HOST_BASIC_INFO_COUNT; + + kern_return_t result = host_info(mach_host_self(), + HOST_BASIC_INFO, + (host_info_t)&hostInfo, + &infoCount); + + if (result != KERN_SUCCESS) { + return @"Unknown"; + } + + // hostInfo 结构体包含: + // - max_cpus: 最大 CPU 数量 + // - avail_cpus: 可用 CPU 数量 + // - memory_size: 物理内存大小 + // - cpu_type: CPU 类型 + // - cpu_subtype: CPU 子类型 + // - cpu_threadtype: CPU 线程类型 + + cpu_type_t cpuType = hostInfo.cpu_type; + cpu_subtype_t cpuSubtype = hostInfo.cpu_subtype; + + NSString *cpuName = [self getCPUName:cpuType subtype:cpuSubtype]; + + return cpuName; +} + +- (BOOL) hasEmbededMobileProvision { + NSString *fileName = [[NSBundle mainBundle] pathForResource:@"embedded" ofType:@"mobileprovision"]; + return fileName != nil; +} + +- (BOOL) isAppStoreReceiptSandbox { + NSURL *appStoreReceiptURL = [[NSBundle mainBundle] appStoreReceiptURL]; + if (!appStoreReceiptURL) { + return NO; + } + return [[appStoreReceiptURL lastPathComponent] isEqualToString:@"sandboxReceipt"]; +} +- (NSString *)KernOsVersion { + // sysctl 参数数组,用于查询 kern.osversion + int mib[2] = {CTL_KERN, KERN_OSVERSION}; + + // 用于存储返回值的结构 + struct { + int64_t value1; + int32_t value2; + } result = {0}; + + size_t size = sizeof(result); + + // 调用 sysctl 获取系统信息 + int ret = sysctl(mib, 2, &result, &size, NULL, 0); + + // 检查返回值和结果 + if (ret == -1 || result.value1 == 0) { + // 出错或第一个值为0时,返回 "-1" + return [NSString stringWithFormat:@"%ld", (long)-1]; + } + + if (result.value2 == 0) { + // 只有第一个值有效 + return [NSString stringWithFormat:@"%ld", (long)result.value1]; + } else { + // 两个值都有效,格式化为 "value1.value2" + return [NSString stringWithFormat:@"%ld.%ld", (long)result.value1, (long)result.value2]; + } +} + + +- (NSString *)getCPUName:(cpu_type_t)cpuType subtype:(cpu_subtype_t)cpuSubtype { + NSString *architecture = @"Unknown"; + + switch (cpuType) { + case CPU_TYPE_ARM: + architecture = @"ARM"; + break; + + case CPU_TYPE_ARM64: + // 进一步区分具体芯片 + switch (cpuSubtype) { + case CPU_SUBTYPE_ARM64_ALL: + architecture = @"ARM64"; + break; + case CPU_SUBTYPE_ARM64E: + architecture = @"ARM64E"; // A12+ + break; + case CPU_SUBTYPE_ARM64_V8: + architecture = @"ARM64v8"; + break; + default: + architecture = @"ARM64 (Unknown subtype)"; + break; + } + break; + + case CPU_TYPE_X86: + architecture = @"x86"; + break; + + case CPU_TYPE_X86_64: + architecture = @"x86_64"; + break; + + default: + architecture = [NSString stringWithFormat:@"Unknown (type: %d)", cpuType]; + break; + } + + return architecture; +} + +- (NSString *)getDevicePlatform { + if (!mv_cachedDevicePlatform) { + void *buffer = NULL; + size_t size = 0; + + // 第一次调用获取所需缓冲区大小 + sysctlbyname("hw.machine", NULL, &size, NULL, 0); + + // 分配内存 + buffer = malloc(size); + + if (buffer != NULL) { + // 第二次调用获取实际数据 + sysctlbyname("hw.machine", buffer, &size, NULL, 0); + + // 格式化为字符串 + NSString *machineString = [NSString stringWithFormat:@"%s", (const char *)buffer]; + + // 释放缓冲区 + free(buffer); + + // 判断是否为模拟器 + // if ([machineString isEqualToString:@"x86_64"]) { + // mv_cachedDevicePlatform = @"simulator"; + // } else { + mv_cachedDevicePlatform = [NSString stringWithString:machineString]; + // } + } + } + + return mv_cachedDevicePlatform; +} + +- (BOOL) isMacCatalystApp { + if (@available(iOS 14.0, *)) { + NSProcessInfo *processInfo = [NSProcessInfo processInfo]; + BOOL isMacCatalyst = processInfo.isMacCatalystApp; + return isMacCatalyst; + } + + return NO; +} + +// 时区时间相关 + +// 获取开机时间 +- (NSTimeInterval) SystemUpTime { + return [NSProcessInfo processInfo].systemUptime; +} +- (NSTimeInterval) Timestamp { + return [currentDate timeIntervalSince1970]; +} + +- (NSString *) date2Str:(NSDate *)date { + NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; + [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; + NSString *formattedDateString = [dateFormatter stringFromDate:date]; + return formattedDateString; +} + +- (NSString *) NowTimeFormatedStr { + return [self date2Str:currentDate]; +} + +- (NSTimeInterval)machAbsoluteToTimeInterval:(uint64_t)machAbsolute { + uint64_t nanos = (machAbsolute * _clock_timebase.numer) / _clock_timebase.denom; + return nanos/1.0e9; +} + + + +- (NSTimeInterval)AbsoluteTime { + uint64_t machtime = mach_absolute_time(); + return [self machAbsoluteToTimeInterval:machtime]; +} + +#define MIB_SIZE 2 +- (double) kern_boot_time { + int mib[MIB_SIZE]; + size_t size; + struct timeval boottime; + + mib[0] = CTL_KERN; + mib[1] = KERN_BOOTTIME; + size = sizeof(boottime); + if (sysctl(mib, MIB_SIZE, &boottime, &size, NULL, 0) != -1) + { + // successful call + return boottime.tv_sec; + } + return -1; +} + +- (NSString *) toUtcDateTimeStr: (NSTimeInterval) interval { + NSDate *date = [NSDate dateWithTimeIntervalSince1970:interval]; + return [self date2Str:date]; +} +/** + 网络启动时间 + */ +- (NSString *) network_restart_time { + BOOL success; + struct ifaddrs *addrs; + const struct ifaddrs *cursor; + const struct if_data *networkStatisc; + + NSString *name=[[NSString alloc]init]; + + struct IF_DATA_TIMEVAL changeTime ; + + success = getifaddrs(&addrs) == 0; + if (success) + { + cursor = addrs; + while (cursor != NULL) + { + name=[NSString stringWithFormat:@"%s",cursor->ifa_name]; + if (cursor->ifa_addr->sa_family == AF_LINK) + { + if ([name hasPrefix:@"en1"]) + { + networkStatisc = (const struct if_data *) cursor->ifa_data; + changeTime = networkStatisc->ifi_lastchange; + NSDate *restartTime = [NSDate dateWithTimeIntervalSince1970:changeTime.tv_sec]; + return [self date2Str:restartTime]; + + } + if ([name hasPrefix:@"pdp_ip1"]) + { + networkStatisc = (const struct if_data *) cursor->ifa_data; + changeTime = networkStatisc->ifi_lastchange; + NSDate *restartTime = [NSDate dateWithTimeIntervalSince1970:changeTime.tv_sec]; + return [self date2Str:restartTime]; + } + } + cursor = cursor->ifa_next; + } + freeifaddrs(addrs); + } + return @"unknown"; +} + +// 内核进程启动时间 +- (NSTimeInterval) kernel_task_time { + int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0}; + u_int miblen = 4; + + size_t size; + int st = sysctl(mib, miblen, NULL, &size, NULL, 0); + + struct kinfo_proc * process = NULL; + struct kinfo_proc * newprocess = NULL; + + do { + size += size / 10; + newprocess = realloc(process, size); + + if (!newprocess){ + if (process) + { + free(process); + } + return -1; + } + + process = newprocess; + st = sysctl(mib, miblen, process, &size, NULL, 0); + } while (st == -1 && errno == ENOMEM); + NSTimeInterval time = -1; + if (st == 0){ + if (size % sizeof(struct kinfo_proc) == 0){ + int nprocess = size / sizeof(struct kinfo_proc); + if (nprocess) { + for (int i = nprocess - 1; i >= 0; i--) + { + NSString * processID = [[NSString alloc] initWithFormat:@"%d", process[i].kp_proc.p_pid]; + NSString * processName = [[NSString alloc]initWithBytes:(const void *)process[i].kp_proc.p_comm + length:strlen(process[i].kp_proc.p_comm) + encoding:NSUTF8StringEncoding]; + + if ([processName isEqualToString:@"kernel_task"]) + { + time = process[i].kp_proc.p_un.__p_starttime.tv_sec; + break; + } + } + + free(process); + + } + } + } + return time; +} + + + +- (UIInterfaceOrientation) Orientation { + // ios > 13 + /* + UIDeviceOrientationUnknown, + UIDeviceOrientationPortrait, // Device oriented vertically, home button on the bottom + UIDeviceOrientationPortraitUpsideDown, // Device oriented vertically, home button on the top + UIDeviceOrientationLandscapeLeft, // Device oriented horizontally, home button on the right + UIDeviceOrientationLandscapeRight, // Device oriented horizontally, home button on the left + UIDeviceOrientationFaceUp, // Device oriented flat, face up + UIDeviceOrientationFaceDown + */ + UIInterfaceOrientation orientation = UIInterfaceOrientationUnknown; + UIApplication *app = [UIApplication sharedApplication]; + if (@available(iOS 13.0, *)) { + UIWindowScene *winScene = app.windows.firstObject.windowScene; + orientation = winScene.interfaceOrientation; + } else { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + orientation = app.statusBarOrientation; +#pragma clang diagnostic pop + } + return orientation; + +} +// MTGDeviceInfo hardwareString +- (NSString *)System_HW_Machine { + void *buffer = NULL; + NSString *result = nil; + + // 设置 sysctl 的 mib 参数 + // 0x100000006LL 拆分为两个 int: {6, 1} + // 高32位是1 (0x1), 低32位是6 (0x6) + int mib[2]; + mib[0] = 6; // CTL_HW + mib[1] = 1; // HW_MACHINE + + size_t size = 100; + + // 第一次调用获取实际需要的缓冲区大小 + // #import + sysctl(mib, 2, NULL, &size, NULL, 0); + + // 分配内存 + buffer = malloc(size); + + if (buffer != NULL) { + // 第二次调用获取实际数据 + sysctl(mib, 2, buffer, &size, NULL, 0); + + // 转换为 NSString + result = [NSString stringWithUTF8String:(const char *)buffer]; + + // 释放内存 + free(buffer); + } + + return result; +} + +- (NSString *)fetchSystemUserAgent { + // 获取应用可执行文件名或Bundle ID + NSBundle *mainBundle = [NSBundle mainBundle]; + NSDictionary *infoDictionary = [mainBundle infoDictionary]; + + NSString *executable = infoDictionary[(__bridge NSString *)kCFBundleExecutableKey]; + if (!executable) { + executable = infoDictionary[(__bridge NSString *)kCFBundleIdentifierKey]; + } + + // 获取应用版本号 + NSString *appVersion = infoDictionary[(__bridge NSString *)kCFBundleVersionKey]; + + // 获取CFNetwork版本号 + NSBundle *cfNetworkBundle = [NSBundle bundleWithIdentifier:@"com.apple.CFNetwork"]; + NSDictionary *cfNetworkInfo = [cfNetworkBundle infoDictionary]; + NSString *cfNetworkVersion = cfNetworkInfo[(__bridge NSString *)kCFBundleVersionKey]; + + // 获取Darwin版本号 + struct utsname systemInfo; + uname(&systemInfo); + NSString *darwinVersion = [NSString stringWithCString:systemInfo.release + encoding:NSUTF8StringEncoding]; + + // 构建User-Agent字符串 + NSString *userAgent = [NSString stringWithFormat:@"%@/%@ CFNetwork/%@ Darwin/%@", + executable, + appVersion, + cfNetworkVersion, + darwinVersion]; + NSLog(@"%@",userAgent); + + // 检查是否可以转换为ASCII编码 + if (userAgent && ![userAgent canBeConvertedToEncoding:NSASCIIStringEncoding]) { + NSMutableString *mutableUserAgent = [userAgent mutableCopy]; + + // 转换为ASCII兼容格式 + CFStringTransform((__bridge CFMutableStringRef)mutableUserAgent, + NULL, + CFSTR("Any-Latin; Latin-ASCII; [:^ASCII:] Remove"), + false); + + userAgent = [mutableUserAgent copy]; + } + + return userAgent; +} + + + +- (NSData *)obj2JsonData:(id)obj { + NSError *error; + NSData *jsonData = [NSJSONSerialization dataWithJSONObject:obj + options:NSJSONWritingPrettyPrinted + error:&error]; + + return jsonData; +} + +- (NSString *)dic2Json: (NSDictionary *)dict { + NSData *jsonData = [self obj2JsonData:dict]; + return [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; +} + +- (NSString *) base64: (NSString*) originalString { + NSData *data = [originalString dataUsingEncoding:NSUTF8StringEncoding]; + NSString *base64String = [data base64EncodedStringWithOptions:0]; + return base64String; +} + + +// 以下新增差的字段。。。。 +// 屏幕宽度 +- (CGFloat)screenWidth { + UIScreen *screen = [UIScreen mainScreen]; + return screen.bounds.size.width; +} + +// 屏幕高度 +- (CGFloat)screenHeight { + UIScreen *screen = [UIScreen mainScreen]; + return screen.bounds.size.height; +} + +// 屏幕亮度 +- (CGFloat)screenBrightness { + return [UIScreen mainScreen].brightness * 100.0; +} +// 缩放 +- (CGFloat)screenScale { + UIScreen *screen = [UIScreen mainScreen]; + return screen.scale; +} + +// 安全区域信息 (top, left, bottom, right) +- (NSString *)safeAreaInsets { + UIEdgeInsets safeArea = UIEdgeInsetsZero; + UIWindow *window = [self getKeyWindow]; + + if (window) { + safeArea = window.safeAreaInsets; + } + + return [NSString stringWithFormat:@"%.1f,%.1f,%.1f,%.1f", + safeArea.top, safeArea.left, safeArea.bottom, safeArea.right]; +} +- (UIWindow *)getKeyWindow { + NSSet *connectedScenes = [UIApplication sharedApplication].connectedScenes; + for (UIScene *scene in connectedScenes) { + if ([scene isKindOfClass:[UIWindowScene class]]) { + UIWindowScene *windowScene = (UIWindowScene *)scene; + if (windowScene.windows.count > 0) { + return windowScene.windows.firstObject; + } + } + } + return nil; +} + + +// ========== 音量相关 ========== + +// 获取系统音量 (0.0 - 1.0)默认 +- (CGFloat)getVolume { + AVAudioSession *audioSession = [AVAudioSession sharedInstance]; + return audioSession.outputVolume*100; //设置为0-100 +} + +// ========== 电池相关 ========== +// 获取电池电量 (0-100) +- (NSInteger)batteryLevel { + // 启用电池监控 + [[UIDevice currentDevice] setBatteryMonitoringEnabled:YES]; + + CGFloat batteryLevel = [UIDevice currentDevice].batteryLevel; + + // 转换为 0-100 的整数范围 + NSInteger batteryPercent = (NSInteger)round(batteryLevel * 100); + + // 使用完后关闭 + if (batteryLevel == 1.0) { + [[UIDevice currentDevice] setBatteryMonitoringEnabled:NO]; + } + + return batteryPercent; +} + +// 获取电池状态 (可选:返回更详细的电池信息) +- (NSString *)batteryState { + [[UIDevice currentDevice] setBatteryMonitoringEnabled:YES]; + + UIDeviceBatteryState state = [UIDevice currentDevice].batteryState; + NSString *batteryState = @"Unknown"; + + switch (state) { + case UIDeviceBatteryStateUnknown: + batteryState = @"Unknown"; + break; + case UIDeviceBatteryStateUnplugged: + batteryState = @"Unplugged"; + break; + case UIDeviceBatteryStateCharging: + batteryState = @"Charging"; + break; + case UIDeviceBatteryStateFull: + batteryState = @"Full"; + break; + } + + return batteryState; +} + +// ========== 设备名称 ========== + +// 获取设备名称 (用户设置的iPhone名字) +- (NSString *)deviceName { + return [UIDevice currentDevice].name; +} + +// 获取设备模型名称 ("iPhone", "iPad") +- (NSString *)deviceModel { + return [UIDevice currentDevice].model; +} + + +// 获取物理CPU核心数 +- (NSInteger)getCPUCoreCount { + int coreCount = 0; + size_t size = sizeof(coreCount); + // 获取物理核心数 + sysctlbyname("hw.physicalcpu", &coreCount, &size, NULL, 0); + return coreCount > 0 ? coreCount : 1; +} + +// 获取设备总磁盘大小 (单位: 字节) +- (long long)getTotalDiskSize { + NSFileManager *fileManager = [NSFileManager defaultManager]; + NSDictionary *fileAttributes = [fileManager attributesOfFileSystemForPath:NSHomeDirectory() error:nil]; + + long long diskSize = [[fileAttributes objectForKey:NSFileSystemSize] longLongValue]; + return diskSize; +} + +// 获取 CFNetwork 框架版本 +- (NSString *)getCFNetworkVersion{ + // 获取CFNetwork版本号 + NSBundle *cfNetworkBundle = [NSBundle bundleWithIdentifier:@"com.apple.CFNetwork"]; + NSDictionary *cfNetworkInfo = [cfNetworkBundle infoDictionary]; + NSString *cfNetworkVersion = cfNetworkInfo[(__bridge NSString *)kCFBundleVersionKey]; + return cfNetworkVersion; +} + +// 获取 Darwin 内核版本 +- (NSString *)getDarwinVersion { + char darwinVersion[256]; + size_t size = sizeof(darwinVersion); + + int result = sysctlbyname("kern.osrelease", darwinVersion, &size, NULL, 0); + + if (result == 0) { + return [NSString stringWithFormat:@"%s", darwinVersion]; + } + + return @"Unknown"; +} + + +// ========== User-Agent 相关 ========== +/** + 获取真实的 WebKit 版本和 Build 号 + */ +- (NSDictionary *)getWebKitAndBuildInfo { + @try { + WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectZero]; + NSString *userAgent = [webView valueForKey:@"userAgent"]; + + NSLog(@"完整 User-Agent: %@", userAgent); + + // 解析 WebKit 版本 + NSRegularExpression *webkitRegex = [NSRegularExpression + regularExpressionWithPattern:@"AppleWebKit/([\\d.]+)" + options:0 error:nil]; + NSArray *webkitMatches = [webkitRegex matchesInString:userAgent + options:0 + range:NSMakeRange(0, userAgent.length)]; + + NSString *webkitVersion = @""; + if (webkitMatches.count > 0) { + NSTextCheckingResult *match = webkitMatches[0]; + webkitVersion = [userAgent substringWithRange:[match rangeAtIndex:1]]; + } + + // 解析 Build 号 + NSRegularExpression *buildRegex = [NSRegularExpression + regularExpressionWithPattern:@"Mobile/([A-Za-z0-9]+)" + options:0 error:nil]; + NSArray *buildMatches = [buildRegex matchesInString:userAgent + options:0 + range:NSMakeRange(0, userAgent.length)]; + + NSString *buildNumber = @""; + if (buildMatches.count > 0) { + NSTextCheckingResult *match = buildMatches[0]; + buildNumber = [userAgent substringWithRange:[match rangeAtIndex:1]]; + } + + return @{ + @"userAgent": userAgent, + @"webkitVersion": webkitVersion, + @"buildNumber": buildNumber, + @"systemVersion": [[UIDevice currentDevice] systemVersion] + }; + } @catch (NSException *exception) { + NSLog(@"Error: %@", exception); + return @{}; + } +} + +/** + 构造真实的 User-Agent(使用当前设备的真实版本号) + */ +- (NSString *)getAccurateUserAgent { + NSDictionary *info = [self getWebKitAndBuildInfo]; + + NSString *systemVersion = [info[@"systemVersion"] + stringByReplacingOccurrencesOfString:@"." withString:@"_"]; + NSString *webkitVersion = info[@"webkitVersion"] ?: @"605.1.15"; + NSString *buildNumber = info[@"buildNumber"] ?: @"15E148"; + + NSString *userAgent = [NSString stringWithFormat: + @"Mozilla/5.0 (iPhone; CPU iPhone OS %@ like Mac OS X) AppleWebKit/%@ (KHTML, like Gecko) Mobile/%@", + systemVersion, webkitVersion, buildNumber]; + + return userAgent; +} + + + +- (void) dealloc { + +} +@end diff --git a/TastePick/MyPreDeviceInfo.h b/TastePick/MyPreDeviceInfo.h new file mode 100644 index 0000000..e39bd79 --- /dev/null +++ b/TastePick/MyPreDeviceInfo.h @@ -0,0 +1,44 @@ +// +// MyPreDeviceInfo.h +// dvinfo +// +// Created by mac on 2025/11/21. +// + +#ifndef MyPreDeviceInfo_h +#define MyPreDeviceInfo_h + +#import +#import + + +@interface MyPreDeviceInfo : NSObject + +@property (nonatomic, strong) NSNumber *orientation; +@property (nonatomic, copy) NSString *screenSize; +@property (nonatomic, strong) NSNumber *networkType; +@property (nonatomic, copy) NSString *radioAccessTechnology; +@property (nonatomic, assign) BOOL running; +@property (nonatomic, copy) NSString *webViewUserAgent; + +@property (readwrite, nonatomic, copy) void (^onStatusChange)(void); + + ++ (instancetype)sharedInstance; ++ (void)start; ++ (void)stop; ++ (void)setU4:(NSString *)u4; ++ (void)setFmkType:(NSInteger)fmkType; ++ (NSString *)u4; ++ (NSInteger)fmkType; + +- (void)start; +- (void)stop; +- (void)startMonitoringDeviceOrientation; +- (void)setCorrectOrientaion; +- (void)startMonitoringNetworkType; +- (void)setStatusChangeBlock: (void (^)(void))block; +@end + + +#endif /* MyPreDeviceInfo_h */ diff --git a/TastePick/MyPreDeviceInfo.m b/TastePick/MyPreDeviceInfo.m new file mode 100644 index 0000000..55ee3f3 --- /dev/null +++ b/TastePick/MyPreDeviceInfo.m @@ -0,0 +1,255 @@ +// +// MyPreDeviceInfo.m +// dvinfo +// +// Created by mac on 2025/11/21. +// + +#import "MyPreDeviceInfo.h" + +#import +#import +#import +#import "MyAFNetworkReachabilityManager.h" + + +static MyPreDeviceInfo *s_pInstance = nil; +static NSString *_u4 = nil; +static NSInteger _fmkType = 0; +static BOOL isSDKInit = FALSE; + +@implementation MyPreDeviceInfo +{ + WKWebView *wkWebView; +} + ++ (instancetype)sharedInstance { + @synchronized(self) { + if (!s_pInstance) { + s_pInstance = [[[self class] alloc] init]; + } + return s_pInstance; + } +} + +- (void)dealloc { + // ARC 会自动处理,不需要显式调用 [super dealloc] +} + ++ (void)start { + [[MyPreDeviceInfo sharedInstance] start]; +} + ++ (void)stop { + [[MyPreDeviceInfo sharedInstance] stop]; +} + ++ (void)setU4:(NSString *)u4 { + if (u4 && _u4 != u4) { + _u4 = [u4 copy]; + } +} + ++ (void)setFmkType:(NSInteger)fmkType { + _fmkType = fmkType; +} + ++ (NSString *)u4 { + return _u4; +} + ++ (NSInteger)fmkType { + return _fmkType; +} + +- (instancetype)init { + self = [super init]; + if (self) { + _orientation = @(-1); + + UIScreen *mainScreen = [UIScreen mainScreen]; + CGRect bounds = mainScreen.bounds; + CGFloat width = [self convert2PixelFromPoint:bounds.size.width]; + CGFloat height = [self convert2PixelFromPoint:bounds.size.height]; + _screenSize = [NSString stringWithFormat:@"%fx%f", width, height]; + + _networkType = @(1); + _radioAccessTechnology = @""; + _webViewUserAgent = @""; + } + return self; +} + +- (CGFloat)convert2PixelFromPoint:(CGFloat)point { + CGFloat scale = [UIScreen mainScreen].scale; + return point * scale; +} + +- (void)start { + if (!isSDKInit) { + [self startMonitoringNetworkType]; + [self startMonitoringDeviceOrientation]; + [self fetchUserAgentViaWKWebView]; + } + self.running = !isSDKInit; +} + +- (void)stop { + if (self.running) { + [[NSNotificationCenter defaultCenter] removeObserver:self + name:UIApplicationDidChangeStatusBarFrameNotification + object:nil]; + + [[MyAFNetworkReachabilityManager sharedManager] stopMonitoring]; + + self.running = NO; + } +} + +- (void)startMonitoringDeviceOrientation { + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(setCorrectOrientaion) + name:UIApplicationDidChangeStatusBarFrameNotification + object:nil]; +} + +- (void) setStatusChangeBlock:(void (^)(void))block { + self.onStatusChange = block; +} + +- (void)setCorrectOrientaion { + UIScreen *mainScreen = [UIScreen mainScreen]; + CGRect bounds = mainScreen.bounds; + CGFloat width = [self convert2PixelFromPoint:bounds.size.width]; + CGFloat height = [self convert2PixelFromPoint:bounds.size.height]; + self.screenSize = [NSString stringWithFormat:@"%fx%f", width, height]; + + /* + NSInteger orientation = [MTGBase currentInterfaceOrientation]; + if (orientation == UIInterfaceOrientationPortrait || + orientation == UIInterfaceOrientationPortraitUpsideDown) { + self.orientation = @(1); + } else if (orientation == UIInterfaceOrientationLandscapeLeft || + orientation == UIInterfaceOrientationLandscapeRight) { + self.orientation = @(2); + } + */ +} + +- (void)startMonitoringNetworkType { + [[MyAFNetworkReachabilityManager sharedManager] startMonitoring]; + + __weak typeof(self) weakSelf = self; + [[MyAFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(MyAFNetworkReachabilityStatus status) { + __strong typeof(weakSelf) strongSelf = weakSelf; + if (!strongSelf) return; + + strongSelf.networkType = @(1); + strongSelf.radioAccessTechnology = @""; + + switch (status) { + case MyAFNetworkReachabilityStatusNotReachable: + strongSelf.networkType = @(0); + strongSelf.radioAccessTechnology = @"NotReachable"; + break; + + case MyAFNetworkReachabilityStatusReachableViaWiFi: + strongSelf.networkType = @(9); + strongSelf.radioAccessTechnology = @"WiFi"; + break; + + case MyAFNetworkReachabilityStatusReachableViaWWAN: { + CTTelephonyNetworkInfo *networkInfo = [[CTTelephonyNetworkInfo alloc] init]; + NSString *radioTech = @""; + if (@available(iOS 12.0, *)) { + NSDictionary *dict = networkInfo.serviceCurrentRadioAccessTechnology; + NSLog(@"net:%@", dict); + radioTech = [[dict allValues] componentsJoinedByString:@","]; + } else { + radioTech = networkInfo.currentRadioAccessTechnology; + } + + strongSelf.radioAccessTechnology = radioTech; + + NSInteger networkType = 1; + if ([radioTech isEqualToString:CTRadioAccessTechnologyLTE]) { + networkType = 4; + } else if ([radioTech isEqualToString:CTRadioAccessTechnologyWCDMA] || + [radioTech isEqualToString:CTRadioAccessTechnologyHSDPA] || + [radioTech isEqualToString:CTRadioAccessTechnologyHSUPA] || + [radioTech isEqualToString:CTRadioAccessTechnologyCDMAEVDORev0] || + [radioTech isEqualToString:CTRadioAccessTechnologyCDMAEVDORevA] || + [radioTech isEqualToString:CTRadioAccessTechnologyCDMAEVDORevB] || + [radioTech isEqualToString:CTRadioAccessTechnologyeHRPD]) { + networkType = 3; + } else if ([radioTech isEqualToString:CTRadioAccessTechnologyEdge] || + [radioTech isEqualToString:CTRadioAccessTechnologyGPRS] || + [radioTech isEqualToString:CTRadioAccessTechnologyCDMA1x]) { + networkType = 2; + } else if ([radioTech isEqualToString:@"CTRadioAccessTechnologyNR"] || + [radioTech isEqualToString:@"CTRadioAccessTechnologyNRNSA"]) { + networkType = 5; + } else { + networkType = 6; + } + + strongSelf.networkType = @(networkType); + break; + } + } + + if (strongSelf.onStatusChange) { + strongSelf.onStatusChange(); + } + }]; +} + +- (void)fetchUserAgentViaWKWebView { + __weak typeof(self) weakSelf = self; + [self performBlockOnMainThread_by_mv:^{ + __strong typeof(weakSelf) strongSelf = weakSelf; + if (!strongSelf) return; + + strongSelf->wkWebView = [[WKWebView alloc] initWithFrame:CGRectZero]; + + + [strongSelf->wkWebView evaluateJavaScript:@"navigator.userAgent" + completionHandler:^(id result, NSError *error) { + // 这是内部的 block_invoke_2 的实现 + // 原始代码中没有提供这个 block 的具体实现 + // 你需要根据实际需求补充这部分代码 + if (error) { + // 处理错误 + } else { + // 处理返回的 userAgent + strongSelf.webViewUserAgent = (NSString *)result; + // 进行后续处理... + } + if (strongSelf.onStatusChange) { + strongSelf.onStatusChange(); + } + + }]; + + }]; +} + +- (void)performBlockOnMainThread_by_mv:(void (^)(void))block { + if (block) { + dispatch_queue_t mainQueue = dispatch_get_main_queue(); + + const char *currentLabel = dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL); + const char *mainLabel = dispatch_queue_get_label(mainQueue); + + // 检查是否已在主线程 + if (strcmp(currentLabel, mainLabel) == 0 || [NSThread isMainThread]) { + // 已在主线程,直接执行 + block(); + } else { + // 不在主线程,异步派发到主线程 + dispatch_async(mainQueue, block); + } + } +} + +@end diff --git a/TastePick/ProfileView.swift b/TastePick/ProfileView.swift new file mode 100644 index 0000000..36f8bbb --- /dev/null +++ b/TastePick/ProfileView.swift @@ -0,0 +1,394 @@ +// +// ProfileView.swift +// EatWheel +// +// Created by chengdu on 2025/12/4. +// +// 用户个人信息页面 + +import SwiftUI + +struct ProfileView: View { + @EnvironmentObject var viewModel: WheelViewModel + @State private var showPrivacyPolicy = false + @State private var showAboutPage = false + + var body: some View { + ScrollView { + VStack(spacing: 20) { + // 用户信息 + UserInfoView() + + // 收藏菜品 + FavoriteFoodsView(viewModel: viewModel) + + // 设置选项 + SettingsView(showPrivacyPolicy: $showPrivacyPolicy, showAboutPage: $showAboutPage) + } + .padding() + } + .navigationBarTitleDisplayMode(.inline) + .background(Color(.systemGray6).edgesIgnoringSafeArea(.all)) + .sheet(isPresented: $showPrivacyPolicy) { + SafariView(url: URL(string: "https://tastepick.bitbucket.io/privacy.html")!) + } + .sheet(isPresented: $showAboutPage) { + AboutAppView() + } + } +} + +struct UserInfoView: View { + var body: some View { + VStack(spacing: 15) { + Image("1") + .resizable() + .aspectRatio(contentMode: .fit) + .frame(width: 100, height: 100) + .clipShape(Circle()) + .padding(.top, 50) + VStack(spacing: 5) { + Text("TastePick") + .font(.title2) + .fontWeight(.bold) + + Spacer() + } + Spacer() + } + .frame(maxWidth: .infinity) + .padding() + .background(Color.white) + .cornerRadius(15) + .shadow(color: Color.black.opacity(0.05), radius: 10, x: 0, y: 0) + } +} + +struct FavoriteFoodsView: View { + @ObservedObject var viewModel: WheelViewModel + + var favorites: [FoodItem] { + viewModel.getFavoriteFoods() + } + + var body: some View { + VStack(alignment: .leading, spacing: 15) { + HStack { + Text("My collection") + .font(.headline) + + Spacer() + + if !favorites.isEmpty { + Text("\(favorites.count)") + .font(.caption) + .padding(.horizontal, 8) + .padding(.vertical, 4) + .background(Color(red: 1.0, green: 0.42, blue: 0.21).opacity(0.1)) + .foregroundColor(Color(red: 1.0, green: 0.42, blue: 0.21)) + .cornerRadius(10) + } + } + Spacer() + + if favorites.isEmpty { + EmptyFavoritesView() + } else { + ScrollView(.horizontal, showsIndicators: false) { + HStack(spacing: 15) { + ForEach(favorites.prefix(10)) { food in + FavoriteFoodCard(food: food, viewModel: viewModel) + } + } + } + } + Spacer() + } + .padding() + .background(Color.white) + .cornerRadius(15) + .shadow(color: Color.black.opacity(0.05), radius: 10, x: 0, y: 5) + } +} + +struct FavoriteFoodCard: View { + let food: FoodItem + @ObservedObject var viewModel: WheelViewModel + @State private var showingDetail = false + + var body: some View { + Button(action: { showingDetail = true }) { + VStack(spacing: 10) { + Image(systemName: food.icon) + .font(.title2) + .foregroundColor(Color(red: 1.0, green: 0.42, blue: 0.21)) + .frame(width: 50, height: 50) + .background(Color(red: 1.0, green: 0.42, blue: 0.21).opacity(0.1)) + .cornerRadius(25) + + Text(food.name) + .font(.caption) + .fontWeight(.medium) + .lineLimit(1) + .frame(width: 70) + } + } + .buttonStyle(PlainButtonStyle()) + .sheet(isPresented: $showingDetail) { + ResultView(food: food, isPresented: $showingDetail) + .environmentObject(viewModel) + } + } +} + +struct EmptyFavoritesView: View { + var body: some View { + HStack { + Image(systemName: "heart.slash") + .foregroundColor(.gray.opacity(0.5)) + + Text("No favorites yet") + .foregroundColor(.secondary) + .font(.body) + } + .frame(maxWidth: .infinity) + .padding() + + Spacer() + } + +} + +struct SettingsView: View { + @Binding var showPrivacyPolicy: Bool + @Binding var showAboutPage: Bool + + var body: some View { + VStack(spacing: 0) { + // 隐私政策按钮 + SettingRow( + icon: "shield", + title: "Privacy Policy", + action: { + showPrivacyPolicy = true + } + ) + Spacer() + Divider() + + // 关于按钮 + SettingRow( + icon: "info.circle", + title: "About Us", + action: { + showAboutPage = true + } + ) + + Spacer() + } + .background(Color.white) + .cornerRadius(15) + .shadow(color: Color.black.opacity(0.05), radius: 10, x: 0, y: 5) + } +} + +struct SettingRow: View { + let icon: String + let title: String + let action: () -> Void + @State private var isPressed = false + + var body: some View { + Button(action: action) { + HStack { + Image(systemName: icon) + .foregroundColor(.gray) + .frame(width: 24) + + Text(title) + .foregroundColor(.primary) + + Spacer() + + Image(systemName: "chevron.right") + .font(.caption) + .foregroundColor(.gray) + } + .padding() + .background(isPressed ? Color.gray.opacity(0.1) : Color.clear) + .cornerRadius(8) + .scaleEffect(isPressed ? 0.98 : 1) + } + .buttonStyle(PlainButtonStyle()) + .onLongPressGesture(minimumDuration: .infinity, maximumDistance: .infinity) { pressing in + withAnimation(.easeInOut(duration: 0.2)) { + isPressed = pressing + } + } perform: {} + } +} + +// 关于应用页面 +struct AboutAppView: View { + @Environment(\.dismiss) var dismiss + + var body: some View { + NavigationView { + ScrollView { + VStack(spacing: 24) { + // 应用简介 + appIntroduction + + // 核心功能 + coreFeatures + + + Spacer(minLength: 30) + } + .padding() + } + .navigationBarTitleDisplayMode(.inline) + .navigationBarItems(trailing: Button("Guit") { + dismiss() + }) + } + } + + // 应用简介 + private var appIntroduction: some View { + VStack(alignment: .leading, spacing: 12) { + Text("Application Introduction") + .font(.headline) + .foregroundColor(.primary) + + VStack(alignment: .leading, spacing: 8) { + Text("TastePick is a decision-making assistant app designed specifically for food lovers.") + .font(.body) + .foregroundColor(.secondary) + + Text("Struggling with what to eat every day? Let the spinning wheel help you decide! Whether it's home-style cooking, restaurant food, or takeout, we can provide you with fun solutions.") + .font(.body) + .foregroundColor(.secondary) + + Text("Say goodbye to decision paralysis and enjoy the pleasures of delicious food!") + .font(.body) + .fontWeight(.medium) + .foregroundColor(Color(red: 1.0, green: 0.42, blue: 0.21)) + .padding(.top, 4) + } + + Spacer() + } + .frame(maxWidth: .infinity, alignment: .leading) + .padding() + .background( + RoundedRectangle(cornerRadius: 16) + .fill(Color.white) + .shadow(color: Color.black.opacity(0.05), radius: 8, x: 0, y: 3) + ) + + } + + // MARK: - 核心功能 + private var coreFeatures: some View { + VStack(alignment: .leading, spacing: 16) { + Text("Core Functions") + .font(.headline) + .foregroundColor(.primary) + + VStack(spacing: 30) { + // 功能1:随机转盘 + FeatureItemView( + icon: "arrow.triangle.2.circlepath", + title: "Random wheel selection", + description: "Solve your daily decision-making dilemma by randomly selecting dishes using a fun spinning wheel." + ) + + // 功能2:分类管理 + FeatureItemView( + icon: "square.grid.2x2", + title: "Category Management", + description: "Create and manage dish categories to organize your food library in an orderly manner." + ) + + // 功能3:收藏功能 + FeatureItemView( + icon: "heart", + title: "Collect and like", + description: "Save frequently used recipes and quickly access your favorites." + ) + + // 功能4:统计记录 + FeatureItemView( + icon: "chart.bar", + title: "Select Record", + description: "Review your past choices to understand your dietary preferences." + ) + } + } + .frame(maxWidth: .infinity, alignment: .leading) + .padding() + .background( + RoundedRectangle(cornerRadius: 16) + .fill(Color.white) + .shadow(color: Color.black.opacity(0.05), radius: 8, x: 0, y: 3) + ) + } + + +} + +// MARK: - 功能项视图 +struct FeatureItemView: View { + let icon: String + let title: String + let description: String + + var body: some View { + HStack(spacing: 12) { + // 图标 + ZStack { + Circle() + .fill(Color(red: 1.0, green: 0.42, blue: 0.21).opacity(0.1)) + .frame(width: 36, height: 36) + + Image(systemName: icon) + .font(.system(size: 16)) + .foregroundColor(Color(red: 1.0, green: 0.42, blue: 0.21)) + } + + // 文字内容 + VStack(alignment: .leading, spacing: 2) { + Text(title) + .font(.subheadline) + .fontWeight(.medium) + .foregroundColor(.primary) + + Text(description) + .font(.caption) + .foregroundColor(.secondary) + .lineLimit(2) + } + } + .frame(maxWidth: .infinity, alignment: .leading) + } +} + +// MARK: - Safari 网页视图(隐私政策用) +import SafariServices + +struct SafariView: UIViewControllerRepresentable { + let url: URL + + func makeUIViewController(context: Context) -> SFSafariViewController { + let safariVC = SFSafariViewController(url: url) + safariVC.preferredControlTintColor = UIColor(red: 1.0, green: 0.42, blue: 0.21, alpha: 1.0) + safariVC.dismissButtonStyle = .close + return safariVC + } + + func updateUIViewController(_ uiViewController: SFSafariViewController, context: Context) { + // 不需要更新 + } +} diff --git a/TastePick/ResultView.swift b/TastePick/ResultView.swift new file mode 100644 index 0000000..561b27b --- /dev/null +++ b/TastePick/ResultView.swift @@ -0,0 +1,300 @@ +// +// ResultView.swift +// EatWheel +// +// Created by chengdu on 2025/12/4. +// +//显示转盘选择结果 + +import SwiftUI + +struct ResultView: View { + let food: FoodItem + @Binding var isPresented: Bool + @EnvironmentObject var viewModel: WheelViewModel + @StateObject private var adm = Adm.shared // 添加广告管理器 + @State private var scale: CGFloat = 0.8 + @State private var opacity: Double = 0 + @State private var isShowingAd = false // 跟踪广告是否正在展示 + @State private var isProcessingFavorite = false // 跟踪收藏处理状态 + @State private var showAdAfterFavorite = false // 控制广告显示状态 + + var body: some View { + ZStack { + VStack(spacing: 30) { + Spacer() + + VStack(spacing: 25) { + // 图标动画 + ZStack { + Circle() + .fill(Color(red: 1.0, green: 0.42, blue: 0.21).opacity(0.1)) + .frame(width: 140, height: 140) + + Image(systemName: food.icon) + .font(.system(size: 60)) + .foregroundColor(Color(red: 1.0, green: 0.42, blue: 0.21)) + } + .scaleEffect(scale) + .opacity(opacity) + + // 结果文字 + VStack(spacing: 10) { + Text("This is what we're having today!") + .font(.title2) + .foregroundColor(.secondary) + + Text(food.name) + .font(.system(size: 48, weight: .bold, design: .rounded)) + .foregroundColor(Color(red: 1.0, green: 0.42, blue: 0.21)) + .multilineTextAlignment(.center) + .padding(.horizontal, 20) + + HStack { + Image(systemName: "tag.fill") + .font(.caption) + .foregroundColor(.gray) + + Text(viewModel.getCategoryName(for: food.categoryId)) + .font(.subheadline) + .foregroundColor(.secondary) + } + } + } + + Spacer() + + // 按钮 + VStack(spacing: 15) { + Button(action: { + isPresented = false + }) { + Text("Okay, let's eat this!") + .font(.headline) + .foregroundColor(.white) + .frame(maxWidth: .infinity) + .padding() + .background(Color(red: 1.0, green: 0.42, blue: 0.21)) + .cornerRadius(15) + } + .padding(.horizontal, 40) + + Button(action: handleFavoriteAction) { + HStack { + if isProcessingFavorite { + ProgressView() + .scaleEffect(0.8) + .padding(.trailing, 5) + Text("Processing...") + } else { + Image(systemName: food.isFavorite ? "heart.fill" : "heart") + Text(food.isFavorite ? "Already saved" : "Collect") + } + } + .foregroundColor(.gray) + .frame(height: 20) + } + .disabled(isProcessingFavorite) + } + .padding(.bottom, 30) + } + .blur(radius: isShowingAd ? 3 : 0) // 广告展示时模糊背景 + + // 广告展示遮罩层 + if isShowingAd { + Color.black.opacity(0.4) + .edgesIgnoringSafeArea(.all) + .transition(.opacity) + } + } + .onAppear { + withAnimation(.spring(response: 0.6, dampingFraction: 0.7)) { + scale = 1 + opacity = 1 + } + setupAdCallbacks() + } + .onChange(of: showAdAfterFavorite) { showAd in + if showAd { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { + showAdIfReady() + } + } + } + .onChange(of: adm.isAdReady) { isReady in + if isReady && showAdAfterFavorite && !isShowingAd { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { + showAdIfReady() + } + } + } + .onDisappear { + // 重置状态 + isProcessingFavorite = false + showAdAfterFavorite = false + isShowingAd = false + } + } + + // MARK: - 广告相关方法 + + private func setupAdCallbacks() { + // 设置广告回调 + adm.onAdLoaded = { [self] in + print("广告加载成功") + if showAdAfterFavorite && !isShowingAd { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { + showAdIfReady() + } + } + } + + adm.onAdClosed = { [self] in + print("广告已关闭,完成收藏流程") + // 延迟一点时间,确保广告完全关闭 + DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { + withAnimation { + isShowingAd = false + } + completeFavoriteProcess() + } + } + + adm.onAdFailed = { [self] error in + print("广告展示失败: \(error.localizedDescription),直接完成收藏") + withAnimation { + isShowingAd = false + } + completeFavoriteProcess() + } + + adm.onAdDisplayed = { [self] in + print("广告已展示") + // 广告成功展示后,确保状态正确 + withAnimation { + isShowingAd = true + } + } + + adm.onAdClicked = { + print("广告被点击") + } + } + + private func handleFavoriteAction() { + print("开始处理收藏操作") + + // 如果已经收藏,直接切换状态 + if food.isFavorite { + print("菜品已收藏,直接取消收藏") + viewModel.toggleFavorite(for: food) + isPresented = false + return + } + + // 如果是新收藏,先标记为处理中 + isProcessingFavorite = true + + // 延迟触发广告展示 + DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { + showAdAfterFavorite = true + } + } + + private func showAdIfReady() { + print("尝试展示广告(收藏)...") + + // 确保当前视图是活跃的 + guard !isShowingAd else { + print("广告正在展示中,跳过") + return + } + + // 获取当前活跃的视图控制器 + if let rootViewController = getCurrentViewController() { + print("找到活跃的视图控制器") + + if adm.isAdReady { + print("广告已就绪,正在展示...") + withAnimation { + isShowingAd = true + } + + // 确保视图控制器处于活跃状态 + DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { + let success = adm.showInterstitialAd(viewController: rootViewController, placementName: "favorite_food") + + if !success { + print("广告展示失败(立即返回),直接完成收藏") + withAnimation { + isShowingAd = false + } + completeFavoriteProcess() + } + } + } else { + print("广告未就绪,等待广告加载...") + // 如果广告未就绪,等待2秒再检查 + DispatchQueue.main.asyncAfter(deadline: .now() + 2) { [self] in + if adm.isAdReady && showAdAfterFavorite && !isShowingAd { + print("广告现在已就绪,重新尝试展示") + showAdIfReady() + } else if !isShowingAd { + print("广告加载超时,直接完成收藏") + completeFavoriteProcess() + } + } + } + } else { + print("无法获取当前活跃的视图控制器,直接完成收藏") + completeFavoriteProcess() + } + } + + private func completeFavoriteProcess() { + print("开始完成收藏操作...") + + // 切换收藏状态 + viewModel.toggleFavorite(for: food) + + // 重置状态 + isProcessingFavorite = false + showAdAfterFavorite = false + + // 延迟关闭页面 + DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { + isPresented = false + } + } + + // 获取当前活跃的视图控制器 + private func getCurrentViewController() -> UIViewController? { + // 查找当前活跃的UIWindowScene + guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene, + let window = windowScene.windows.first(where: { $0.isKeyWindow }) else { + print("无法找到活跃的UIWindow") + return nil + } + + // 从根视图控制器开始查找 + var rootViewController = window.rootViewController + + // 如果当前有模态展示的控制器,使用它 + while let presentedViewController = rootViewController?.presentedViewController { + rootViewController = presentedViewController + } + + // 如果是UINavigationController,获取最顶部的控制器 + if let navigationController = rootViewController as? UINavigationController { + rootViewController = navigationController.visibleViewController + } + + // 如果是UITabBarController,获取选中的控制器 + if let tabBarController = rootViewController as? UITabBarController { + rootViewController = tabBarController.selectedViewController + } + + print("找到当前视图控制器: \(String(describing: rootViewController))") + return rootViewController + } +} diff --git a/TastePick/SearchBarView.swift b/TastePick/SearchBarView.swift new file mode 100644 index 0000000..7c7f69a --- /dev/null +++ b/TastePick/SearchBarView.swift @@ -0,0 +1,33 @@ +// +// SearchBarView.swift +// EatWheel +// +// Created by chengdu on 2025/12/4. +// +//搜索栏组件 +import SwiftUI + +struct SearchBar: View { + @Binding var text: String + var placeholder: String = "Search..." + + var body: some View { + HStack { + Image(systemName: "magnifyingglass") + .foregroundColor(.gray) + + TextField(placeholder, text: $text) + .textFieldStyle(PlainTextFieldStyle()) + + if !text.isEmpty { + Button(action: { text = "" }) { + Image(systemName: "xmark.circle.fill") + .foregroundColor(.gray) + } + } + } + .padding(10) + .background(Color(.systemGray5)) + .cornerRadius(10) + } +} diff --git a/TastePick/TastePick-Bridging-Header.h b/TastePick/TastePick-Bridging-Header.h new file mode 100644 index 0000000..47ac453 --- /dev/null +++ b/TastePick/TastePick-Bridging-Header.h @@ -0,0 +1,32 @@ +// +// TastePick-Bridging-Header.h +// TastePick +// +// Created by chengdu on 2025/12/29. +// + + +// TastePick-Bridging-Header.h +#ifndef TastePick_Bridging_Header_h +#define TastePick_Bridging_Header_h + +#import +#import +#import + +#import "MyPreDeviceInfo.h" +#import "MyInfo.h" +//用于AES加密 +#import + +// IronSource 导入 +#import + +// LevelPlay 导入(如果可用) +#ifdef __has_include +#if __has_include() +#import +#endif +#endif + +#endif /* TastePick_Bridging_Header_h */ diff --git a/TastePick/WheelHomeView.swift b/TastePick/WheelHomeView.swift new file mode 100644 index 0000000..f23af07 --- /dev/null +++ b/TastePick/WheelHomeView.swift @@ -0,0 +1,108 @@ +// +// WheelHomeView.swift +// EatWheel +// +// Created by chengdu on 2025/12/4. +// +//转盘主页面 +import SwiftUI + +struct WheelHomeView: View { + @EnvironmentObject var viewModel: WheelViewModel + @State private var rotationDegrees: Double = 0 + @State private var isSpinning = false + @State private var selectedFood: FoodItem? + @State private var showResult = false + + var body: some View { + ZStack { + Color(.systemGray6) + .edgesIgnoringSafeArea(.all) + + ScrollView { + VStack(spacing: 20) { + // 欢迎区域 + WelcomeHeader() + + // 统计卡片 + StatsCardView(viewModel: viewModel) + + if viewModel.foods.isEmpty { + EmptyStateView() + } else { + // 转盘区域 + WheelView( + foods: viewModel.foods, + rotationDegrees: rotationDegrees, + selectedFood: selectedFood + ) + .frame(height: 350) + .padding(.vertical) + + // 控制按钮 + SpinButton( + isSpinning: isSpinning, + hasFoods: !viewModel.foods.isEmpty, + action: spinWheel + ) + .padding(.horizontal) + + // 最近选择 + let recentSelections = viewModel.getRecentSelections() + if !recentSelections.isEmpty { + RecentSelectionsView( + selections: recentSelections, + viewModel: viewModel + ) + .padding(.horizontal) + } + } + + Spacer(minLength: 100) + } + .padding(.top) + } + } + .navigationBarTitleDisplayMode(.inline) + .sheet(isPresented: $showResult) { + if let food = selectedFood { + ResultView(food: food, isPresented: $showResult) + .environmentObject(viewModel) + } + } + } + + private func spinWheel() { + guard !viewModel.foods.isEmpty else { return } + + isSpinning = true + selectedFood = nil + + // 随机旋转 + let randomSpins = Double.random(in: 5...8) * 360 + let sliceAngle = 360.0 / Double(viewModel.foods.count) + let randomIndex = Int.random(in: 0.. Color { + let colors: [Color] = [ + .red, .orange, .yellow, .green, + .blue, .purple, .pink, .indigo, + .teal, .mint, .cyan, .brown + ] + return colors[index % colors.count].opacity(0.7) + } + + private func truncateText(_ text: String, limit: Int) -> String { + if text.count > limit { + let index = text.index(text.startIndex, offsetBy: limit) + return String(text[.. Path { + var path = Path() + let center = CGPoint(x: rect.midX, y: rect.midY) + let radius = min(rect.width, rect.height) / 2 + + path.move(to: center) + path.addArc(center: center, radius: radius, + startAngle: startAngle, + endAngle: endAngle, + clockwise: false) + path.closeSubpath() + + return path + } +} + +struct Triangle: Shape { + func path(in rect: CGRect) -> Path { + var path = Path() + path.move(to: CGPoint(x: rect.midX, y: rect.minY)) + path.addLine(to: CGPoint(x: rect.minX, y: rect.maxY)) + path.addLine(to: CGPoint(x: rect.maxX, y: rect.maxY)) + path.closeSubpath() + return path + } +} diff --git a/TastePick/WheelViewModel.swift b/TastePick/WheelViewModel.swift new file mode 100644 index 0000000..c5a09f8 --- /dev/null +++ b/TastePick/WheelViewModel.swift @@ -0,0 +1,491 @@ +// +// WheelViewModel.swift +// EatWheel +// +// Created by chengdu on 2025/12/4. +// +//应用数据管理核心 + +import SwiftUI +import Combine + +class WheelViewModel: ObservableObject { + @Published var categories: [Category] = [] + @Published var foods: [FoodItem] = [] + + private let categoriesKey = "stored_categories" + private let foodsKey = "stored_foods" + + init() { + loadData() + if categories.isEmpty { + createDefaultCategories() + } + } + + // MARK: - 数据管理 + private func loadData() { + if let categoriesData = UserDefaults.standard.data(forKey: categoriesKey), + let decodedCategories = try? JSONDecoder().decode([Category].self, from: categoriesData) { + categories = decodedCategories + } + + if let foodsData = UserDefaults.standard.data(forKey: foodsKey), + let decodedFoods = try? JSONDecoder().decode([FoodItem].self, from: foodsData) { + foods = decodedFoods + } + } + + func saveData() { + if let categoriesData = try? JSONEncoder().encode(categories) { + UserDefaults.standard.set(categoriesData, forKey: categoriesKey) + } + + if let foodsData = try? JSONEncoder().encode(foods) { + UserDefaults.standard.set(foodsData, forKey: foodsKey) + } + + objectWillChange.send() + } + + private func createDefaultCategories() { + let defaultCategories = [ + Category(name: "Chinese food", icon: "takeoutbag.and.cup.and.straw", color: .red), + Category(name: "Western food", icon: "fork.knife", color: .blue), + Category(name: "Japanese food", icon: "fish", color: .green), + Category(name: "Korean food", icon: "heart", color: .orange), + Category(name: "Fast food", icon: "bolt", color: .yellow), + Category(name: "Dessert", icon: "birthday.cake", color: .pink), + Category(name: "Beverages", icon: "cup.and.saucer", color: .purple), + Category(name: "Vegetarian diet", icon: "leaf", color: .mint) + ] + + categories = defaultCategories + + // 添加默认菜品 + let defaultFoods = [ + ("Hot pot", "Chinese food", "flame"), + ("Sichuan cuisine", "Chinese food", "flame.fill"), + ("Spaghetti", "Western food", "f.cursive.circle"), + ("Steak", "Western food", "fork.knife"), + ("Sushi", "Japanese food", "fish"), + ("Hand-Pulled Noodle", "Japanese food", "mouth"), + ("Hamburger", "Fast food", "bag"), + ("Fried chicken", "Fast food", "bird"), + ("Cake", "Dessert", "birthday.cake"), + ("Ice cream", "Dessert", "snow"), + ("Milk tea", "Beverages", "cup.and.saucer"), + ("Coffee", "Beverages", "cup"), + ("Salad", "Vegetarian diet", "leaf"), + ("Fruit", "Vegetarian diet", "applelogo") + ] + + for (name, categoryName, icon) in defaultFoods { + if let category = categories.first(where: { $0.name == categoryName }) { + let food = FoodItem(name: name, categoryId: category.id, icon: icon) + foods.append(food) + } + } + + saveData() + } + + // MARK: - 分类管理 + func addCategory(name: String, icon: String, color: Color) { + let newCategory = Category(name: name, icon: icon, color: color) + categories.append(newCategory) + saveData() + } + + func updateCategory(_ category: Category, newName: String? = nil, newIcon: String? = nil, newColor: Color? = nil) { + if let index = categories.firstIndex(where: { $0.id == category.id }) { + var updatedCategory = categories[index] + if let newName = newName { updatedCategory.name = newName } + if let newIcon = newIcon { updatedCategory.icon = newIcon } + if let newColor = newColor { updatedCategory.colorHex = newColor.toHex() ?? category.colorHex } + categories[index] = updatedCategory + saveData() + } + } + + func deleteCategory(_ category: Category) { + categories.removeAll { $0.id == category.id } + // 同时删除该分类下的所有菜品 + foods.removeAll { $0.categoryId == category.id } + saveData() + } + + // MARK: - 菜品管理 + func addFood(name: String, categoryId: UUID, icon: String = "fork.knife") { + let newFood = FoodItem(name: name, categoryId: categoryId, icon: icon) + foods.append(newFood) + saveData() + } + + func updateFood(_ food: FoodItem, newName: String? = nil, newIcon: String? = nil, newCategoryId: UUID? = nil) { + if let index = foods.firstIndex(where: { $0.id == food.id }) { + var updatedFood = foods[index] + if let newName = newName { updatedFood.name = newName } + if let newIcon = newIcon { updatedFood.icon = newIcon } + if let newCategoryId = newCategoryId { updatedFood.categoryId = newCategoryId } + foods[index] = updatedFood + saveData() + } + } + + func deleteFood(_ food: FoodItem) { + foods.removeAll { $0.id == food.id } + saveData() + } + + func toggleFavorite(for food: FoodItem) { + if let index = foods.firstIndex(where: { $0.id == food.id }) { + foods[index].isFavorite.toggle() + saveData() + } + } + + func recordSelection(for food: FoodItem) { + if let index = foods.firstIndex(where: { $0.id == food.id }) { + foods[index].lastSelected = Date() + saveData() + } + } + + // MARK: - 选择记录管理 + func clearSelection(for food: FoodItem) { + if let index = foods.firstIndex(where: { $0.id == food.id }) { + foods[index].lastSelected = nil + saveData() + } + } + + func clearAllSelections() { + for i in 0.. 0 { + saveData() + } + } + + // MARK: - 查询方法 + func getFoods(for categoryId: UUID) -> [FoodItem] { + foods.filter { $0.categoryId == categoryId } + } + + func getCategory(for food: FoodItem) -> Category? { + categories.first { $0.id == food.categoryId } + } + + func getCategoryName(for categoryId: UUID) -> String { + categories.first { $0.id == categoryId }?.name ?? "Unknown category" + } + + func getFavoriteFoods() -> [FoodItem] { + foods.filter { $0.isFavorite } + } + + func getRecentSelections() -> [FoodItem] { + foods + .filter { $0.lastSelected != nil } + .sorted { ($0.lastSelected ?? Date.distantPast) > ($1.lastSelected ?? Date.distantPast) } + .prefix(5) + .map { $0 } + } + + func getMostSelectedCategory() -> String? { + let categoryCounts = Dictionary(grouping: foods.filter { $0.lastSelected != nil }) { $0.categoryId } + .mapValues { $0.count } + + if let mostSelectedId = categoryCounts.max(by: { $0.value < $1.value })?.key { + return categories.first { $0.id == mostSelectedId }?.name + } + return nil + } + + // MARK: - 统计信息 + func getStatistics() -> (totalFoods: Int, favorites: Int, totalSelections: Int) { + let totalFoods = foods.count + let favorites = foods.filter { $0.isFavorite }.count + let totalSelections = foods.filter { $0.lastSelected != nil }.count + return (totalFoods, favorites, totalSelections) + } + + func getSelectionStats() -> (total: Int, today: Int, week: Int) { + let total = foods.filter { $0.lastSelected != nil }.count + + let today = Calendar.current.startOfDay(for: Date()) + let todayCount = foods.filter { + guard let date = $0.lastSelected else { return false } + return date >= today + }.count + + let weekAgo = Calendar.current.date(byAdding: .day, value: -7, to: Date())! + let weekCount = foods.filter { + guard let date = $0.lastSelected else { return false } + return date >= weekAgo + }.count + + return (total, todayCount, weekCount) + } + + // MARK: - 数据验证 + func validateFoodName(_ name: String) -> (isValid: Bool, message: String?) { + guard !name.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty else { + return (false, "The dish name cannot be empty.") + } + + + // 检查是否已存在同名菜品 + if foods.contains(where: { $0.name == name }) { + return (false, "A dish with the same name already exists.") + } + + return (true, nil) + } + + + + // MARK: - 搜索功能 + func searchFoods(_ query: String) -> [FoodItem] { + guard !query.isEmpty else { return [] } + + return foods.filter { food in + food.name.localizedCaseInsensitiveContains(query) || + getCategoryName(for: food.categoryId).localizedCaseInsensitiveContains(query) + } + } + + func searchCategories(_ query: String) -> [Category] { + guard !query.isEmpty else { return [] } + + return categories.filter { category in + category.name.localizedCaseInsensitiveContains(query) + } + } + + // MARK: - 数据备份和重置 + func resetToDefaults() { + categories.removeAll() + foods.removeAll() + createDefaultCategories() + } +} + +// MARK: - 数据模型用于备份 +struct AppData: Codable { + let categories: [Category] + let foods: [FoodItem] + let version: String + let backupDate: Date + + init(categories: [Category], foods: [FoodItem]) { + self.categories = categories + self.foods = foods + self.version = "1.0.0" + self.backupDate = Date() + } +} + +// MARK: - 数据导入导出扩展 +extension WheelViewModel { + // 导出数据为JSON格式 + func exportData() -> Data? { + let appData = AppData(categories: categories, foods: foods) + let encoder = JSONEncoder() + encoder.outputFormatting = .prettyPrinted + return try? encoder.encode(appData) + } + + // 导入JSON数据 + func importData(_ data: Data) -> Bool { + do { + let decoder = JSONDecoder() + let appData = try decoder.decode(AppData.self, from: data) + categories = appData.categories + foods = appData.foods + saveData() + return true + } catch { + print("Data import failed: \(error)") + return false + } + } + + // 导出为JSON字符串(便于分享) + func exportJSONString() -> String? { + guard let data = exportData() else { return nil } + return String(data: data, encoding: .utf8) + } + + // 从JSON字符串导入 + func importJSONString(_ jsonString: String) -> Bool { + guard let data = jsonString.data(using: .utf8) else { return false } + return importData(data) + } + + // 创建当前数据的备份 + func createBackup() -> AppData { + return AppData(categories: categories, foods: foods) + } + + // 从备份恢复 + func restoreFromBackup(_ appData: AppData) -> Bool { + categories = appData.categories + foods = appData.foods + saveData() + return true + } +} + + + +// MARK: - 辅助方法扩展 +extension WheelViewModel { + // 获取所有分类的名称 + func getAllCategoryNames() -> [String] { + categories.map { $0.name }.sorted() + } + + // 获取菜品数量最多的分类 + func getMostFoodsCategory() -> Category? { + categories.max(by: { getFoods(for: $0.id).count < getFoods(for: $1.id).count }) + } + + // 获取最近添加的菜品 + func getRecentlyAddedFoods(count: Int = 5) -> [FoodItem] { + foods.sorted { $0.createdAt > $1.createdAt }.prefix(count).map { $0 } + } + + // 检查是否有未分类的菜品 + func hasUncategorizedFoods() -> Bool { + foods.contains { food in + !categories.contains { $0.id == food.categoryId } + } + } + + // 修复未分类的菜品(将未分类的菜品分配到第一个分类) + func fixUncategorizedFoods() -> Int { + guard let firstCategory = categories.first else { return 0 } + var fixedCount = 0 + + for i in 0.. 0 { + saveData() + } + + return fixedCount + } +} + +// MARK: - 数据质量检查 +extension WheelViewModel { + struct DataQualityReport { + let totalFoods: Int + let totalCategories: Int + let foodsWithoutCategory: Int + let duplicateFoodNames: Int + let duplicateCategoryNames: Int + let foodsWithoutIcon: Int + } + + func checkDataQuality() -> DataQualityReport { + let totalFoods = foods.count + let totalCategories = categories.count + + // 检查未分类的菜品 + let foodsWithoutCategory = foods.filter { food in + !categories.contains { $0.id == food.categoryId } + }.count + + // 检查重复的菜品名称 + let foodNames = foods.map { $0.name } + let duplicateFoodNames = Dictionary(grouping: foodNames, by: { $0 }) + .filter { $0.value.count > 1 } + .count + + // 检查重复的分类名称 + let categoryNames = categories.map { $0.name } + let duplicateCategoryNames = Dictionary(grouping: categoryNames, by: { $0 }) + .filter { $0.value.count > 1 } + .count + + // 检查没有图标的菜品 + let foodsWithoutIcon = foods.filter { $0.icon.isEmpty || $0.icon == "fork.knife" }.count + + return DataQualityReport( + totalFoods: totalFoods, + totalCategories: totalCategories, + foodsWithoutCategory: foodsWithoutCategory, + duplicateFoodNames: duplicateFoodNames, + duplicateCategoryNames: duplicateCategoryNames, + foodsWithoutIcon: foodsWithoutIcon + ) + } + + // 自动修复数据问题 + func autoFixDataIssues() -> (fixed: Int, warnings: [String]) { + var fixedCount = 0 + var warnings: [String] = [] + + // 修复未分类的菜品 + let uncategorizedFixed = fixUncategorizedFoods() + if uncategorizedFixed > 0 { + fixedCount += uncategorizedFixed + warnings.append("Fixed \(uncategorizedFixed) uncategorized dishes") + } + + // 检查并修复重复的分类名称 + var seenCategoryNames: [String: UUID] = [:] + for i in 0..