diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ea1710078..2bb8fda31 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,8 +20,6 @@ jobs: script: - test:ios - test:macos - - test:facebook_utils:ios - - test:twitter_utils:ios - test:parseui:all - test:parse_live_query:all - build:starters diff --git a/.gitignore b/.gitignore index 50d9a3bc8..c21100b94 100644 --- a/.gitignore +++ b/.gitignore @@ -37,7 +37,6 @@ docs/ ## AppCode .idea/ -ParseFacebookUtils/Vendor ParseUI/Vendor # VSC diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index be210c30e..9411d42e9 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -12,10 +12,8 @@ For analyzing bugs, creating bug fixes and features we recommend to clone this repository locally and add it as a local package to your Xcode project. This way you can edit and inspect the Parse SDK while running your app. You can find step-by-step instructions for how do that in the [Xcode docs](https://developer.apple.com/documentation/xcode/editing-a-package-dependency-as-a-local-package). 1. Fork the repository and create a new branch. -2. Add unit tests for any new code you add. +2. Add unit tests for any new code you add: - Core Module - [/Parse/Tests/Unit/](/Parse/Tests/Unit/) - - Facebook Utils - [/ParseFacebookUtils/Tests/Unit/](/ParseFacebookUtils/Tests/Unit/) - - Twitter Utils - [/ParseTwitterUtils/Tests/Unit/](/ParseTwitterUtils/Tests/Unit/) 3. If you've changed APIs, update the documentation and the [iOS Guide](https://github.com/parse-community/docs/tree/gh-pages/_includes/ios). 4. Ensure the test suite passes. You can run the tests in the command line with rake. diff --git a/Package.resolved b/Package.resolved index 37b0ec50a..abb2b5bab 100644 --- a/Package.resolved +++ b/Package.resolved @@ -19,15 +19,6 @@ "version": "1.5.0" } }, - { - "package": "Facebook", - "repositoryURL": "https://github.com/facebook/facebook-ios-sdk", - "state": { - "branch": null, - "revision": "7fd8a930a5b2c940a22efafe0e214ed0df671312", - "version": "15.1.0" - } - }, { "package": "OCMock", "repositoryURL": "https://github.com/erikdoe/ocmock.git", diff --git a/Package.swift b/Package.swift index 46b62226e..517395cc4 100644 --- a/Package.swift +++ b/Package.swift @@ -13,10 +13,6 @@ let package = Package( ], products: [ .library(name: "ParseObjC", targets: ["ParseCore"]), - .library(name: "ParseFacebookUtils", targets: ["ParseFacebookUtils"]), - .library(name: "ParseFacebookUtilsiOS", targets: ["ParseFacebookUtilsiOS"]), - .library(name: "ParseFacebookUtilsTvOS", targets: ["ParseFacebookUtilsTvOS"]), - .library(name: "ParseTwitterUtils", targets: ["ParseTwitterUtils"]), .library(name: "ParseUI", targets: ["ParseUI"]), .library(name: "ParseLiveQuery", targets: ["ParseLiveQuery"]) ], @@ -24,7 +20,6 @@ let package = Package( .package(url: "https://github.com/parse-community/Bolts-ObjC.git", from: "1.10.0"), .package(url: "https://github.com/BoltsFramework/Bolts-Swift.git", from: "1.5.0"), .package(url: "https://github.com/daltoniam/Starscream.git", from: "4.0.6"), - .package(url: "https://github.com/facebook/facebook-ios-sdk.git", from: "15.1.0"), .package(name: "OCMock", url: "https://github.com/erikdoe/ocmock.git", .revision("67bb9602f0a7541f24dc2d6d0d7389ca3e4c2c89")) ], targets: [ @@ -37,57 +32,10 @@ let package = Package( publicHeadersPath: "Source", cSettings: [.headerSearchPath("Internal/**")] ), - .target( - name: "ParseFacebookUtils", - dependencies: [ - "ParseCore", - .product(name: "Bolts", package: "Bolts-ObjC"), - .product(name: "FacebookCore", package: "facebook-ios-sdk", condition: .when(platforms: [.iOS, .tvOS])), - .product(name: "FacebookLogin", package: "facebook-ios-sdk", condition: .when(platforms: [.iOS, .tvOS]))], - path: "ParseFacebookUtils/ParseFacebookUtils", - exclude: ["Resources/Info-tvOS.plist", "Resources/Info-iOS.plist"], - resources: [.process("Resources")], - publicHeadersPath: "Source" - ), - .target( - name: "ParseFacebookUtilsiOS", - dependencies: [ - "ParseFacebookUtils" - ], - path: "ParseFacebookUtilsiOS/ParseFacebookUtilsiOS", - exclude: ["Resources/Info-iOS.plist"], - resources: [.process("Resources")], - publicHeadersPath: "Source", - cSettings: [.headerSearchPath("Internal/**")] - ), - .target( - name: "ParseFacebookUtilsTvOS", - dependencies: [ - "ParseFacebookUtils", - .product(name: "FacebookTV", package: "facebook-ios-sdk", condition: .when(platforms: [.tvOS])) - ], - path: "ParseFacebookUtilsTvOS/ParseFacebookUtilsTvOS", - exclude: ["Resources/Info-tvOS.plist"], - resources: [.process("Resources")], - publicHeadersPath: "Source", - cSettings: [.headerSearchPath("Internal/**")] - ), - .target( - name: "ParseTwitterUtils", - dependencies: [ - "ParseCore" - ], - path: "ParseTwitterUtils/ParseTwitterUtils", - exclude: ["Resources/Info-iOS.plist"], - resources: [.process("Resources")], - publicHeadersPath: "Source", - cSettings: [.headerSearchPath("Internal/**")] - ), .target( name: "ParseUI", dependencies: [ - "ParseFacebookUtilsiOS", - "ParseTwitterUtils" + "ParseCore" ], path: "ParseUI/ParseUI", exclude: ["Resources/Info-iOS.plist"], diff --git a/Parse.xcworkspace/contents.xcworkspacedata b/Parse.xcworkspace/contents.xcworkspacedata index d265c108f..b8be39c51 100644 --- a/Parse.xcworkspace/contents.xcworkspacedata +++ b/Parse.xcworkspace/contents.xcworkspacedata @@ -4,18 +4,6 @@ - - - - - - - - diff --git a/Parse.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Parse.xcworkspace/xcshareddata/swiftpm/Package.resolved index 6459dc20f..abb2b5bab 100644 --- a/Parse.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Parse.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -19,15 +19,6 @@ "version": "1.5.0" } }, - { - "package": "Facebook", - "repositoryURL": "https://github.com/facebook/facebook-ios-sdk.git", - "state": { - "branch": null, - "revision": "7fd8a930a5b2c940a22efafe0e214ed0df671312", - "version": "15.1.0" - } - }, { "package": "OCMock", "repositoryURL": "https://github.com/erikdoe/ocmock.git", diff --git a/Parse/Parse/Source/PFAnonymousUtils.h b/Parse/Parse/Source/PFAnonymousUtils.h index 13c73a107..95ad47d45 100644 --- a/Parse/Parse/Source/PFAnonymousUtils.h +++ b/Parse/Parse/Source/PFAnonymousUtils.h @@ -32,10 +32,10 @@ NS_ASSUME_NONNULL_BEGIN Data associated with the anonymous user is retained. - logIn switches users without converting the anonymous user. Data associated with the anonymous user will be lost. - - Service logIn (e.g. Facebook, Twitter) will attempt to convert + - Authentication service logIn will attempt to convert the anonymous user into a standard user by linking it to the service. If a user already exists that is linked to the service, it will instead switch to the existing user. - - Service linking (e.g. Facebook, Twitter) will convert the anonymous user + - Authentication service linking will convert the anonymous user into a standard user by linking it to the service. */ @interface PFAnonymousUtils : NSObject diff --git a/Parse/Parse/Source/PFConstants.h b/Parse/Parse/Source/PFConstants.h index e541317f3..2ad08abc1 100644 --- a/Parse/Parse/Source/PFConstants.h +++ b/Parse/Parse/Source/PFConstants.h @@ -320,10 +320,6 @@ typedef NS_ENUM(NSInteger, PFErrorCode) { Users can only be created through sign up. */ kPFErrorUserCanOnlyBeCreatedThroughSignUp = 207, - /** - An existing Facebook account already linked to another user. - */ - kPFErrorFacebookAccountAlreadyLinked = 208, /** An existing account already linked to another user. */ @@ -333,18 +329,10 @@ typedef NS_ENUM(NSInteger, PFErrorCode) { */ kPFErrorInvalidSessionToken = 209, kPFErrorUserIdMismatch = 209, - /** - Facebook id missing from request. - */ - kPFErrorFacebookIdMissing = 250, /** Linked id missing from request. */ kPFErrorLinkedIdMissing = 250, - /** - Invalid Facebook session. - */ - kPFErrorFacebookInvalidSession = 251, /** Invalid linked session. */ diff --git a/Parse/Parse/Source/PFUser.h b/Parse/Parse/Source/PFUser.h index 86390f31c..4338ec19c 100644 --- a/Parse/Parse/Source/PFUser.h +++ b/Parse/Parse/Source/PFUser.h @@ -31,9 +31,6 @@ typedef void(^PFUserLogoutResultBlock)(NSError *_Nullable error); The `PFUser` class is a local representation of a user persisted to the Parse Data. This class is a subclass of a `PFObject`, and retains the same functionality of a `PFObject`, but also extends it with various user specific methods, like authentication, signing up, and validation uniqueness. - - Many APIs responsible for linking a `PFUser` with Facebook or Twitter have been deprecated in favor of dedicated - utilities for each social network. See `PFFacebookUtils`, `PFTwitterUtils` and `PFAnonymousUtils` for more information. */ @interface PFUser : PFObject @@ -65,8 +62,6 @@ typedef void(^PFUserLogoutResultBlock)(NSError *_Nullable error); /** Whether the `PFUser` was just created from a request. - - This is only set after a Facebook or Twitter login. */ @property (nonatomic, assign, readonly) BOOL isNew; diff --git a/Parse/Parse/Source/PFUser.m b/Parse/Parse/Source/PFUser.m index 9de923bea..8e0787a33 100644 --- a/Parse/Parse/Source/PFUser.m +++ b/Parse/Parse/Source/PFUser.m @@ -223,7 +223,7 @@ - (nullable PFRESTCommand *)_currentSignUpCommandForChanges:(PFOperationSet *)ch #pragma mark - Service Login ///-------------------------------------- -// Constructs the command for user_signup_or_login. This is used for Facebook, Twitter, and other linking services. +// Constructs the command for user_signup_or_login. This is used for authentication services. - (PFRESTCommand *)_currentServiceLoginCommandForChanges:(PFOperationSet *)changes error:(NSError **)error { @synchronized([self lock]) { NSDictionary *parameters = [self _convertToDictionaryForSaving:changes @@ -342,15 +342,13 @@ - (PFObject *)mergeFromObject:(PFUser *)other { /* Merges custom fields from JSON associated with a PFUser: { - "session_token": string, - "is_new": boolean, - "auth_data": { - "facebook": { - "id": string, - "access_token": string, - "expiration_date": string (represents date) - } - } + "session_token": string, + "is_new": boolean, + "auth_data": { + "": { + ... + } + } } */ - (void)_mergeFromServerWithResult:(NSDictionary *)result decoder:(PFDecoder *)decoder completeData:(BOOL)completeData { diff --git a/Parse/Tests/Resources/ParseUnitTests-OSX-Info.plist b/Parse/Tests/Resources/ParseUnitTests-OSX-Info.plist index 8e40b3180..48a7667f6 100644 --- a/Parse/Tests/Resources/ParseUnitTests-OSX-Info.plist +++ b/Parse/Tests/Resources/ParseUnitTests-OSX-Info.plist @@ -33,8 +33,6 @@ CFBundleVersion 1.0 - FacebookAppID - fake_id LSApplicationCategoryType LSRequiresIPhoneOS diff --git a/Parse/Tests/Resources/ParseUnitTests-iOS-Info.plist b/Parse/Tests/Resources/ParseUnitTests-iOS-Info.plist index 8e40b3180..48a7667f6 100644 --- a/Parse/Tests/Resources/ParseUnitTests-iOS-Info.plist +++ b/Parse/Tests/Resources/ParseUnitTests-iOS-Info.plist @@ -33,8 +33,6 @@ CFBundleVersion 1.0 - FacebookAppID - fake_id LSApplicationCategoryType LSRequiresIPhoneOS diff --git a/ParseFacebookUtils/.gitignore b/ParseFacebookUtils/.gitignore deleted file mode 100644 index f4096fee4..000000000 --- a/ParseFacebookUtils/.gitignore +++ /dev/null @@ -1 +0,0 @@ -Package.resolved diff --git a/ParseFacebookUtils/CHANGELOG.md b/ParseFacebookUtils/CHANGELOG.md deleted file mode 100644 index c932cc491..000000000 --- a/ParseFacebookUtils/CHANGELOG.md +++ /dev/null @@ -1,51 +0,0 @@ -# Change Log -All notable changes to this project will be documented in this file. - ---- - -## [ParseFacebookUtils-V4 1.11.1](https://github.com/ParsePlatform/ParseFacebookUtils-iOS/releases/tag/v4-1.11.1) (02/20/2016) - -#### Updated - -- `ParseFacebookUtilsV4` CocoaPod now uses the latest version of Facebook SDK. - [#50](https://github.com/ParsePlatform/ParseFacebookUtils-iOS/pull/50), - [#48](https://github.com/ParsePlatform/ParseFacebookUtils-iOS/pull/48) - by [@nlutsenko](https://github.com/nlutsenko) - -#### Fixed - -- Fixed static analyzer warnings that appeared in Xcode 7.3 beta. - [#51](https://github.com/ParsePlatform/ParseFacebookUtils-iOS/pull/51) - by [@nlutsenko](https://github.com/nlutsenko) - -## [ParseFacebookUtils-V4 1.11.0](https://github.com/ParsePlatform/ParseFacebookUtils-iOS/releases/tag/v4-1.11.0) (01/07/2016) - -#### New - -- ParseFacebookUtils now requires Xcode 7.0+. - [#38](https://github.com/ParsePlatform/ParseFacebookUtils-iOS/pull/38) - by [@nlutsenko](https://github.com/nlutsenko) - -## [ParseFacebookUtils-V4 1.10.0](https://github.com/ParsePlatform/ParseFacebookUtils-iOS/releases/tag/v4-1.10.0) (12/14/2015) - -#### New -- ParseFacebookUtils now supports tvOS. #23 - -#### Improved -- Updated, cleaned up and improved documentation. #22 - -## [ParseFacebookUtils-V4 1.9.1](https://github.com/ParsePlatform/ParseFacebookUtils-iOS/releases/tag/v4-1.9.1) (11/17/2015) - -#### New -- ParseFacebookUtils now supports Xcode 7.1. #7 -- ParseFacebookUtils now depends on FBSDK 4.8+. - -#### Improved -- Removed unused imports. #10 - -## [ParseFacebookUtils-V4 1.9.0](https://github.com/ParsePlatform/ParseFacebookUtils-iOS/releases/tag/v4-1.9.0) (10/08/2015) - -Hello, open source! - -#### Fixed -- Fixed initialization of Facebook Utils blocking the main thread. diff --git a/ParseFacebookUtils/Configurations/ParseFacebookUtilsV4-iOS-Dynamic.xcconfig b/ParseFacebookUtils/Configurations/ParseFacebookUtilsV4-iOS-Dynamic.xcconfig deleted file mode 100644 index cb9b605be..000000000 --- a/ParseFacebookUtils/Configurations/ParseFacebookUtilsV4-iOS-Dynamic.xcconfig +++ /dev/null @@ -1,16 +0,0 @@ -// -// Copyright (c) 2015-present, Parse, LLC. -// All rights reserved. -// -// This source code is licensed under the BSD-style license found in the -// LICENSE file in the root directory of this source tree. An additional grant -// of patent rights can be found in the PATENTS file in the same directory. -// - -#include "Shared/Platform/iOS.xcconfig" -#include "Shared/Product/DynamicFramework.xcconfig" - -PRODUCT_NAME = ParseFacebookUtilsV4 -PRODUCT_BUNDLE_IDENTIFIER = com.parse.facebookutils-ios - -INFOPLIST_FILE = $(SRCROOT)/ParseFacebookUtils/Resources/Info-iOS.plist diff --git a/ParseFacebookUtils/Configurations/ParseFacebookUtilsV4-iOS.xcconfig b/ParseFacebookUtils/Configurations/ParseFacebookUtilsV4-iOS.xcconfig deleted file mode 100644 index dff4409e9..000000000 --- a/ParseFacebookUtils/Configurations/ParseFacebookUtilsV4-iOS.xcconfig +++ /dev/null @@ -1,16 +0,0 @@ -// -// Copyright (c) 2015-present, Parse, LLC. -// All rights reserved. -// -// This source code is licensed under the BSD-style license found in the -// LICENSE file in the root directory of this source tree. An additional grant -// of patent rights can be found in the PATENTS file in the same directory. -// - -#include "Shared/Platform/iOS.xcconfig" -#include "Shared/Product/StaticFramework.xcconfig" - -PRODUCT_NAME = ParseFacebookUtilsV4 -PRODUCT_BUNDLE_IDENTIFIER = com.parse.facebookutils-ios - -INFOPLIST_FILE = $(SRCROOT)/ParseFacebookUtils/Resources/Info-iOS.plist diff --git a/ParseFacebookUtils/Configurations/ParseFacebookUtilsV4-tvOS-Dynamic.xcconfig b/ParseFacebookUtils/Configurations/ParseFacebookUtilsV4-tvOS-Dynamic.xcconfig deleted file mode 100644 index 380769f02..000000000 --- a/ParseFacebookUtils/Configurations/ParseFacebookUtilsV4-tvOS-Dynamic.xcconfig +++ /dev/null @@ -1,16 +0,0 @@ -// -// Copyright (c) 2015-present, Parse, LLC. -// All rights reserved. -// -// This source code is licensed under the BSD-style license found in the -// LICENSE file in the root directory of this source tree. An additional grant -// of patent rights can be found in the PATENTS file in the same directory. -// - -#include "Shared/Platform/tvOS.xcconfig" -#include "Shared/Product/DynamicFramework.xcconfig" - -PRODUCT_NAME = ParseFacebookUtilsV4 -PRODUCT_BUNDLE_IDENTIFIER = com.parse.facebookutils-tvos - -INFOPLIST_FILE = $(SRCROOT)/ParseFacebookUtils/Resources/Info-tvOS.plist diff --git a/ParseFacebookUtils/Configurations/ParseFacebookUtilsV4-tvOS.xcconfig b/ParseFacebookUtils/Configurations/ParseFacebookUtilsV4-tvOS.xcconfig deleted file mode 100644 index 3dcb2e9e7..000000000 --- a/ParseFacebookUtils/Configurations/ParseFacebookUtilsV4-tvOS.xcconfig +++ /dev/null @@ -1,16 +0,0 @@ -// -// Copyright (c) 2015-present, Parse, LLC. -// All rights reserved. -// -// This source code is licensed under the BSD-style license found in the -// LICENSE file in the root directory of this source tree. An additional grant -// of patent rights can be found in the PATENTS file in the same directory. -// - -#include "Shared/Platform/tvOS.xcconfig" -#include "Shared/Product/StaticFramework.xcconfig" - -PRODUCT_NAME = ParseFacebookUtilsV4 -PRODUCT_BUNDLE_IDENTIFIER = com.parse.facebookutils-tvos - -INFOPLIST_FILE = $(SRCROOT)/ParseFacebookUtils/Resources/Info-tvOS.plist diff --git a/ParseFacebookUtils/Configurations/Shared b/ParseFacebookUtils/Configurations/Shared deleted file mode 120000 index 657caabf0..000000000 --- a/ParseFacebookUtils/Configurations/Shared +++ /dev/null @@ -1 +0,0 @@ -../../Vendor/xctoolchain/Configurations \ No newline at end of file diff --git a/ParseFacebookUtils/ParseFacebookUtils.xcodeproj/project.pbxproj b/ParseFacebookUtils/ParseFacebookUtils.xcodeproj/project.pbxproj deleted file mode 100644 index 17cdc61e2..000000000 --- a/ParseFacebookUtils/ParseFacebookUtils.xcodeproj/project.pbxproj +++ /dev/null @@ -1,888 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 52; - objects = { - -/* Begin PBXBuildFile section */ - 39E248D12AD1C2510014357C /* ParseObjC in Frameworks */ = {isa = PBXBuildFile; productRef = 39E248D02AD1C2510014357C /* ParseObjC */; }; - 39E248D32AD1C25B0014357C /* ParseObjC in Frameworks */ = {isa = PBXBuildFile; productRef = 39E248D22AD1C25B0014357C /* ParseObjC */; }; - 39E24A202AD219600014357C /* FacebookAEM in Frameworks */ = {isa = PBXBuildFile; productRef = 39E24A1F2AD219600014357C /* FacebookAEM */; }; - 39E24A222AD219600014357C /* FacebookBasics in Frameworks */ = {isa = PBXBuildFile; productRef = 39E24A212AD219600014357C /* FacebookBasics */; }; - 39E24A242AD219600014357C /* FacebookCore in Frameworks */ = {isa = PBXBuildFile; productRef = 39E24A232AD219600014357C /* FacebookCore */; }; - 39E24A262AD219600014357C /* FacebookLogin in Frameworks */ = {isa = PBXBuildFile; productRef = 39E24A252AD219600014357C /* FacebookLogin */; }; - 39E24A2A2AD219DC0014357C /* FacebookAEM in Frameworks */ = {isa = PBXBuildFile; productRef = 39E24A292AD219DC0014357C /* FacebookAEM */; }; - 39E24A2C2AD219DC0014357C /* FacebookBasics in Frameworks */ = {isa = PBXBuildFile; productRef = 39E24A2B2AD219DC0014357C /* FacebookBasics */; }; - 39E24A2E2AD219DC0014357C /* FacebookCore in Frameworks */ = {isa = PBXBuildFile; productRef = 39E24A2D2AD219DC0014357C /* FacebookCore */; }; - 39E24A302AD219DC0014357C /* FacebookTV in Frameworks */ = {isa = PBXBuildFile; productRef = 39E24A2F2AD219DC0014357C /* FacebookTV */; }; - 7C5F7D27292101490035B219 /* PFFacebookUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C5F7D1E292101370035B219 /* PFFacebookUtils.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C5F7D28292101490035B219 /* ParseFacebookUtilsV4.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C5F7D1B292101370035B219 /* ParseFacebookUtilsV4.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C5F7D29292101490035B219 /* PFFacebookAuthenticationProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C5F7D1F292101370035B219 /* PFFacebookAuthenticationProvider.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C5F7D2B292101490035B219 /* PFFacebookUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C5F7D1E292101370035B219 /* PFFacebookUtils.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C5F7D2C292101490035B219 /* ParseFacebookUtilsV4.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C5F7D1B292101370035B219 /* ParseFacebookUtilsV4.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C5F7D2D292101490035B219 /* PFFacebookAuthenticationProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C5F7D1F292101370035B219 /* PFFacebookAuthenticationProvider.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C5F7D2F2921014A0035B219 /* PFFacebookUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C5F7D1E292101370035B219 /* PFFacebookUtils.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C5F7D302921014A0035B219 /* ParseFacebookUtilsV4.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C5F7D1B292101370035B219 /* ParseFacebookUtilsV4.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C5F7D312921014A0035B219 /* PFFacebookAuthenticationProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C5F7D1F292101370035B219 /* PFFacebookAuthenticationProvider.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C5F7D332921014A0035B219 /* PFFacebookUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C5F7D1E292101370035B219 /* PFFacebookUtils.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C5F7D342921014A0035B219 /* ParseFacebookUtilsV4.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C5F7D1B292101370035B219 /* ParseFacebookUtilsV4.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C5F7D352921014A0035B219 /* PFFacebookAuthenticationProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C5F7D1F292101370035B219 /* PFFacebookAuthenticationProvider.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C5F7D372921015C0035B219 /* PFFacebookAuthenticationProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C5F7D1C292101370035B219 /* PFFacebookAuthenticationProvider.m */; }; - 7C5F7D392921015C0035B219 /* PFFacebookUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C5F7D1A292101370035B219 /* PFFacebookUtils.m */; }; - 7C5F7D3A2921015D0035B219 /* PFFacebookAuthenticationProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C5F7D1C292101370035B219 /* PFFacebookAuthenticationProvider.m */; }; - 7C5F7D3C2921015D0035B219 /* PFFacebookUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C5F7D1A292101370035B219 /* PFFacebookUtils.m */; }; - 7C5F7D3D2921015D0035B219 /* PFFacebookAuthenticationProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C5F7D1C292101370035B219 /* PFFacebookAuthenticationProvider.m */; }; - 7C5F7D3F2921015D0035B219 /* PFFacebookUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C5F7D1A292101370035B219 /* PFFacebookUtils.m */; }; - 7C5F7D402921015E0035B219 /* PFFacebookAuthenticationProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C5F7D1C292101370035B219 /* PFFacebookAuthenticationProvider.m */; }; - 7C5F7D422921015E0035B219 /* PFFacebookUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C5F7D1A292101370035B219 /* PFFacebookUtils.m */; }; - 7C5F7DF4292105800035B219 /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C5F7DF3292105800035B219 /* libc++.tbd */; }; - 7C5F7DF6292105880035B219 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C5F7DF5292105880035B219 /* Accelerate.framework */; }; -/* End PBXBuildFile section */ - -/* Begin PBXCopyFilesBuildPhase section */ - BCCC20E1271F1BAB003C9D03 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; - BCCC20E4271F1BB3003C9D03 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 39E248C92AD1C23F0014357C /* Parse-SDK-iOS-OSX */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = "Parse-SDK-iOS-OSX"; path = ..; sourceTree = ""; }; - 4AAEAA75200C020E00AA7479 /* ParseFacebookUtilsV4.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ParseFacebookUtilsV4.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 4AAEAA90200C022300AA7479 /* ParseFacebookUtilsV4.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ParseFacebookUtilsV4.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 4AAEAA92200C025100AA7479 /* ParseFacebookUtilsV4-iOS-Dynamic.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "ParseFacebookUtilsV4-iOS-Dynamic.xcconfig"; sourceTree = ""; }; - 4AAEAA93200C026300AA7479 /* ParseFacebookUtilsV4-tvOS-Dynamic.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "ParseFacebookUtilsV4-tvOS-Dynamic.xcconfig"; sourceTree = ""; }; - 7C5F7D1A292101370035B219 /* PFFacebookUtils.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFFacebookUtils.m; sourceTree = ""; }; - 7C5F7D1B292101370035B219 /* ParseFacebookUtilsV4.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ParseFacebookUtilsV4.h; sourceTree = ""; }; - 7C5F7D1C292101370035B219 /* PFFacebookAuthenticationProvider.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFFacebookAuthenticationProvider.m; sourceTree = ""; }; - 7C5F7D1E292101370035B219 /* PFFacebookUtils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFFacebookUtils.h; sourceTree = ""; }; - 7C5F7D1F292101370035B219 /* PFFacebookAuthenticationProvider.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFFacebookAuthenticationProvider.h; sourceTree = ""; }; - 7C5F7D22292101370035B219 /* Info-iOS.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Info-iOS.plist"; sourceTree = ""; }; - 7C5F7D23292101370035B219 /* Localizable.strings */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; path = Localizable.strings; sourceTree = ""; }; - 7C5F7D24292101370035B219 /* Info-tvOS.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Info-tvOS.plist"; sourceTree = ""; }; - 7C5F7DF3292105800035B219 /* libc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS16.1.sdk/usr/lib/libc++.tbd"; sourceTree = DEVELOPER_DIR; }; - 7C5F7DF5292105880035B219 /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS16.1.sdk/System/Library/Frameworks/Accelerate.framework; sourceTree = DEVELOPER_DIR; }; - 8121EA9F1D39862400AC0B02 /* Common.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Common.xcconfig; sourceTree = ""; }; - 8121EAA11D39862400AC0B02 /* iOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = iOS.xcconfig; sourceTree = ""; }; - 8121EAA21D39862400AC0B02 /* macOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = macOS.xcconfig; sourceTree = ""; }; - 8121EAA31D39862400AC0B02 /* tvOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = tvOS.xcconfig; sourceTree = ""; }; - 8121EAA41D39862400AC0B02 /* watchOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = watchOS.xcconfig; sourceTree = ""; }; - 8121EAA61D39862400AC0B02 /* Application.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Application.xcconfig; sourceTree = ""; }; - 8121EAA71D39862400AC0B02 /* DynamicFramework.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = DynamicFramework.xcconfig; sourceTree = ""; }; - 8121EAA81D39862400AC0B02 /* LogicTests.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = LogicTests.xcconfig; sourceTree = ""; }; - 8121EAA91D39862400AC0B02 /* StaticFramework.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = StaticFramework.xcconfig; sourceTree = ""; }; - 8121EAAB1D39862400AC0B02 /* Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - 8121EAAC1D39862400AC0B02 /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 8121EAAD1D39862400AC0B02 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; - 81FE7F721C1778FC00E6BD34 /* ParseFacebookUtilsV4-tvOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "ParseFacebookUtilsV4-tvOS.xcconfig"; sourceTree = ""; }; - 81FE7F8B1C17790400E6BD34 /* ParseFacebookUtilsV4.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ParseFacebookUtilsV4.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - D2AAC07E0554694100DB518D /* ParseFacebookUtilsV4.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ParseFacebookUtilsV4.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - F52CD64A1B5838560051AB86 /* ParseFacebookUtilsV4-iOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "ParseFacebookUtilsV4-iOS.xcconfig"; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 4AAEAA6B200C020E00AA7479 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C5F7DF6292105880035B219 /* Accelerate.framework in Frameworks */, - 7C5F7DF4292105800035B219 /* libc++.tbd in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4AAEAA86200C022300AA7479 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 81FE7F811C17790400E6BD34 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 39E24A2C2AD219DC0014357C /* FacebookBasics in Frameworks */, - 39E24A2A2AD219DC0014357C /* FacebookAEM in Frameworks */, - 39E248D32AD1C25B0014357C /* ParseObjC in Frameworks */, - 39E24A302AD219DC0014357C /* FacebookTV in Frameworks */, - 39E24A2E2AD219DC0014357C /* FacebookCore in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - D2AAC07C0554694100DB518D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 39E24A222AD219600014357C /* FacebookBasics in Frameworks */, - 39E24A202AD219600014357C /* FacebookAEM in Frameworks */, - 39E248D12AD1C2510014357C /* ParseObjC in Frameworks */, - 39E24A262AD219600014357C /* FacebookLogin in Frameworks */, - 39E24A242AD219600014357C /* FacebookCore in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 034768DFFF38A50411DB9C8B /* Products */ = { - isa = PBXGroup; - children = ( - D2AAC07E0554694100DB518D /* ParseFacebookUtilsV4.framework */, - 81FE7F8B1C17790400E6BD34 /* ParseFacebookUtilsV4.framework */, - 4AAEAA75200C020E00AA7479 /* ParseFacebookUtilsV4.framework */, - 4AAEAA90200C022300AA7479 /* ParseFacebookUtilsV4.framework */, - ); - name = Products; - sourceTree = ""; - }; - 0867D691FE84028FC02AAC07 /* Breakpad */ = { - isa = PBXGroup; - children = ( - 39E248C82AD1C23F0014357C /* Packages */, - F52CD63A1B58383C0051AB86 /* Configurations */, - 813DFC7E1AB2510300F25A08 /* ParseFacebookUtils */, - 0867D69AFE84028FC02AAC07 /* Frameworks */, - 034768DFFF38A50411DB9C8B /* Products */, - ); - indentWidth = 4; - name = Breakpad; - sourceTree = ""; - }; - 0867D69AFE84028FC02AAC07 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 7C5F7DF5292105880035B219 /* Accelerate.framework */, - 7C5F7DF3292105800035B219 /* libc++.tbd */, - ); - name = Frameworks; - sourceTree = ""; - }; - 39E248C82AD1C23F0014357C /* Packages */ = { - isa = PBXGroup; - children = ( - 39E248C92AD1C23F0014357C /* Parse-SDK-iOS-OSX */, - ); - name = Packages; - sourceTree = ""; - }; - 7C5F7D19292101370035B219 /* Source */ = { - isa = PBXGroup; - children = ( - 7C5F7D1B292101370035B219 /* ParseFacebookUtilsV4.h */, - 7C5F7D1E292101370035B219 /* PFFacebookUtils.h */, - 7C5F7D1A292101370035B219 /* PFFacebookUtils.m */, - 7C5F7D1C292101370035B219 /* PFFacebookAuthenticationProvider.m */, - 7C5F7D1F292101370035B219 /* PFFacebookAuthenticationProvider.h */, - ); - path = Source; - sourceTree = ""; - }; - 7C5F7D21292101370035B219 /* Resources */ = { - isa = PBXGroup; - children = ( - 7C5F7D22292101370035B219 /* Info-iOS.plist */, - 7C5F7D23292101370035B219 /* Localizable.strings */, - 7C5F7D24292101370035B219 /* Info-tvOS.plist */, - ); - path = Resources; - sourceTree = ""; - }; - 8121EA9E1D39862400AC0B02 /* Shared */ = { - isa = PBXGroup; - children = ( - 8121EA9F1D39862400AC0B02 /* Common.xcconfig */, - 8121EAA01D39862400AC0B02 /* Platform */, - 8121EAA51D39862400AC0B02 /* Product */, - 8121EAAA1D39862400AC0B02 /* Project */, - 8121EAAD1D39862400AC0B02 /* Warnings.xcconfig */, - ); - path = Shared; - sourceTree = ""; - }; - 8121EAA01D39862400AC0B02 /* Platform */ = { - isa = PBXGroup; - children = ( - 8121EAA11D39862400AC0B02 /* iOS.xcconfig */, - 8121EAA21D39862400AC0B02 /* macOS.xcconfig */, - 8121EAA31D39862400AC0B02 /* tvOS.xcconfig */, - 8121EAA41D39862400AC0B02 /* watchOS.xcconfig */, - ); - path = Platform; - sourceTree = ""; - }; - 8121EAA51D39862400AC0B02 /* Product */ = { - isa = PBXGroup; - children = ( - 8121EAA61D39862400AC0B02 /* Application.xcconfig */, - 8121EAA71D39862400AC0B02 /* DynamicFramework.xcconfig */, - 8121EAA81D39862400AC0B02 /* LogicTests.xcconfig */, - 8121EAA91D39862400AC0B02 /* StaticFramework.xcconfig */, - ); - path = Product; - sourceTree = ""; - }; - 8121EAAA1D39862400AC0B02 /* Project */ = { - isa = PBXGroup; - children = ( - 8121EAAB1D39862400AC0B02 /* Debug.xcconfig */, - 8121EAAC1D39862400AC0B02 /* Release.xcconfig */, - ); - path = Project; - sourceTree = ""; - }; - 813DFC7E1AB2510300F25A08 /* ParseFacebookUtils */ = { - isa = PBXGroup; - children = ( - 7C5F7D21292101370035B219 /* Resources */, - 7C5F7D19292101370035B219 /* Source */, - ); - path = ParseFacebookUtils; - sourceTree = ""; - }; - F52CD63A1B58383C0051AB86 /* Configurations */ = { - isa = PBXGroup; - children = ( - F52CD64A1B5838560051AB86 /* ParseFacebookUtilsV4-iOS.xcconfig */, - 4AAEAA92200C025100AA7479 /* ParseFacebookUtilsV4-iOS-Dynamic.xcconfig */, - 81FE7F721C1778FC00E6BD34 /* ParseFacebookUtilsV4-tvOS.xcconfig */, - 4AAEAA93200C026300AA7479 /* ParseFacebookUtilsV4-tvOS-Dynamic.xcconfig */, - 8121EA9E1D39862400AC0B02 /* Shared */, - ); - path = Configurations; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - 4AAEAA5E200C020E00AA7479 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C5F7D312921014A0035B219 /* PFFacebookAuthenticationProvider.h in Headers */, - 7C5F7D302921014A0035B219 /* ParseFacebookUtilsV4.h in Headers */, - 7C5F7D2F2921014A0035B219 /* PFFacebookUtils.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4AAEAA7A200C022300AA7479 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C5F7D352921014A0035B219 /* PFFacebookAuthenticationProvider.h in Headers */, - 7C5F7D342921014A0035B219 /* ParseFacebookUtilsV4.h in Headers */, - 7C5F7D332921014A0035B219 /* PFFacebookUtils.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 81FE7F761C17790400E6BD34 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C5F7D2D292101490035B219 /* PFFacebookAuthenticationProvider.h in Headers */, - 7C5F7D2C292101490035B219 /* ParseFacebookUtilsV4.h in Headers */, - 7C5F7D2B292101490035B219 /* PFFacebookUtils.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - D2AAC07A0554694100DB518D /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C5F7D29292101490035B219 /* PFFacebookAuthenticationProvider.h in Headers */, - 7C5F7D28292101490035B219 /* ParseFacebookUtilsV4.h in Headers */, - 7C5F7D27292101490035B219 /* PFFacebookUtils.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - 4AAEAA5B200C020E00AA7479 /* ParseFacebookUtilsV4-iOS-Dynamic */ = { - isa = PBXNativeTarget; - buildConfigurationList = 4AAEAA72200C020E00AA7479 /* Build configuration list for PBXNativeTarget "ParseFacebookUtilsV4-iOS-Dynamic" */; - buildPhases = ( - 4AAEAA5D200C020E00AA7479 /* Generate Localizable Strings */, - 4AAEAA5E200C020E00AA7479 /* Headers */, - 4AAEAA66200C020E00AA7479 /* Sources */, - 4AAEAA6B200C020E00AA7479 /* Frameworks */, - 4AAEAA70200C020E00AA7479 /* Resources */, - BCCC20E1271F1BAB003C9D03 /* Embed Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "ParseFacebookUtilsV4-iOS-Dynamic"; - packageProductDependencies = ( - ); - productName = Breakpad; - productReference = 4AAEAA75200C020E00AA7479 /* ParseFacebookUtilsV4.framework */; - productType = "com.apple.product-type.framework"; - }; - 4AAEAA77200C022300AA7479 /* ParseFacebookUtilsV4-tvOS-Dynamic */ = { - isa = PBXNativeTarget; - buildConfigurationList = 4AAEAA8D200C022300AA7479 /* Build configuration list for PBXNativeTarget "ParseFacebookUtilsV4-tvOS-Dynamic" */; - buildPhases = ( - 4AAEAA79200C022300AA7479 /* Generate Localizable Strings */, - 4AAEAA7A200C022300AA7479 /* Headers */, - 4AAEAA81200C022300AA7479 /* Sources */, - 4AAEAA86200C022300AA7479 /* Frameworks */, - 4AAEAA8B200C022300AA7479 /* Resources */, - BCCC20E4271F1BB3003C9D03 /* Embed Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "ParseFacebookUtilsV4-tvOS-Dynamic"; - packageProductDependencies = ( - ); - productName = Breakpad; - productReference = 4AAEAA90200C022300AA7479 /* ParseFacebookUtilsV4.framework */; - productType = "com.apple.product-type.framework"; - }; - 81FE7F731C17790400E6BD34 /* ParseFacebookUtilsV4-tvOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 81FE7F881C17790400E6BD34 /* Build configuration list for PBXNativeTarget "ParseFacebookUtilsV4-tvOS" */; - buildPhases = ( - 4A1351A5202817C7000F5FD5 /* Fetch Latest Dependencies */, - 81FE7F751C17790400E6BD34 /* Generate Localizable Strings */, - 81FE7F761C17790400E6BD34 /* Headers */, - 81FE7F7D1C17790400E6BD34 /* Sources */, - 81FE7F811C17790400E6BD34 /* Frameworks */, - 81FE7F861C17790400E6BD34 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "ParseFacebookUtilsV4-tvOS"; - packageProductDependencies = ( - 39E248D22AD1C25B0014357C /* ParseObjC */, - 39E24A292AD219DC0014357C /* FacebookAEM */, - 39E24A2B2AD219DC0014357C /* FacebookBasics */, - 39E24A2D2AD219DC0014357C /* FacebookCore */, - 39E24A2F2AD219DC0014357C /* FacebookTV */, - ); - productName = Breakpad; - productReference = 81FE7F8B1C17790400E6BD34 /* ParseFacebookUtilsV4.framework */; - productType = "com.apple.product-type.framework"; - }; - D2AAC07D0554694100DB518D /* ParseFacebookUtilsV4-iOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "ParseFacebookUtilsV4-iOS" */; - buildPhases = ( - 4A1351B220281814000F5FD5 /* Fetch Latest Dependencies */, - 81B3F2291AC9CA2600A92677 /* Generate Localizable Strings */, - D2AAC07A0554694100DB518D /* Headers */, - D2AAC07B0554694100DB518D /* Sources */, - D2AAC07C0554694100DB518D /* Frameworks */, - 8139B1341A7BF6B5002BEF84 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "ParseFacebookUtilsV4-iOS"; - packageProductDependencies = ( - 39E248D02AD1C2510014357C /* ParseObjC */, - 39E24A1F2AD219600014357C /* FacebookAEM */, - 39E24A212AD219600014357C /* FacebookBasics */, - 39E24A232AD219600014357C /* FacebookCore */, - 39E24A252AD219600014357C /* FacebookLogin */, - ); - productName = Breakpad; - productReference = D2AAC07E0554694100DB518D /* ParseFacebookUtilsV4.framework */; - productType = "com.apple.product-type.framework"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 0867D690FE84028FC02AAC07 /* Project object */ = { - isa = PBXProject; - attributes = { - CLASSPREFIX = PF; - LastUpgradeCheck = 0920; - ORGANIZATIONNAME = "Parse, LLC"; - }; - buildConfigurationList = 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "ParseFacebookUtils" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = en; - hasScannedForEncodings = 1; - knownRegions = ( - da, - de, - es, - fr, - it, - ja, - nl, - no, - sl, - sv, - tr, - en, - Base, - ); - mainGroup = 0867D691FE84028FC02AAC07 /* Breakpad */; - packageReferences = ( - 39E24A1E2AD219600014357C /* XCRemoteSwiftPackageReference "facebook-ios-sdk" */, - ); - productRefGroup = 034768DFFF38A50411DB9C8B /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - D2AAC07D0554694100DB518D /* ParseFacebookUtilsV4-iOS */, - 81FE7F731C17790400E6BD34 /* ParseFacebookUtilsV4-tvOS */, - 4AAEAA5B200C020E00AA7479 /* ParseFacebookUtilsV4-iOS-Dynamic */, - 4AAEAA77200C022300AA7479 /* ParseFacebookUtilsV4-tvOS-Dynamic */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 4AAEAA70200C020E00AA7479 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4AAEAA8B200C022300AA7479 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 8139B1341A7BF6B5002BEF84 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 81FE7F861C17790400E6BD34 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 4A1351A5202817C7000F5FD5 /* Fetch Latest Dependencies */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 8; - files = ( - ); - inputPaths = ( - ); - name = "Fetch Latest Dependencies"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 1; - shellPath = /bin/sh; - shellScript = " -"; - }; - 4A1351B220281814000F5FD5 /* Fetch Latest Dependencies */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 8; - files = ( - ); - inputPaths = ( - ); - name = "Fetch Latest Dependencies"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 1; - shellPath = /bin/sh; - shellScript = " -"; - }; - 4AAEAA5D200C020E00AA7479 /* Generate Localizable Strings */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Generate Localizable Strings"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "# Generate localizable strings\nfind $PROJECT_DIR -name '*.m' -print0 | xargs -0 genstrings -q -o $PROJECT_DIR/ParseFacebookUtils/Resources\necho \"Finished converting images\"\n"; - }; - 4AAEAA79200C022300AA7479 /* Generate Localizable Strings */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Generate Localizable Strings"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "# Generate localizable strings\nfind $PROJECT_DIR -name '*.m' -print0 | xargs -0 genstrings -q -o $PROJECT_DIR/ParseFacebookUtils/Resources\necho \"Finished converting images\"\n"; - }; - 81B3F2291AC9CA2600A92677 /* Generate Localizable Strings */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 8; - files = ( - ); - inputPaths = ( - ); - name = "Generate Localizable Strings"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 1; - shellPath = /bin/sh; - shellScript = "# Generate localizable strings\nfind $PROJECT_DIR -name '*.m' -print0 | xargs -0 genstrings -q -o $PROJECT_DIR/ParseFacebookUtils/Resources\necho \"Finished converting images\"\n"; - }; - 81FE7F751C17790400E6BD34 /* Generate Localizable Strings */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 8; - files = ( - ); - inputPaths = ( - ); - name = "Generate Localizable Strings"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 1; - shellPath = /bin/sh; - shellScript = "# Generate localizable strings\nfind $PROJECT_DIR -name '*.m' -print0 | xargs -0 genstrings -q -o $PROJECT_DIR/ParseFacebookUtils/Resources\necho \"Finished converting images\"\n"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 4AAEAA66200C020E00AA7479 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C5F7D3C2921015D0035B219 /* PFFacebookUtils.m in Sources */, - 7C5F7D3A2921015D0035B219 /* PFFacebookAuthenticationProvider.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4AAEAA81200C022300AA7479 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C5F7D392921015C0035B219 /* PFFacebookUtils.m in Sources */, - 7C5F7D372921015C0035B219 /* PFFacebookAuthenticationProvider.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 81FE7F7D1C17790400E6BD34 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C5F7D3F2921015D0035B219 /* PFFacebookUtils.m in Sources */, - 7C5F7D3D2921015D0035B219 /* PFFacebookAuthenticationProvider.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - D2AAC07B0554694100DB518D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C5F7D422921015E0035B219 /* PFFacebookUtils.m in Sources */, - 7C5F7D402921015E0035B219 /* PFFacebookAuthenticationProvider.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 1DEB921F08733DC00010E9CD /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = F52CD64A1B5838560051AB86 /* ParseFacebookUtilsV4-iOS.xcconfig */; - buildSettings = { - CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - EXCLUDED_ARCHS = ""; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - SUPPORTS_MACCATALYST = NO; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 1DEB922008733DC00010E9CD /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = F52CD64A1B5838560051AB86 /* ParseFacebookUtilsV4-iOS.xcconfig */; - buildSettings = { - CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - EXCLUDED_ARCHS = ""; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - ONLY_ACTIVE_ARCH = YES; - SUPPORTS_MACCATALYST = NO; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; - 1DEB922308733DC00010E9CD /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 8121EAAB1D39862400AC0B02 /* Debug.xcconfig */; - buildSettings = { - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_ENABLE_CODE_COVERAGE = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - PARSE_DIR = "$(PROJECT_DIR)/.."; - }; - name = Debug; - }; - 1DEB922408733DC00010E9CD /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 8121EAAC1D39862400AC0B02 /* Release.xcconfig */; - buildSettings = { - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_ENABLE_CODE_COVERAGE = NO; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - PARSE_DIR = "$(PROJECT_DIR)/.."; - }; - name = Release; - }; - 4AAEAA73200C020E00AA7479 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 4AAEAA92200C025100AA7479 /* ParseFacebookUtilsV4-iOS-Dynamic.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_MODULES_AUTOLINK = YES; - EXCLUDED_ARCHS = ""; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - SUPPORTS_MACCATALYST = NO; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 4AAEAA74200C020E00AA7479 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 4AAEAA92200C025100AA7479 /* ParseFacebookUtilsV4-iOS-Dynamic.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_MODULES_AUTOLINK = YES; - EXCLUDED_ARCHS = ""; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - ONLY_ACTIVE_ARCH = YES; - SUPPORTS_MACCATALYST = NO; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; - 4AAEAA8E200C022300AA7479 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 4AAEAA93200C026300AA7479 /* ParseFacebookUtilsV4-tvOS-Dynamic.xcconfig */; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD)"; - CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_MODULES_AUTOLINK = YES; - EXCLUDED_ARCHS = ""; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - SWIFT_VERSION = 5.0; - TVOS_DEPLOYMENT_TARGET = 12.0; - }; - name = Debug; - }; - 4AAEAA8F200C022300AA7479 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 4AAEAA93200C026300AA7479 /* ParseFacebookUtilsV4-tvOS-Dynamic.xcconfig */; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD)"; - CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_MODULES_AUTOLINK = YES; - EXCLUDED_ARCHS = ""; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - ONLY_ACTIVE_ARCH = YES; - SWIFT_VERSION = 5.0; - TVOS_DEPLOYMENT_TARGET = 12.0; - }; - name = Release; - }; - 81FE7F891C17790400E6BD34 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 81FE7F721C1778FC00E6BD34 /* ParseFacebookUtilsV4-tvOS.xcconfig */; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD)"; - CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - EXCLUDED_ARCHS = ""; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - TVOS_DEPLOYMENT_TARGET = 12.0; - }; - name = Debug; - }; - 81FE7F8A1C17790400E6BD34 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 81FE7F721C1778FC00E6BD34 /* ParseFacebookUtilsV4-tvOS.xcconfig */; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD)"; - CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - EXCLUDED_ARCHS = ""; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - ONLY_ACTIVE_ARCH = YES; - TVOS_DEPLOYMENT_TARGET = 12.0; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "ParseFacebookUtilsV4-iOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1DEB921F08733DC00010E9CD /* Debug */, - 1DEB922008733DC00010E9CD /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "ParseFacebookUtils" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1DEB922308733DC00010E9CD /* Debug */, - 1DEB922408733DC00010E9CD /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 4AAEAA72200C020E00AA7479 /* Build configuration list for PBXNativeTarget "ParseFacebookUtilsV4-iOS-Dynamic" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 4AAEAA73200C020E00AA7479 /* Debug */, - 4AAEAA74200C020E00AA7479 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 4AAEAA8D200C022300AA7479 /* Build configuration list for PBXNativeTarget "ParseFacebookUtilsV4-tvOS-Dynamic" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 4AAEAA8E200C022300AA7479 /* Debug */, - 4AAEAA8F200C022300AA7479 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 81FE7F881C17790400E6BD34 /* Build configuration list for PBXNativeTarget "ParseFacebookUtilsV4-tvOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 81FE7F891C17790400E6BD34 /* Debug */, - 81FE7F8A1C17790400E6BD34 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - -/* Begin XCRemoteSwiftPackageReference section */ - 39E24A1E2AD219600014357C /* XCRemoteSwiftPackageReference "facebook-ios-sdk" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/facebook/facebook-ios-sdk.git"; - requirement = { - kind = exactVersion; - version = 15.1.0; - }; - }; -/* End XCRemoteSwiftPackageReference section */ - -/* Begin XCSwiftPackageProductDependency section */ - 39E248D02AD1C2510014357C /* ParseObjC */ = { - isa = XCSwiftPackageProductDependency; - productName = ParseObjC; - }; - 39E248D22AD1C25B0014357C /* ParseObjC */ = { - isa = XCSwiftPackageProductDependency; - productName = ParseObjC; - }; - 39E24A1F2AD219600014357C /* FacebookAEM */ = { - isa = XCSwiftPackageProductDependency; - package = 39E24A1E2AD219600014357C /* XCRemoteSwiftPackageReference "facebook-ios-sdk" */; - productName = FacebookAEM; - }; - 39E24A212AD219600014357C /* FacebookBasics */ = { - isa = XCSwiftPackageProductDependency; - package = 39E24A1E2AD219600014357C /* XCRemoteSwiftPackageReference "facebook-ios-sdk" */; - productName = FacebookBasics; - }; - 39E24A232AD219600014357C /* FacebookCore */ = { - isa = XCSwiftPackageProductDependency; - package = 39E24A1E2AD219600014357C /* XCRemoteSwiftPackageReference "facebook-ios-sdk" */; - productName = FacebookCore; - }; - 39E24A252AD219600014357C /* FacebookLogin */ = { - isa = XCSwiftPackageProductDependency; - package = 39E24A1E2AD219600014357C /* XCRemoteSwiftPackageReference "facebook-ios-sdk" */; - productName = FacebookLogin; - }; - 39E24A292AD219DC0014357C /* FacebookAEM */ = { - isa = XCSwiftPackageProductDependency; - package = 39E24A1E2AD219600014357C /* XCRemoteSwiftPackageReference "facebook-ios-sdk" */; - productName = FacebookAEM; - }; - 39E24A2B2AD219DC0014357C /* FacebookBasics */ = { - isa = XCSwiftPackageProductDependency; - package = 39E24A1E2AD219600014357C /* XCRemoteSwiftPackageReference "facebook-ios-sdk" */; - productName = FacebookBasics; - }; - 39E24A2D2AD219DC0014357C /* FacebookCore */ = { - isa = XCSwiftPackageProductDependency; - package = 39E24A1E2AD219600014357C /* XCRemoteSwiftPackageReference "facebook-ios-sdk" */; - productName = FacebookCore; - }; - 39E24A2F2AD219DC0014357C /* FacebookTV */ = { - isa = XCSwiftPackageProductDependency; - package = 39E24A1E2AD219600014357C /* XCRemoteSwiftPackageReference "facebook-ios-sdk" */; - productName = FacebookTV; - }; -/* End XCSwiftPackageProductDependency section */ - }; - rootObject = 0867D690FE84028FC02AAC07 /* Project object */; -} diff --git a/ParseFacebookUtils/ParseFacebookUtils.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ParseFacebookUtils/ParseFacebookUtils.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a62..000000000 --- a/ParseFacebookUtils/ParseFacebookUtils.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/ParseFacebookUtils/ParseFacebookUtils.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ParseFacebookUtils/ParseFacebookUtils.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d981003..000000000 --- a/ParseFacebookUtils/ParseFacebookUtils.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/ParseFacebookUtils/ParseFacebookUtils.xcodeproj/xcshareddata/xcschemes/ParseFacebookUtilsV4-iOS-Dynamic.xcscheme b/ParseFacebookUtils/ParseFacebookUtils.xcodeproj/xcshareddata/xcschemes/ParseFacebookUtilsV4-iOS-Dynamic.xcscheme deleted file mode 100644 index 17963fd11..000000000 --- a/ParseFacebookUtils/ParseFacebookUtils.xcodeproj/xcshareddata/xcschemes/ParseFacebookUtilsV4-iOS-Dynamic.xcscheme +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ParseFacebookUtils/ParseFacebookUtils.xcodeproj/xcshareddata/xcschemes/ParseFacebookUtilsV4-iOS.xcscheme b/ParseFacebookUtils/ParseFacebookUtils.xcodeproj/xcshareddata/xcschemes/ParseFacebookUtilsV4-iOS.xcscheme deleted file mode 100644 index 8f2f22dc5..000000000 --- a/ParseFacebookUtils/ParseFacebookUtils.xcodeproj/xcshareddata/xcschemes/ParseFacebookUtilsV4-iOS.xcscheme +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ParseFacebookUtils/ParseFacebookUtils.xcodeproj/xcshareddata/xcschemes/ParseFacebookUtilsV4-tvOS-Dynamic.xcscheme b/ParseFacebookUtils/ParseFacebookUtils.xcodeproj/xcshareddata/xcschemes/ParseFacebookUtilsV4-tvOS-Dynamic.xcscheme deleted file mode 100644 index 0c1653843..000000000 --- a/ParseFacebookUtils/ParseFacebookUtils.xcodeproj/xcshareddata/xcschemes/ParseFacebookUtilsV4-tvOS-Dynamic.xcscheme +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ParseFacebookUtils/ParseFacebookUtils.xcodeproj/xcshareddata/xcschemes/ParseFacebookUtilsV4-tvOS.xcscheme b/ParseFacebookUtils/ParseFacebookUtils.xcodeproj/xcshareddata/xcschemes/ParseFacebookUtilsV4-tvOS.xcscheme deleted file mode 100644 index 98ebf013e..000000000 --- a/ParseFacebookUtils/ParseFacebookUtils.xcodeproj/xcshareddata/xcschemes/ParseFacebookUtilsV4-tvOS.xcscheme +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ParseFacebookUtils/ParseFacebookUtils/Resources/Info-iOS.plist b/ParseFacebookUtils/ParseFacebookUtils/Resources/Info-iOS.plist deleted file mode 100644 index a189aea67..000000000 --- a/ParseFacebookUtils/ParseFacebookUtils/Resources/Info-iOS.plist +++ /dev/null @@ -1,28 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleExecutable - ParseFacebookUtilsV4 - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - FMWK - CFBundleShortVersionString - 2.7.3 - CFBundleSignature - ???? - CFBundleSupportedPlatforms - - iPhoneOS - - CFBundleVersion - 2.7.3 - MinimumOSVersion - 12.0 - - diff --git a/ParseFacebookUtils/ParseFacebookUtils/Resources/Info-tvOS.plist b/ParseFacebookUtils/ParseFacebookUtils/Resources/Info-tvOS.plist deleted file mode 100644 index 002ac579a..000000000 --- a/ParseFacebookUtils/ParseFacebookUtils/Resources/Info-tvOS.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleExecutable - ParseFacebookUtilsV4 - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - FMWK - CFBundleShortVersionString - 2.7.3 - CFBundleSignature - ???? - CFBundleVersion - 2.7.3 - - diff --git a/ParseFacebookUtils/ParseFacebookUtils/Resources/Localizable.strings b/ParseFacebookUtils/ParseFacebookUtils/Resources/Localizable.strings deleted file mode 100644 index e69de29bb..000000000 diff --git a/ParseFacebookUtils/ParseFacebookUtils/Source/PFFacebookAuthenticationProvider.h b/ParseFacebookUtils/ParseFacebookUtils/Source/PFFacebookAuthenticationProvider.h deleted file mode 100644 index be60f8159..000000000 --- a/ParseFacebookUtils/ParseFacebookUtils/Source/PFFacebookAuthenticationProvider.h +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import -#import - -#if __has_include() -#import -#else -#import "BFTask.h" -#endif - -@import ParseCore; - -NS_ASSUME_NONNULL_BEGIN - -extern NSString *const PFFacebookUserAuthenticationType; - -@interface PFFacebookAuthenticationProvider : NSObject - -///-------------------------------------- -/// @name Init -///-------------------------------------- - -- (instancetype)init NS_UNAVAILABLE; -+ (instancetype)new NS_UNAVAILABLE; - -- (instancetype)initWithApplication:(UIApplication *)application - launchOptions:(nullable NSDictionary *)launchOptions NS_DESIGNATED_INITIALIZER; -+ (instancetype)providerWithApplication:(UIApplication *)application - launchOptions:(nullable NSDictionary *)launchOptions;; - -///-------------------------------------- -/// @name Authenticate -///-------------------------------------- - -- (BFTask*> *)authenticateAsyncWithReadPermissions:(nullable NSArray *)readPermissions - publishPermissions:(nullable NSArray *)publishPermissions; -- (BFTask*> *)authenticateAsyncWithReadPermissions:(nullable NSArray *)readPermissions - publishPermissions:(nullable NSArray *)publishPermissions - fromViewComtroller:(UIViewController *)viewController; - -@end - -NS_ASSUME_NONNULL_END diff --git a/ParseFacebookUtils/ParseFacebookUtils/Source/PFFacebookAuthenticationProvider.m b/ParseFacebookUtils/ParseFacebookUtils/Source/PFFacebookAuthenticationProvider.m deleted file mode 100644 index de5dc51ef..000000000 --- a/ParseFacebookUtils/ParseFacebookUtils/Source/PFFacebookAuthenticationProvider.m +++ /dev/null @@ -1,77 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "PFFacebookAuthenticationProvider.h" - -#import - -#import "PFFacebookUtils.h" - -NSString *const PFFacebookUserAuthenticationType = @"facebook"; - -@implementation PFFacebookAuthenticationProvider - -///-------------------------------------- -#pragma mark - Init -///-------------------------------------- - -- (instancetype)initWithApplication:(UIApplication *)application - launchOptions:(nullable NSDictionary *)launchOptions { - self = [super init]; - if (!self) return self; - - [[FBSDKApplicationDelegate sharedInstance] application:[UIApplication sharedApplication] - didFinishLaunchingWithOptions:launchOptions]; - - return self; -} - -+ (instancetype)providerWithApplication:(UIApplication *)application - launchOptions:(nullable NSDictionary *)launchOptions { - return [[self alloc] initWithApplication:application launchOptions:launchOptions]; -} - -///-------------------------------------- -#pragma mark - Authenticate -///-------------------------------------- - -- (BFTask*> *)authenticateAsyncWithReadPermissions:(nullable NSArray *)readPermissions - publishPermissions:(nullable NSArray *)publishPermissions { - return [self authenticateAsyncWithReadPermissions:readPermissions - publishPermissions:publishPermissions - fromViewComtroller:[PFFacebookUtils applicationTopViewController]]; -} - -- (BFTask*> *)authenticateAsyncWithReadPermissions:(nullable NSArray *)readPermissions - publishPermissions:(nullable NSArray *)publishPermissions - fromViewComtroller:(UIViewController *)viewController { - return [BFTask taskWithError:[NSError pffb_invalidFacebookSessionError]]; -} - -///-------------------------------------- -#pragma mark - PFUserAuthenticationDelegate -///-------------------------------------- - -- (BOOL)restoreAuthenticationWithAuthData:(nullable NSDictionary *)authData { - FBSDKAccessToken *token = [PFFacebookUtils facebookAccessTokenFromUserAuthenticationData:authData]; - if (!token) { - return !authData; // Only deauthenticate if authData was nil, otherwise - return failure (`NO`). - } - - FBSDKAccessToken *currentToken = [FBSDKAccessToken currentAccessToken]; - // Do not reset the current token if we have the same token already set. - if (![currentToken.userID isEqualToString:token.userID] || - ![currentToken.tokenString isEqualToString:token.tokenString]) { - [FBSDKAccessToken setCurrentAccessToken:token]; - } - - return YES; -} - -@end diff --git a/ParseFacebookUtils/ParseFacebookUtils/Source/PFFacebookUtils.h b/ParseFacebookUtils/ParseFacebookUtils/Source/PFFacebookUtils.h deleted file mode 100644 index cded596a0..000000000 --- a/ParseFacebookUtils/ParseFacebookUtils/Source/PFFacebookUtils.h +++ /dev/null @@ -1,288 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import - -#if __has_include() -#import -#else -#import "BFTask.h" -#endif - -@import ParseCore; - -#import -#import "PFFacebookAuthenticationProvider.h" - -NS_ASSUME_NONNULL_BEGIN - -static PFFacebookAuthenticationProvider *authenticationProvider_; - -/** - The `PFFacebookUtils` class provides utility functions for using Facebook authentication with `PFUser`s. - - @warning This class supports official Facebook iOS SDK v4.0+ and is available only on iOS. - */ -@interface PFFacebookUtils : NSObject - -+ (UIViewController *)applicationTopViewController; - -///-------------------------------------- -/// @name User Authentication Data -///-------------------------------------- - -+ (NSDictionary *)userAuthenticationDataWithFacebookUserId:(NSString *)userId - accessToken:(NSString *)accessToken - expirationDate:(NSDate *)expirationDate; -+ (nullable NSDictionary *)userAuthenticationDataFromAccessToken:(FBSDKAccessToken *)token; - -+ (nullable FBSDKAccessToken *)facebookAccessTokenFromUserAuthenticationData:(nullable NSDictionary *)authData; - - -///-------------------------------------- -#pragma mark - Authentication Provider -///-------------------------------------- - -+ (void)_assertFacebookInitialized; - -+ (PFFacebookAuthenticationProvider *)_authenticationProvider; - -+ (void)_setAuthenticationProvider:(PFFacebookAuthenticationProvider *)provider; -///-------------------------------------- -/// @name Logging In -///-------------------------------------- - -/** - *Asynchronously* logs in a user using Facebook with read permissions. - - This method delegates to the Facebook SDK to authenticate the user, - and then automatically logs in (or creates, in the case where it is a new user) a `PFUser`. - - @param permissions Array of read permissions to use. - - @return The task that has will a have `result` set to `PFUser` if operation succeeds. - */ -+ (BFTask *)logInInBackgroundWithReadPermissions:(nullable NSArray *)permissions; - -/** - *Asynchronously* logs in a user using Facebook with read permissions. - - This method delegates to the Facebook SDK to authenticate the user, - and then automatically logs in (or creates, in the case where it is a new user) a `PFUser`. - - @param permissions Array of read permissions to use. - @param block The block to execute when the log in completes. - It should have the following signature: `^(PFUser *user, NSError *error)`. - */ -+ (void)logInInBackgroundWithReadPermissions:(nullable NSArray *)permissions - block:(nullable PFUserResultBlock)block; - -/** - *Asynchronously* logs in a user using Facebook with publish permissions. - - This method delegates to the Facebook SDK to authenticate the user, - and then automatically logs in (or creates, in the case where it is a new user) a `PFUser`. - - @param permissions Array of publish permissions to use. - - @return The task that has will a have `result` set to `PFUser` if operation succeeds. - */ -+ (BFTask *)logInInBackgroundWithPublishPermissions:(nullable NSArray *)permissions; - -/** - *Asynchronously* logs in a user using Facebook with publish permissions. - - This method delegates to the Facebook SDK to authenticate the user, - and then automatically logs in (or creates, in the case where it is a new user) a `PFUser`. - - @param permissions Array of publish permissions to use. - @param block The block to execute when the log in completes. - It should have the following signature: `^(PFUser *user, NSError *error)`. - */ -+ (void)logInInBackgroundWithPublishPermissions:(nullable NSArray *)permissions - block:(nullable PFUserResultBlock)block; - -/** - *Asynchronously* logs in a user using given Facebook Acess Token. - - This method delegates to the Facebook SDK to authenticate the user, - and then automatically logs in (or creates, in the case where it is a new user) a `PFUser`. - - @param accessToken An instance of `FBSDKAccessToken` to use when logging in. - - @return The task that has will a have `result` set to `PFUser` if operation succeeds. - */ -+ (BFTask *)logInInBackgroundWithAccessToken:(FBSDKAccessToken *)accessToken; - -/** - *Asynchronously* logs in a user using given Facebook Acess Token. - - This method delegates to the Facebook SDK to authenticate the user, - and then automatically logs in (or creates, in the case where it is a new user) a `PFUser`. - - @param accessToken An instance of `FBSDKAccessToken` to use when logging in. - @param block The block to execute when the log in completes. - It should have the following signature: `^(PFUser *user, NSError *error)`. - */ -+ (void)logInInBackgroundWithAccessToken:(FBSDKAccessToken *)accessToken - block:(nullable PFUserResultBlock)block; - -///-------------------------------------- -/// @name Linking Users -///-------------------------------------- - -/** - *Asynchronously* links Facebook with read permissions to an existing `PFUser`. - - This method delegates to the Facebook SDK to authenticate - the user, and then automatically links the account to the `PFUser`. - It will also save any unsaved changes that were made to the `user`. - - @param user User to link to Facebook. - @param permissions Array of read permissions to use when logging in with Facebook. - - @return The task that will have a `result` set to `@YES` if operation succeeds. - */ -+ (BFTask *)linkUserInBackground:(PFUser *)user - withReadPermissions:(nullable NSArray *)permissions; - -/** - *Asynchronously* links Facebook with read permissions to an existing `PFUser`. - - This method delegates to the Facebook SDK to authenticate - the user, and then automatically links the account to the `PFUser`. - It will also save any unsaved changes that were made to the `user`. - - @param user User to link to Facebook. - @param permissions Array of read permissions to use. - @param block The block to execute when the linking completes. - It should have the following signature: `^(BOOL succeeded, NSError *error)`. - */ -+ (void)linkUserInBackground:(PFUser *)user - withReadPermissions:(nullable NSArray *)permissions - block:(nullable PFBooleanResultBlock)block; - -/** - *Asynchronously* links Facebook with publish permissions to an existing `PFUser`. - - This method delegates to the Facebook SDK to authenticate - the user, and then automatically links the account to the `PFUser`. - It will also save any unsaved changes that were made to the `user`. - - @param user User to link to Facebook. - @param permissions Array of publish permissions to use. - - @return The task that will have a `result` set to `@YES` if operation succeeds. - */ -+ (BFTask *)linkUserInBackground:(PFUser *)user - withPublishPermissions:(NSArray *)permissions; - -/** - *Asynchronously* links Facebook with publish permissions to an existing `PFUser`. - - This method delegates to the Facebook SDK to authenticate - the user, and then automatically links the account to the `PFUser`. - It will also save any unsaved changes that were made to the `user`. - - @param user User to link to Facebook. - @param permissions Array of publish permissions to use. - @param block The block to execute when the linking completes. - It should have the following signature: `^(BOOL succeeded, NSError *error)`. - */ -+ (void)linkUserInBackground:(PFUser *)user - withPublishPermissions:(NSArray *)permissions - block:(nullable PFBooleanResultBlock)block; - -/** - *Asynchronously* links Facebook Access Token to an existing `PFUser`. - - This method delegates to the Facebook SDK to authenticate - the user, and then automatically links the account to the `PFUser`. - It will also save any unsaved changes that were made to the `user`. - - @param user User to link to Facebook. - @param accessToken An instance of `FBSDKAccessToken` to use. - - @return The task that will have a `result` set to `@YES` if operation succeeds. - */ -+ (BFTask *)linkUserInBackground:(PFUser *)user withAccessToken:(FBSDKAccessToken *)accessToken; - -/** - *Asynchronously* links Facebook Access Token to an existing `PFUser`. - - This method delegates to the Facebook SDK to authenticate - the user, and then automatically links the account to the `PFUser`. - It will also save any unsaved changes that were made to the `user`. - - @param user User to link to Facebook. - @param accessToken An instance of `FBSDKAccessToken` to use. - @param block The block to execute when the linking completes. - It should have the following signature: `^(BOOL succeeded, NSError *error)`. - */ -+ (void)linkUserInBackground:(PFUser *)user - withAccessToken:(FBSDKAccessToken *)accessToken - block:(nullable PFBooleanResultBlock)block; - -///-------------------------------------- -/// @name Unlinking Users -///-------------------------------------- - -/** - Unlinks the `PFUser` from a Facebook account *asynchronously*. - - @param user User to unlink from Facebook. - @return The task, that encapsulates the work being done. - */ -+ (BFTask *)unlinkUserInBackground:(PFUser *)user; - -/** - Unlinks the `PFUser` from a Facebook account *asynchronously*. - - @param user User to unlink from Facebook. - @param block The block to execute. - It should have the following argument signature: `^(BOOL succeeded, NSError *error)`. - */ -+ (void)unlinkUserInBackground:(PFUser *)user block:(nullable PFBooleanResultBlock)block; - -///-------------------------------------- -/// @name Getting Linked State -///-------------------------------------- - -/** - Whether the user has their account linked to Facebook. - - @param user User to check for a facebook link. The user must be logged in on this device. - - @return `YES` if the user has their account linked to Facebook, otherwise `NO`. - */ -+ (BOOL)isLinkedWithUser:(PFUser *)user; - -@end - -@interface BFTask (ParseFacebookUtils) - -- (instancetype)pffb_continueWithMainThreadUserBlock:(PFUserResultBlock)block; -- (instancetype)pffb_continueWithMainThreadBooleanBlock:(PFBooleanResultBlock)block; -- (instancetype)pffb_continueWithMainThreadBlock:(BFContinuationBlock)block; - -@end - -@interface NSError (ParseFacebookUtils) - -+ (instancetype)pffb_invalidFacebookSessionError; - -@end - -@interface NSDateFormatter (ParseFacebookUtils) - -+ (instancetype)pffb_preciseDateFormatter; - -@end - -NS_ASSUME_NONNULL_END diff --git a/ParseFacebookUtils/ParseFacebookUtils/Source/PFFacebookUtils.m b/ParseFacebookUtils/ParseFacebookUtils/Source/PFFacebookUtils.m deleted file mode 100644 index a92bf555b..000000000 --- a/ParseFacebookUtils/ParseFacebookUtils/Source/PFFacebookUtils.m +++ /dev/null @@ -1,261 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "PFFacebookUtils.h" - -#if __has_include() -#import -#else -#import "BFExecutor.h" -#endif - -@import ParseCore; - -#import - -#import "PFFacebookAuthenticationProvider.h" - -@implementation PFFacebookUtils - -+ (UIViewController *)applicationTopViewController { - UIViewController *viewController = [UIApplication sharedApplication].keyWindow.rootViewController; - while (viewController.presentedViewController) { - viewController = viewController.presentedViewController; - } - return viewController; -} - -///-------------------------------------- -#pragma mark - User Authentication Data -///-------------------------------------- - -+ (NSDictionary *)userAuthenticationDataWithFacebookUserId:(NSString *)userId - accessToken:(NSString *)accessToken - expirationDate:(NSDate *)expirationDate { - return @{ @"id" : userId, - @"access_token" : accessToken, - @"expiration_date" : [[NSDateFormatter pffb_preciseDateFormatter] stringFromDate:expirationDate] }; -} - -+ (nullable NSDictionary *)userAuthenticationDataFromAccessToken:(FBSDKAccessToken *)token { - if (!token.userID || !token.tokenString || !token.expirationDate) { - return nil; - } - - return [self userAuthenticationDataWithFacebookUserId:token.userID - accessToken:token.tokenString - expirationDate:token.expirationDate]; -} - -+ (nullable FBSDKAccessToken *)facebookAccessTokenFromUserAuthenticationData:(nullable NSDictionary *)authData { - NSString *accessToken = authData[@"access_token"]; - NSString *expirationDateString = authData[@"expiration_date"]; - if (!accessToken || !expirationDateString) { - return nil; - } - -NSDate *expirationDate = [[NSDateFormatter pffb_preciseDateFormatter] dateFromString:expirationDateString]; - FBSDKAccessToken *token = [[FBSDKAccessToken alloc] initWithTokenString: accessToken permissions:@[] declinedPermissions:@[] expiredPermissions:@[] appID: FBSDKSettings.sharedSettings.appID userID: authData[@"id"] expirationDate: expirationDate refreshDate: nil dataAccessExpirationDate: nil]; - return token; -} - -///-------------------------------------- -#pragma mark - Authentication Provider -///-------------------------------------- - -+ (void)_assertFacebookInitialized { - if (!authenticationProvider_) { - [NSException raise:NSInternalInconsistencyException format:@"You must initialize PFFacebookUtils with a call to +initializeFacebookWithApplicationLaunchOptions"]; - } -} - -+ (PFFacebookAuthenticationProvider *)_authenticationProvider { - return authenticationProvider_; -} - -+ (void)_setAuthenticationProvider:(PFFacebookAuthenticationProvider *)provider { - authenticationProvider_ = provider; -} - -///-------------------------------------- -#pragma mark - Logging In -///-------------------------------------- - -+ (BFTask *)logInInBackgroundWithReadPermissions:(nullable NSArray *)permissions { - return [self _logInAsyncWithReadPermissions:permissions publishPermissions:nil]; -} - -+ (void)logInInBackgroundWithReadPermissions:(nullable NSArray *)permissions - block:(nullable PFUserResultBlock)block { - [[self logInInBackgroundWithReadPermissions:permissions] pffb_continueWithMainThreadUserBlock:block]; -} - -+ (BFTask *)logInInBackgroundWithPublishPermissions:(nullable NSArray *)permissions { - return [self _logInAsyncWithReadPermissions:nil publishPermissions:permissions]; -} - -+ (void)logInInBackgroundWithPublishPermissions:(nullable NSArray *)permissions - block:(nullable PFUserResultBlock)block { - [[self logInInBackgroundWithPublishPermissions:permissions] pffb_continueWithMainThreadUserBlock:block]; -} - -+ (BFTask *)_logInAsyncWithReadPermissions:(NSArray *)readPermissions - publishPermissions:(NSArray *)publishPermissions { - [self _assertFacebookInitialized]; - - PFFacebookAuthenticationProvider *provider = [self _authenticationProvider]; - return [[provider authenticateAsyncWithReadPermissions:readPermissions - publishPermissions:publishPermissions] continueWithSuccessBlock:^id(BFTask *task) { - return [PFUser logInWithAuthTypeInBackground:PFFacebookUserAuthenticationType authData:task.result]; - }]; -} - -+ (BFTask *)logInInBackgroundWithAccessToken:(FBSDKAccessToken *)accessToken { - [self _assertFacebookInitialized]; - - NSDictionary *authData = [PFFacebookUtils userAuthenticationDataFromAccessToken:accessToken]; - if (!authData) { - return [BFTask taskWithError:[NSError pffb_invalidFacebookSessionError]]; - } - return [[PFUser logInWithAuthTypeInBackground:PFFacebookUserAuthenticationType - authData:authData] continueWithSuccessBlock:^id(BFTask *task) { - [FBSDKAccessToken setCurrentAccessToken:accessToken]; - return task; // Return the same result. - }]; -} - -+ (void)logInInBackgroundWithAccessToken:(FBSDKAccessToken *)accessToken - block:(nullable PFUserResultBlock)block { - [[self logInInBackgroundWithAccessToken:accessToken] pffb_continueWithMainThreadUserBlock:block]; -} - -///-------------------------------------- -#pragma mark - Linking Users -///-------------------------------------- - -+ (BFTask *)linkUserInBackground:(PFUser *)user - withReadPermissions:(nullable NSArray *)permissions { - return [self _linkUserAsync:user withReadPermissions:permissions publishPermissions:nil]; -} - -+ (void)linkUserInBackground:(PFUser *)user - withReadPermissions:(nullable NSArray *)permissions - block:(nullable PFBooleanResultBlock)block { - [[self linkUserInBackground:user withReadPermissions:permissions] pffb_continueWithMainThreadBooleanBlock:block]; -} - -+ (BFTask *)linkUserInBackground:(PFUser *)user - withPublishPermissions:(NSArray *)permissions { - return [self _linkUserAsync:user withReadPermissions:nil publishPermissions:permissions]; -} - -+ (void)linkUserInBackground:(PFUser *)user - withPublishPermissions:(NSArray *)permissions - block:(nullable PFBooleanResultBlock)block { - [[self linkUserInBackground:user withPublishPermissions:permissions] pffb_continueWithMainThreadBooleanBlock:block]; -} - -+ (BFTask *)linkUserInBackground:(PFUser *)user withAccessToken:(FBSDKAccessToken *)accessToken { - [self _assertFacebookInitialized]; - - NSDictionary *authData = [PFFacebookUtils userAuthenticationDataFromAccessToken:accessToken]; - if (!authData) { - return [BFTask taskWithError:[NSError pffb_invalidFacebookSessionError]]; - } - return [user linkWithAuthTypeInBackground:PFFacebookUserAuthenticationType authData:authData]; -} - -+ (void)linkUserInBackground:(PFUser *)user - withAccessToken:(FBSDKAccessToken *)accessToken - block:(nullable PFBooleanResultBlock)block { - [[self linkUserInBackground:user withAccessToken:accessToken] pffb_continueWithMainThreadBooleanBlock:block]; -} - -+ (BFTask *)_linkUserAsync:(PFUser *)user - withReadPermissions:(nullable NSArray *)readPermissions - publishPermissions:(nullable NSArray *)publishPermissions { - [self _assertFacebookInitialized]; - - PFFacebookAuthenticationProvider *authenticationProvider = [self _authenticationProvider]; - return [[authenticationProvider authenticateAsyncWithReadPermissions:readPermissions - publishPermissions:publishPermissions] continueWithSuccessBlock:^id(BFTask *task) { - return [user linkWithAuthTypeInBackground:PFFacebookUserAuthenticationType authData:task.result]; - }]; -} - -///-------------------------------------- -#pragma mark - Unlinking -///-------------------------------------- - -+ (BFTask *)unlinkUserInBackground:(PFUser *)user { - [self _assertFacebookInitialized]; - return [user unlinkWithAuthTypeInBackground:PFFacebookUserAuthenticationType]; -} - -+ (void)unlinkUserInBackground:(PFUser *)user block:(nullable PFBooleanResultBlock)block { - [[self unlinkUserInBackground:user] pffb_continueWithMainThreadBooleanBlock:block]; -} - -///-------------------------------------- -#pragma mark - Getting Linked State -///-------------------------------------- - -+ (BOOL)isLinkedWithUser:(PFUser *)user { - return [user isLinkedWithAuthType:PFFacebookUserAuthenticationType]; -} - -@end - -@implementation BFTask (ParseFacebookUtils) - -- (instancetype)pffb_continueWithMainThreadUserBlock:(PFUserResultBlock)block { - return [self pffb_continueWithMainThreadBlock:^id(BFTask *task) { - if (block) { - block(task.result, task.error); - } - return nil; - }]; -} - -- (instancetype)pffb_continueWithMainThreadBooleanBlock:(PFBooleanResultBlock)block { - return [self pffb_continueWithMainThreadBlock:^id(BFTask *task) { - if (block) { - block([task.result boolValue], task.error); - } - return nil; - }]; -} - -- (instancetype)pffb_continueWithMainThreadBlock:(BFContinuationBlock)block { - return [self continueWithExecutor:[BFExecutor mainThreadExecutor] withBlock:block]; -} - -@end - -@implementation NSError (ParseFacebookUtils) - -+ (instancetype)pffb_invalidFacebookSessionError { - return [NSError errorWithDomain:PFParseErrorDomain - code:kPFErrorFacebookInvalidSession - userInfo:@{ NSLocalizedDescriptionKey : @"Supplied access token is missing required data." }]; -} - -@end - -@implementation NSDateFormatter (ParseFacebookUtils) - -+ (instancetype)pffb_preciseDateFormatter { - NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; - formatter.locale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"]; - formatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0]; - formatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"; - return formatter; -} - -@end diff --git a/ParseFacebookUtils/ParseFacebookUtils/Source/ParseFacebookUtilsV4.h b/ParseFacebookUtils/ParseFacebookUtils/Source/ParseFacebookUtilsV4.h deleted file mode 100644 index e23d38cd7..000000000 --- a/ParseFacebookUtils/ParseFacebookUtils/Source/ParseFacebookUtilsV4.h +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "PFFacebookUtils.h" -#import "PFFacebookAuthenticationProvider.h" diff --git a/ParseFacebookUtilsTvOs/.gitignore b/ParseFacebookUtilsTvOs/.gitignore deleted file mode 100644 index f4096fee4..000000000 --- a/ParseFacebookUtilsTvOs/.gitignore +++ /dev/null @@ -1 +0,0 @@ -Package.resolved diff --git a/ParseFacebookUtilsTvOs/Configurations/ParseFacebookUtilsTvOS-Dynamic.xcconfig b/ParseFacebookUtilsTvOs/Configurations/ParseFacebookUtilsTvOS-Dynamic.xcconfig deleted file mode 100644 index f5c6c1334..000000000 --- a/ParseFacebookUtilsTvOs/Configurations/ParseFacebookUtilsTvOS-Dynamic.xcconfig +++ /dev/null @@ -1,16 +0,0 @@ -// -// Copyright (c) 2015-present, Parse, LLC. -// All rights reserved. -// -// This source code is licensed under the BSD-style license found in the -// LICENSE file in the root directory of this source tree. An additional grant -// of patent rights can be found in the PATENTS file in the same directory. -// - -#include "Shared/Platform/tvOS.xcconfig" -#include "Shared/Product/DynamicFramework.xcconfig" - -PRODUCT_NAME = ParseFacebookUtilsTvOS -PRODUCT_BUNDLE_IDENTIFIER = com.parse.facebookutilstvos - -INFOPLIST_FILE = $(SRCROOT)/ParseFacebookUtilsTvOS/Resources/Info-tvOS.plist diff --git a/ParseFacebookUtilsTvOs/Configurations/ParseFacebookUtilsTvOS.xcconfig b/ParseFacebookUtilsTvOs/Configurations/ParseFacebookUtilsTvOS.xcconfig deleted file mode 100644 index 0ca6f91f0..000000000 --- a/ParseFacebookUtilsTvOs/Configurations/ParseFacebookUtilsTvOS.xcconfig +++ /dev/null @@ -1,16 +0,0 @@ -// -// Copyright (c) 2015-present, Parse, LLC. -// All rights reserved. -// -// This source code is licensed under the BSD-style license found in the -// LICENSE file in the root directory of this source tree. An additional grant -// of patent rights can be found in the PATENTS file in the same directory. -// - -#include "Shared/Platform/tvOS.xcconfig" -#include "Shared/Product/StaticFramework.xcconfig" - -PRODUCT_NAME = ParseFacebookUtilsTvOS -PRODUCT_BUNDLE_IDENTIFIER = com.parse.facebookutilstvos - -INFOPLIST_FILE = $(SRCROOT)/ParseFacebookUtilsTvOS/Resources/Info-tvOS.plist diff --git a/ParseFacebookUtilsTvOs/Configurations/Shared b/ParseFacebookUtilsTvOs/Configurations/Shared deleted file mode 120000 index 657caabf0..000000000 --- a/ParseFacebookUtilsTvOs/Configurations/Shared +++ /dev/null @@ -1 +0,0 @@ -../../Vendor/xctoolchain/Configurations \ No newline at end of file diff --git a/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS.xcodeproj/project.pbxproj b/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS.xcodeproj/project.pbxproj deleted file mode 100644 index 0ef4ee9ac..000000000 --- a/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS.xcodeproj/project.pbxproj +++ /dev/null @@ -1,524 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 52; - objects = { - -/* Begin PBXBuildFile section */ - 39E248DC2AD1C4120014357C /* ParseFacebookUtils in Frameworks */ = {isa = PBXBuildFile; productRef = 39E248DB2AD1C4120014357C /* ParseFacebookUtils */; }; - 39E248DE2AD1C43A0014357C /* ParseObjC in Frameworks */ = {isa = PBXBuildFile; productRef = 39E248DD2AD1C43A0014357C /* ParseObjC */; }; - 39E248E02AD1C49D0014357C /* ParseFacebookUtilsTvOS in Frameworks */ = {isa = PBXBuildFile; productRef = 39E248DF2AD1C49D0014357C /* ParseFacebookUtilsTvOS */; }; - 7C5F7FB129212AAD0035B219 /* PFFacebookDeviceAuthenticationProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C5F7FAF29212A9F0035B219 /* PFFacebookDeviceAuthenticationProvider.h */; }; - 7C5F7FB229212AAD0035B219 /* PFFacebookDeviceAuthenticationProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C5F7FB029212A9F0035B219 /* PFFacebookDeviceAuthenticationProvider.m */; }; - 7C5F7FB329212AAD0035B219 /* PFFacebookUtilsDevice.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C5F7FAA29212A9F0035B219 /* PFFacebookUtilsDevice.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C5F7FB429212AAD0035B219 /* PFFacebookUtilsDevice.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C5F7FAC29212A9F0035B219 /* PFFacebookUtilsDevice.m */; }; - 7C5F7FB529212AAD0035B219 /* ParseFacebookUtilsTvOS.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C5F7FAB29212A9F0035B219 /* ParseFacebookUtilsTvOS.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C5F7FB629212AAE0035B219 /* PFFacebookDeviceAuthenticationProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C5F7FAF29212A9F0035B219 /* PFFacebookDeviceAuthenticationProvider.h */; }; - 7C5F7FB729212AAE0035B219 /* PFFacebookDeviceAuthenticationProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C5F7FB029212A9F0035B219 /* PFFacebookDeviceAuthenticationProvider.m */; }; - 7C5F7FB829212AAE0035B219 /* PFFacebookUtilsDevice.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C5F7FAA29212A9F0035B219 /* PFFacebookUtilsDevice.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C5F7FB929212AAE0035B219 /* PFFacebookUtilsDevice.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C5F7FAC29212A9F0035B219 /* PFFacebookUtilsDevice.m */; }; - 7C5F7FBA29212AAE0035B219 /* ParseFacebookUtilsTvOS.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C5F7FAB29212A9F0035B219 /* ParseFacebookUtilsTvOS.h */; settings = {ATTRIBUTES = (Public, ); }; }; -/* End PBXBuildFile section */ - -/* Begin PBXCopyFilesBuildPhase section */ - BCCC20E4271F1BB3003C9D03 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 39E248D82AD1C3F40014357C /* Parse-SDK-iOS-OSX */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = "Parse-SDK-iOS-OSX"; path = ..; sourceTree = ""; }; - 4AAEAA90200C022300AA7479 /* ParseFacebookUtilsTvOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ParseFacebookUtilsTvOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 4AAEAA93200C026300AA7479 /* ParseFacebookUtilsTvOS-Dynamic.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "ParseFacebookUtilsTvOS-Dynamic.xcconfig"; sourceTree = ""; }; - 7C5F7FA729212A9F0035B219 /* Localizable.strings */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; path = Localizable.strings; sourceTree = ""; }; - 7C5F7FA829212A9F0035B219 /* Info-tvOS.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Info-tvOS.plist"; sourceTree = ""; }; - 7C5F7FAA29212A9F0035B219 /* PFFacebookUtilsDevice.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFFacebookUtilsDevice.h; sourceTree = ""; }; - 7C5F7FAB29212A9F0035B219 /* ParseFacebookUtilsTvOS.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ParseFacebookUtilsTvOS.h; sourceTree = ""; }; - 7C5F7FAC29212A9F0035B219 /* PFFacebookUtilsDevice.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFFacebookUtilsDevice.m; sourceTree = ""; }; - 7C5F7FAF29212A9F0035B219 /* PFFacebookDeviceAuthenticationProvider.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFFacebookDeviceAuthenticationProvider.h; sourceTree = ""; }; - 7C5F7FB029212A9F0035B219 /* PFFacebookDeviceAuthenticationProvider.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFFacebookDeviceAuthenticationProvider.m; sourceTree = ""; }; - 8121EA9F1D39862400AC0B02 /* Common.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Common.xcconfig; sourceTree = ""; }; - 8121EAA11D39862400AC0B02 /* iOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = iOS.xcconfig; sourceTree = ""; }; - 8121EAA21D39862400AC0B02 /* macOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = macOS.xcconfig; sourceTree = ""; }; - 8121EAA31D39862400AC0B02 /* tvOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = tvOS.xcconfig; sourceTree = ""; }; - 8121EAA41D39862400AC0B02 /* watchOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = watchOS.xcconfig; sourceTree = ""; }; - 8121EAA61D39862400AC0B02 /* Application.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Application.xcconfig; sourceTree = ""; }; - 8121EAA71D39862400AC0B02 /* DynamicFramework.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = DynamicFramework.xcconfig; sourceTree = ""; }; - 8121EAA81D39862400AC0B02 /* LogicTests.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = LogicTests.xcconfig; sourceTree = ""; }; - 8121EAA91D39862400AC0B02 /* StaticFramework.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = StaticFramework.xcconfig; sourceTree = ""; }; - 8121EAAB1D39862400AC0B02 /* Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - 8121EAAC1D39862400AC0B02 /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 8121EAAD1D39862400AC0B02 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; - 81FE7F721C1778FC00E6BD34 /* ParseFacebookUtilsTvOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = ParseFacebookUtilsTvOS.xcconfig; sourceTree = ""; }; - 81FE7F8B1C17790400E6BD34 /* ParseFacebookUtilsTvOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ParseFacebookUtilsTvOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 4AAEAA86200C022300AA7479 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 81FE7F811C17790400E6BD34 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 39E248DE2AD1C43A0014357C /* ParseObjC in Frameworks */, - 39E248DC2AD1C4120014357C /* ParseFacebookUtils in Frameworks */, - 39E248E02AD1C49D0014357C /* ParseFacebookUtilsTvOS in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 034768DFFF38A50411DB9C8B /* Products */ = { - isa = PBXGroup; - children = ( - 81FE7F8B1C17790400E6BD34 /* ParseFacebookUtilsTvOS.framework */, - 4AAEAA90200C022300AA7479 /* ParseFacebookUtilsTvOS.framework */, - ); - name = Products; - sourceTree = ""; - }; - 0867D691FE84028FC02AAC07 /* Breakpad */ = { - isa = PBXGroup; - children = ( - 39E248D72AD1C3F40014357C /* Packages */, - F52CD63A1B58383C0051AB86 /* Configurations */, - 7C5F7FA529212A9F0035B219 /* ParseFacebookUtilsTvOS */, - 0867D69AFE84028FC02AAC07 /* Frameworks */, - 034768DFFF38A50411DB9C8B /* Products */, - ); - indentWidth = 4; - name = Breakpad; - sourceTree = ""; - }; - 0867D69AFE84028FC02AAC07 /* Frameworks */ = { - isa = PBXGroup; - children = ( - ); - name = Frameworks; - sourceTree = ""; - }; - 39E248D72AD1C3F40014357C /* Packages */ = { - isa = PBXGroup; - children = ( - 39E248D82AD1C3F40014357C /* Parse-SDK-iOS-OSX */, - ); - name = Packages; - sourceTree = ""; - }; - 7C5F7FA529212A9F0035B219 /* ParseFacebookUtilsTvOS */ = { - isa = PBXGroup; - children = ( - 7C5F7FA629212A9F0035B219 /* Resources */, - 7C5F7FA929212A9F0035B219 /* Source */, - 7C5F7FAD29212A9F0035B219 /* Internal */, - ); - path = ParseFacebookUtilsTvOS; - sourceTree = ""; - }; - 7C5F7FA629212A9F0035B219 /* Resources */ = { - isa = PBXGroup; - children = ( - 7C5F7FA729212A9F0035B219 /* Localizable.strings */, - 7C5F7FA829212A9F0035B219 /* Info-tvOS.plist */, - ); - path = Resources; - sourceTree = ""; - }; - 7C5F7FA929212A9F0035B219 /* Source */ = { - isa = PBXGroup; - children = ( - 7C5F7FAA29212A9F0035B219 /* PFFacebookUtilsDevice.h */, - 7C5F7FAB29212A9F0035B219 /* ParseFacebookUtilsTvOS.h */, - 7C5F7FAC29212A9F0035B219 /* PFFacebookUtilsDevice.m */, - ); - path = Source; - sourceTree = ""; - }; - 7C5F7FAD29212A9F0035B219 /* Internal */ = { - isa = PBXGroup; - children = ( - 7C5F7FAE29212A9F0035B219 /* AuthenticationProvider */, - ); - path = Internal; - sourceTree = ""; - }; - 7C5F7FAE29212A9F0035B219 /* AuthenticationProvider */ = { - isa = PBXGroup; - children = ( - 7C5F7FAF29212A9F0035B219 /* PFFacebookDeviceAuthenticationProvider.h */, - 7C5F7FB029212A9F0035B219 /* PFFacebookDeviceAuthenticationProvider.m */, - ); - path = AuthenticationProvider; - sourceTree = ""; - }; - 8121EA9E1D39862400AC0B02 /* Shared */ = { - isa = PBXGroup; - children = ( - 8121EA9F1D39862400AC0B02 /* Common.xcconfig */, - 8121EAA01D39862400AC0B02 /* Platform */, - 8121EAA51D39862400AC0B02 /* Product */, - 8121EAAA1D39862400AC0B02 /* Project */, - 8121EAAD1D39862400AC0B02 /* Warnings.xcconfig */, - ); - path = Shared; - sourceTree = ""; - }; - 8121EAA01D39862400AC0B02 /* Platform */ = { - isa = PBXGroup; - children = ( - 8121EAA11D39862400AC0B02 /* iOS.xcconfig */, - 8121EAA21D39862400AC0B02 /* macOS.xcconfig */, - 8121EAA31D39862400AC0B02 /* tvOS.xcconfig */, - 8121EAA41D39862400AC0B02 /* watchOS.xcconfig */, - ); - path = Platform; - sourceTree = ""; - }; - 8121EAA51D39862400AC0B02 /* Product */ = { - isa = PBXGroup; - children = ( - 8121EAA61D39862400AC0B02 /* Application.xcconfig */, - 8121EAA71D39862400AC0B02 /* DynamicFramework.xcconfig */, - 8121EAA81D39862400AC0B02 /* LogicTests.xcconfig */, - 8121EAA91D39862400AC0B02 /* StaticFramework.xcconfig */, - ); - path = Product; - sourceTree = ""; - }; - 8121EAAA1D39862400AC0B02 /* Project */ = { - isa = PBXGroup; - children = ( - 8121EAAB1D39862400AC0B02 /* Debug.xcconfig */, - 8121EAAC1D39862400AC0B02 /* Release.xcconfig */, - ); - path = Project; - sourceTree = ""; - }; - F52CD63A1B58383C0051AB86 /* Configurations */ = { - isa = PBXGroup; - children = ( - 81FE7F721C1778FC00E6BD34 /* ParseFacebookUtilsTvOS.xcconfig */, - 4AAEAA93200C026300AA7479 /* ParseFacebookUtilsTvOS-Dynamic.xcconfig */, - 8121EA9E1D39862400AC0B02 /* Shared */, - ); - path = Configurations; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - 4AAEAA7A200C022300AA7479 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C5F7FB829212AAE0035B219 /* PFFacebookUtilsDevice.h in Headers */, - 7C5F7FB629212AAE0035B219 /* PFFacebookDeviceAuthenticationProvider.h in Headers */, - 7C5F7FBA29212AAE0035B219 /* ParseFacebookUtilsTvOS.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 81FE7F761C17790400E6BD34 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C5F7FB329212AAD0035B219 /* PFFacebookUtilsDevice.h in Headers */, - 7C5F7FB129212AAD0035B219 /* PFFacebookDeviceAuthenticationProvider.h in Headers */, - 7C5F7FB529212AAD0035B219 /* ParseFacebookUtilsTvOS.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - 4AAEAA77200C022300AA7479 /* ParseFacebookUtilsTvOS-Dynamic */ = { - isa = PBXNativeTarget; - buildConfigurationList = 4AAEAA8D200C022300AA7479 /* Build configuration list for PBXNativeTarget "ParseFacebookUtilsTvOS-Dynamic" */; - buildPhases = ( - 4AAEAA7A200C022300AA7479 /* Headers */, - 4AAEAA81200C022300AA7479 /* Sources */, - 4AAEAA86200C022300AA7479 /* Frameworks */, - 4AAEAA8B200C022300AA7479 /* Resources */, - BCCC20E4271F1BB3003C9D03 /* Embed Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "ParseFacebookUtilsTvOS-Dynamic"; - packageProductDependencies = ( - ); - productName = Breakpad; - productReference = 4AAEAA90200C022300AA7479 /* ParseFacebookUtilsTvOS.framework */; - productType = "com.apple.product-type.framework"; - }; - 81FE7F731C17790400E6BD34 /* ParseFacebookUtilsTvOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 81FE7F881C17790400E6BD34 /* Build configuration list for PBXNativeTarget "ParseFacebookUtilsTvOS" */; - buildPhases = ( - 81FE7F761C17790400E6BD34 /* Headers */, - 81FE7F7D1C17790400E6BD34 /* Sources */, - 81FE7F811C17790400E6BD34 /* Frameworks */, - 81FE7F861C17790400E6BD34 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = ParseFacebookUtilsTvOS; - packageProductDependencies = ( - 39E248DB2AD1C4120014357C /* ParseFacebookUtils */, - 39E248DD2AD1C43A0014357C /* ParseObjC */, - 39E248DF2AD1C49D0014357C /* ParseFacebookUtilsTvOS */, - ); - productName = Breakpad; - productReference = 81FE7F8B1C17790400E6BD34 /* ParseFacebookUtilsTvOS.framework */; - productType = "com.apple.product-type.framework"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 0867D690FE84028FC02AAC07 /* Project object */ = { - isa = PBXProject; - attributes = { - CLASSPREFIX = PF; - LastUpgradeCheck = 0920; - ORGANIZATIONNAME = "Parse, LLC"; - TargetAttributes = { - 4AAEAA77200C022300AA7479 = { - LastSwiftMigration = 1410; - }; - }; - }; - buildConfigurationList = 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "ParseFacebookUtilsTvOS" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = en; - hasScannedForEncodings = 1; - knownRegions = ( - da, - de, - es, - fr, - it, - ja, - nl, - no, - sl, - sv, - tr, - en, - Base, - ); - mainGroup = 0867D691FE84028FC02AAC07 /* Breakpad */; - packageReferences = ( - ); - productRefGroup = 034768DFFF38A50411DB9C8B /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 81FE7F731C17790400E6BD34 /* ParseFacebookUtilsTvOS */, - 4AAEAA77200C022300AA7479 /* ParseFacebookUtilsTvOS-Dynamic */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 4AAEAA8B200C022300AA7479 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 81FE7F861C17790400E6BD34 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 4AAEAA81200C022300AA7479 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C5F7FB729212AAE0035B219 /* PFFacebookDeviceAuthenticationProvider.m in Sources */, - 7C5F7FB929212AAE0035B219 /* PFFacebookUtilsDevice.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 81FE7F7D1C17790400E6BD34 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C5F7FB229212AAD0035B219 /* PFFacebookDeviceAuthenticationProvider.m in Sources */, - 7C5F7FB429212AAD0035B219 /* PFFacebookUtilsDevice.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 1DEB922308733DC00010E9CD /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 8121EAAB1D39862400AC0B02 /* Debug.xcconfig */; - buildSettings = { - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_ENABLE_CODE_COVERAGE = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - PARSE_DIR = "$(PROJECT_DIR)/.."; - }; - name = Debug; - }; - 1DEB922408733DC00010E9CD /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 8121EAAC1D39862400AC0B02 /* Release.xcconfig */; - buildSettings = { - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_ENABLE_CODE_COVERAGE = NO; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - PARSE_DIR = "$(PROJECT_DIR)/.."; - }; - name = Release; - }; - 4AAEAA8E200C022300AA7479 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 4AAEAA93200C026300AA7479 /* ParseFacebookUtilsTvOS-Dynamic.xcconfig */; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD)"; - CLANG_ENABLE_MODULES = YES; - CLANG_MODULES_AUTOLINK = YES; - DEFINES_MODULE = YES; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - "@loader_path/Frameworks", - ); - SDKROOT = appletvos; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - TVOS_DEPLOYMENT_TARGET = 12.0; - }; - name = Debug; - }; - 4AAEAA8F200C022300AA7479 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 4AAEAA93200C026300AA7479 /* ParseFacebookUtilsTvOS-Dynamic.xcconfig */; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD)"; - CLANG_ENABLE_MODULES = YES; - CLANG_MODULES_AUTOLINK = YES; - DEFINES_MODULE = YES; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - "@loader_path/Frameworks", - ); - ONLY_ACTIVE_ARCH = YES; - SDKROOT = appletvos; - SWIFT_VERSION = 5.0; - TVOS_DEPLOYMENT_TARGET = 12.0; - }; - name = Release; - }; - 81FE7F891C17790400E6BD34 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 81FE7F721C1778FC00E6BD34 /* ParseFacebookUtilsTvOS.xcconfig */; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD)"; - CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - SDKROOT = appletvos; - TVOS_DEPLOYMENT_TARGET = 12.0; - }; - name = Debug; - }; - 81FE7F8A1C17790400E6BD34 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 81FE7F721C1778FC00E6BD34 /* ParseFacebookUtilsTvOS.xcconfig */; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD)"; - CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - SDKROOT = appletvos; - TVOS_DEPLOYMENT_TARGET = 12.0; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "ParseFacebookUtilsTvOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1DEB922308733DC00010E9CD /* Debug */, - 1DEB922408733DC00010E9CD /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 4AAEAA8D200C022300AA7479 /* Build configuration list for PBXNativeTarget "ParseFacebookUtilsTvOS-Dynamic" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 4AAEAA8E200C022300AA7479 /* Debug */, - 4AAEAA8F200C022300AA7479 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 81FE7F881C17790400E6BD34 /* Build configuration list for PBXNativeTarget "ParseFacebookUtilsTvOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 81FE7F891C17790400E6BD34 /* Debug */, - 81FE7F8A1C17790400E6BD34 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - -/* Begin XCSwiftPackageProductDependency section */ - 39E248DB2AD1C4120014357C /* ParseFacebookUtils */ = { - isa = XCSwiftPackageProductDependency; - productName = ParseFacebookUtils; - }; - 39E248DD2AD1C43A0014357C /* ParseObjC */ = { - isa = XCSwiftPackageProductDependency; - productName = ParseObjC; - }; - 39E248DF2AD1C49D0014357C /* ParseFacebookUtilsTvOS */ = { - isa = XCSwiftPackageProductDependency; - productName = ParseFacebookUtilsTvOS; - }; -/* End XCSwiftPackageProductDependency section */ - }; - rootObject = 0867D690FE84028FC02AAC07 /* Project object */; -} diff --git a/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a62..000000000 --- a/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d981003..000000000 --- a/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS.xcodeproj/xcshareddata/xcschemes/ParseFacebookUtilsTvOS-Dynamic.xcscheme b/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS.xcodeproj/xcshareddata/xcschemes/ParseFacebookUtilsTvOS-Dynamic.xcscheme deleted file mode 100644 index ce40e066b..000000000 --- a/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS.xcodeproj/xcshareddata/xcschemes/ParseFacebookUtilsTvOS-Dynamic.xcscheme +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS.xcodeproj/xcshareddata/xcschemes/ParseFacebookUtilsTvOS.xcscheme b/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS.xcodeproj/xcshareddata/xcschemes/ParseFacebookUtilsTvOS.xcscheme deleted file mode 100644 index fa31dd369..000000000 --- a/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS.xcodeproj/xcshareddata/xcschemes/ParseFacebookUtilsTvOS.xcscheme +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS/Internal/AuthenticationProvider/PFFacebookDeviceAuthenticationProvider.h b/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS/Internal/AuthenticationProvider/PFFacebookDeviceAuthenticationProvider.h deleted file mode 100644 index 0e2936014..000000000 --- a/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS/Internal/AuthenticationProvider/PFFacebookDeviceAuthenticationProvider.h +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import - -@import ParseFacebookUtils; - -@interface PFFacebookDeviceAuthenticationProvider : PFFacebookAuthenticationProvider - -@end diff --git a/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS/Internal/AuthenticationProvider/PFFacebookDeviceAuthenticationProvider.m b/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS/Internal/AuthenticationProvider/PFFacebookDeviceAuthenticationProvider.m deleted file mode 100644 index 1367ea7ab..000000000 --- a/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS/Internal/AuthenticationProvider/PFFacebookDeviceAuthenticationProvider.m +++ /dev/null @@ -1,96 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "PFFacebookDeviceAuthenticationProvider.h" - -#if __has_include() -#import -#import -#else -#import "BFExecutor.h" -#import "BFTaskCompletionSource.h" -#endif - -@import ParseFacebookUtils; - -#import -#import -#import - - -@interface PFFacebookDeviceAuthenticationProvider () { - BFTaskCompletionSource *_loginTaskCompletionSource; - FBSDKDeviceLoginViewController *_loginViewController; -} - -@end - -@implementation PFFacebookDeviceAuthenticationProvider - -///-------------------------------------- -#pragma mark - PFFacebookAuthenticationProvider -///-------------------------------------- - -- (BFTask*> *)authenticateAsyncWithReadPermissions:(nullable NSArray *)readPermissions - publishPermissions:(nullable NSArray *)publishPermissions - fromViewComtroller:(UIViewController *)viewController { - return [BFTask taskFromExecutor:[BFExecutor mainThreadExecutor] withBlock:^id _Nonnull{ - if (self->_loginTaskCompletionSource) { - return [NSError errorWithDomain:FBSDKErrorDomain - code:FBSDKErrorDialogUnavailable - userInfo:@{ NSLocalizedDescriptionKey : @"Another login attempt is already in progress." }]; - } - self->_loginTaskCompletionSource = [BFTaskCompletionSource taskCompletionSource]; - self-> _loginViewController = [[FBSDKDeviceLoginViewController alloc] init]; - self->_loginViewController.delegate = self; - NSArray *permissions = [readPermissions arrayByAddingObjectsFromArray:publishPermissions]; - self->_loginViewController.permissions = permissions; - - [viewController presentViewController:self->_loginViewController animated:YES completion:nil]; - - return self->_loginTaskCompletionSource.task; - }]; -} - -///-------------------------------------- -#pragma mark - PFUserAuthenticationDelegate -///-------------------------------------- - -- (BOOL)restoreAuthenticationWithAuthData:(nullable NSDictionary *)authData { - if (!authData) { - [FBSDKAccessToken setCurrentAccessToken:nil]; - } - return [super restoreAuthenticationWithAuthData:authData]; -} - -///-------------------------------------- -#pragma mark - FBSDKDeviceLoginViewController -///-------------------------------------- - -- (void)deviceLoginViewControllerDidCancel:(FBSDKDeviceLoginViewController *)viewController { - [_loginTaskCompletionSource trySetCancelled]; - _loginViewController = nil; - _loginTaskCompletionSource = nil; -} - -- (void)deviceLoginViewControllerDidFinish:(FBSDKDeviceLoginViewController *)viewController { - FBSDKAccessToken *accessToken = [FBSDKAccessToken currentAccessToken]; - NSDictionary *result = [PFFacebookUtils userAuthenticationDataFromAccessToken:accessToken]; - [_loginTaskCompletionSource trySetResult:result]; - _loginViewController = nil; - _loginTaskCompletionSource = nil; -} - -- (void)deviceLoginViewController:(FBSDKDeviceLoginViewController *)viewController didFailWithError:(NSError *)error { - [_loginTaskCompletionSource trySetError:error]; - _loginViewController = nil; - _loginTaskCompletionSource = nil; -} - -@end diff --git a/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS/Resources/Info-tvOS.plist b/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS/Resources/Info-tvOS.plist deleted file mode 100644 index 62c478826..000000000 --- a/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS/Resources/Info-tvOS.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleExecutable - ParseFacebookUtilsTvOS - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.19.4 - CFBundleSignature - ???? - CFBundleVersion - 1.19.4 - - diff --git a/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS/Resources/Localizable.strings b/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS/Resources/Localizable.strings deleted file mode 100644 index e69de29bb..000000000 diff --git a/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS/Source/PFFacebookUtilsDevice.h b/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS/Source/PFFacebookUtilsDevice.h deleted file mode 100644 index 6907fd3ea..000000000 --- a/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS/Source/PFFacebookUtilsDevice.h +++ /dev/null @@ -1,27 +0,0 @@ -// -// Header.h -// -// -// Created by Volodymyr Nazarkevych on 29.11.2022. -// -@import ParseFacebookUtils; - -@interface PFFacebookUtilsDevice : PFFacebookUtils - -///-------------------------------------- -/// @name Interacting With Facebook -///-------------------------------------- - -/** - Initializes Parse Facebook Utils. - - You must provide your Facebook application ID as the value for FacebookAppID in your bundle's plist file - as described here: https://developers.facebook.com/docs/getting-started/facebook-sdk-for-ios/ - - @warning You must invoke this in order to use the Facebook functionality in Parse. - - @param launchOptions The launchOptions as passed to [UIApplicationDelegate application:didFinishLaunchingWithOptions:]. - */ -+ (void)initializeFacebookWithApplicationLaunchOptions:(nullable NSDictionary *)launchOptions; - -@end diff --git a/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS/Source/PFFacebookUtilsDevice.m b/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS/Source/PFFacebookUtilsDevice.m deleted file mode 100644 index 24a48bbbe..000000000 --- a/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS/Source/PFFacebookUtilsDevice.m +++ /dev/null @@ -1,48 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "PFFacebookUtilsDevice.h" - -#if __has_include() -#import -#else -#import "BFExecutor.h" -#endif - -@import ParseCore; -@import ParseFacebookUtils; - -#import -#import "PFFacebookDeviceAuthenticationProvider.h" - -@implementation PFFacebookUtilsDevice - -///-------------------------------------- -#pragma mark - Interacting With Facebook -///-------------------------------------- - -+ (void)initializeFacebookWithApplicationLaunchOptions:(NSDictionary *)launchOptions { - if (![Parse currentConfiguration]) { - // TODO: (nlutsenko) Remove this when Parse SDK throws on every access to Parse._currentManager - [NSException raise:NSInternalInconsistencyException format:@"PFFacebookUtils must be initialized after initializing Parse."]; - } - if (!authenticationProvider_) { - Class providerClass = nil; - - providerClass = [PFFacebookDeviceAuthenticationProvider class]; - - PFFacebookAuthenticationProvider *provider = [providerClass providerWithApplication:[UIApplication sharedApplication] - launchOptions:launchOptions]; - [PFUser registerAuthenticationDelegate:provider forAuthType:PFFacebookUserAuthenticationType]; - - [self _setAuthenticationProvider:provider]; - } -} - -@end diff --git a/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS/Source/ParseFacebookUtilsTvOS.h b/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS/Source/ParseFacebookUtilsTvOS.h deleted file mode 100644 index f2602cc3d..000000000 --- a/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS/Source/ParseFacebookUtilsTvOS.h +++ /dev/null @@ -1,9 +0,0 @@ -// -// ParseFacebookUtils-tvOS.h -// ParseFacebookUtils-tvOS -// -// Created by Volodymyr Nazarkevych on 29.11.2022. -// Copyright © 2022 Parse, LLC. All rights reserved. -// - -#import "PFFacebookUtilsDevice.h" diff --git a/ParseFacebookUtilsiOS/.gitignore b/ParseFacebookUtilsiOS/.gitignore deleted file mode 100644 index f4096fee4..000000000 --- a/ParseFacebookUtilsiOS/.gitignore +++ /dev/null @@ -1 +0,0 @@ -Package.resolved diff --git a/ParseFacebookUtilsiOS/Configurations/ParseFacebookTestApplication.xcconfig b/ParseFacebookUtilsiOS/Configurations/ParseFacebookTestApplication.xcconfig deleted file mode 100644 index 20764fd98..000000000 --- a/ParseFacebookUtilsiOS/Configurations/ParseFacebookTestApplication.xcconfig +++ /dev/null @@ -1,16 +0,0 @@ -// -// Copyright (c) 2015-present, Parse, LLC. -// All rights reserved. -// -// This source code is licensed under the BSD-style license found in the -// LICENSE file in the root directory of this source tree. An additional grant -// of patent rights can be found in the PATENTS file in the same directory. -// - -#include "Shared/Platform/iOS.xcconfig" -#include "Shared/Product/Application.xcconfig" - -PRODUCT_NAME = ParseFacebookTestApplication -PRODUCT_BUNDLE_IDENTIFIER = com.parse.facebookutilsios.unit.app - -INFOPLIST_FILE = $(SRCROOT)/Tests/TestApplication/Resources/Info.plist diff --git a/ParseFacebookUtilsiOS/Configurations/ParseFacebookUtils-UnitTests.xcconfig b/ParseFacebookUtilsiOS/Configurations/ParseFacebookUtils-UnitTests.xcconfig deleted file mode 100644 index eb99bc9d3..000000000 --- a/ParseFacebookUtilsiOS/Configurations/ParseFacebookUtils-UnitTests.xcconfig +++ /dev/null @@ -1,19 +0,0 @@ -// -// Copyright (c) 2015-present, Parse, LLC. -// All rights reserved. -// -// This source code is licensed under the BSD-style license found in the -// LICENSE file in the root directory of this source tree. An additional grant -// of patent rights can be found in the PATENTS file in the same directory. -// - -#include "Shared/Platform/iOS.xcconfig" -#include "Shared/Product/LogicTests.xcconfig" - -PRODUCT_NAME = ParseFacebookUtilsiOS-UnitTests -PRODUCT_BUNDLE_IDENTIFIER = com.parse.facebookutilsios.unit - -IPHONEOS_DEPLOYMENT_TARGET = 12.0 - -INFOPLIST_FILE = $(SRCROOT)/Tests/Resources/Info.plist -TEST_HOST = $(BUILT_PRODUCTS_DIR)/ParseFacebookTestApplication.app/ParseFacebookTestApplication diff --git a/ParseFacebookUtilsiOS/Configurations/ParseFacebookUtilsiOS-Dynamic.xcconfig b/ParseFacebookUtilsiOS/Configurations/ParseFacebookUtilsiOS-Dynamic.xcconfig deleted file mode 100644 index 95d31bdaf..000000000 --- a/ParseFacebookUtilsiOS/Configurations/ParseFacebookUtilsiOS-Dynamic.xcconfig +++ /dev/null @@ -1,16 +0,0 @@ -// -// Copyright (c) 2015-present, Parse, LLC. -// All rights reserved. -// -// This source code is licensed under the BSD-style license found in the -// LICENSE file in the root directory of this source tree. An additional grant -// of patent rights can be found in the PATENTS file in the same directory. -// - -#include "Shared/Platform/iOS.xcconfig" -#include "Shared/Product/DynamicFramework.xcconfig" - -PRODUCT_NAME = ParseFacebookUtilsiOS -PRODUCT_BUNDLE_IDENTIFIER = com.parse.facebookutilsios - -INFOPLIST_FILE = $(SRCROOT)/ParseFacebookUtilsiOS/Resources/Info-iOS.plist diff --git a/ParseFacebookUtilsiOS/Configurations/ParseFacebookUtilsiOS.xcconfig b/ParseFacebookUtilsiOS/Configurations/ParseFacebookUtilsiOS.xcconfig deleted file mode 100644 index e5c24ea57..000000000 --- a/ParseFacebookUtilsiOS/Configurations/ParseFacebookUtilsiOS.xcconfig +++ /dev/null @@ -1,16 +0,0 @@ -// -// Copyright (c) 2015-present, Parse, LLC. -// All rights reserved. -// -// This source code is licensed under the BSD-style license found in the -// LICENSE file in the root directory of this source tree. An additional grant -// of patent rights can be found in the PATENTS file in the same directory. -// - -#include "Shared/Platform/iOS.xcconfig" -#include "Shared/Product/StaticFramework.xcconfig" - -PRODUCT_NAME = ParseFacebookUtilsiOS -PRODUCT_BUNDLE_IDENTIFIER = com.parse.facebookutilsios - -INFOPLIST_FILE = $(SRCROOT)/ParseFacebookUtilsiOS/Resources/Info-iOS.plist diff --git a/ParseFacebookUtilsiOS/Configurations/Shared b/ParseFacebookUtilsiOS/Configurations/Shared deleted file mode 120000 index 657caabf0..000000000 --- a/ParseFacebookUtilsiOS/Configurations/Shared +++ /dev/null @@ -1 +0,0 @@ -../../Vendor/xctoolchain/Configurations \ No newline at end of file diff --git a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS.xcodeproj/project.pbxproj b/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS.xcodeproj/project.pbxproj deleted file mode 100644 index 568fd64c8..000000000 --- a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS.xcodeproj/project.pbxproj +++ /dev/null @@ -1,914 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 52; - objects = { - -/* Begin PBXBuildFile section */ - 39A6B6732AD8E90100123017 /* ParseObjC in Frameworks */ = {isa = PBXBuildFile; productRef = 39A6B6722AD8E90100123017 /* ParseObjC */; }; - 39A6B6752AD8E96B00123017 /* ParseFacebookUtils in Frameworks */ = {isa = PBXBuildFile; productRef = 39A6B6742AD8E96B00123017 /* ParseFacebookUtils */; }; - 39E22AC52AD065BA00D9AE5C /* OCMock in Frameworks */ = {isa = PBXBuildFile; productRef = 39E22AC42AD065BA00D9AE5C /* OCMock */; }; - 39E248E92AD1C4D60014357C /* ParseFacebookUtils in Frameworks */ = {isa = PBXBuildFile; productRef = 39E248E82AD1C4D60014357C /* ParseFacebookUtils */; }; - 7C5F7E2829210C9C0035B219 /* FacebookUtilsTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C5F7E1B29210C970035B219 /* FacebookUtilsTests.m */; }; - 7C5F7E2929210C9C0035B219 /* FacebookAuthenticationProviderTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C5F7E1C29210C970035B219 /* FacebookAuthenticationProviderTests.m */; }; - 7C5F7E2A29210CA00035B219 /* PFFacebookTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C5F7E2129210C970035B219 /* PFFacebookTestCase.m */; }; - 7C5F7E2B29210CA20035B219 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C5F7E2529210C970035B219 /* main.m */; }; - 7C5F7E8129210E760035B219 /* PFFacebookUtilsDevice.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CACE621291EA75A003359B5 /* PFFacebookUtilsDevice.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C5F7E8229210E760035B219 /* ParseFacebookUtilsiOS.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CACE622291EA75A003359B5 /* ParseFacebookUtilsiOS.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C5F7E8329210E760035B219 /* PFFacebookUtils_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CACE626291EA75A003359B5 /* PFFacebookUtils_Private.h */; }; - 7C5F7E8429210E760035B219 /* PFFacebookMobileAuthenticationProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CACE628291EA75A003359B5 /* PFFacebookMobileAuthenticationProvider.h */; }; - 7C5F7E8529210E760035B219 /* PFFacebookMobileAuthenticationProvider_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CACE629291EA75A003359B5 /* PFFacebookMobileAuthenticationProvider_Private.h */; }; - 7C5F7E8629210E890035B219 /* PFFacebookUtilsDevice.m in Sources */ = {isa = PBXBuildFile; fileRef = 7CACE623291EA75A003359B5 /* PFFacebookUtilsDevice.m */; }; - 7C5F7E8729210E890035B219 /* PFFacebookMobileAuthenticationProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 7CACE627291EA75A003359B5 /* PFFacebookMobileAuthenticationProvider.m */; }; - 7C5F7E8F292114340035B219 /* PFFacebookUtilsDevice.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CACE621291EA75A003359B5 /* PFFacebookUtilsDevice.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C5F7E90292114340035B219 /* ParseFacebookUtilsiOS.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CACE622291EA75A003359B5 /* ParseFacebookUtilsiOS.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C5F7E91292114340035B219 /* PFFacebookUtils_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CACE626291EA75A003359B5 /* PFFacebookUtils_Private.h */; }; - 7C5F7E92292114340035B219 /* PFFacebookMobileAuthenticationProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CACE628291EA75A003359B5 /* PFFacebookMobileAuthenticationProvider.h */; }; - 7C5F7E93292114350035B219 /* PFFacebookMobileAuthenticationProvider_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CACE629291EA75A003359B5 /* PFFacebookMobileAuthenticationProvider_Private.h */; }; - 7C5F7E94292114410035B219 /* PFFacebookUtilsDevice.m in Sources */ = {isa = PBXBuildFile; fileRef = 7CACE623291EA75A003359B5 /* PFFacebookUtilsDevice.m */; }; - 7C5F7E95292114410035B219 /* PFFacebookMobileAuthenticationProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 7CACE627291EA75A003359B5 /* PFFacebookMobileAuthenticationProvider.m */; }; - 7C5F7EDA29211E5E0035B219 /* libsqlite3.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C5F7ED929211E5E0035B219 /* libsqlite3.tbd */; }; - 7C5F7EDC29211E640035B219 /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C5F7EDB29211E640035B219 /* libc++.tbd */; }; - 7C5F7EDE29211E6A0035B219 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C5F7EDD29211E6A0035B219 /* SystemConfiguration.framework */; }; - 7C5F7EE029211E6E0035B219 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C5F7EDF29211E6E0035B219 /* AudioToolbox.framework */; }; - 7C5F7EE229211E870035B219 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C5F7EE129211E870035B219 /* Accelerate.framework */; }; - 7C77D0512929156900C4D90E /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C77D0502929156900C4D90E /* libc++.tbd */; }; - 7C77D0532929157600C4D90E /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C77D0522929157600C4D90E /* Accelerate.framework */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - B9A7EE7323C49272003E606E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; - proxyType = 1; - remoteGlobalIDString = F535C73A1B54B4A800A7D81E; - remoteInfo = ParseFacebookTestApplicationV4; - }; - B9A7EEB623C49C89003E606E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; - proxyType = 1; - remoteGlobalIDString = D2AAC07D0554694100DB518D; - remoteInfo = "ParseFacebookUtilsV4-iOS"; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXCopyFilesBuildPhase section */ - BCCC20E1271F1BAB003C9D03 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 39E248E72AD1C4BE0014357C /* Parse-SDK-iOS-OSX */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = "Parse-SDK-iOS-OSX"; path = ..; sourceTree = ""; }; - 4AAEAA75200C020E00AA7479 /* ParseFacebookUtilsiOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ParseFacebookUtilsiOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 7C5F7E1B29210C970035B219 /* FacebookUtilsTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FacebookUtilsTests.m; sourceTree = ""; }; - 7C5F7E1C29210C970035B219 /* FacebookAuthenticationProviderTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FacebookAuthenticationProviderTests.m; sourceTree = ""; }; - 7C5F7E1E29210C970035B219 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 7C5F7E2129210C970035B219 /* PFFacebookTestCase.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFFacebookTestCase.m; sourceTree = ""; }; - 7C5F7E2229210C970035B219 /* PFFacebookTestCase.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFFacebookTestCase.h; sourceTree = ""; }; - 7C5F7E2529210C970035B219 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 7C5F7E2729210C970035B219 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 7C5F7E2C29210CF30035B219 /* ParseFacebookTestApplication.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = ParseFacebookTestApplication.xcconfig; sourceTree = ""; }; - 7C5F7E2D29210CF30035B219 /* ParseFacebookUtils-UnitTests.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "ParseFacebookUtils-UnitTests.xcconfig"; sourceTree = ""; }; - 7C5F7ED929211E5E0035B219 /* libsqlite3.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsqlite3.tbd; path = usr/lib/libsqlite3.tbd; sourceTree = SDKROOT; }; - 7C5F7EDB29211E640035B219 /* libc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "usr/lib/libc++.tbd"; sourceTree = SDKROOT; }; - 7C5F7EDD29211E6A0035B219 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; - 7C5F7EDF29211E6E0035B219 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; - 7C5F7EE129211E870035B219 /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; }; - 7C77D0502929156900C4D90E /* libc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS16.1.sdk/usr/lib/libc++.tbd"; sourceTree = DEVELOPER_DIR; }; - 7C77D0522929157600C4D90E /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS16.1.sdk/System/Library/Frameworks/Accelerate.framework; sourceTree = DEVELOPER_DIR; }; - 7CACE61A291EA74D003359B5 /* ParseFacebookUtilsiOS-Dynamic.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "ParseFacebookUtilsiOS-Dynamic.xcconfig"; sourceTree = ""; }; - 7CACE61B291EA74D003359B5 /* ParseFacebookUtilsiOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = ParseFacebookUtilsiOS.xcconfig; sourceTree = ""; }; - 7CACE61E291EA75A003359B5 /* Info-iOS.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Info-iOS.plist"; sourceTree = ""; }; - 7CACE61F291EA75A003359B5 /* Localizable.strings */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; path = Localizable.strings; sourceTree = ""; }; - 7CACE621291EA75A003359B5 /* PFFacebookUtilsDevice.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFFacebookUtilsDevice.h; sourceTree = ""; }; - 7CACE622291EA75A003359B5 /* ParseFacebookUtilsiOS.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ParseFacebookUtilsiOS.h; sourceTree = ""; }; - 7CACE623291EA75A003359B5 /* PFFacebookUtilsDevice.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFFacebookUtilsDevice.m; sourceTree = ""; }; - 7CACE626291EA75A003359B5 /* PFFacebookUtils_Private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFFacebookUtils_Private.h; sourceTree = ""; }; - 7CACE627291EA75A003359B5 /* PFFacebookMobileAuthenticationProvider.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFFacebookMobileAuthenticationProvider.m; sourceTree = ""; }; - 7CACE628291EA75A003359B5 /* PFFacebookMobileAuthenticationProvider.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFFacebookMobileAuthenticationProvider.h; sourceTree = ""; }; - 7CACE629291EA75A003359B5 /* PFFacebookMobileAuthenticationProvider_Private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFFacebookMobileAuthenticationProvider_Private.h; sourceTree = ""; }; - 8121EA9F1D39862400AC0B02 /* Common.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Common.xcconfig; sourceTree = ""; }; - 8121EAA11D39862400AC0B02 /* iOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = iOS.xcconfig; sourceTree = ""; }; - 8121EAA21D39862400AC0B02 /* macOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = macOS.xcconfig; sourceTree = ""; }; - 8121EAA31D39862400AC0B02 /* tvOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = tvOS.xcconfig; sourceTree = ""; }; - 8121EAA41D39862400AC0B02 /* watchOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = watchOS.xcconfig; sourceTree = ""; }; - 8121EAA61D39862400AC0B02 /* Application.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Application.xcconfig; sourceTree = ""; }; - 8121EAA71D39862400AC0B02 /* DynamicFramework.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = DynamicFramework.xcconfig; sourceTree = ""; }; - 8121EAA81D39862400AC0B02 /* LogicTests.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = LogicTests.xcconfig; sourceTree = ""; }; - 8121EAA91D39862400AC0B02 /* StaticFramework.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = StaticFramework.xcconfig; sourceTree = ""; }; - 8121EAAB1D39862400AC0B02 /* Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - 8121EAAC1D39862400AC0B02 /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 8121EAAD1D39862400AC0B02 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; - 81CB98C61AB7905D00136FA5 /* ParseFacebookUtilsiOS-UnitTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "ParseFacebookUtilsiOS-UnitTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - D2AAC07E0554694100DB518D /* ParseFacebookUtilsiOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ParseFacebookUtilsiOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - F535C73B1B54B4A800A7D81E /* ParseFacebookTestApplication.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ParseFacebookTestApplication.app; sourceTree = BUILT_PRODUCTS_DIR; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 4AAEAA6B200C020E00AA7479 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C77D0532929157600C4D90E /* Accelerate.framework in Frameworks */, - 7C77D0512929156900C4D90E /* libc++.tbd in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 81CB98C31AB7905D00136FA5 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 39A6B6752AD8E96B00123017 /* ParseFacebookUtils in Frameworks */, - 7C5F7EE229211E870035B219 /* Accelerate.framework in Frameworks */, - 39E22AC52AD065BA00D9AE5C /* OCMock in Frameworks */, - 39A6B6732AD8E90100123017 /* ParseObjC in Frameworks */, - 7C5F7EE029211E6E0035B219 /* AudioToolbox.framework in Frameworks */, - 7C5F7EDE29211E6A0035B219 /* SystemConfiguration.framework in Frameworks */, - 7C5F7EDC29211E640035B219 /* libc++.tbd in Frameworks */, - 7C5F7EDA29211E5E0035B219 /* libsqlite3.tbd in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - D2AAC07C0554694100DB518D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 39E248E92AD1C4D60014357C /* ParseFacebookUtils in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - F535C7381B54B4A800A7D81E /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 034768DFFF38A50411DB9C8B /* Products */ = { - isa = PBXGroup; - children = ( - D2AAC07E0554694100DB518D /* ParseFacebookUtilsiOS.framework */, - 81CB98C61AB7905D00136FA5 /* ParseFacebookUtilsiOS-UnitTests.xctest */, - F535C73B1B54B4A800A7D81E /* ParseFacebookTestApplication.app */, - 4AAEAA75200C020E00AA7479 /* ParseFacebookUtilsiOS.framework */, - ); - name = Products; - sourceTree = ""; - }; - 0867D691FE84028FC02AAC07 /* Breakpad */ = { - isa = PBXGroup; - children = ( - 39E248E62AD1C4BE0014357C /* Packages */, - F52CD63A1B58383C0051AB86 /* Configurations */, - 7CACE61C291EA75A003359B5 /* ParseFacebookUtilsiOS */, - 7C5F7E1929210C970035B219 /* Tests */, - 0867D69AFE84028FC02AAC07 /* Frameworks */, - 034768DFFF38A50411DB9C8B /* Products */, - ); - indentWidth = 4; - name = Breakpad; - sourceTree = ""; - }; - 0867D69AFE84028FC02AAC07 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 7C77D0522929157600C4D90E /* Accelerate.framework */, - 7C77D0502929156900C4D90E /* libc++.tbd */, - 7C5F7EE129211E870035B219 /* Accelerate.framework */, - 7C5F7EDF29211E6E0035B219 /* AudioToolbox.framework */, - 7C5F7EDD29211E6A0035B219 /* SystemConfiguration.framework */, - 7C5F7EDB29211E640035B219 /* libc++.tbd */, - 7C5F7ED929211E5E0035B219 /* libsqlite3.tbd */, - ); - name = Frameworks; - sourceTree = ""; - }; - 39E248E62AD1C4BE0014357C /* Packages */ = { - isa = PBXGroup; - children = ( - 39E248E72AD1C4BE0014357C /* Parse-SDK-iOS-OSX */, - ); - name = Packages; - sourceTree = ""; - }; - 7C5F7E1929210C970035B219 /* Tests */ = { - isa = PBXGroup; - children = ( - 7C5F7E1A29210C970035B219 /* Unit */, - 7C5F7E1D29210C970035B219 /* Resources */, - 7C5F7E1F29210C970035B219 /* Other */, - 7C5F7E2329210C970035B219 /* TestApplication */, - ); - path = Tests; - sourceTree = ""; - }; - 7C5F7E1A29210C970035B219 /* Unit */ = { - isa = PBXGroup; - children = ( - 7C5F7E1B29210C970035B219 /* FacebookUtilsTests.m */, - 7C5F7E1C29210C970035B219 /* FacebookAuthenticationProviderTests.m */, - ); - path = Unit; - sourceTree = ""; - }; - 7C5F7E1D29210C970035B219 /* Resources */ = { - isa = PBXGroup; - children = ( - 7C5F7E1E29210C970035B219 /* Info.plist */, - ); - path = Resources; - sourceTree = ""; - }; - 7C5F7E1F29210C970035B219 /* Other */ = { - isa = PBXGroup; - children = ( - 7C5F7E2029210C970035B219 /* TestCase */, - ); - path = Other; - sourceTree = ""; - }; - 7C5F7E2029210C970035B219 /* TestCase */ = { - isa = PBXGroup; - children = ( - 7C5F7E2129210C970035B219 /* PFFacebookTestCase.m */, - 7C5F7E2229210C970035B219 /* PFFacebookTestCase.h */, - ); - path = TestCase; - sourceTree = ""; - }; - 7C5F7E2329210C970035B219 /* TestApplication */ = { - isa = PBXGroup; - children = ( - 7C5F7E2429210C970035B219 /* Classes */, - 7C5F7E2629210C970035B219 /* Resources */, - ); - path = TestApplication; - sourceTree = ""; - }; - 7C5F7E2429210C970035B219 /* Classes */ = { - isa = PBXGroup; - children = ( - 7C5F7E2529210C970035B219 /* main.m */, - ); - path = Classes; - sourceTree = ""; - }; - 7C5F7E2629210C970035B219 /* Resources */ = { - isa = PBXGroup; - children = ( - 7C5F7E2729210C970035B219 /* Info.plist */, - ); - path = Resources; - sourceTree = ""; - }; - 7CACE61C291EA75A003359B5 /* ParseFacebookUtilsiOS */ = { - isa = PBXGroup; - children = ( - 7CACE61D291EA75A003359B5 /* Resources */, - 7CACE620291EA75A003359B5 /* Source */, - 7CACE624291EA75A003359B5 /* Internal */, - ); - path = ParseFacebookUtilsiOS; - sourceTree = ""; - }; - 7CACE61D291EA75A003359B5 /* Resources */ = { - isa = PBXGroup; - children = ( - 7CACE61E291EA75A003359B5 /* Info-iOS.plist */, - 7CACE61F291EA75A003359B5 /* Localizable.strings */, - ); - path = Resources; - sourceTree = ""; - }; - 7CACE620291EA75A003359B5 /* Source */ = { - isa = PBXGroup; - children = ( - 7CACE622291EA75A003359B5 /* ParseFacebookUtilsiOS.h */, - 7CACE621291EA75A003359B5 /* PFFacebookUtilsDevice.h */, - 7CACE623291EA75A003359B5 /* PFFacebookUtilsDevice.m */, - ); - path = Source; - sourceTree = ""; - }; - 7CACE624291EA75A003359B5 /* Internal */ = { - isa = PBXGroup; - children = ( - 7CACE625291EA75A003359B5 /* AuthenticationProvider */, - ); - path = Internal; - sourceTree = ""; - }; - 7CACE625291EA75A003359B5 /* AuthenticationProvider */ = { - isa = PBXGroup; - children = ( - 7CACE626291EA75A003359B5 /* PFFacebookUtils_Private.h */, - 7CACE627291EA75A003359B5 /* PFFacebookMobileAuthenticationProvider.m */, - 7CACE628291EA75A003359B5 /* PFFacebookMobileAuthenticationProvider.h */, - 7CACE629291EA75A003359B5 /* PFFacebookMobileAuthenticationProvider_Private.h */, - ); - path = AuthenticationProvider; - sourceTree = ""; - }; - 8121EA9E1D39862400AC0B02 /* Shared */ = { - isa = PBXGroup; - children = ( - 8121EA9F1D39862400AC0B02 /* Common.xcconfig */, - 8121EAA01D39862400AC0B02 /* Platform */, - 8121EAA51D39862400AC0B02 /* Product */, - 8121EAAA1D39862400AC0B02 /* Project */, - 8121EAAD1D39862400AC0B02 /* Warnings.xcconfig */, - ); - path = Shared; - sourceTree = ""; - }; - 8121EAA01D39862400AC0B02 /* Platform */ = { - isa = PBXGroup; - children = ( - 8121EAA11D39862400AC0B02 /* iOS.xcconfig */, - 8121EAA21D39862400AC0B02 /* macOS.xcconfig */, - 8121EAA31D39862400AC0B02 /* tvOS.xcconfig */, - 8121EAA41D39862400AC0B02 /* watchOS.xcconfig */, - ); - path = Platform; - sourceTree = ""; - }; - 8121EAA51D39862400AC0B02 /* Product */ = { - isa = PBXGroup; - children = ( - 8121EAA61D39862400AC0B02 /* Application.xcconfig */, - 8121EAA71D39862400AC0B02 /* DynamicFramework.xcconfig */, - 8121EAA81D39862400AC0B02 /* LogicTests.xcconfig */, - 8121EAA91D39862400AC0B02 /* StaticFramework.xcconfig */, - ); - path = Product; - sourceTree = ""; - }; - 8121EAAA1D39862400AC0B02 /* Project */ = { - isa = PBXGroup; - children = ( - 8121EAAB1D39862400AC0B02 /* Debug.xcconfig */, - 8121EAAC1D39862400AC0B02 /* Release.xcconfig */, - ); - path = Project; - sourceTree = ""; - }; - F52CD63A1B58383C0051AB86 /* Configurations */ = { - isa = PBXGroup; - children = ( - 7CACE61A291EA74D003359B5 /* ParseFacebookUtilsiOS-Dynamic.xcconfig */, - 7CACE61B291EA74D003359B5 /* ParseFacebookUtilsiOS.xcconfig */, - 7C5F7E2C29210CF30035B219 /* ParseFacebookTestApplication.xcconfig */, - 7C5F7E2D29210CF30035B219 /* ParseFacebookUtils-UnitTests.xcconfig */, - 8121EA9E1D39862400AC0B02 /* Shared */, - ); - path = Configurations; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - 4AAEAA5E200C020E00AA7479 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C5F7E8F292114340035B219 /* PFFacebookUtilsDevice.h in Headers */, - 7C5F7E90292114340035B219 /* ParseFacebookUtilsiOS.h in Headers */, - 7C5F7E91292114340035B219 /* PFFacebookUtils_Private.h in Headers */, - 7C5F7E92292114340035B219 /* PFFacebookMobileAuthenticationProvider.h in Headers */, - 7C5F7E93292114350035B219 /* PFFacebookMobileAuthenticationProvider_Private.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - D2AAC07A0554694100DB518D /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C5F7E8129210E760035B219 /* PFFacebookUtilsDevice.h in Headers */, - 7C5F7E8229210E760035B219 /* ParseFacebookUtilsiOS.h in Headers */, - 7C5F7E8329210E760035B219 /* PFFacebookUtils_Private.h in Headers */, - 7C5F7E8429210E760035B219 /* PFFacebookMobileAuthenticationProvider.h in Headers */, - 7C5F7E8529210E760035B219 /* PFFacebookMobileAuthenticationProvider_Private.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - 4AAEAA5B200C020E00AA7479 /* ParseFacebookUtilsiOS-Dynamic */ = { - isa = PBXNativeTarget; - buildConfigurationList = 4AAEAA72200C020E00AA7479 /* Build configuration list for PBXNativeTarget "ParseFacebookUtilsiOS-Dynamic" */; - buildPhases = ( - 4AAEAA5E200C020E00AA7479 /* Headers */, - 4AAEAA66200C020E00AA7479 /* Sources */, - 4AAEAA6B200C020E00AA7479 /* Frameworks */, - 4AAEAA70200C020E00AA7479 /* Resources */, - BCCC20E1271F1BAB003C9D03 /* Embed Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "ParseFacebookUtilsiOS-Dynamic"; - packageProductDependencies = ( - ); - productName = Breakpad; - productReference = 4AAEAA75200C020E00AA7479 /* ParseFacebookUtilsiOS.framework */; - productType = "com.apple.product-type.framework"; - }; - 81CB98C51AB7905D00136FA5 /* ParseFacebookUtils-UnitTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 81CB98D11AB7905D00136FA5 /* Build configuration list for PBXNativeTarget "ParseFacebookUtils-UnitTests" */; - buildPhases = ( - 81CB98C21AB7905D00136FA5 /* Sources */, - 81CB98C31AB7905D00136FA5 /* Frameworks */, - 81CB98C41AB7905D00136FA5 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - B9A7EEB723C49C89003E606E /* PBXTargetDependency */, - B9A7EE7423C49272003E606E /* PBXTargetDependency */, - ); - name = "ParseFacebookUtils-UnitTests"; - packageProductDependencies = ( - 39E22AC42AD065BA00D9AE5C /* OCMock */, - 39A6B6722AD8E90100123017 /* ParseObjC */, - 39A6B6742AD8E96B00123017 /* ParseFacebookUtils */, - ); - productName = "ParseFacebookUtilsV4-Tests"; - productReference = 81CB98C61AB7905D00136FA5 /* ParseFacebookUtilsiOS-UnitTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - D2AAC07D0554694100DB518D /* ParseFacebookUtilsiOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "ParseFacebookUtilsiOS" */; - buildPhases = ( - D2AAC07A0554694100DB518D /* Headers */, - D2AAC07B0554694100DB518D /* Sources */, - D2AAC07C0554694100DB518D /* Frameworks */, - 8139B1341A7BF6B5002BEF84 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = ParseFacebookUtilsiOS; - packageProductDependencies = ( - 39E248E82AD1C4D60014357C /* ParseFacebookUtils */, - ); - productName = Breakpad; - productReference = D2AAC07E0554694100DB518D /* ParseFacebookUtilsiOS.framework */; - productType = "com.apple.product-type.framework"; - }; - F535C73A1B54B4A800A7D81E /* ParseFacebookTestApplication */ = { - isa = PBXNativeTarget; - buildConfigurationList = F535C75B1B54B4A800A7D81E /* Build configuration list for PBXNativeTarget "ParseFacebookTestApplication" */; - buildPhases = ( - F535C7371B54B4A800A7D81E /* Sources */, - F535C7381B54B4A800A7D81E /* Frameworks */, - F535C7391B54B4A800A7D81E /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = ParseFacebookTestApplication; - productName = ParseFacebookTestApplicationV4; - productReference = F535C73B1B54B4A800A7D81E /* ParseFacebookTestApplication.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 0867D690FE84028FC02AAC07 /* Project object */ = { - isa = PBXProject; - attributes = { - CLASSPREFIX = PF; - LastUpgradeCheck = 0920; - ORGANIZATIONNAME = "Parse, LLC"; - TargetAttributes = { - 4AAEAA5B200C020E00AA7479 = { - LastSwiftMigration = 1410; - ProvisioningStyle = Manual; - }; - 81CB98C51AB7905D00136FA5 = { - CreatedOnToolsVersion = 6.2; - ProvisioningStyle = Manual; - TestTargetID = F535C73A1B54B4A800A7D81E; - }; - D2AAC07D0554694100DB518D = { - ProvisioningStyle = Manual; - }; - F535C73A1B54B4A800A7D81E = { - CreatedOnToolsVersion = 6.4; - ProvisioningStyle = Manual; - }; - }; - }; - buildConfigurationList = 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "ParseFacebookUtilsiOS" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = en; - hasScannedForEncodings = 1; - knownRegions = ( - da, - de, - es, - fr, - it, - ja, - nl, - no, - sl, - sv, - tr, - en, - Base, - ); - mainGroup = 0867D691FE84028FC02AAC07 /* Breakpad */; - packageReferences = ( - 39E22AC32AD065BA00D9AE5C /* XCRemoteSwiftPackageReference "ocmock" */, - ); - productRefGroup = 034768DFFF38A50411DB9C8B /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - D2AAC07D0554694100DB518D /* ParseFacebookUtilsiOS */, - 4AAEAA5B200C020E00AA7479 /* ParseFacebookUtilsiOS-Dynamic */, - 81CB98C51AB7905D00136FA5 /* ParseFacebookUtils-UnitTests */, - F535C73A1B54B4A800A7D81E /* ParseFacebookTestApplication */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 4AAEAA70200C020E00AA7479 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 8139B1341A7BF6B5002BEF84 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 81CB98C41AB7905D00136FA5 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - F535C7391B54B4A800A7D81E /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 4AAEAA66200C020E00AA7479 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C5F7E94292114410035B219 /* PFFacebookUtilsDevice.m in Sources */, - 7C5F7E95292114410035B219 /* PFFacebookMobileAuthenticationProvider.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 81CB98C21AB7905D00136FA5 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C5F7E2929210C9C0035B219 /* FacebookAuthenticationProviderTests.m in Sources */, - 7C5F7E2A29210CA00035B219 /* PFFacebookTestCase.m in Sources */, - 7C5F7E2829210C9C0035B219 /* FacebookUtilsTests.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - D2AAC07B0554694100DB518D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C5F7E8629210E890035B219 /* PFFacebookUtilsDevice.m in Sources */, - 7C5F7E8729210E890035B219 /* PFFacebookMobileAuthenticationProvider.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - F535C7371B54B4A800A7D81E /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C5F7E2B29210CA20035B219 /* main.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - B9A7EE7423C49272003E606E /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = F535C73A1B54B4A800A7D81E /* ParseFacebookTestApplication */; - targetProxy = B9A7EE7323C49272003E606E /* PBXContainerItemProxy */; - }; - B9A7EEB723C49C89003E606E /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = D2AAC07D0554694100DB518D /* ParseFacebookUtilsiOS */; - targetProxy = B9A7EEB623C49C89003E606E /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin XCBuildConfiguration section */ - 1DEB921F08733DC00010E9CD /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7CACE61B291EA74D003359B5 /* ParseFacebookUtilsiOS.xcconfig */; - buildSettings = { - CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; - CODE_SIGN_STYLE = Manual; - DEVELOPMENT_TEAM = ""; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - INFOPLIST_FILE = "$(SRCROOT)/ParseFacebookUtilsiOS/Resources/Info-iOS.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - PRODUCT_BUNDLE_IDENTIFIER = com.parse.facebookutilsios; - PROVISIONING_PROFILE_SPECIFIER = ""; - SDKROOT = iphoneos; - SUPPORTS_MACCATALYST = NO; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 1DEB922008733DC00010E9CD /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7CACE61B291EA74D003359B5 /* ParseFacebookUtilsiOS.xcconfig */; - buildSettings = { - CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; - CODE_SIGN_STYLE = Manual; - DEVELOPMENT_TEAM = ""; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - INFOPLIST_FILE = "$(SRCROOT)/ParseFacebookUtilsiOS/Resources/Info-iOS.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_BUNDLE_IDENTIFIER = com.parse.facebookutilsios; - PROVISIONING_PROFILE_SPECIFIER = ""; - SDKROOT = iphoneos; - SUPPORTS_MACCATALYST = NO; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; - 1DEB922308733DC00010E9CD /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 8121EAAB1D39862400AC0B02 /* Debug.xcconfig */; - buildSettings = { - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_ENABLE_CODE_COVERAGE = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - PARSE_DIR = "$(PROJECT_DIR)/.."; - }; - name = Debug; - }; - 1DEB922408733DC00010E9CD /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 8121EAAC1D39862400AC0B02 /* Release.xcconfig */; - buildSettings = { - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_ENABLE_CODE_COVERAGE = NO; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - PARSE_DIR = "$(PROJECT_DIR)/.."; - }; - name = Release; - }; - 4AAEAA73200C020E00AA7479 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7CACE61A291EA74D003359B5 /* ParseFacebookUtilsiOS-Dynamic.xcconfig */; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - CLANG_MODULES_AUTOLINK = YES; - CODE_SIGN_STYLE = Manual; - DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = ""; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - INFOPLIST_FILE = "$(SRCROOT)/ParseFacebookUtilsiOS/Resources/Info-iOS.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.parse.facebookutilsios; - PROVISIONING_PROFILE_SPECIFIER = ""; - SDKROOT = iphoneos; - SUPPORTS_MACCATALYST = NO; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 4AAEAA74200C020E00AA7479 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7CACE61A291EA74D003359B5 /* ParseFacebookUtilsiOS-Dynamic.xcconfig */; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - CLANG_MODULES_AUTOLINK = YES; - CODE_SIGN_STYLE = Manual; - DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = ""; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - INFOPLIST_FILE = "$(SRCROOT)/ParseFacebookUtilsiOS/Resources/Info-iOS.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - ONLY_ACTIVE_ARCH = YES; - PRODUCT_BUNDLE_IDENTIFIER = com.parse.facebookutilsios; - PROVISIONING_PROFILE_SPECIFIER = ""; - SDKROOT = iphoneos; - SUPPORTS_MACCATALYST = NO; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; - 81CB98CF1AB7905D00136FA5 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7C5F7E2D29210CF30035B219 /* ParseFacebookUtils-UnitTests.xcconfig */; - buildSettings = { - CODE_SIGN_STYLE = Manual; - DEVELOPMENT_TEAM = ""; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - INFOPLIST_FILE = "$(SRCROOT)/Tests/Resources/Info.plist"; - PRODUCT_BUNDLE_IDENTIFIER = com.parse.facebookutilsios.unit; - PROVISIONING_PROFILE_SPECIFIER = ""; - SDKROOT = iphoneos; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = 1; - }; - name = Debug; - }; - 81CB98D01AB7905D00136FA5 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7C5F7E2D29210CF30035B219 /* ParseFacebookUtils-UnitTests.xcconfig */; - buildSettings = { - CODE_SIGN_STYLE = Manual; - DEVELOPMENT_TEAM = ""; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - INFOPLIST_FILE = "$(SRCROOT)/Tests/Resources/Info.plist"; - PRODUCT_BUNDLE_IDENTIFIER = com.parse.facebookutilsios.unit; - PROVISIONING_PROFILE_SPECIFIER = ""; - SDKROOT = iphoneos; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = 1; - }; - name = Release; - }; - F535C75C1B54B4A800A7D81E /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7C5F7E2C29210CF30035B219 /* ParseFacebookTestApplication.xcconfig */; - buildSettings = { - CODE_SIGN_STYLE = Manual; - DEVELOPMENT_TEAM = ""; - INFOPLIST_FILE = "$(SRCROOT)/Tests/TestApplication/Resources/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.parse.facebookutilsios.unit.app; - PROVISIONING_PROFILE_SPECIFIER = ""; - SDKROOT = iphoneos; - }; - name = Debug; - }; - F535C75D1B54B4A800A7D81E /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7C5F7E2C29210CF30035B219 /* ParseFacebookTestApplication.xcconfig */; - buildSettings = { - CODE_SIGN_STYLE = Manual; - DEVELOPMENT_TEAM = ""; - INFOPLIST_FILE = "$(SRCROOT)/Tests/TestApplication/Resources/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.parse.facebookutilsios.unit.app; - PROVISIONING_PROFILE_SPECIFIER = ""; - SDKROOT = iphoneos; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "ParseFacebookUtilsiOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1DEB921F08733DC00010E9CD /* Debug */, - 1DEB922008733DC00010E9CD /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "ParseFacebookUtilsiOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1DEB922308733DC00010E9CD /* Debug */, - 1DEB922408733DC00010E9CD /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 4AAEAA72200C020E00AA7479 /* Build configuration list for PBXNativeTarget "ParseFacebookUtilsiOS-Dynamic" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 4AAEAA73200C020E00AA7479 /* Debug */, - 4AAEAA74200C020E00AA7479 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 81CB98D11AB7905D00136FA5 /* Build configuration list for PBXNativeTarget "ParseFacebookUtils-UnitTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 81CB98CF1AB7905D00136FA5 /* Debug */, - 81CB98D01AB7905D00136FA5 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - F535C75B1B54B4A800A7D81E /* Build configuration list for PBXNativeTarget "ParseFacebookTestApplication" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - F535C75C1B54B4A800A7D81E /* Debug */, - F535C75D1B54B4A800A7D81E /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - -/* Begin XCRemoteSwiftPackageReference section */ - 39E22AC32AD065BA00D9AE5C /* XCRemoteSwiftPackageReference "ocmock" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/erikdoe/ocmock"; - requirement = { - kind = revision; - revision = 67bb9602f0a7541f24dc2d6d0d7389ca3e4c2c89; - }; - }; -/* End XCRemoteSwiftPackageReference section */ - -/* Begin XCSwiftPackageProductDependency section */ - 39A6B6722AD8E90100123017 /* ParseObjC */ = { - isa = XCSwiftPackageProductDependency; - productName = ParseObjC; - }; - 39A6B6742AD8E96B00123017 /* ParseFacebookUtils */ = { - isa = XCSwiftPackageProductDependency; - productName = ParseFacebookUtils; - }; - 39E22AC42AD065BA00D9AE5C /* OCMock */ = { - isa = XCSwiftPackageProductDependency; - package = 39E22AC32AD065BA00D9AE5C /* XCRemoteSwiftPackageReference "ocmock" */; - productName = OCMock; - }; - 39E248E82AD1C4D60014357C /* ParseFacebookUtils */ = { - isa = XCSwiftPackageProductDependency; - productName = ParseFacebookUtils; - }; -/* End XCSwiftPackageProductDependency section */ - }; - rootObject = 0867D690FE84028FC02AAC07 /* Project object */; -} diff --git a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a62..000000000 --- a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d981003..000000000 --- a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS.xcodeproj/xcshareddata/xcschemes/ParseFacebookUtilsiOS-Dynamic.xcscheme b/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS.xcodeproj/xcshareddata/xcschemes/ParseFacebookUtilsiOS-Dynamic.xcscheme deleted file mode 100644 index 1d7f67478..000000000 --- a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS.xcodeproj/xcshareddata/xcschemes/ParseFacebookUtilsiOS-Dynamic.xcscheme +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS.xcodeproj/xcshareddata/xcschemes/ParseFacebookUtilsiOS.xcscheme b/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS.xcodeproj/xcshareddata/xcschemes/ParseFacebookUtilsiOS.xcscheme deleted file mode 100644 index b0d6603eb..000000000 --- a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS.xcodeproj/xcshareddata/xcschemes/ParseFacebookUtilsiOS.xcscheme +++ /dev/null @@ -1,106 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS/Internal/AuthenticationProvider/PFFacebookMobileAuthenticationProvider.h b/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS/Internal/AuthenticationProvider/PFFacebookMobileAuthenticationProvider.h deleted file mode 100644 index aaf2e8720..000000000 --- a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS/Internal/AuthenticationProvider/PFFacebookMobileAuthenticationProvider.h +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import -#import - -@import ParseCore; -@import ParseFacebookUtils; - -@class BFTask<__covariant BFGenericType>; - -NS_ASSUME_NONNULL_BEGIN - -@interface PFFacebookMobileAuthenticationProvider : PFFacebookAuthenticationProvider - -@property (nonatomic, strong, readonly) FBSDKLoginManager *loginManager; - -@end - -NS_ASSUME_NONNULL_END diff --git a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS/Internal/AuthenticationProvider/PFFacebookMobileAuthenticationProvider.m b/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS/Internal/AuthenticationProvider/PFFacebookMobileAuthenticationProvider.m deleted file mode 100644 index 10390d318..000000000 --- a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS/Internal/AuthenticationProvider/PFFacebookMobileAuthenticationProvider.m +++ /dev/null @@ -1,81 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "PFFacebookMobileAuthenticationProvider.h" -#import "PFFacebookMobileAuthenticationProvider_Private.h" - -#if __has_include() -#import -#import -#else -#import "BFTask.h" -#import "BFTaskCompletionSource.h" -#endif - -@import ParseCore; -@import ParseFacebookUtils; - -#import -#import - - -@implementation PFFacebookMobileAuthenticationProvider - -///-------------------------------------- -#pragma mark - Init -///-------------------------------------- - -- (instancetype)initWithApplication:(UIApplication *)application - launchOptions:(nullable NSDictionary *)launchOptions { - self = [super initWithApplication:application launchOptions:launchOptions]; - if (!self) return self; - - _loginManager = [[FBSDKLoginManager alloc] init]; - - return self; -} - -///-------------------------------------- -#pragma mark - Authenticate -///-------------------------------------- - -- (BFTask*> *)authenticateAsyncWithReadPermissions:(nullable NSArray *)readPermissions - publishPermissions:(nullable NSArray *)publishPermissions - fromViewComtroller:(UIViewController *)viewController { - - NSArray *permissions = [readPermissions arrayByAddingObjectsFromArray:publishPermissions]; - - BFTaskCompletionSource *taskCompletionSource = [BFTaskCompletionSource taskCompletionSource]; - FBSDKLoginManagerLoginResultBlock resultHandler = ^(FBSDKLoginManagerLoginResult *result, NSError *error) { - if (result.isCancelled) { - [taskCompletionSource cancel]; - } else if (error) { - taskCompletionSource.error = error; - } else { - taskCompletionSource.result = [PFFacebookUtils userAuthenticationDataFromAccessToken:result.token]; - } - }; - - [self.loginManager logInWithPermissions:permissions fromViewController:viewController handler:resultHandler]; - - return taskCompletionSource.task; -} - -///-------------------------------------- -#pragma mark - PFUserAuthenticationDelegate -///-------------------------------------- - -- (BOOL)restoreAuthenticationWithAuthData:(nullable NSDictionary *)authData { - if (!authData) { - [self.loginManager logOut]; - } - return [super restoreAuthenticationWithAuthData:authData]; -} - -@end diff --git a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS/Internal/AuthenticationProvider/PFFacebookMobileAuthenticationProvider_Private.h b/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS/Internal/AuthenticationProvider/PFFacebookMobileAuthenticationProvider_Private.h deleted file mode 100644 index 40a16547b..000000000 --- a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS/Internal/AuthenticationProvider/PFFacebookMobileAuthenticationProvider_Private.h +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import - -#import "PFFacebookMobileAuthenticationProvider.h" - -@class FBSDKAccessToken; - -@interface PFFacebookMobileAuthenticationProvider () - -@property (nonatomic, strong, readwrite) FBSDKLoginManager *loginManager; - -@end diff --git a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS/Internal/AuthenticationProvider/PFFacebookUtils_Private.h b/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS/Internal/AuthenticationProvider/PFFacebookUtils_Private.h deleted file mode 100644 index 860f20e63..000000000 --- a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS/Internal/AuthenticationProvider/PFFacebookUtils_Private.h +++ /dev/null @@ -1,18 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "PFFacebookUtilsDevice.h" -#import "PFFacebookMobileAuthenticationProvider.h" - -@interface PFFacebookUtilsDevice (Private) - -+ (PFFacebookMobileAuthenticationProvider *)_authenticationProvider; -+ (void)_setAuthenticationProvider:(PFFacebookMobileAuthenticationProvider *)provider; - -@end diff --git a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS/Resources/Info-iOS.plist b/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS/Resources/Info-iOS.plist deleted file mode 100644 index 139ee825b..000000000 --- a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS/Resources/Info-iOS.plist +++ /dev/null @@ -1,28 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleExecutable - ParseFacebookUtilsiOS - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.19.4 - CFBundleSignature - ???? - CFBundleSupportedPlatforms - - iPhoneOS - - CFBundleVersion - 1.19.4 - MinimumOSVersion - 12.0 - - diff --git a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS/Resources/Localizable.strings b/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS/Resources/Localizable.strings deleted file mode 100644 index e69de29bb..000000000 diff --git a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS/Source/PFFacebookUtilsDevice.h b/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS/Source/PFFacebookUtilsDevice.h deleted file mode 100644 index 62f520d7e..000000000 --- a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS/Source/PFFacebookUtilsDevice.h +++ /dev/null @@ -1,42 +0,0 @@ -// -// Header.h -// -// -// Created by Volodymyr Nazarkevych on 29.11.2022. -// - -#import - -@import ParseFacebookUtils; - -#import - -@interface PFFacebookUtilsDevice : PFFacebookUtils - -///-------------------------------------- -/// @name Interacting With Facebook -///-------------------------------------- - -/** - Initializes Parse Facebook Utils. - - You must provide your Facebook application ID as the value for FacebookAppID in your bundle's plist file - as described here: https://developers.facebook.com/docs/getting-started/facebook-sdk-for-ios/ - - @warning You must invoke this in order to use the Facebook functionality in Parse. - - @param launchOptions The launchOptions as passed to [UIApplicationDelegate application:didFinishLaunchingWithOptions:]. - */ -+ (void)initializeFacebookWithApplicationLaunchOptions:(nullable NSDictionary *)launchOptions; - -/** - `FBSDKLoginManager` provides methods for configuring login behavior, default audience - and managing Facebook Access Token. - - @warning This method is available only on iOS. - - @return An instance of `FBSDKLoginManager` that is used by `PFFacebookUtils`. - */ -+ ( FBSDKLoginManager * _Nonnull)facebookLoginManager; - -@end diff --git a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS/Source/PFFacebookUtilsDevice.m b/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS/Source/PFFacebookUtilsDevice.m deleted file mode 100644 index 999fe5a98..000000000 --- a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS/Source/PFFacebookUtilsDevice.m +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "PFFacebookUtilsDevice.h" -#if __has_include() -#import -#else -#import "BFExecutor.h" -#endif - -@import ParseCore; - -#import - -#import "PFFacebookMobileAuthenticationProvider.h" - -@implementation PFFacebookUtilsDevice - -///-------------------------------------- -#pragma mark - Interacting With Facebook -///-------------------------------------- - -+ (void)initializeFacebookWithApplicationLaunchOptions:(NSDictionary *)launchOptions { - if (![Parse currentConfiguration]) { - // TODO: (nlutsenko) Remove this when Parse SDK throws on every access to Parse._currentManager - [NSException raise:NSInternalInconsistencyException format:@"PFFacebookUtils must be initialized after initializing Parse."]; - } - if (!authenticationProvider_) { - Class providerClass = nil; - - providerClass = [PFFacebookMobileAuthenticationProvider class]; - - PFFacebookAuthenticationProvider *provider = [providerClass providerWithApplication:[UIApplication sharedApplication] - launchOptions:launchOptions]; - [PFUser registerAuthenticationDelegate:provider forAuthType:PFFacebookUserAuthenticationType]; - - [self _setAuthenticationProvider:provider]; - } -} - -+ (FBSDKLoginManager *)facebookLoginManager { - PFFacebookMobileAuthenticationProvider *provider = (PFFacebookMobileAuthenticationProvider *)[self _authenticationProvider]; - return provider.loginManager; -} - -@end diff --git a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS/Source/ParseFacebookUtilsiOS.h b/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS/Source/ParseFacebookUtilsiOS.h deleted file mode 100644 index 3b0b2772b..000000000 --- a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS/Source/ParseFacebookUtilsiOS.h +++ /dev/null @@ -1,9 +0,0 @@ -// -// ParseFacebookUtilsiOS.h -// ParseFacebookUtilsiOS -// -// Created by Volodymyr Nazarkevych on 22.11.2022. -// Copyright © 2022 Parse, LLC. All rights reserved. -// - -#import "PFFacebookUtilsDevice.h" diff --git a/ParseFacebookUtilsiOS/Tests/Other/TestCase/PFFacebookTestCase.h b/ParseFacebookUtilsiOS/Tests/Other/TestCase/PFFacebookTestCase.h deleted file mode 100644 index 7941e897b..000000000 --- a/ParseFacebookUtilsiOS/Tests/Other/TestCase/PFFacebookTestCase.h +++ /dev/null @@ -1,78 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import - -@import XCTest; - -@interface PFFacebookTestCase : XCTestCase - -///-------------------------------------- -/// @name XCTestCase -///-------------------------------------- - -- (void)setUp NS_REQUIRES_SUPER; -- (void)tearDown NS_REQUIRES_SUPER; - -///-------------------------------------- -/// @name Expectations -///-------------------------------------- - -- (XCTestExpectation *)currentSelectorTestExpectation; -- (void)waitForTestExpectations; - -///-------------------------------------- -/// @name Mocks -///-------------------------------------- - -- (void)registerMockObject:(id)mockObject; - -@end - -#define _PFRegisterMock(mockObject) [self registerMockObject:mockObject] -#define _PFMockShim(method, args...) ({ id mock = method(args); _PFRegisterMock(mock); mock; }) -#define _PFOCMockWarning _Pragma("GCC warning \"Please use PF mocking methods instead of OCMock ones.\"") - -#define _PFStrictClassMock(kls) [OCMockObject mockForClass:kls] -#define _PFClassMock(kls) [OCMockObject niceMockForClass:kls] -#define _PFStrictProtocolMock(proto) [OCMockObject mockForProtocol:proto] -#define _PFProtocolMock(proto) [OCMockObject niceMockForProtocol:proto] -#define _PFPartialMock(obj) [OCMockObject partialMockForObject:obj] - -#define PFStrictClassMock(...) _PFMockShim(_PFStrictClassMock, __VA_ARGS__) -#define PFClassMock(...) _PFMockShim(_PFClassMock, __VA_ARGS__) -#define PFStrictProtocolMock(...) _PFMockShim(_PFStrictProtocolMock, __VA_ARGS__) -#define PFProtocolMock(...) _PFMockShim(_PFProtocolMock, __VA_ARGS__) -#define PFPartialMock(...) _PFMockShim(_PFPartialMock, __VA_ARGS__) - -#undef OCMStrictClassMock -#undef OCMClassMock -#undef OCMStrictProtocolMock -#undef OCMProtocolMock -#undef OCMPartialMock - -#define OCMStrictClassMock _PFOCMockWarning _PFStrictClassMock -#define OCMClassMock _PFOCMockWarning _PFClassMock -#define OCMStrictProtocolMock _PFOCMockWarning _PFStrictProtocolMock -#define OCMProtocolMock _PFOCMockWarning _PFProtocolMock -#define OCMPartialMock _PFOCMockWarning _PFPartialMock - -#define PFAssertIsKindOfClass(a1, a2, description...) \ -XCTAssertTrue([a1 isKindOfClass:[a2 class]], ## description) - -#define PFAssertNotKindOfClass(a1, a2, description...) \ -XCTAssertFalse([a1 isKindOfClass:[a2 class]], ## description) - -#define PFAssertThrowsInconsistencyException(expression, ...) \ -XCTAssertThrowsSpecificNamed(expression, NSException, NSInternalInconsistencyException, __VA_ARGS__) - -#define PFAssertThrowsInvalidArgumentException(expression, ...) \ -XCTAssertThrowsSpecificNamed(expression, NSException, NSInvalidArgumentException, __VA_ARGS__) - -#define PFAssertStringContains(a, b) XCTAssertTrue([(a) rangeOfString:(b)].location != NSNotFound) diff --git a/ParseFacebookUtilsiOS/Tests/Other/TestCase/PFFacebookTestCase.m b/ParseFacebookUtilsiOS/Tests/Other/TestCase/PFFacebookTestCase.m deleted file mode 100644 index a5414a149..000000000 --- a/ParseFacebookUtilsiOS/Tests/Other/TestCase/PFFacebookTestCase.m +++ /dev/null @@ -1,63 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "PFFacebookTestCase.h" - -@implementation PFFacebookTestCase { - NSMutableArray *_mocks; - dispatch_queue_t _mockQueue; -} - -///-------------------------------------- -#pragma mark - XCTestCase -///-------------------------------------- - -- (void)setUp { - [super setUp]; - - _mocks = [[NSMutableArray alloc] init]; - _mockQueue = dispatch_queue_create("com.parse.tests.mock.queue", DISPATCH_QUEUE_SERIAL); -} - -- (void)tearDown { - dispatch_sync(_mockQueue, ^{ - [_mocks makeObjectsPerformSelector:@selector(stopMocking)]; - }); - - _mocks = nil; - _mockQueue = nil; - - [super tearDown]; -} - -///-------------------------------------- -#pragma mark - Helpers -///-------------------------------------- - -- (XCTestExpectation *)currentSelectorTestExpectation { - NSInvocation *invocation = self.invocation; - NSString *selectorName = invocation ? NSStringFromSelector(invocation.selector) : @"testExpectation"; - return [self expectationWithDescription:selectorName]; -} - -- (void)waitForTestExpectations { - [self waitForExpectationsWithTimeout:10.0 handler:nil]; -} - -///-------------------------------------- -#pragma mark - Mock Registration -///-------------------------------------- - -- (void)registerMockObject:(id)mockObject { - dispatch_sync(_mockQueue, ^{ - [_mocks addObject:mockObject]; - }); -} - -@end diff --git a/ParseFacebookUtilsiOS/Tests/Resources/Info.plist b/ParseFacebookUtilsiOS/Tests/Resources/Info.plist deleted file mode 100644 index ba72822e8..000000000 --- a/ParseFacebookUtilsiOS/Tests/Resources/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/ParseFacebookUtilsiOS/Tests/TestApplication/Classes/main.m b/ParseFacebookUtilsiOS/Tests/TestApplication/Classes/main.m deleted file mode 100644 index 453fc1227..000000000 --- a/ParseFacebookUtilsiOS/Tests/TestApplication/Classes/main.m +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import - -@interface AppDelegate : NSObject - -@end - -@implementation AppDelegate - -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - UIWindow *window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].applicationFrame]; - window.rootViewController = [[UIViewController alloc] init]; - [window makeKeyAndVisible]; - return YES; -} - -@end - -int main(int argc, char * argv[]) { - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); - } -} diff --git a/ParseFacebookUtilsiOS/Tests/TestApplication/Resources/Info.plist b/ParseFacebookUtilsiOS/Tests/TestApplication/Resources/Info.plist deleted file mode 100644 index 6dcc65160..000000000 --- a/ParseFacebookUtilsiOS/Tests/TestApplication/Resources/Info.plist +++ /dev/null @@ -1,47 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIcons - - CFBundleIcons~ipad - - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - LSRequiresIPhoneOS - - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - - diff --git a/ParseFacebookUtilsiOS/Tests/Unit/FacebookAuthenticationProviderTests.m b/ParseFacebookUtilsiOS/Tests/Unit/FacebookAuthenticationProviderTests.m deleted file mode 100644 index be693619f..000000000 --- a/ParseFacebookUtilsiOS/Tests/Unit/FacebookAuthenticationProviderTests.m +++ /dev/null @@ -1,288 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -@import Bolts; - -@import FBSDKCoreKit.FBSDKAccessToken; -@import FBSDKLoginKit; - -#import "PFFacebookMobileAuthenticationProvider_Private.h" -#import "PFFacebookTestCase.h" - -@interface FacebookAuthenticationProviderTests : PFFacebookTestCase - -@end - -@implementation FacebookAuthenticationProviderTests - -- (void)testAuthType { - XCTAssertEqualObjects(PFFacebookUserAuthenticationType, @"facebook"); -} - -- (void)testAuthenticateRead { - NSDictionary *expectedAuthData = @{ @"id" : @"fbId", - @"access_token" : @"token", - @"expiration_date" : @"1970-01-01T00:22:17.000Z" }; - - id mockedLoginManager = PFStrictClassMock([FBSDKLoginManager class]); - - OCMStub([mockedLoginManager logInWithPermissions:@[ @"read" ] - fromViewController:OCMOCK_ANY - handler:OCMOCK_ANY]).andDo(^(NSInvocation *invocation) { - __unsafe_unretained FBSDKLoginManagerLoginResultBlock handler = nil; - [invocation getArgument:&handler atIndex:4]; - - FBSDKAccessToken *token = [[FBSDKAccessToken alloc] initWithTokenString:@"token" - permissions:@[ @"read" ] - declinedPermissions:@[] - expiredPermissions:@[] - appID:@"appId" - userID:@"fbId" - expirationDate:[NSDate dateWithTimeIntervalSince1970:1337] - refreshDate:[NSDate dateWithTimeIntervalSince1970:1337] - dataAccessExpirationDate:nil]; - - FBSDKLoginManagerLoginResult *result = [[FBSDKLoginManagerLoginResult alloc] initWithToken:token - authenticationToken:nil - isCancelled:NO - grantedPermissions:[NSSet setWithObject:@"read"] - declinedPermissions:[NSSet setWithArray:@[]]]; - - handler(result, nil); - }); - - PFFacebookMobileAuthenticationProvider *provider = [[PFFacebookMobileAuthenticationProvider alloc] initWithApplication:[UIApplication sharedApplication] launchOptions:nil]; - provider.loginManager = mockedLoginManager; - - XCTestExpectation *expectation = [self currentSelectorTestExpectation]; - [[provider authenticateAsyncWithReadPermissions:@[ @"read" ] - publishPermissions:nil] continueWithBlock:^id(BFTask *task) { - XCTAssertEqualObjects(task.result, expectedAuthData); - [expectation fulfill]; - return nil; - }]; - [self waitForTestExpectations]; -} - -- (void)testAuthenticatePublish { - NSDictionary *expectedAuthData = @{ @"id" : @"fbId", - @"access_token" : @"token", - @"expiration_date" : @"1970-01-01T00:22:17.000Z" }; - - id mockedLoginManager = PFStrictClassMock([FBSDKLoginManager class]); - - OCMStub([mockedLoginManager logInWithPermissions:@[ @"publish" ] - fromViewController:OCMOCK_ANY - handler:OCMOCK_ANY]).andDo(^(NSInvocation *invocation) { - __unsafe_unretained FBSDKLoginManagerLoginResultBlock handler = nil; - [invocation getArgument:&handler atIndex:4]; - - FBSDKAccessToken *token = [[FBSDKAccessToken alloc] initWithTokenString:@"token" - permissions:@[ @"publish" ] - declinedPermissions:@[] - expiredPermissions:@[] - appID:@"appId" - userID:@"fbId" - expirationDate:[NSDate dateWithTimeIntervalSince1970:1337] - refreshDate:[NSDate dateWithTimeIntervalSince1970:1337] - dataAccessExpirationDate:nil]; - - FBSDKLoginManagerLoginResult *result = [[FBSDKLoginManagerLoginResult alloc] initWithToken:token - authenticationToken:nil - isCancelled:NO - grantedPermissions:[NSSet setWithObject:@"publish"] - declinedPermissions:[NSSet setWithArray:@[]]]; - - handler(result, nil); - }); - - PFFacebookMobileAuthenticationProvider *provider = [[PFFacebookMobileAuthenticationProvider alloc] initWithApplication:[UIApplication sharedApplication] launchOptions:nil]; - provider.loginManager = mockedLoginManager; - - XCTestExpectation *expectation = [self currentSelectorTestExpectation]; - [[provider authenticateAsyncWithReadPermissions:@[] - publishPermissions:@[ @"publish" ]] continueWithBlock:^id(BFTask *task) { - XCTAssertEqualObjects(task.result, expectedAuthData); - [expectation fulfill]; - return nil; - }]; - [self waitForTestExpectations]; -} - -- (void)testAuthenticateBoth { - id mockedLoginManager = PFStrictClassMock([FBSDKLoginManager class]); - - PFFacebookMobileAuthenticationProvider *provider = [[PFFacebookMobileAuthenticationProvider alloc] initWithApplication:[UIApplication sharedApplication] launchOptions:nil]; - provider.loginManager = mockedLoginManager; - - OCMStub([mockedLoginManager logInWithPermissions:(@[ @"read", @"publish" ]) - fromViewController:OCMOCK_ANY - handler:OCMOCK_ANY]).andDo((^(NSInvocation *invocation) { - __unsafe_unretained FBSDKLoginManagerLoginResultBlock handler = nil; - [invocation getArgument:&handler atIndex:4]; - - FBSDKAccessToken *token = [[FBSDKAccessToken alloc] initWithTokenString:@"token" - permissions:@[ @"read", @"publish" ] - declinedPermissions:@[] - expiredPermissions:@[] - appID:@"appId" - userID:@"fbId" - expirationDate:[NSDate dateWithTimeIntervalSince1970:1337] - refreshDate:[NSDate dateWithTimeIntervalSince1970:1337] - dataAccessExpirationDate:nil]; - - FBSDKLoginManagerLoginResult *result = [[FBSDKLoginManagerLoginResult alloc] initWithToken:token - authenticationToken:nil - isCancelled:NO - grantedPermissions:[NSSet setWithArray:@[ @"read", @"publish" ]] - declinedPermissions:[NSSet setWithArray:@[]]]; - - handler(result, nil); - })); - - XCTestExpectation *expectation = [self currentSelectorTestExpectation]; - [[provider authenticateAsyncWithReadPermissions:@[ @"read" ] publishPermissions:@[ @"publish" ]] continueWithBlock:^id(BFTask *task) { - XCTAssertNil(task.error); - [expectation fulfill]; - return nil; - }]; - [self waitForTestExpectations]; -} - -- (void)testAuthenticateCancel { - id mockedLoginManager = PFStrictClassMock([FBSDKLoginManager class]); - - OCMStub([mockedLoginManager logInWithPermissions:@[ @"publish" ] - fromViewController:OCMOCK_ANY - handler:OCMOCK_ANY]).andDo(^(NSInvocation *invocation) { - __unsafe_unretained FBSDKLoginManagerLoginResultBlock handler = nil; - [invocation getArgument:&handler atIndex:4]; - - FBSDKLoginManagerLoginResult *result = [[FBSDKLoginManagerLoginResult alloc] initWithToken:nil - authenticationToken:nil - isCancelled:YES - grantedPermissions:[NSSet setWithArray:@[]] - declinedPermissions:[NSSet setWithObject:@"publish"]]; - - handler(result, nil); - }); - - PFFacebookMobileAuthenticationProvider *provider = [[PFFacebookMobileAuthenticationProvider alloc] initWithApplication:[UIApplication sharedApplication] launchOptions:nil]; - provider.loginManager = mockedLoginManager; - - XCTestExpectation *expectation = [self currentSelectorTestExpectation]; - [[provider authenticateAsyncWithReadPermissions:@[] publishPermissions:@[ @"publish" ]] continueWithBlock:^id(BFTask *task) { - XCTAssertTrue(task.cancelled); - [expectation fulfill]; - return nil; - }]; - [self waitForTestExpectations]; -} - -- (void)testAuthenticateError { - NSError *expectedError = [NSError errorWithDomain:@"FBSDK" code:1337 userInfo:nil]; - id mockedLoginManager = PFStrictClassMock([FBSDKLoginManager class]); - - OCMStub([mockedLoginManager logInWithPermissions:@[ @"publish" ] - fromViewController:OCMOCK_ANY - handler:OCMOCK_ANY]).andDo(^(NSInvocation *invocation) { - __unsafe_unretained FBSDKLoginManagerLoginResultBlock handler = nil; - [invocation getArgument:&handler atIndex:4]; - - handler(nil, expectedError); - }); - - PFFacebookMobileAuthenticationProvider *provider = [[PFFacebookMobileAuthenticationProvider alloc] initWithApplication:[UIApplication sharedApplication] launchOptions:nil]; - provider.loginManager = mockedLoginManager; - - XCTestExpectation *expectation = [self currentSelectorTestExpectation]; - [[provider authenticateAsyncWithReadPermissions:@[] publishPermissions:@[ @"publish" ]] continueWithBlock:^id(BFTask *task) { - XCTAssertEqualObjects(task.error, expectedError); - [expectation fulfill]; - return nil; - }]; - [self waitForTestExpectations]; -} - -- (void)testAuthenticateInvalidResults { - id mockedLoginManager = PFStrictClassMock([FBSDKLoginManager class]); - -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wnonnull" - - // Test simulates invalid input with a nil user. User is nonnull in the interface. Disabling that warning here. - - OCMStub([mockedLoginManager logInWithPermissions:@[ @"publish" ] - fromViewController:OCMOCK_ANY - handler:OCMOCK_ANY]).andDo(^(NSInvocation *invocation) { - __unsafe_unretained FBSDKLoginManagerLoginResultBlock handler = nil; - [invocation getArgument:&handler atIndex:4]; - - FBSDKAccessToken *token = [[FBSDKAccessToken alloc] initWithTokenString:@"" - permissions:@[ @"publish" ] - declinedPermissions:@[] - expiredPermissions:@[] - appID:@"appId" - userID:nil - expirationDate:nil - refreshDate:nil - dataAccessExpirationDate:nil]; - - FBSDKLoginManagerLoginResult *result = [[FBSDKLoginManagerLoginResult alloc] initWithToken:token - authenticationToken:nil - isCancelled:NO - grantedPermissions:[NSSet setWithObject:@"publish"] - declinedPermissions:[NSSet setWithArray:@[]]]; - - handler(result, nil); - }); - -#pragma GCC diagnostic pop - - - - PFFacebookMobileAuthenticationProvider *provider = [[PFFacebookMobileAuthenticationProvider alloc] initWithApplication:[UIApplication sharedApplication] launchOptions:nil]; - provider.loginManager = mockedLoginManager; - - XCTestExpectation *expectation = [self currentSelectorTestExpectation]; - [[provider authenticateAsyncWithReadPermissions:@[] publishPermissions:@[ @"publish" ]] continueWithBlock:^id(BFTask *task) { - XCTAssertNil(task.result); - XCTAssertFalse(task.faulted); - [expectation fulfill]; - return nil; - }]; - [self waitForTestExpectations]; -} - -- (void)testReauthenticate { - NSDictionary *authData = @{ @"id" : @"fbId", - @"access_token" : @"token", - @"expiration_date" : @"1970-01-01T00:22:17.000Z" }; - - id mockedLoginManager = PFStrictClassMock([FBSDKLoginManager class]); - - PFFacebookMobileAuthenticationProvider *provider = [[PFFacebookMobileAuthenticationProvider alloc] initWithApplication:[UIApplication sharedApplication] launchOptions:nil]; - provider.loginManager = mockedLoginManager; - - XCTAssertTrue([provider restoreAuthenticationWithAuthData:authData]); -} - -- (void)testRestoreAuthNil { - id mockedLoginManager = PFStrictClassMock([FBSDKLoginManager class]); - OCMExpect([mockedLoginManager logOut]); - - PFFacebookMobileAuthenticationProvider *provider = [[PFFacebookMobileAuthenticationProvider alloc] initWithApplication:[UIApplication sharedApplication] launchOptions:nil]; - provider.loginManager = mockedLoginManager; - - XCTAssertTrue([provider restoreAuthenticationWithAuthData:nil]); - - OCMVerifyAll(mockedLoginManager); -} - -@end diff --git a/ParseFacebookUtilsiOS/Tests/Unit/FacebookUtilsTests.m b/ParseFacebookUtilsiOS/Tests/Unit/FacebookUtilsTests.m deleted file mode 100644 index 2e2df432f..000000000 --- a/ParseFacebookUtilsiOS/Tests/Unit/FacebookUtilsTests.m +++ /dev/null @@ -1,277 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -@import ParseCore; - -#import - -#import "PFFacebookTestCase.h" -#import "PFFacebookUtils_Private.h" - -#if __has_include() -#import -#else -#import "PFFacebookUtils.h" -#endif - -///-------------------------------------- -#pragma mark - FacebookUtilsTests -///-------------------------------------- - -@interface FacebookUtilsTests : PFFacebookTestCase - -@end - -@implementation FacebookUtilsTests - -///-------------------------------------- -#pragma mark - XCTestCase -///-------------------------------------- - -- (void)tearDown { - [PFFacebookUtilsDevice _setAuthenticationProvider:nil]; - - [super tearDown]; -} - -///-------------------------------------- -#pragma mark - Helpers -///-------------------------------------- - -- (NSDictionary *)sampleAuthData { - return @{ @"id" : @"fbId", - @"auth_token" : @"token", - @"expiration_date" : @"1970-01-01T00:22:17.000Z" }; -} - -///-------------------------------------- -#pragma mark - Tests -///-------------------------------------- - -- (void)testInitialize { - id userMock = PFStrictClassMock([PFUser class]); - OCMExpect(ClassMethod([userMock registerAuthenticationDelegate:[OCMArg checkWithBlock:^BOOL(id obj) { - return (obj != nil); - }] forAuthType:@"facebook"])); - - XCTAssertThrows([PFFacebookUtilsDevice unlinkUserInBackground:userMock]); - - XCTAssertThrows([PFFacebookUtilsDevice initializeFacebookWithApplicationLaunchOptions:nil]); - - id parseMock = PFStrictClassMock([Parse class]); - id configurationMock = PFStrictClassMock([ParseClientConfiguration class]); - OCMStub(ClassMethod([parseMock currentConfiguration])).andReturn(configurationMock); - - XCTAssertNoThrow([PFFacebookUtilsDevice initializeFacebookWithApplicationLaunchOptions:nil]); - XCTAssertNotNil([PFFacebookUtilsDevice _authenticationProvider]); - XCTAssertNoThrow([PFFacebookUtilsDevice initializeFacebookWithApplicationLaunchOptions:nil]); - - OCMVerifyAll(userMock); -} - -- (void)testLoginManager { - id mockedLoginManager = PFStrictClassMock([FBSDKLoginManager class]); - id mockedAuthProvider = PFStrictClassMock([PFFacebookMobileAuthenticationProvider class]); - - OCMStub([mockedAuthProvider loginManager]).andReturn(mockedLoginManager); - - [PFFacebookUtilsDevice _setAuthenticationProvider:mockedAuthProvider]; - XCTAssertEqualObjects(mockedLoginManager, [PFFacebookUtilsDevice facebookLoginManager]); -} - -- (void)testLoginReadPermissions { - id mockedAuthProvider = PFStrictClassMock([PFFacebookMobileAuthenticationProvider class]); - OCMStub([mockedAuthProvider authenticateAsyncWithReadPermissions:@[ @"read" ] publishPermissions:nil]).andReturn([BFTask taskWithResult:@{}]); - [PFFacebookUtilsDevice _setAuthenticationProvider:mockedAuthProvider]; - - id userMock = PFStrictClassMock([PFUser class]); - OCMStub(ClassMethod([userMock logInWithAuthTypeInBackground:@"facebook" authData:[OCMArg isNotNil]])).andReturn([BFTask taskWithResult:userMock]); - - XCTestExpectation *taskExpecatation = [self expectationWithDescription:@"task"]; - [[PFFacebookUtilsDevice logInInBackgroundWithReadPermissions:@[ @"read" ]] continueWithBlock:^id(BFTask *task) { - XCTAssertEqual(task.result, userMock); - [taskExpecatation fulfill]; - return nil; - }]; - [self waitForTestExpectations]; - - XCTestExpectation *blockExpecatation = [self expectationWithDescription:@"block"]; - [PFFacebookUtilsDevice logInInBackgroundWithReadPermissions:@[ @"read" ] block:^(PFUser *resultUser, NSError *error) { - XCTAssertEqual(resultUser, userMock); - XCTAssertNil(error); - [blockExpecatation fulfill]; - }]; - [self waitForTestExpectations]; -} - -- (void)testLoginWritePermissions { - id mockedAuthProvider = PFStrictClassMock([PFFacebookMobileAuthenticationProvider class]); - OCMStub([mockedAuthProvider authenticateAsyncWithReadPermissions:nil publishPermissions:@[ @"publish" ]]).andReturn([BFTask taskWithResult:@{}]); - [PFFacebookUtilsDevice _setAuthenticationProvider:mockedAuthProvider]; - - id userMock = PFStrictClassMock([PFUser class]); - OCMStub(ClassMethod([userMock logInWithAuthTypeInBackground:@"facebook" authData:[OCMArg isNotNil]])).andReturn([BFTask taskWithResult:userMock]); - - XCTestExpectation *taskExpecatation = [self expectationWithDescription:@"task"]; - [[PFFacebookUtilsDevice logInInBackgroundWithPublishPermissions:@[ @"publish" ]] continueWithBlock:^id(BFTask *task) { - XCTAssertEqual(task.result, userMock); - [taskExpecatation fulfill]; - return nil; - }]; - [self waitForTestExpectations]; - - XCTestExpectation *blockExpecatation = [self expectationWithDescription:@"block"]; - [PFFacebookUtilsDevice logInInBackgroundWithPublishPermissions:@[ @"publish" ] block:^(PFUser *resultUser, NSError *error) { - XCTAssertEqual(resultUser, userMock); - XCTAssertNil(error); - [blockExpecatation fulfill]; - }]; - [self waitForTestExpectations]; -} - -- (void)testLoginWithAccessToken { - id mockedPrivateUtilities = PFStrictClassMock([PFFacebookUtils class]); - id mockedAccessToken = PFStrictClassMock([FBSDKAccessToken class]); - id mockedAuthProvider = PFStrictClassMock([PFFacebookMobileAuthenticationProvider class]); - [PFFacebookUtilsDevice _setAuthenticationProvider:mockedAuthProvider]; - - // NOTE: (richardross) Until we decouple user login with auth data, we can only mock error cases here. - OCMStub(ClassMethod([mockedPrivateUtilities userAuthenticationDataFromAccessToken:mockedAccessToken])).andReturn(nil); - - XCTestExpectation *taskExpectation = [self expectationWithDescription:@"task"]; - [[PFFacebookUtilsDevice logInInBackgroundWithAccessToken:mockedAccessToken] continueWithBlock:^id(BFTask *task) { - XCTAssertEqualObjects(task.error.domain, PFParseErrorDomain); - XCTAssertEqual(task.error.code, kPFErrorFacebookInvalidSession); - [taskExpectation fulfill]; - return nil; - }]; - [self waitForTestExpectations]; - - XCTestExpectation *blockExpectation = [self expectationWithDescription:@"block"]; - [PFFacebookUtilsDevice logInInBackgroundWithAccessToken:mockedAccessToken block:^(PFUser *user, NSError *error) { - XCTAssertNil(user); - XCTAssertEqualObjects(error.domain, PFParseErrorDomain); - XCTAssertEqual(error.code, kPFErrorFacebookInvalidSession); - [blockExpectation fulfill]; - }]; - [self waitForTestExpectations]; -} - -- (void)testLinkWithReadPermissions { - id mockedUser = PFStrictClassMock([PFUser class]); - id mockedAuthProvider = PFStrictClassMock([PFFacebookMobileAuthenticationProvider class]); - - OCMStub([mockedAuthProvider authenticateAsyncWithReadPermissions:@[ @"read" ] publishPermissions:nil]).andReturn([BFTask taskWithResult:@{}]); - [PFFacebookUtilsDevice _setAuthenticationProvider:mockedAuthProvider]; - - OCMStub([mockedUser linkWithAuthTypeInBackground:@"facebook" authData:[OCMArg isNotNil]]).andReturn([BFTask taskWithResult:@YES]); - - XCTestExpectation *taskExpecatation = [self expectationWithDescription:@"task"]; - [[PFFacebookUtilsDevice linkUserInBackground:mockedUser withReadPermissions:@[ @"read" ]] continueWithBlock:^id(BFTask *task) { - XCTAssertEqualObjects(task.result, @YES); - [taskExpecatation fulfill]; - return nil; - }]; - [self waitForTestExpectations]; - - XCTestExpectation *blockExpectation = [self expectationWithDescription:@"block"]; - [PFFacebookUtilsDevice linkUserInBackground:mockedUser withReadPermissions:@[ @"read" ] block:^(BOOL result, NSError *error) { - XCTAssertTrue(result); - [blockExpectation fulfill]; - }]; - [self waitForTestExpectations]; -} - -- (void)testLinkWithWritePermissions { - id mockedUser = PFStrictClassMock([PFUser class]); - id mockedAuthProvider = PFStrictClassMock([PFFacebookMobileAuthenticationProvider class]); - - OCMStub([mockedAuthProvider authenticateAsyncWithReadPermissions:nil publishPermissions:@[ @"publish" ]]).andReturn([BFTask taskWithResult:@{}]); - [PFFacebookUtilsDevice _setAuthenticationProvider:mockedAuthProvider]; - OCMStub([mockedUser linkWithAuthTypeInBackground:@"facebook" authData:[OCMArg isNotNil]]).andReturn([BFTask taskWithResult:@YES]); - - XCTestExpectation *taskExpecation = [self expectationWithDescription:@"task"]; - [[PFFacebookUtilsDevice linkUserInBackground:mockedUser withPublishPermissions:@[ @"publish" ]] continueWithBlock:^id(BFTask *task) { - XCTAssertEqualObjects(task.result, @YES); - [taskExpecation fulfill]; - return nil; - }]; - [self waitForTestExpectations]; - - XCTestExpectation *blockExpectation = [self expectationWithDescription:@"block"]; - [PFFacebookUtilsDevice linkUserInBackground:mockedUser withPublishPermissions:@[ @"publish" ] block:^(BOOL result, NSError *error) { - XCTAssertTrue(result); - [blockExpectation fulfill]; - }]; - [self waitForTestExpectations]; -} - -- (void)testLinkWithAccessToken { - id mockedPrivateUtilities = PFStrictClassMock([PFFacebookUtils class]); - id mockedAccessToken = PFStrictClassMock([FBSDKAccessToken class]); - id mockedUser = PFStrictClassMock([PFUser class]); - id mockedAuthProvider = PFStrictClassMock([PFFacebookMobileAuthenticationProvider class]); - - NSDictionary *sampleAuthData = [self sampleAuthData]; - OCMStub(ClassMethod([mockedPrivateUtilities userAuthenticationDataFromAccessToken:mockedAccessToken])).andReturn(sampleAuthData); - - [PFFacebookUtilsDevice _setAuthenticationProvider:mockedAuthProvider]; - [OCMStub([mockedUser linkWithAuthTypeInBackground:@"facebook" authData:sampleAuthData]) andReturn:[BFTask taskWithResult:@YES]]; - - XCTestExpectation *taskExpecatation = [self expectationWithDescription:@"block"]; - [[PFFacebookUtilsDevice linkUserInBackground:mockedUser withAccessToken:mockedAccessToken] continueWithBlock:^id(BFTask *task) { - XCTAssertEqualObjects(task.result, @YES); - [taskExpecatation fulfill]; - return nil; - }]; - [self waitForTestExpectations]; - - XCTestExpectation *blockExpectation = [self expectationWithDescription:@"block"]; - [PFFacebookUtilsDevice linkUserInBackground:mockedUser withAccessToken:mockedAccessToken block:^(BOOL result, NSError *error) { - XCTAssertTrue(result); - [blockExpectation fulfill]; - }]; - [self waitForTestExpectations]; -} - -- (void)testUnlink { - id mockedLinkedUser = PFStrictClassMock([PFUser class]); - id mockedAuthProvider = PFStrictClassMock([PFFacebookMobileAuthenticationProvider class]); - - [PFFacebookUtilsDevice _setAuthenticationProvider:mockedAuthProvider]; - [OCMStub([mockedLinkedUser unlinkWithAuthTypeInBackground:@"facebook"]) andReturn:[BFTask taskWithResult:@YES]]; - - XCTestExpectation *taskExpecatation = [self expectationWithDescription:@"block"]; - [[PFFacebookUtilsDevice unlinkUserInBackground:mockedLinkedUser] continueWithBlock:^id(BFTask *task) { - XCTAssertEqualObjects(task.result, @YES); - [taskExpecatation fulfill]; - return nil; - }]; - [self waitForTestExpectations]; - - XCTestExpectation *blockExpectation = [self expectationWithDescription:@"block"]; - [PFFacebookUtilsDevice unlinkUserInBackground:mockedLinkedUser block:^(BOOL result, NSError *error) { - XCTAssertTrue(result); - [blockExpectation fulfill]; - }]; - [self waitForTestExpectations]; -} - -- (void)testIsLinked { - id mockedLinkedUser = PFStrictClassMock([PFUser class]); - id mockedUnlinkedUser = PFStrictClassMock([PFUser class]); - - OCMStub([mockedLinkedUser isLinkedWithAuthType:@"facebook"]).andReturn(YES); - OCMStub([mockedUnlinkedUser isLinkedWithAuthType:@"facebook"]).andReturn(NO); - - XCTAssertTrue([PFFacebookUtilsDevice isLinkedWithUser:mockedLinkedUser]); - XCTAssertFalse([PFFacebookUtilsDevice isLinkedWithUser:mockedUnlinkedUser]); -} - -@end diff --git a/ParseLiveQuery/Examples/LiveQueryDemo.xcodeproj/project.pbxproj b/ParseLiveQuery/Examples/LiveQueryDemo.xcodeproj/project.pbxproj index 115b5245d..452c4732b 100644 --- a/ParseLiveQuery/Examples/LiveQueryDemo.xcodeproj/project.pbxproj +++ b/ParseLiveQuery/Examples/LiveQueryDemo.xcodeproj/project.pbxproj @@ -3,10 +3,11 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ + 6B63F16A2BC3560300F89DEE /* ParseLiveQuery in Frameworks */ = {isa = PBXBuildFile; productRef = 6B63F1692BC3560300F89DEE /* ParseLiveQuery */; }; F509D5291CA9E53D007B15B0 /* Message.swift in Sources */ = {isa = PBXBuildFile; fileRef = F59F85B61C9BB4B600566A29 /* Message.swift */; }; F509D52A1CA9E53D007B15B0 /* Room.swift in Sources */ = {isa = PBXBuildFile; fileRef = F59F85B71C9BB4B600566A29 /* Room.swift */; }; F509D52B1CA9E53D007B15B0 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = F59F85AF1C9BB48200566A29 /* main.swift */; }; @@ -57,6 +58,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 6B63F16A2BC3560300F89DEE /* ParseLiveQuery in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -128,6 +130,9 @@ dependencies = ( ); name = LiveQueryDemo; + packageProductDependencies = ( + 6B63F1692BC3560300F89DEE /* ParseLiveQuery */, + ); productName = AppKitDemo; productReference = F509D5171CA9E4AE007B15B0 /* LiveQueryDemo.app */; productType = "com.apple.product-type.application"; @@ -235,7 +240,10 @@ CODE_SIGN_IDENTITY = "-"; COMBINE_HIDPI_IMAGES = YES; INFOPLIST_FILE = "$(SRCROOT)/LiveQueryDemo/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); MACOSX_DEPLOYMENT_TARGET = 10.15; PRODUCT_BUNDLE_IDENTIFIER = com.parse.LiveQueryDemo; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -251,7 +259,10 @@ CODE_SIGN_IDENTITY = "-"; COMBINE_HIDPI_IMAGES = YES; INFOPLIST_FILE = "$(SRCROOT)/LiveQueryDemo/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); MACOSX_DEPLOYMENT_TARGET = 10.15; PRODUCT_BUNDLE_IDENTIFIER = com.parse.LiveQueryDemo; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -358,7 +369,8 @@ MACOSX_DEPLOYMENT_TARGET = 10.15; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = macosx; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; }; name = Release; }; @@ -384,6 +396,13 @@ defaultConfigurationName = Release; }; /* End XCConfigurationList section */ + +/* Begin XCSwiftPackageProductDependency section */ + 6B63F1692BC3560300F89DEE /* ParseLiveQuery */ = { + isa = XCSwiftPackageProductDependency; + productName = ParseLiveQuery; + }; +/* End XCSwiftPackageProductDependency section */ }; rootObject = F59F85A41C9BB48200566A29 /* Project object */; } diff --git a/ParseLiveQuery/ParseLiveQuery.xcodeproj/project.pbxproj b/ParseLiveQuery/ParseLiveQuery.xcodeproj/project.pbxproj index 4c96b67e2..2e1717f2a 100644 --- a/ParseLiveQuery/ParseLiveQuery.xcodeproj/project.pbxproj +++ b/ParseLiveQuery/ParseLiveQuery.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 52; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ @@ -11,16 +11,16 @@ 0632EDD51CA1A6DB00DD3CB8 /* Parse+LiveQuery.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0632EDD31CA1A6DB00DD3CB8 /* Parse+LiveQuery.swift */; }; 094AE9001E25AF3100F408BC /* libicucore.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 094AE8FF1E25AF3100F408BC /* libicucore.tbd */; }; 09D80FE21E26C05200AC7A2D /* libsqlite3.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 09D80FE11E26C05200AC7A2D /* libsqlite3.tbd */; }; - 393363622ACF772800E582D4 /* BoltsSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 393363612ACF772800E582D4 /* BoltsSwift */; }; 393363642ACF773900E582D4 /* BoltsSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 393363632ACF773900E582D4 /* BoltsSwift */; }; 393363902ACF889100E582D4 /* Starscream in Frameworks */ = {isa = PBXBuildFile; productRef = 3933638F2ACF889100E582D4 /* Starscream */; }; 393363922ACF889F00E582D4 /* Starscream in Frameworks */ = {isa = PBXBuildFile; productRef = 393363912ACF889F00E582D4 /* Starscream */; }; 39506FFB2A304E6B007F9550 /* Common.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39506FFA2A304E6B007F9550 /* Common.swift */; }; 39506FFC2A3056B6007F9550 /* Common.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39506FFA2A304E6B007F9550 /* Common.swift */; }; - 39CE834D2ACF707500142920 /* ParseObjC in Frameworks */ = {isa = PBXBuildFile; productRef = 39CE834C2ACF707500142920 /* ParseObjC */; }; 39CE834F2ACF707B00142920 /* ParseObjC in Frameworks */ = {isa = PBXBuildFile; productRef = 39CE834E2ACF707B00142920 /* ParseObjC */; }; 4A819D9D1D937866009C0F61 /* ObjCCompat.swift in Sources */ = {isa = PBXBuildFile; fileRef = F54D58B51C8E33D9009F8D6C /* ObjCCompat.swift */; }; 4A819D9E1D93786A009C0F61 /* ObjCCompat.swift in Sources */ = {isa = PBXBuildFile; fileRef = F54D58B51C8E33D9009F8D6C /* ObjCCompat.swift */; }; + 6B63F1642BC34F3900F89DEE /* ParseObjC in Frameworks */ = {isa = PBXBuildFile; productRef = 6B63F1632BC34F3900F89DEE /* ParseObjC */; }; + 6B63F1682BC355C900F89DEE /* BoltsSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 6B63F1672BC355C900F89DEE /* BoltsSwift */; }; 708836762561F503005B32F0 /* ParseLiveQuery_watchOS.h in Headers */ = {isa = PBXBuildFile; fileRef = 708836742561F503005B32F0 /* ParseLiveQuery_watchOS.h */; settings = {ATTRIBUTES = (Public, ); }; }; 708836982561F55B005B32F0 /* ParseLiveQuery_tvOS.h in Headers */ = {isa = PBXBuildFile; fileRef = 708836962561F55B005B32F0 /* ParseLiveQuery_tvOS.h */; settings = {ATTRIBUTES = (Public, ); }; }; 95E91676299526B200EFDB34 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 094AE9011E25AF3A00F408BC /* Foundation.framework */; }; @@ -181,11 +181,11 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 39CE834D2ACF707500142920 /* ParseObjC in Frameworks */, 95E916B6299527DC00EFDB34 /* SystemConfiguration.framework in Frameworks */, 95E916B12995279800EFDB34 /* AudioToolbox.framework in Frameworks */, + 6B63F1642BC34F3900F89DEE /* ParseObjC in Frameworks */, + 6B63F1682BC355C900F89DEE /* BoltsSwift in Frameworks */, 393363902ACF889100E582D4 /* Starscream in Frameworks */, - 393363622ACF772800E582D4 /* BoltsSwift in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -432,9 +432,9 @@ ); name = "ParseLiveQuery-iOS"; packageProductDependencies = ( - 39CE834C2ACF707500142920 /* ParseObjC */, - 393363612ACF772800E582D4 /* BoltsSwift */, 3933638F2ACF889100E582D4 /* Starscream */, + 6B63F1632BC34F3900F89DEE /* ParseObjC */, + 6B63F1672BC355C900F89DEE /* BoltsSwift */, ); productName = ParseLiveQuery; productReference = F5A9BFCA1BE0248D00E78326 /* ParseLiveQuery.framework */; @@ -1087,11 +1087,6 @@ /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ - 393363612ACF772800E582D4 /* BoltsSwift */ = { - isa = XCSwiftPackageProductDependency; - package = 393363602ACF772800E582D4 /* XCRemoteSwiftPackageReference "Bolts-Swift" */; - productName = BoltsSwift; - }; 393363632ACF773900E582D4 /* BoltsSwift */ = { isa = XCSwiftPackageProductDependency; package = 393363602ACF772800E582D4 /* XCRemoteSwiftPackageReference "Bolts-Swift" */; @@ -1107,14 +1102,19 @@ package = 3933638E2ACF889100E582D4 /* XCRemoteSwiftPackageReference "Starscream" */; productName = Starscream; }; - 39CE834C2ACF707500142920 /* ParseObjC */ = { + 39CE834E2ACF707B00142920 /* ParseObjC */ = { isa = XCSwiftPackageProductDependency; productName = ParseObjC; }; - 39CE834E2ACF707B00142920 /* ParseObjC */ = { + 6B63F1632BC34F3900F89DEE /* ParseObjC */ = { isa = XCSwiftPackageProductDependency; productName = ParseObjC; }; + 6B63F1672BC355C900F89DEE /* BoltsSwift */ = { + isa = XCSwiftPackageProductDependency; + package = 393363602ACF772800E582D4 /* XCRemoteSwiftPackageReference "Bolts-Swift" */; + productName = BoltsSwift; + }; /* End XCSwiftPackageProductDependency section */ }; rootObject = F5256FC51BD71F9A0052FB8A /* Project object */; diff --git a/ParseStarterProject/iOS/ParseStarterProject-Swift/ParseStarterProject/AppDelegate.swift b/ParseStarterProject/iOS/ParseStarterProject-Swift/ParseStarterProject/AppDelegate.swift index 69b522685..5ffabbe1b 100644 --- a/ParseStarterProject/iOS/ParseStarterProject-Swift/ParseStarterProject/AppDelegate.swift +++ b/ParseStarterProject/iOS/ParseStarterProject-Swift/ParseStarterProject/AppDelegate.swift @@ -44,13 +44,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate { } Parse.initialize(with: configuration) - // **************************************************************************** - // If you are using Facebook, uncomment and add your FacebookAppID to your bundle's plist as - // described here: https://developers.facebook.com/docs/getting-started/facebook-sdk-for-ios/ - // Uncomment the line inside ParseStartProject-Bridging-Header and the following line here: - // PFFacebookUtils.initializeFacebook() - // **************************************************************************** - PFUser.enableAutomaticUser() let defaultACL = PFACL() @@ -133,15 +126,4 @@ class AppDelegate: UIResponder, UIApplicationDelegate { // PFAnalytics.trackAppOpenedWithRemoteNotificationPayload(userInfo) // } // } - - //-------------------------------------- - // MARK: Facebook SDK Integration - //-------------------------------------- - - /////////////////////////////////////////////////////////// - // Uncomment this method if you are using Facebook - /////////////////////////////////////////////////////////// - // func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -> Bool { - // return FBAppCall.handleOpenURL(url, sourceApplication:sourceApplication, session:PFFacebookUtils.session()) - // } } diff --git a/ParseStarterProject/iOS/ParseStarterProject/ParseStarterProject/ParseStarterProjectAppDelegate.m b/ParseStarterProject/iOS/ParseStarterProject/ParseStarterProject/ParseStarterProjectAppDelegate.m index f072fa6e7..f3bb506a7 100644 --- a/ParseStarterProject/iOS/ParseStarterProject/ParseStarterProject/ParseStarterProjectAppDelegate.m +++ b/ParseStarterProject/iOS/ParseStarterProject/ParseStarterProject/ParseStarterProjectAppDelegate.m @@ -12,9 +12,6 @@ // If you want to use any of the UI components, uncomment this line // #import -// If you are using Facebook, uncomment this line -// #import - #import "ParseStarterProjectAppDelegate.h" #import "ParseStarterProjectViewController.h" @@ -43,12 +40,6 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( configuration.localDatastoreEnabled = YES; }]]; - // **************************************************************************** - // If you are using Facebook, uncomment and add your FacebookAppID to your bundle's plist as - // described here: https://developers.facebook.com/docs/getting-started/facebook-sdk-for-ios/ - // [PFFacebookUtils initializeFacebook]; - // **************************************************************************** - [PFUser enableAutomaticUser]; PFACL *defaultACL = [PFACL ACL]; @@ -133,16 +124,4 @@ - (void)application:(UIApplication *)application didReceiveRemoteNotification:(N // } //} -#pragma mark Facebook SDK Integration - -/////////////////////////////////////////////////////////// -// Uncomment this method if you are using Facebook -/////////////////////////////////////////////////////////// -//- (BOOL)application:(UIApplication *)application -// openURL:(NSURL *)url -// sourceApplication:(NSString *)sourceApplication -// annotation:(id)annotation { -// return [PFFacebookUtils handleOpenURL:url]; -//} - @end diff --git a/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarterProject/AppDelegate.swift b/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarterProject/AppDelegate.swift index ad4fe6816..a3c01de2c 100644 --- a/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarterProject/AppDelegate.swift +++ b/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarterProject/AppDelegate.swift @@ -121,15 +121,4 @@ class AppDelegate: UIResponder, UIApplicationDelegate { // PFAnalytics.trackAppOpenedWithRemoteNotificationPayload(userInfo) // } // } - - //-------------------------------------- - // MARK: Facebook SDK Integration - //-------------------------------------- - - /////////////////////////////////////////////////////////// - // Uncomment this method if you are using Facebook - /////////////////////////////////////////////////////////// - // func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -> Bool { - // return FBAppCall.handleOpenURL(url, sourceApplication:sourceApplication, session:PFFacebookUtils.session()) - // } } diff --git a/ParseTwitterUtils/.gitignore b/ParseTwitterUtils/.gitignore deleted file mode 100644 index f4096fee4..000000000 --- a/ParseTwitterUtils/.gitignore +++ /dev/null @@ -1 +0,0 @@ -Package.resolved diff --git a/ParseTwitterUtils/CHANGELOG.md b/ParseTwitterUtils/CHANGELOG.md deleted file mode 100644 index d44df0325..000000000 --- a/ParseTwitterUtils/CHANGELOG.md +++ /dev/null @@ -1,55 +0,0 @@ -# Change Log - -## [1.11.0](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/tree/1.11.0) (2016-06-29) -[Full Changelog](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/compare/1.10.0...1.11.0) - -**Implemented enhancements:** - -- Add support for Carthage. [\#33](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/pull/33) ([nlutsenko](https://github.com/nlutsenko)) -- Fix analyzer and build warnings. [\#32](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/pull/32) ([nlutsenko](https://github.com/nlutsenko)) -- Update all dependencies and project to Xcode 7.3. [\#28](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/pull/28) ([nlutsenko](https://github.com/nlutsenko)) -- Add support for using `PF_Twitter` without a linking or logging into a Parse account [\#27](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/pull/27) ([zadr](https://github.com/zadr)) -- Removed `Parse.clientKey` requirement for initializing ParseTwitterUtils. [\#26](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/pull/26) ([aphex3k](https://github.com/aphex3k)) - -**Merged pull requests:** - -- Update CocoaPods and RubyGems dependencies. [\#31](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/pull/31) ([nlutsenko](https://github.com/nlutsenko)) - -## [1.10.0](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/tree/1.10.0) (2016-01-08) -[Full Changelog](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/compare/1.9.1...1.10.0) - -**Implemented enhancements:** - -- Remove all usages of PF\_GENERIC macro. [\#19](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/pull/19) ([nlutsenko](https://github.com/nlutsenko)) -- Add custom packaging into a precompiled binary via Rakefile. [\#16](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/pull/16) ([nlutsenko](https://github.com/nlutsenko)) -- Update all of the public documentation to new style. [\#15](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/pull/15) ([nlutsenko](https://github.com/nlutsenko)) - -**Merged pull requests:** - -- ParseTwitterUtils 1.10.0 [\#21](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/pull/21) ([nlutsenko](https://github.com/nlutsenko)) -- Update project to Xcode 7.2. [\#20](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/pull/20) ([nlutsenko](https://github.com/nlutsenko)) -- Use Xcode 7.2 for Travis-CI. [\#17](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/pull/17) ([nlutsenko](https://github.com/nlutsenko)) -- Update xctoolchain to latest. [\#14](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/pull/14) ([richardjrossiii](https://github.com/richardjrossiii)) - -## [1.9.1](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/tree/1.9.1) (2015-11-18) -[Full Changelog](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/compare/1.9.0...1.9.1) - -**Implemented enhancements:** - -- Fix warnings in PFOAuth1FlowDialog. [\#10](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/pull/10) ([nlutsenko](https://github.com/nlutsenko)) -- Remove all usage of custom nullability macros. [\#8](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/pull/8) ([nlutsenko](https://github.com/nlutsenko)) -- Update everything to use Xcode 7.1. [\#6](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/pull/6) ([nlutsenko](https://github.com/nlutsenko)) -- Added safeguard assertion for initialization of PFTwitterUtils before Parse is initialized. [\#4](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/pull/4) ([nlutsenko](https://github.com/nlutsenko)) -- Include and automate localized strings generation. [\#2](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/pull/2) ([nlutsenko](https://github.com/nlutsenko)) - -**Merged pull requests:** - -- ParseTwitterUtils 1.9.1 [\#13](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/pull/13) ([nlutsenko](https://github.com/nlutsenko)) -- Update Gemfile. [\#9](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/pull/9) ([nlutsenko](https://github.com/nlutsenko)) -- Update xctoolchain to latest. [\#5](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/pull/5) ([nlutsenko](https://github.com/nlutsenko)) -- Use shared things from xctoolchain. [\#3](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/pull/3) ([nlutsenko](https://github.com/nlutsenko)) - -## [1.9.0](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/tree/1.9.0) (2015-10-08) - - -\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)* \ No newline at end of file diff --git a/ParseTwitterUtils/Configurations/ParseTwitterTestApplication.xcconfig b/ParseTwitterUtils/Configurations/ParseTwitterTestApplication.xcconfig deleted file mode 100644 index 7d288ec81..000000000 --- a/ParseTwitterUtils/Configurations/ParseTwitterTestApplication.xcconfig +++ /dev/null @@ -1,18 +0,0 @@ -// -// Copyright (c) 2015-present, Parse, LLC. -// All rights reserved. -// -// This source code is licensed under the BSD-style license found in the -// LICENSE file in the root directory of this source tree. An additional grant -// of patent rights can be found in the PATENTS file in the same directory. -// - -#include "Shared/Platform/iOS.xcconfig" -#include "Shared/Product/Application.xcconfig" - -PRODUCT_NAME = ParseTwitterTestApplication -PRODUCT_BUNDLE_IDENTIFIER = com.parse.twitterutils.testapplication - -IPHONEOS_DEPLOYMENT_TARGET = 12.0 - -INFOPLIST_FILE = $(SRCROOT)/Tests/TestApplication/Resources/Info.plist diff --git a/ParseTwitterUtils/Configurations/ParseTwitterUtils-Tests.xcconfig b/ParseTwitterUtils/Configurations/ParseTwitterUtils-Tests.xcconfig deleted file mode 100644 index b32ed55c1..000000000 --- a/ParseTwitterUtils/Configurations/ParseTwitterUtils-Tests.xcconfig +++ /dev/null @@ -1,18 +0,0 @@ -// -// Copyright (c) 2015-present, Parse, LLC. -// All rights reserved. -// -// This source code is licensed under the BSD-style license found in the -// LICENSE file in the root directory of this source tree. An additional grant -// of patent rights can be found in the PATENTS file in the same directory. -// - -#include "Shared/Platform/iOS.xcconfig" -#include "Shared/Product/LogicTests.xcconfig" - -PRODUCT_NAME = ParseTwitterUtils-Tests -IPHONEOS_DEPLOYMENT_TARGET = 12.0 - -INFOPLIST_FILE = $(PROJECT_DIR)/Tests/Resources/Info.plist - -TEST_HOST = $(BUILT_PRODUCTS_DIR)/ParseTwitterTestApplication.app/ParseTwitterTestApplication diff --git a/ParseTwitterUtils/Configurations/ParseTwitterUtils-iOS-Dynamic.xcconfig b/ParseTwitterUtils/Configurations/ParseTwitterUtils-iOS-Dynamic.xcconfig deleted file mode 100644 index 9930dd79e..000000000 --- a/ParseTwitterUtils/Configurations/ParseTwitterUtils-iOS-Dynamic.xcconfig +++ /dev/null @@ -1,21 +0,0 @@ -// -// Copyright (c) 2015-present, Parse, LLC. -// All rights reserved. -// -// This source code is licensed under the BSD-style license found in the -// LICENSE file in the root directory of this source tree. An additional grant -// of patent rights can be found in the PATENTS file in the same directory. -// - -#include "Shared/Platform/iOS.xcconfig" -#include "Shared/Product/DynamicFramework.xcconfig" - -PRODUCT_NAME = ParseTwitterUtils -PRODUCT_BUNDLE_IDENTIFIER = com.parse.twitterutils.ios - -IPHONEOS_DEPLOYMENT_TARGET = 12.0 - -INFOPLIST_FILE = $(SRCROOT)/ParseTwitterUtils/Resources/Info-iOS.plist - -// TODO: (nlutsenko) Cleanup source code so we can safely ignore local variable shadow warnings. -GCC_WARN_SHADOW = NO diff --git a/ParseTwitterUtils/Configurations/ParseTwitterUtils-iOS.xcconfig b/ParseTwitterUtils/Configurations/ParseTwitterUtils-iOS.xcconfig deleted file mode 100644 index 1cfe8062c..000000000 --- a/ParseTwitterUtils/Configurations/ParseTwitterUtils-iOS.xcconfig +++ /dev/null @@ -1,20 +0,0 @@ -// -// Copyright (c) 2015-present, Parse, LLC. -// All rights reserved. -// -// This source code is licensed under the BSD-style license found in the -// LICENSE file in the root directory of this source tree. An additional grant -// of patent rights can be found in the PATENTS file in the same directory. -// - -#include "Shared/Platform/iOS.xcconfig" -#include "Shared/Product/StaticFramework.xcconfig" - -PRODUCT_NAME = ParseTwitterUtils -PRODUCT_BUNDLE_IDENTIFIER = com.parse.twitterutils.ios - -INFOPLIST_FILE = $(SRCROOT)/ParseTwitterUtils/Resources/Info-iOS.plist - -// TODO: (nlutsenko) Cleanup source code so we can safely ignore local variable shadow warnings. -GCC_WARN_SHADOW = NO - diff --git a/ParseTwitterUtils/Configurations/Shared b/ParseTwitterUtils/Configurations/Shared deleted file mode 120000 index 657caabf0..000000000 --- a/ParseTwitterUtils/Configurations/Shared +++ /dev/null @@ -1 +0,0 @@ -../../Vendor/xctoolchain/Configurations \ No newline at end of file diff --git a/ParseTwitterUtils/ParseTwitterTestApplication.entitlements b/ParseTwitterUtils/ParseTwitterTestApplication.entitlements deleted file mode 100644 index ee95ab7e5..000000000 --- a/ParseTwitterUtils/ParseTwitterTestApplication.entitlements +++ /dev/null @@ -1,10 +0,0 @@ - - - - - com.apple.security.app-sandbox - - com.apple.security.network.client - - - diff --git a/ParseTwitterUtils/ParseTwitterUtils.xcodeproj/project.pbxproj b/ParseTwitterUtils/ParseTwitterUtils.xcodeproj/project.pbxproj deleted file mode 100644 index 9f30c48a4..000000000 --- a/ParseTwitterUtils/ParseTwitterUtils.xcodeproj/project.pbxproj +++ /dev/null @@ -1,936 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 52; - objects = { - -/* Begin PBXBuildFile section */ - 06D00BB51BC790F3005BAA6F /* PFTwitterLocalization.h in Headers */ = {isa = PBXBuildFile; fileRef = 06D00BB41BC790F3005BAA6F /* PFTwitterLocalization.h */; }; - 39E22B102AD070A500D9AE5C /* OCMock in Frameworks */ = {isa = PBXBuildFile; productRef = 39E22B0F2AD070A500D9AE5C /* OCMock */; }; - 39E2490B2AD1C6470014357C /* ParseTwitterUtils in Frameworks */ = {isa = PBXBuildFile; productRef = 39E2490A2AD1C6470014357C /* ParseTwitterUtils */; }; - 39E2490D2AD1C6520014357C /* ParseObjC in Frameworks */ = {isa = PBXBuildFile; productRef = 39E2490C2AD1C6520014357C /* ParseObjC */; }; - 7C605D0B292A91D700E4B6D2 /* PFTwitterLocalization.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C605D02292A91D700E4B6D2 /* PFTwitterLocalization.m */; }; - 7C605D0C292A91D700E4B6D2 /* PFTwitterLocalization.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C605D02292A91D700E4B6D2 /* PFTwitterLocalization.m */; }; - 7C77D07E2929241300C4D90E /* PF_Twitter.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D079292923FF00C4D90E /* PF_Twitter.m */; }; - 7C77D07F2929241300C4D90E /* PFTwitterUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D07D292923FF00C4D90E /* PFTwitterUtils.m */; }; - 7C77D0802929241D00C4D90E /* PFTwitterUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D07A292923FF00C4D90E /* PFTwitterUtils.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D0812929241D00C4D90E /* PF_Twitter.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D07B292923FF00C4D90E /* PF_Twitter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D0822929241D00C4D90E /* ParseTwitterUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D07C292923FF00C4D90E /* ParseTwitterUtils.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D0832929243E00C4D90E /* PFTwitterUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D07A292923FF00C4D90E /* PFTwitterUtils.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D0842929243E00C4D90E /* PF_Twitter.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D07B292923FF00C4D90E /* PF_Twitter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D0852929243E00C4D90E /* ParseTwitterUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D07C292923FF00C4D90E /* ParseTwitterUtils.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D0862929244900C4D90E /* PF_Twitter.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D079292923FF00C4D90E /* PF_Twitter.m */; }; - 7C77D0872929244900C4D90E /* PFTwitterUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D07D292923FF00C4D90E /* PFTwitterUtils.m */; }; - 8135E4951B4B6A0E0092F452 /* PF_Twitter_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 8135E48E1B4B6A0E0092F452 /* PF_Twitter_Private.h */; }; - 8135E4961B4B6A0E0092F452 /* PFTwitterAuthenticationProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 8135E48F1B4B6A0E0092F452 /* PFTwitterAuthenticationProvider.h */; }; - 8135E4971B4B6A0E0092F452 /* PFTwitterAuthenticationProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 8135E4901B4B6A0E0092F452 /* PFTwitterAuthenticationProvider.m */; }; - 813E54A41BB5DDEF00C727E8 /* PFTwitterUtils_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 813E54A31BB5DDEF00C727E8 /* PFTwitterUtils_Private.h */; }; - 813E54A91BB5E5FA00C727E8 /* PFTwitterPrivateUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 813E54A61BB5E52000C727E8 /* PFTwitterPrivateUtilities.m */; }; - 813E54AA1BB5E5FF00C727E8 /* PFTwitterPrivateUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 813E54A51BB5E52000C727E8 /* PFTwitterPrivateUtilities.h */; }; - 815F18401B4B730E0066E996 /* PFOAuth1FlowDialog.h in Headers */ = {isa = PBXBuildFile; fileRef = 815F183E1B4B730E0066E996 /* PFOAuth1FlowDialog.h */; }; - 815F18411B4B730E0066E996 /* PFOAuth1FlowDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = 815F183F1B4B730E0066E996 /* PFOAuth1FlowDialog.m */; }; - 81665C731BBDE27D00AE923F /* OAuth1FlowDialogTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 81665C6E1BBDE27D00AE923F /* OAuth1FlowDialogTests.m */; }; - 81665C741BBDE27D00AE923F /* OAuthCoreTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 81665C6F1BBDE27D00AE923F /* OAuthCoreTests.m */; }; - 81665C751BBDE27D00AE923F /* TwitterAuthenticationProviderTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 81665C701BBDE27D00AE923F /* TwitterAuthenticationProviderTests.m */; }; - 81665C761BBDE27D00AE923F /* TwitterTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 81665C711BBDE27D00AE923F /* TwitterTests.m */; }; - 81665C771BBDE27D00AE923F /* TwitterUtilsTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 81665C721BBDE27D00AE923F /* TwitterUtilsTests.m */; }; - 81665C7C1BBDE2EE00AE923F /* PFTwitterTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = 81665C7B1BBDE2EE00AE923F /* PFTwitterTestCase.m */; }; - 8166FB921B4F1DC5003841A2 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 8166FB8F1B4F1DC5003841A2 /* main.m */; }; - 816832521D1E1A7900315E21 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8168311C1D1E16DC00315E21 /* Security.framework */; platformFilter = ios; }; - 816832591D1E1A7E00315E21 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8168312A1D1E16F000315E21 /* SystemConfiguration.framework */; platformFilter = ios; }; - 8168325E1D1E1A8600315E21 /* libsqlite3.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 816831231D1E16E700315E21 /* libsqlite3.tbd */; platformFilter = ios; }; - 8168326A1D1E1A8B00315E21 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8168312E1D1E16F700315E21 /* AudioToolbox.framework */; platformFilter = ios; }; - 817A37CB1B4B741A00129AFA /* PF_OAuthCore.h in Headers */ = {isa = PBXBuildFile; fileRef = 817A37C91B4B741A00129AFA /* PF_OAuthCore.h */; }; - 817A37CC1B4B741A00129AFA /* PF_OAuthCore.m in Sources */ = {isa = PBXBuildFile; fileRef = 817A37CA1B4B741A00129AFA /* PF_OAuthCore.m */; }; - 819DAAD61BB5EC79002BDE2B /* PFTwitterAlertView.h in Headers */ = {isa = PBXBuildFile; fileRef = 819DAAD41BB5EC79002BDE2B /* PFTwitterAlertView.h */; }; - 819DAAD71BB5EC79002BDE2B /* PFTwitterAlertView.m in Sources */ = {isa = PBXBuildFile; fileRef = 819DAAD51BB5EC79002BDE2B /* PFTwitterAlertView.m */; }; - 81ECACBB1D1E14E000FA7673 /* PFOAuth1FlowDialog.h in Headers */ = {isa = PBXBuildFile; fileRef = 815F183E1B4B730E0066E996 /* PFOAuth1FlowDialog.h */; }; - 81ECACBC1D1E14E000FA7673 /* PF_OAuthCore.h in Headers */ = {isa = PBXBuildFile; fileRef = 817A37C91B4B741A00129AFA /* PF_OAuthCore.h */; }; - 81ECACBD1D1E14E000FA7673 /* PFTwitterUtils_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 813E54A31BB5DDEF00C727E8 /* PFTwitterUtils_Private.h */; }; - 81ECACBF1D1E14E000FA7673 /* PFTwitterPrivateUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 813E54A51BB5E52000C727E8 /* PFTwitterPrivateUtilities.h */; }; - 81ECACC11D1E14E000FA7673 /* PFTwitterLocalization.h in Headers */ = {isa = PBXBuildFile; fileRef = 06D00BB41BC790F3005BAA6F /* PFTwitterLocalization.h */; }; - 81ECACC21D1E14E000FA7673 /* PF_Twitter_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 8135E48E1B4B6A0E0092F452 /* PF_Twitter_Private.h */; }; - 81ECACC31D1E14E000FA7673 /* PFTwitterAuthenticationProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 8135E48F1B4B6A0E0092F452 /* PFTwitterAuthenticationProvider.h */; }; - 81ECACC41D1E14E000FA7673 /* PFTwitterAlertView.h in Headers */ = {isa = PBXBuildFile; fileRef = 819DAAD41BB5EC79002BDE2B /* PFTwitterAlertView.h */; }; - 81ECACC71D1E14E000FA7673 /* PFTwitterAuthenticationProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 8135E4901B4B6A0E0092F452 /* PFTwitterAuthenticationProvider.m */; }; - 81ECACCA1D1E14E000FA7673 /* PFOAuth1FlowDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = 815F183F1B4B730E0066E996 /* PFOAuth1FlowDialog.m */; }; - 81ECACCB1D1E14E000FA7673 /* PFTwitterPrivateUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 813E54A61BB5E52000C727E8 /* PFTwitterPrivateUtilities.m */; }; - 81ECACCC1D1E14E000FA7673 /* PF_OAuthCore.m in Sources */ = {isa = PBXBuildFile; fileRef = 817A37CA1B4B741A00129AFA /* PF_OAuthCore.m */; }; - 81ECACCD1D1E14E000FA7673 /* PFTwitterAlertView.m in Sources */ = {isa = PBXBuildFile; fileRef = 819DAAD51BB5EC79002BDE2B /* PFTwitterAlertView.m */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 8166FB941B4F1E9A003841A2 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 8166FB661B4F1D77003841A2; - remoteInfo = ParseTwitterTestApplication; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 06D00BB41BC790F3005BAA6F /* PFTwitterLocalization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PFTwitterLocalization.h; sourceTree = ""; }; - 39E249092AD1C61F0014357C /* Parse-SDK-iOS-OSX */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = "Parse-SDK-iOS-OSX"; path = ..; sourceTree = ""; }; - 7C605D02292A91D700E4B6D2 /* PFTwitterLocalization.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PFTwitterLocalization.m; sourceTree = ""; }; - 7C77D076292923FF00C4D90E /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/ParseTwitterUtils.strings; sourceTree = ""; }; - 7C77D077292923FF00C4D90E /* Info-iOS.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Info-iOS.plist"; sourceTree = ""; }; - 7C77D079292923FF00C4D90E /* PF_Twitter.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PF_Twitter.m; sourceTree = ""; }; - 7C77D07A292923FF00C4D90E /* PFTwitterUtils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFTwitterUtils.h; sourceTree = ""; }; - 7C77D07B292923FF00C4D90E /* PF_Twitter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PF_Twitter.h; sourceTree = ""; }; - 7C77D07C292923FF00C4D90E /* ParseTwitterUtils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ParseTwitterUtils.h; sourceTree = ""; }; - 7C77D07D292923FF00C4D90E /* PFTwitterUtils.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFTwitterUtils.m; sourceTree = ""; }; - 8135E48E1B4B6A0E0092F452 /* PF_Twitter_Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PF_Twitter_Private.h; sourceTree = ""; }; - 8135E48F1B4B6A0E0092F452 /* PFTwitterAuthenticationProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PFTwitterAuthenticationProvider.h; sourceTree = ""; }; - 8135E4901B4B6A0E0092F452 /* PFTwitterAuthenticationProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PFTwitterAuthenticationProvider.m; sourceTree = ""; }; - 813E54A31BB5DDEF00C727E8 /* PFTwitterUtils_Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PFTwitterUtils_Private.h; sourceTree = ""; }; - 813E54A51BB5E52000C727E8 /* PFTwitterPrivateUtilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PFTwitterPrivateUtilities.h; sourceTree = ""; }; - 813E54A61BB5E52000C727E8 /* PFTwitterPrivateUtilities.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PFTwitterPrivateUtilities.m; sourceTree = ""; }; - 815462231D37FE6E0069489A /* Common.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Common.xcconfig; sourceTree = ""; }; - 815462251D37FE6E0069489A /* iOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = iOS.xcconfig; sourceTree = ""; }; - 815462261D37FE6E0069489A /* macOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = macOS.xcconfig; sourceTree = ""; }; - 815462271D37FE6E0069489A /* tvOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = tvOS.xcconfig; sourceTree = ""; }; - 815462281D37FE6E0069489A /* watchOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = watchOS.xcconfig; sourceTree = ""; }; - 8154622A1D37FE6E0069489A /* Application.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Application.xcconfig; sourceTree = ""; }; - 8154622B1D37FE6E0069489A /* DynamicFramework.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = DynamicFramework.xcconfig; sourceTree = ""; }; - 8154622C1D37FE6E0069489A /* LogicTests.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = LogicTests.xcconfig; sourceTree = ""; }; - 8154622D1D37FE6E0069489A /* StaticFramework.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = StaticFramework.xcconfig; sourceTree = ""; }; - 8154622F1D37FE6E0069489A /* Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - 815462301D37FE6E0069489A /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 815462311D37FE6E0069489A /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; - 815F183E1B4B730E0066E996 /* PFOAuth1FlowDialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PFOAuth1FlowDialog.h; sourceTree = ""; }; - 815F183F1B4B730E0066E996 /* PFOAuth1FlowDialog.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PFOAuth1FlowDialog.m; sourceTree = ""; }; - 81665C6E1BBDE27D00AE923F /* OAuth1FlowDialogTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OAuth1FlowDialogTests.m; sourceTree = ""; }; - 81665C6F1BBDE27D00AE923F /* OAuthCoreTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OAuthCoreTests.m; sourceTree = ""; }; - 81665C701BBDE27D00AE923F /* TwitterAuthenticationProviderTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TwitterAuthenticationProviderTests.m; sourceTree = ""; }; - 81665C711BBDE27D00AE923F /* TwitterTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TwitterTests.m; sourceTree = ""; }; - 81665C721BBDE27D00AE923F /* TwitterUtilsTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TwitterUtilsTests.m; sourceTree = ""; }; - 81665C7A1BBDE2EE00AE923F /* PFTwitterTestCase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PFTwitterTestCase.h; sourceTree = ""; }; - 81665C7B1BBDE2EE00AE923F /* PFTwitterTestCase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PFTwitterTestCase.m; sourceTree = ""; }; - 8166FB671B4F1D77003841A2 /* ParseTwitterTestApplication.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ParseTwitterTestApplication.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 8166FB8F1B4F1DC5003841A2 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 8166FB911B4F1DC5003841A2 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 816831121D1E16CC00315E21 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; - 816831151D1E16D000315E21 /* Accounts.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accounts.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/System/Library/Frameworks/Accounts.framework; sourceTree = DEVELOPER_DIR; }; - 816831181D1E16D500315E21 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/System/Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; }; - 8168311C1D1E16DC00315E21 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/System/Library/Frameworks/Security.framework; sourceTree = DEVELOPER_DIR; }; - 8168311F1D1E16E200315E21 /* StoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = StoreKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/System/Library/Frameworks/StoreKit.framework; sourceTree = DEVELOPER_DIR; }; - 816831231D1E16E700315E21 /* libsqlite3.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsqlite3.tbd; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/usr/lib/libsqlite3.tbd; sourceTree = DEVELOPER_DIR; }; - 816831261D1E16EB00315E21 /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/System/Library/Frameworks/CoreLocation.framework; sourceTree = DEVELOPER_DIR; }; - 8168312A1D1E16F000315E21 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/System/Library/Frameworks/SystemConfiguration.framework; sourceTree = DEVELOPER_DIR; }; - 8168312E1D1E16F700315E21 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/System/Library/Frameworks/AudioToolbox.framework; sourceTree = DEVELOPER_DIR; }; - 816831321D1E16FE00315E21 /* Social.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Social.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/System/Library/Frameworks/Social.framework; sourceTree = DEVELOPER_DIR; }; - 817A37C91B4B741A00129AFA /* PF_OAuthCore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PF_OAuthCore.h; sourceTree = ""; }; - 817A37CA1B4B741A00129AFA /* PF_OAuthCore.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PF_OAuthCore.m; sourceTree = ""; }; - 81930A391BBDE76E00A5E4BB /* PFTwitterTestMacros.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFTwitterTestMacros.h; sourceTree = ""; }; - 819DAAD41BB5EC79002BDE2B /* PFTwitterAlertView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PFTwitterAlertView.h; sourceTree = ""; }; - 819DAAD51BB5EC79002BDE2B /* PFTwitterAlertView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PFTwitterAlertView.m; sourceTree = ""; }; - 81CB98C61AB7905D00136FA5 /* ParseTwitterUtils-Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "ParseTwitterUtils-Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - 81CB98D31AB7906D00136FA5 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = ../Resources/Info.plist; sourceTree = ""; }; - 81ECACD71D1E14E000FA7673 /* ParseTwitterUtils.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ParseTwitterUtils.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 81ECACD91D1E14F300FA7673 /* ParseTwitterUtils-iOS-Dynamic.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "ParseTwitterUtils-iOS-Dynamic.xcconfig"; sourceTree = ""; }; - B99F4FFE2444B5B00061A6F5 /* ParseTwitterTestApplication.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = ParseTwitterTestApplication.entitlements; sourceTree = ""; }; - B9A7EEC123C49D94003E606E /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; - D2AAC07E0554694100DB518D /* ParseTwitterUtils.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ParseTwitterUtils.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - F51535531B57453700C49F56 /* ParseTwitterUtils-iOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "ParseTwitterUtils-iOS.xcconfig"; sourceTree = ""; }; - F51535541B57454500C49F56 /* ParseTwitterUtils-Tests.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "ParseTwitterUtils-Tests.xcconfig"; sourceTree = ""; }; - F51535551B57455200C49F56 /* ParseTwitterTestApplication.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = ParseTwitterTestApplication.xcconfig; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 8166FB641B4F1D77003841A2 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 81CB98C31AB7905D00136FA5 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 39E22B102AD070A500D9AE5C /* OCMock in Frameworks */, - 8168326A1D1E1A8B00315E21 /* AudioToolbox.framework in Frameworks */, - 39E2490B2AD1C6470014357C /* ParseTwitterUtils in Frameworks */, - 8168325E1D1E1A8600315E21 /* libsqlite3.tbd in Frameworks */, - 816832591D1E1A7E00315E21 /* SystemConfiguration.framework in Frameworks */, - 816832521D1E1A7900315E21 /* Security.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 81ECACCE1D1E14E000FA7673 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - D2AAC07C0554694100DB518D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 39E2490D2AD1C6520014357C /* ParseObjC in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 034768DFFF38A50411DB9C8B /* Products */ = { - isa = PBXGroup; - children = ( - D2AAC07E0554694100DB518D /* ParseTwitterUtils.framework */, - 81CB98C61AB7905D00136FA5 /* ParseTwitterUtils-Tests.xctest */, - 8166FB671B4F1D77003841A2 /* ParseTwitterTestApplication.app */, - 81ECACD71D1E14E000FA7673 /* ParseTwitterUtils.framework */, - ); - name = Products; - sourceTree = ""; - }; - 0867D691FE84028FC02AAC07 /* Breakpad */ = { - isa = PBXGroup; - children = ( - 39E249082AD1C61F0014357C /* Packages */, - B99F4FFE2444B5B00061A6F5 /* ParseTwitterTestApplication.entitlements */, - F51535381B57451200C49F56 /* Configurations */, - 8135E48C1B4B6A0E0092F452 /* ParseTwitterUtils */, - 81CB98D21AB7906D00136FA5 /* Tests */, - 0867D69AFE84028FC02AAC07 /* Frameworks */, - 034768DFFF38A50411DB9C8B /* Products */, - ); - indentWidth = 4; - name = Breakpad; - sourceTree = ""; - }; - 0867D69AFE84028FC02AAC07 /* Frameworks */ = { - isa = PBXGroup; - children = ( - B9A7EEC123C49D94003E606E /* CoreGraphics.framework */, - 813DFC8E1AB2513300F25A08 /* System Frameworks */, - ); - name = Frameworks; - sourceTree = ""; - }; - 39E249082AD1C61F0014357C /* Packages */ = { - isa = PBXGroup; - children = ( - 39E249092AD1C61F0014357C /* Parse-SDK-iOS-OSX */, - ); - name = Packages; - sourceTree = ""; - }; - 7C77D074292923FF00C4D90E /* Resources */ = { - isa = PBXGroup; - children = ( - 7C77D075292923FF00C4D90E /* ParseTwitterUtils.strings */, - 7C77D077292923FF00C4D90E /* Info-iOS.plist */, - ); - path = Resources; - sourceTree = ""; - }; - 7C77D078292923FF00C4D90E /* Source */ = { - isa = PBXGroup; - children = ( - 7C77D079292923FF00C4D90E /* PF_Twitter.m */, - 7C77D07A292923FF00C4D90E /* PFTwitterUtils.h */, - 7C77D07B292923FF00C4D90E /* PF_Twitter.h */, - 7C77D07C292923FF00C4D90E /* ParseTwitterUtils.h */, - 7C77D07D292923FF00C4D90E /* PFTwitterUtils.m */, - ); - path = Source; - sourceTree = ""; - }; - 8135E48C1B4B6A0E0092F452 /* ParseTwitterUtils */ = { - isa = PBXGroup; - children = ( - 8135E48D1B4B6A0E0092F452 /* Internal */, - 7C77D074292923FF00C4D90E /* Resources */, - 7C77D078292923FF00C4D90E /* Source */, - ); - path = ParseTwitterUtils; - sourceTree = ""; - }; - 8135E48D1B4B6A0E0092F452 /* Internal */ = { - isa = PBXGroup; - children = ( - 815F183D1B4B730E0066E996 /* Dialog */, - 817A37C81B4B741A00129AFA /* OAuthCore */, - 8135E48E1B4B6A0E0092F452 /* PF_Twitter_Private.h */, - 813E54A31BB5DDEF00C727E8 /* PFTwitterUtils_Private.h */, - 8135E48F1B4B6A0E0092F452 /* PFTwitterAuthenticationProvider.h */, - 8135E4901B4B6A0E0092F452 /* PFTwitterAuthenticationProvider.m */, - 813E54A51BB5E52000C727E8 /* PFTwitterPrivateUtilities.h */, - 813E54A61BB5E52000C727E8 /* PFTwitterPrivateUtilities.m */, - 819DAAD41BB5EC79002BDE2B /* PFTwitterAlertView.h */, - 819DAAD51BB5EC79002BDE2B /* PFTwitterAlertView.m */, - 06D00BB41BC790F3005BAA6F /* PFTwitterLocalization.h */, - 7C605D02292A91D700E4B6D2 /* PFTwitterLocalization.m */, - ); - path = Internal; - sourceTree = ""; - }; - 813DFC8E1AB2513300F25A08 /* System Frameworks */ = { - isa = PBXGroup; - children = ( - 816831321D1E16FE00315E21 /* Social.framework */, - 8168312E1D1E16F700315E21 /* AudioToolbox.framework */, - 8168312A1D1E16F000315E21 /* SystemConfiguration.framework */, - 816831261D1E16EB00315E21 /* CoreLocation.framework */, - 816831231D1E16E700315E21 /* libsqlite3.tbd */, - 8168311F1D1E16E200315E21 /* StoreKit.framework */, - 8168311C1D1E16DC00315E21 /* Security.framework */, - 816831181D1E16D500315E21 /* CoreGraphics.framework */, - 816831151D1E16D000315E21 /* Accounts.framework */, - 816831121D1E16CC00315E21 /* UIKit.framework */, - ); - name = "System Frameworks"; - sourceTree = ""; - }; - 815462221D37FE6E0069489A /* Shared */ = { - isa = PBXGroup; - children = ( - 815462231D37FE6E0069489A /* Common.xcconfig */, - 815462241D37FE6E0069489A /* Platform */, - 815462291D37FE6E0069489A /* Product */, - 8154622E1D37FE6E0069489A /* Project */, - 815462311D37FE6E0069489A /* Warnings.xcconfig */, - ); - path = Shared; - sourceTree = ""; - }; - 815462241D37FE6E0069489A /* Platform */ = { - isa = PBXGroup; - children = ( - 815462251D37FE6E0069489A /* iOS.xcconfig */, - 815462261D37FE6E0069489A /* macOS.xcconfig */, - 815462271D37FE6E0069489A /* tvOS.xcconfig */, - 815462281D37FE6E0069489A /* watchOS.xcconfig */, - ); - path = Platform; - sourceTree = ""; - }; - 815462291D37FE6E0069489A /* Product */ = { - isa = PBXGroup; - children = ( - 8154622A1D37FE6E0069489A /* Application.xcconfig */, - 8154622B1D37FE6E0069489A /* DynamicFramework.xcconfig */, - 8154622C1D37FE6E0069489A /* LogicTests.xcconfig */, - 8154622D1D37FE6E0069489A /* StaticFramework.xcconfig */, - ); - path = Product; - sourceTree = ""; - }; - 8154622E1D37FE6E0069489A /* Project */ = { - isa = PBXGroup; - children = ( - 8154622F1D37FE6E0069489A /* Debug.xcconfig */, - 815462301D37FE6E0069489A /* Release.xcconfig */, - ); - path = Project; - sourceTree = ""; - }; - 815F183D1B4B730E0066E996 /* Dialog */ = { - isa = PBXGroup; - children = ( - 815F183E1B4B730E0066E996 /* PFOAuth1FlowDialog.h */, - 815F183F1B4B730E0066E996 /* PFOAuth1FlowDialog.m */, - ); - path = Dialog; - sourceTree = ""; - }; - 81665C6D1BBDE27D00AE923F /* Unit */ = { - isa = PBXGroup; - children = ( - 81665C6E1BBDE27D00AE923F /* OAuth1FlowDialogTests.m */, - 81665C6F1BBDE27D00AE923F /* OAuthCoreTests.m */, - 81665C701BBDE27D00AE923F /* TwitterAuthenticationProviderTests.m */, - 81665C711BBDE27D00AE923F /* TwitterTests.m */, - 81665C721BBDE27D00AE923F /* TwitterUtilsTests.m */, - ); - path = Unit; - sourceTree = ""; - }; - 81665C781BBDE2C000AE923F /* Other */ = { - isa = PBXGroup; - children = ( - 81665C791BBDE2EE00AE923F /* TestCase */, - 81930A391BBDE76E00A5E4BB /* PFTwitterTestMacros.h */, - ); - path = Other; - sourceTree = ""; - }; - 81665C791BBDE2EE00AE923F /* TestCase */ = { - isa = PBXGroup; - children = ( - 81665C7A1BBDE2EE00AE923F /* PFTwitterTestCase.h */, - 81665C7B1BBDE2EE00AE923F /* PFTwitterTestCase.m */, - ); - path = TestCase; - sourceTree = ""; - }; - 8166FB8D1B4F1DC5003841A2 /* TestApplication */ = { - isa = PBXGroup; - children = ( - 8166FB8E1B4F1DC5003841A2 /* Classes */, - 8166FB901B4F1DC5003841A2 /* Resources */, - ); - path = TestApplication; - sourceTree = ""; - }; - 8166FB8E1B4F1DC5003841A2 /* Classes */ = { - isa = PBXGroup; - children = ( - 8166FB8F1B4F1DC5003841A2 /* main.m */, - ); - path = Classes; - sourceTree = ""; - }; - 8166FB901B4F1DC5003841A2 /* Resources */ = { - isa = PBXGroup; - children = ( - 8166FB911B4F1DC5003841A2 /* Info.plist */, - ); - path = Resources; - sourceTree = ""; - }; - 817A37C81B4B741A00129AFA /* OAuthCore */ = { - isa = PBXGroup; - children = ( - 817A37C91B4B741A00129AFA /* PF_OAuthCore.h */, - 817A37CA1B4B741A00129AFA /* PF_OAuthCore.m */, - ); - path = OAuthCore; - sourceTree = ""; - }; - 81CB98D21AB7906D00136FA5 /* Tests */ = { - isa = PBXGroup; - children = ( - 81665C6D1BBDE27D00AE923F /* Unit */, - 81665C781BBDE2C000AE923F /* Other */, - 81CB98D71AB7907500136FA5 /* Resources */, - 8166FB8D1B4F1DC5003841A2 /* TestApplication */, - ); - path = Tests; - sourceTree = ""; - }; - 81CB98D71AB7907500136FA5 /* Resources */ = { - isa = PBXGroup; - children = ( - 81CB98D31AB7906D00136FA5 /* Info.plist */, - ); - name = Resources; - sourceTree = ""; - }; - F51535381B57451200C49F56 /* Configurations */ = { - isa = PBXGroup; - children = ( - F51535531B57453700C49F56 /* ParseTwitterUtils-iOS.xcconfig */, - 81ECACD91D1E14F300FA7673 /* ParseTwitterUtils-iOS-Dynamic.xcconfig */, - F51535541B57454500C49F56 /* ParseTwitterUtils-Tests.xcconfig */, - F51535551B57455200C49F56 /* ParseTwitterTestApplication.xcconfig */, - 815462221D37FE6E0069489A /* Shared */, - ); - path = Configurations; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - 81ECACBA1D1E14E000FA7673 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C77D0832929243E00C4D90E /* PFTwitterUtils.h in Headers */, - 7C77D0842929243E00C4D90E /* PF_Twitter.h in Headers */, - 7C77D0852929243E00C4D90E /* ParseTwitterUtils.h in Headers */, - 81ECACBB1D1E14E000FA7673 /* PFOAuth1FlowDialog.h in Headers */, - 81ECACBC1D1E14E000FA7673 /* PF_OAuthCore.h in Headers */, - 81ECACBD1D1E14E000FA7673 /* PFTwitterUtils_Private.h in Headers */, - 81ECACBF1D1E14E000FA7673 /* PFTwitterPrivateUtilities.h in Headers */, - 81ECACC11D1E14E000FA7673 /* PFTwitterLocalization.h in Headers */, - 81ECACC21D1E14E000FA7673 /* PF_Twitter_Private.h in Headers */, - 81ECACC31D1E14E000FA7673 /* PFTwitterAuthenticationProvider.h in Headers */, - 81ECACC41D1E14E000FA7673 /* PFTwitterAlertView.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - D2AAC07A0554694100DB518D /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C77D0802929241D00C4D90E /* PFTwitterUtils.h in Headers */, - 7C77D0812929241D00C4D90E /* PF_Twitter.h in Headers */, - 7C77D0822929241D00C4D90E /* ParseTwitterUtils.h in Headers */, - 815F18401B4B730E0066E996 /* PFOAuth1FlowDialog.h in Headers */, - 817A37CB1B4B741A00129AFA /* PF_OAuthCore.h in Headers */, - 813E54A41BB5DDEF00C727E8 /* PFTwitterUtils_Private.h in Headers */, - 813E54AA1BB5E5FF00C727E8 /* PFTwitterPrivateUtilities.h in Headers */, - 06D00BB51BC790F3005BAA6F /* PFTwitterLocalization.h in Headers */, - 8135E4951B4B6A0E0092F452 /* PF_Twitter_Private.h in Headers */, - 8135E4961B4B6A0E0092F452 /* PFTwitterAuthenticationProvider.h in Headers */, - 819DAAD61BB5EC79002BDE2B /* PFTwitterAlertView.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - 8166FB661B4F1D77003841A2 /* ParseTwitterTestApplication */ = { - isa = PBXNativeTarget; - buildConfigurationList = 8166FB8B1B4F1D77003841A2 /* Build configuration list for PBXNativeTarget "ParseTwitterTestApplication" */; - buildPhases = ( - 8166FB631B4F1D77003841A2 /* Sources */, - 8166FB641B4F1D77003841A2 /* Frameworks */, - 8166FB651B4F1D77003841A2 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = ParseTwitterTestApplication; - productName = ParseTwitterTestApplication; - productReference = 8166FB671B4F1D77003841A2 /* ParseTwitterTestApplication.app */; - productType = "com.apple.product-type.application"; - }; - 81CB98C51AB7905D00136FA5 /* ParseTwitterUtils-Tests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 81CB98D11AB7905D00136FA5 /* Build configuration list for PBXNativeTarget "ParseTwitterUtils-Tests" */; - buildPhases = ( - 81CB98C21AB7905D00136FA5 /* Sources */, - 81CB98C31AB7905D00136FA5 /* Frameworks */, - 81CB98C41AB7905D00136FA5 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 8166FB951B4F1E9A003841A2 /* PBXTargetDependency */, - ); - name = "ParseTwitterUtils-Tests"; - packageProductDependencies = ( - 39E22B0F2AD070A500D9AE5C /* OCMock */, - 39E2490A2AD1C6470014357C /* ParseTwitterUtils */, - ); - productName = "ParseFacebookUtilsV4-Tests"; - productReference = 81CB98C61AB7905D00136FA5 /* ParseTwitterUtils-Tests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 81ECACB71D1E14E000FA7673 /* ParseTwitterUtils-iOS-Dynamic */ = { - isa = PBXNativeTarget; - buildConfigurationList = 81ECACD41D1E14E000FA7673 /* Build configuration list for PBXNativeTarget "ParseTwitterUtils-iOS-Dynamic" */; - buildPhases = ( - 81ECACB91D1E14E000FA7673 /* Generate Localizable Strings */, - 81ECACBA1D1E14E000FA7673 /* Headers */, - 81ECACC61D1E14E000FA7673 /* Sources */, - 81ECACCE1D1E14E000FA7673 /* Frameworks */, - 81ECACD11D1E14E000FA7673 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "ParseTwitterUtils-iOS-Dynamic"; - productName = Breakpad; - productReference = 81ECACD71D1E14E000FA7673 /* ParseTwitterUtils.framework */; - productType = "com.apple.product-type.framework"; - }; - D2AAC07D0554694100DB518D /* ParseTwitterUtils-iOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "ParseTwitterUtils-iOS" */; - buildPhases = ( - 81B3F2291AC9CA2600A92677 /* Generate Localizable Strings */, - D2AAC07A0554694100DB518D /* Headers */, - D2AAC07B0554694100DB518D /* Sources */, - D2AAC07C0554694100DB518D /* Frameworks */, - 8139B1341A7BF6B5002BEF84 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "ParseTwitterUtils-iOS"; - packageProductDependencies = ( - 39E2490C2AD1C6520014357C /* ParseObjC */, - ); - productName = Breakpad; - productReference = D2AAC07E0554694100DB518D /* ParseTwitterUtils.framework */; - productType = "com.apple.product-type.framework"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 0867D690FE84028FC02AAC07 /* Project object */ = { - isa = PBXProject; - attributes = { - CLASSPREFIX = PF; - LastUpgradeCheck = 1020; - ORGANIZATIONNAME = "Parse, LLC"; - TargetAttributes = { - 8166FB661B4F1D77003841A2 = { - CreatedOnToolsVersion = 6.4; - }; - 81CB98C51AB7905D00136FA5 = { - CreatedOnToolsVersion = 6.2; - TestTargetID = 8166FB661B4F1D77003841A2; - }; - }; - }; - buildConfigurationList = 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "ParseTwitterUtils" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = en; - hasScannedForEncodings = 1; - knownRegions = ( - en, - Base, - ); - mainGroup = 0867D691FE84028FC02AAC07 /* Breakpad */; - packageReferences = ( - 39E22B0E2AD070A500D9AE5C /* XCRemoteSwiftPackageReference "ocmock" */, - ); - productRefGroup = 034768DFFF38A50411DB9C8B /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - D2AAC07D0554694100DB518D /* ParseTwitterUtils-iOS */, - 81ECACB71D1E14E000FA7673 /* ParseTwitterUtils-iOS-Dynamic */, - 81CB98C51AB7905D00136FA5 /* ParseTwitterUtils-Tests */, - 8166FB661B4F1D77003841A2 /* ParseTwitterTestApplication */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 8139B1341A7BF6B5002BEF84 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 8166FB651B4F1D77003841A2 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 81CB98C41AB7905D00136FA5 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 81ECACD11D1E14E000FA7673 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 81B3F2291AC9CA2600A92677 /* Generate Localizable Strings */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 8; - files = ( - ); - inputPaths = ( - ); - name = "Generate Localizable Strings"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 1; - shellPath = /bin/sh; - shellScript = "# Generate localizable strings\nLOCALIZATION_FOLDER=$PROJECT_DIR/ParseTwitterUtils/Resources/en.lproj\nLOCALIZATION_MACRO=PFTWLocalizedString\n\nfind $PROJECT_DIR/ParseTwitterUtils -name '*.m' -print0 | xargs -0 xcrun extractLocStrings -s $LOCALIZATION_MACRO -q -o $LOCALIZATION_FOLDER\n\nmv $LOCALIZATION_FOLDER/Localizable.strings $LOCALIZATION_FOLDER/ParseTwitterUtils.strings\n"; - showEnvVarsInLog = 0; - }; - 81ECACB91D1E14E000FA7673 /* Generate Localizable Strings */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Generate Localizable Strings"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "# Generate localizable strings\nLOCALIZATION_FOLDER=$PROJECT_DIR/ParseTwitterUtils/Resources/en.lproj\nLOCALIZATION_MACRO=PFTWLocalizedString\n\nfind $PROJECT_DIR/ParseTwitterUtils -name '*.m' -print0 | xargs -0 xcrun extractLocStrings -s $LOCALIZATION_MACRO -q -o $LOCALIZATION_FOLDER\n\nmv $LOCALIZATION_FOLDER/Localizable.strings $LOCALIZATION_FOLDER/ParseTwitterUtils.strings\n"; - showEnvVarsInLog = 0; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 8166FB631B4F1D77003841A2 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 8166FB921B4F1DC5003841A2 /* main.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 81CB98C21AB7905D00136FA5 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 81665C751BBDE27D00AE923F /* TwitterAuthenticationProviderTests.m in Sources */, - 81665C741BBDE27D00AE923F /* OAuthCoreTests.m in Sources */, - 81665C731BBDE27D00AE923F /* OAuth1FlowDialogTests.m in Sources */, - 81665C771BBDE27D00AE923F /* TwitterUtilsTests.m in Sources */, - 81665C761BBDE27D00AE923F /* TwitterTests.m in Sources */, - 81665C7C1BBDE2EE00AE923F /* PFTwitterTestCase.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 81ECACC61D1E14E000FA7673 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C77D0862929244900C4D90E /* PF_Twitter.m in Sources */, - 7C77D0872929244900C4D90E /* PFTwitterUtils.m in Sources */, - 81ECACC71D1E14E000FA7673 /* PFTwitterAuthenticationProvider.m in Sources */, - 81ECACCA1D1E14E000FA7673 /* PFOAuth1FlowDialog.m in Sources */, - 7C605D0C292A91D700E4B6D2 /* PFTwitterLocalization.m in Sources */, - 81ECACCB1D1E14E000FA7673 /* PFTwitterPrivateUtilities.m in Sources */, - 81ECACCC1D1E14E000FA7673 /* PF_OAuthCore.m in Sources */, - 81ECACCD1D1E14E000FA7673 /* PFTwitterAlertView.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - D2AAC07B0554694100DB518D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C77D07E2929241300C4D90E /* PF_Twitter.m in Sources */, - 7C77D07F2929241300C4D90E /* PFTwitterUtils.m in Sources */, - 8135E4971B4B6A0E0092F452 /* PFTwitterAuthenticationProvider.m in Sources */, - 815F18411B4B730E0066E996 /* PFOAuth1FlowDialog.m in Sources */, - 7C605D0B292A91D700E4B6D2 /* PFTwitterLocalization.m in Sources */, - 813E54A91BB5E5FA00C727E8 /* PFTwitterPrivateUtilities.m in Sources */, - 817A37CC1B4B741A00129AFA /* PF_OAuthCore.m in Sources */, - 819DAAD71BB5EC79002BDE2B /* PFTwitterAlertView.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 8166FB951B4F1E9A003841A2 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - platformFilter = ios; - target = 8166FB661B4F1D77003841A2 /* ParseTwitterTestApplication */; - targetProxy = 8166FB941B4F1E9A003841A2 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 7C77D075292923FF00C4D90E /* ParseTwitterUtils.strings */ = { - isa = PBXVariantGroup; - children = ( - 7C77D076292923FF00C4D90E /* en */, - ); - name = ParseTwitterUtils.strings; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 1DEB921F08733DC00010E9CD /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = F51535531B57453700C49F56 /* ParseTwitterUtils-iOS.xcconfig */; - buildSettings = { - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - SUPPORTS_MACCATALYST = NO; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 1DEB922008733DC00010E9CD /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = F51535531B57453700C49F56 /* ParseTwitterUtils-iOS.xcconfig */; - buildSettings = { - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - ONLY_ACTIVE_ARCH = YES; - SUPPORTS_MACCATALYST = NO; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; - 1DEB922308733DC00010E9CD /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 8154622F1D37FE6E0069489A /* Debug.xcconfig */; - buildSettings = { - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_ENABLE_CODE_COVERAGE = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - ENABLE_TESTABILITY = YES; - ONLY_ACTIVE_ARCH = YES; - PARSE_DIR = "$(PROJECT_DIR)/.."; - }; - name = Debug; - }; - 1DEB922408733DC00010E9CD /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 815462301D37FE6E0069489A /* Release.xcconfig */; - buildSettings = { - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_ENABLE_CODE_COVERAGE = NO; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - PARSE_DIR = "$(PROJECT_DIR)/.."; - }; - name = Release; - }; - 8166FB871B4F1D77003841A2 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = F51535551B57455200C49F56 /* ParseTwitterTestApplication.xcconfig */; - buildSettings = { - CODE_SIGN_ENTITLEMENTS = ParseTwitterTestApplication.entitlements; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - SUPPORTS_MACCATALYST = NO; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 8166FB881B4F1D77003841A2 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = F51535551B57455200C49F56 /* ParseTwitterTestApplication.xcconfig */; - buildSettings = { - CODE_SIGN_ENTITLEMENTS = ParseTwitterTestApplication.entitlements; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - SUPPORTS_MACCATALYST = NO; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; - 81CB98CF1AB7905D00136FA5 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = F51535541B57454500C49F56 /* ParseTwitterUtils-Tests.xcconfig */; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - }; - name = Debug; - }; - 81CB98D01AB7905D00136FA5 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = F51535541B57454500C49F56 /* ParseTwitterUtils-Tests.xcconfig */; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - }; - name = Release; - }; - 81ECACD51D1E14E000FA7673 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 81ECACD91D1E14F300FA7673 /* ParseTwitterUtils-iOS-Dynamic.xcconfig */; - buildSettings = { - CLANG_MODULES_AUTOLINK = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - SUPPORTS_MACCATALYST = NO; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 81ECACD61D1E14E000FA7673 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 81ECACD91D1E14F300FA7673 /* ParseTwitterUtils-iOS-Dynamic.xcconfig */; - buildSettings = { - CLANG_MODULES_AUTOLINK = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - ONLY_ACTIVE_ARCH = YES; - SUPPORTS_MACCATALYST = NO; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "ParseTwitterUtils-iOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1DEB921F08733DC00010E9CD /* Debug */, - 1DEB922008733DC00010E9CD /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "ParseTwitterUtils" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1DEB922308733DC00010E9CD /* Debug */, - 1DEB922408733DC00010E9CD /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 8166FB8B1B4F1D77003841A2 /* Build configuration list for PBXNativeTarget "ParseTwitterTestApplication" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 8166FB871B4F1D77003841A2 /* Debug */, - 8166FB881B4F1D77003841A2 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 81CB98D11AB7905D00136FA5 /* Build configuration list for PBXNativeTarget "ParseTwitterUtils-Tests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 81CB98CF1AB7905D00136FA5 /* Debug */, - 81CB98D01AB7905D00136FA5 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 81ECACD41D1E14E000FA7673 /* Build configuration list for PBXNativeTarget "ParseTwitterUtils-iOS-Dynamic" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 81ECACD51D1E14E000FA7673 /* Debug */, - 81ECACD61D1E14E000FA7673 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - -/* Begin XCRemoteSwiftPackageReference section */ - 39E22B0E2AD070A500D9AE5C /* XCRemoteSwiftPackageReference "ocmock" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/erikdoe/ocmock"; - requirement = { - kind = revision; - revision = 67bb9602f0a7541f24dc2d6d0d7389ca3e4c2c89; - }; - }; -/* End XCRemoteSwiftPackageReference section */ - -/* Begin XCSwiftPackageProductDependency section */ - 39E22B0F2AD070A500D9AE5C /* OCMock */ = { - isa = XCSwiftPackageProductDependency; - package = 39E22B0E2AD070A500D9AE5C /* XCRemoteSwiftPackageReference "ocmock" */; - productName = OCMock; - }; - 39E2490A2AD1C6470014357C /* ParseTwitterUtils */ = { - isa = XCSwiftPackageProductDependency; - productName = ParseTwitterUtils; - }; - 39E2490C2AD1C6520014357C /* ParseObjC */ = { - isa = XCSwiftPackageProductDependency; - productName = ParseObjC; - }; -/* End XCSwiftPackageProductDependency section */ - }; - rootObject = 0867D690FE84028FC02AAC07 /* Project object */; -} diff --git a/ParseTwitterUtils/ParseTwitterUtils.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ParseTwitterUtils/ParseTwitterUtils.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a62..000000000 --- a/ParseTwitterUtils/ParseTwitterUtils.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/ParseTwitterUtils/ParseTwitterUtils.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ParseTwitterUtils/ParseTwitterUtils.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d981003..000000000 --- a/ParseTwitterUtils/ParseTwitterUtils.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/ParseTwitterUtils/ParseTwitterUtils.xcodeproj/xcshareddata/xcschemes/ParseTwitterUtils-iOS-Dynamic.xcscheme b/ParseTwitterUtils/ParseTwitterUtils.xcodeproj/xcshareddata/xcschemes/ParseTwitterUtils-iOS-Dynamic.xcscheme deleted file mode 100644 index 0ae7f5812..000000000 --- a/ParseTwitterUtils/ParseTwitterUtils.xcodeproj/xcshareddata/xcschemes/ParseTwitterUtils-iOS-Dynamic.xcscheme +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ParseTwitterUtils/ParseTwitterUtils.xcodeproj/xcshareddata/xcschemes/ParseTwitterUtils-iOS.xcscheme b/ParseTwitterUtils/ParseTwitterUtils.xcodeproj/xcshareddata/xcschemes/ParseTwitterUtils-iOS.xcscheme deleted file mode 100644 index 9e870b03e..000000000 --- a/ParseTwitterUtils/ParseTwitterUtils.xcodeproj/xcshareddata/xcschemes/ParseTwitterUtils-iOS.xcscheme +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ParseTwitterUtils/ParseTwitterUtils/Internal/Dialog/PFOAuth1FlowDialog.h b/ParseTwitterUtils/ParseTwitterUtils/Internal/Dialog/PFOAuth1FlowDialog.h deleted file mode 100644 index c468bbafb..000000000 --- a/ParseTwitterUtils/ParseTwitterUtils/Internal/Dialog/PFOAuth1FlowDialog.h +++ /dev/null @@ -1,88 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import -#import -#import -@class PFOAuth1FlowDialog; - -@protocol PFOAuth1FlowDialogDataSource - -/** - Asks if a link touched by a user should be opened in an external browser. - - If a user touches a link, the default behavior is to open the link in the Safari browser, - which will cause your app to quit. You may want to prevent this from happening, open the link - in your own internal browser, or perhaps warn the user that they are about to leave your app. - If so, implement this method on your delegate and return NO. If you warn the user, you - should hold onto the URL and once you have received their acknowledgement open the URL yourself - using [[UIApplication sharedApplication] openURL:]. - */ -- (BOOL)dialog:(PFOAuth1FlowDialog *)dialog shouldOpenURLInExternalBrowser:(NSURL *)url; - -@end - -typedef void (^PFOAuth1FlowDialogCompletion)(BOOL succeeded, NSURL *url, NSError *error); - -/** - To allow for greater mockability, this protocol exposes all of the methods implemented by PFOAuth1FlowDialog. - */ -@protocol PFOAuth1FlowDialogInterface - -@property (nonatomic, weak) id dataSource; -@property (nonatomic, strong) PFOAuth1FlowDialogCompletion completion; - -@property (nonatomic, copy) NSDictionary *queryParameters; -@property (nonatomic, copy) NSString *redirectURLPrefix; - -/** - The title that is shown in the header atop the view. - */ -@property (nonatomic, copy) NSString *title; - -+ (instancetype)dialogWithURL:(NSURL *)url queryParameters:(NSDictionary *)queryParameters; - -/** - The view will be added to the top of the current key window. - */ -- (void)showAnimated:(BOOL)animated; - -/** - Hides the view. - This method does not call the completion block. - */ -- (void)dismissAnimated:(BOOL)animated; - -/** - Displays a URL in the dialog. - */ -- (void)loadURL:(NSURL *)url queryParameters:(NSDictionary *)parameters; - -@end - -@interface PFOAuth1FlowDialog : UIView { -@public - // Ensures that UI elements behind the dialog are disabled. - UIView *_modalBackgroundView; - - NSURL *_baseURL; - NSURL *_loadingURL; - - UILabel *_titleLabel; - UIButton *_closeButton; - WKWebView *_webView; - UIActivityIndicatorView *_activityIndicator; - - UIInterfaceOrientation _orientation; - BOOL _showingKeyboard; -} - -- (instancetype)initWithURL:(NSURL *)url queryParameters:(NSDictionary *)parameters; - -@end diff --git a/ParseTwitterUtils/ParseTwitterUtils/Internal/Dialog/PFOAuth1FlowDialog.m b/ParseTwitterUtils/ParseTwitterUtils/Internal/Dialog/PFOAuth1FlowDialog.m deleted file mode 100644 index 537b0bb3a..000000000 --- a/ParseTwitterUtils/ParseTwitterUtils/Internal/Dialog/PFOAuth1FlowDialog.m +++ /dev/null @@ -1,627 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "PFOAuth1FlowDialog.h" -#import - -@import ParseCore; - -@implementation PFOAuth1FlowDialog - -@synthesize dataSource = _dataSource; -@synthesize completion = _completion; - -@synthesize queryParameters = _queryParameters; -@synthesize redirectURLPrefix = _redirectURLPrefix; - -static NSString *const PFOAuth1FlowDialogDefaultTitle = @"Connect to Service"; - -static const CGFloat PFOAuth1FlowDialogBorderGreyColorComponents[4] = {0.3f, 0.3f, 0.3f, 0.8f}; -static const CGFloat PFOAuth1FlowDialogBorderBlackColorComponents[4] = {0.3f, 0.3f, 0.3f, 1.0f}; - -static const NSTimeInterval PFOAuth1FlowDialogAnimationDuration = 0.3; - -static const UIEdgeInsets PFOAuth1FlowDialogContentInsets = { - .top = 10.0f, - .left = 10.0f, - .bottom = 10.0f, - .right = 10.0f, -}; - -static const UIEdgeInsets PFOAuth1FlowDialogTitleInsets = {.top = 4.0f, .left = 8.0f, .bottom = 4.0f, .right = 8.0f}; - -static const CGFloat PFOAuth1FlowDialogScreenInset = 10.0f; - -static BOOL PFOAuth1FlowDialogScreenHasAutomaticRotation() { - static BOOL automaticRotation; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - automaticRotation = [[UIScreen mainScreen] respondsToSelector:NSSelectorFromString(@"coordinateSpace")]; - }); - return automaticRotation; -} - -static BOOL PFOAuth1FlowDialogIsDevicePad() { - static BOOL isPad; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - isPad = (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad); - }); - return isPad; -} - -static CGFloat PFTFloatRound(CGFloat value, NSRoundingMode mode) { - switch (mode) { - case NSRoundPlain: - case NSRoundBankers: -#if CGFLOAT_IS_DOUBLE - value = round(value); -#else - value = roundf(value); -#endif - case NSRoundDown: -#if CGFLOAT_IS_DOUBLE - value = floor(value); -#else - value = floorf(value); -#endif - case NSRoundUp: -#if CGFLOAT_IS_DOUBLE - value = ceil(value); -#else - value = ceilf(value); -#endif - default: break; - } - return value; -} - -#pragma mark - -#pragma mark Class - -+ (void)_fillRect:(CGRect)rect withColorComponents:(const CGFloat *)colorComponents radius:(CGFloat)radius { - CGContextRef context = UIGraphicsGetCurrentContext(); - - if (colorComponents) { - CGContextSaveGState(context); - CGContextSetFillColor(context, colorComponents); - if (radius != 0.0f) { - UIBezierPath *bezierPath = [UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:radius]; - CGContextAddPath(context, [bezierPath CGPath]); - CGContextFillPath(context); - } else { - CGContextFillRect(context, rect); - } - CGContextRestoreGState(context); - } -} - -+ (void)_strokeRect:(CGRect)rect withColorComponents:(const CGFloat *)strokeColor { - CGContextRef context = UIGraphicsGetCurrentContext(); - - CGContextSaveGState(context); - { - CGContextSetStrokeColor(context, strokeColor); - CGContextSetLineWidth(context, 1.0f); - CGContextStrokeRect(context, rect); - } - CGContextRestoreGState(context); -} - -+ (NSURL *)_urlFromBaseURL:(NSURL *)baseURL queryParameters:(NSDictionary *)params { - if ([params count] > 0) { - NSMutableArray *parameterPairs = [NSMutableArray array]; - [params enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { - CFStringRef escapedString = CFURLCreateStringByAddingPercentEscapes( - NULL, /* allocator */ - (CFStringRef)obj, - NULL, /* charactersToLeaveUnescaped */ - (CFStringRef)@"!*'();:@&=+$,/?%#[]", - kCFStringEncodingUTF8); - [parameterPairs addObject:[NSString stringWithFormat:@"%@=%@", key, CFBridgingRelease(escapedString)]]; - }]; - - NSString *query = [parameterPairs componentsJoinedByString:@"&"]; - NSString *url = [NSString stringWithFormat:@"%@?%@", [baseURL absoluteString], query]; - - return [NSURL URLWithString:url]; - } - - return baseURL; -} - -+ (UIImage *)_closeButtonImage { - CGRect imageRect = CGRectZero; - imageRect.size = CGSizeMake(30.0f, 30.0f); - - UIGraphicsBeginImageContextWithOptions(imageRect.size, NO, 0.0f); - CGContextRef context = UIGraphicsGetCurrentContext(); - - CGRect outerRingRect = CGRectInset(imageRect, 2.0f, 2.0f); - - [[UIColor whiteColor] set]; - CGContextFillEllipseInRect(context, outerRingRect); - - CGRect innerRingRect = CGRectInset(outerRingRect, 2.0f, 2.0f); - - [[UIColor blackColor] set]; - CGContextFillEllipseInRect(context, innerRingRect); - - CGRect crossRect = CGRectInset(innerRingRect, 6.0f, 6.0f); - - CGContextBeginPath(context); - - [[UIColor whiteColor] setStroke]; - CGContextSetLineWidth(context, 3.0f); - - CGContextMoveToPoint(context, CGRectGetMinX(crossRect), CGRectGetMinY(crossRect)); - CGContextAddLineToPoint(context, CGRectGetMaxX(crossRect), CGRectGetMaxY(crossRect)); - - CGContextMoveToPoint(context, CGRectGetMaxX(crossRect), CGRectGetMinY(crossRect)); - CGContextAddLineToPoint(context, CGRectGetMinX(crossRect), CGRectGetMaxY(crossRect)); - - CGContextStrokePath(context); - - UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); - UIGraphicsEndImageContext(); - - return image; -} - -#pragma mark - -#pragma mark Init - -- (instancetype)init { - self = [super initWithFrame:CGRectZero]; - if (self) { - self.backgroundColor = [UIColor clearColor]; - self.autoresizesSubviews = YES; - self.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; - self.contentMode = UIViewContentModeRedraw; - - _orientation = UIInterfaceOrientationPortrait; - - _closeButton = [UIButton buttonWithType:UIButtonTypeCustom]; - _closeButton.showsTouchWhenHighlighted = YES; - _closeButton.autoresizingMask = (UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleBottomMargin); - [_closeButton setImage:[[self class] _closeButtonImage] forState:UIControlStateNormal]; - [_closeButton addTarget:self - action:@selector(_cancelButtonAction) - forControlEvents:UIControlEventTouchUpInside]; - [self addSubview:_closeButton]; - - CGFloat titleLabelFontSize = (PFOAuth1FlowDialogIsDevicePad() ? 18.0f : 14.0f); - _titleLabel = [[UILabel alloc] initWithFrame:CGRectZero]; - _titleLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin; - _titleLabel.backgroundColor = [UIColor clearColor]; - _titleLabel.text = PFOAuth1FlowDialogDefaultTitle; - _titleLabel.textColor = [UIColor whiteColor]; - _titleLabel.font = [UIFont boldSystemFontOfSize:titleLabelFontSize]; - [self addSubview:_titleLabel]; - - _webView = [[WKWebView alloc] initWithFrame:CGRectZero]; - _webView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; - _webView.navigationDelegate = self; - [self addSubview:_webView]; - - _activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle: - UIActivityIndicatorViewStyleWhiteLarge]; - _activityIndicator.color = [UIColor grayColor]; - _activityIndicator.autoresizingMask = (UIViewAutoresizingFlexibleTopMargin | - UIViewAutoresizingFlexibleBottomMargin | - UIViewAutoresizingFlexibleLeftMargin | - UIViewAutoresizingFlexibleRightMargin); - [self addSubview:_activityIndicator]; - - _modalBackgroundView = [[UIView alloc] init]; - } - return self; -} - -- (instancetype)initWithURL:(NSURL *)url queryParameters:(NSDictionary *)parameters { - self = [self init]; - if (self) { - _baseURL = url; - _queryParameters = [parameters mutableCopy]; - } - return self; -} - -+ (instancetype)dialogWithURL:(NSURL *)url queryParameters:(NSDictionary *)queryParameters { - return [[self alloc] initWithURL:url queryParameters:queryParameters]; -} - -#pragma mark - -#pragma mark Dealloc - -- (void)dealloc { - _webView.navigationDelegate = nil; - - [[NSNotificationCenter defaultCenter] removeObserver:self]; -} - -#pragma mark - -#pragma mark UIView - -- (void)drawRect:(CGRect)rect { - [super drawRect:rect]; - - [[self class] _fillRect:self.bounds withColorComponents:PFOAuth1FlowDialogBorderGreyColorComponents radius:10.0f]; - [[self class] _strokeRect:_webView.frame withColorComponents:PFOAuth1FlowDialogBorderBlackColorComponents]; -} - -- (void)layoutSubviews { - [super layoutSubviews]; - - const CGRect bounds = self.bounds; - const CGRect contentRect = UIEdgeInsetsInsetRect(bounds, PFOAuth1FlowDialogContentInsets); - - CGRect titleLabelBoundingRect = UIEdgeInsetsInsetRect(contentRect, PFOAuth1FlowDialogTitleInsets); - CGSize titleLabelSize = [_titleLabel sizeThatFits:titleLabelBoundingRect.size]; - titleLabelBoundingRect.size.width = (CGRectGetMaxX(contentRect) - - PFOAuth1FlowDialogTitleInsets.right - - titleLabelSize.height); - titleLabelSize = [_titleLabel sizeThatFits:titleLabelBoundingRect.size]; - - CGRect titleLabelFrame = titleLabelBoundingRect; - titleLabelFrame.size.height = titleLabelSize.height; - titleLabelFrame.size.width = CGRectGetWidth(titleLabelBoundingRect); - _titleLabel.frame = titleLabelFrame; - - CGRect closeButtonFrame = contentRect; - closeButtonFrame.size.height = (CGRectGetHeight(titleLabelFrame) + - PFOAuth1FlowDialogTitleInsets.top + - PFOAuth1FlowDialogTitleInsets.bottom); - closeButtonFrame.size.width = CGRectGetHeight(closeButtonFrame); - closeButtonFrame.origin.x = CGRectGetMaxX(contentRect) - CGRectGetWidth(closeButtonFrame); - _closeButton.frame = closeButtonFrame; - - CGRect webViewFrame = contentRect; - if (!_showingKeyboard || PFOAuth1FlowDialogIsDevicePad() || UIInterfaceOrientationIsPortrait(_orientation)) { - webViewFrame.origin.y = CGRectGetMaxY(titleLabelFrame) + PFOAuth1FlowDialogTitleInsets.bottom; - webViewFrame.size.height = CGRectGetMaxY(contentRect) - CGRectGetMinY(webViewFrame); - } - _webView.frame = webViewFrame; - - [_activityIndicator sizeToFit]; - _activityIndicator.center = _webView.center; -} - -#pragma mark - -#pragma mark Accessors - -- (NSString *)title { - return _titleLabel.text; -} - -- (void)setTitle:(NSString *)title { - _titleLabel.text = title; - - [self setNeedsLayout]; -} - -#pragma mark - -#pragma mark Present / Dismiss - -- (void)showAnimated:(BOOL)animated { - [self load]; - [self _sizeToFitOrientation]; - - [_activityIndicator startAnimating]; - - UIWindow *window = [UIApplication sharedApplication].keyWindow; - _modalBackgroundView.frame = window.bounds; - [_modalBackgroundView addSubview:self]; - [window addSubview:_modalBackgroundView]; - - CGAffineTransform transform = [self _transformForOrientation:_orientation]; - if (animated) { - self.transform = CGAffineTransformScale(transform, 0.001f, 0.001f); - - NSTimeInterval animationStepDuration = PFOAuth1FlowDialogAnimationDuration / 2.0f; - - [UIView animateWithDuration:animationStepDuration - animations:^{ - self.transform = CGAffineTransformScale(transform, 1.1f, 1.1f); - } - completion:^(BOOL finished) { - [UIView animateWithDuration:animationStepDuration - animations:^{ - self.transform = CGAffineTransformScale(transform, 0.9f, 0.9f); - } - completion:^(BOOL finished) { - [UIView animateWithDuration:animationStepDuration - animations:^{ - self.transform = transform; - }]; - }]; - - }]; - } else { - self.transform = transform; - } - - [self _addObservers]; -} - -- (void)dismissAnimated:(BOOL)animated { - _loadingURL = nil; - - __weak typeof(self) wself = self; - dispatch_block_t completionBlock = ^{ - __strong typeof(wself) sself = wself; - [sself _removeObservers]; - [sself removeFromSuperview]; - [sself->_modalBackgroundView removeFromSuperview]; - }; - - if (animated) { - [UIView animateWithDuration:PFOAuth1FlowDialogAnimationDuration - animations:^{ - typeof(wself) sself = wself; - sself.alpha = 0.0f; - } - completion:^(BOOL finished) { - completionBlock(); - }]; - } else { - completionBlock(); - } -} - -- (void)_dismissWithSuccess:(BOOL)success url:(NSURL *)url error:(NSError *)error { - if (!self.completion) { - return; - } - - PFOAuth1FlowDialogCompletion completion = self.completion; - self.completion = nil; - - dispatch_async(dispatch_get_main_queue(), ^{ - completion(success, url, error); - }); - - [self dismissAnimated:YES]; -} - -- (void)_cancelButtonAction { - [self _dismissWithSuccess:NO url:nil error:nil]; -} - -#pragma mark - -#pragma mark Public - -- (void)load { - [self loadURL:_baseURL queryParameters:self.queryParameters]; -} - -- (void)loadURL:(NSURL *)url queryParameters:(NSDictionary *)parameters { - _loadingURL = [[self class] _urlFromBaseURL:url queryParameters:parameters]; - - NSURLRequest *request = [NSURLRequest requestWithURL:_loadingURL]; - [_webView loadRequest:request]; -} - -#pragma mark - -#pragma mark WKWebViewNavigationDelegate - -- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler { - NSURL *url = navigationAction.request.URL; - BOOL hasPrefix = [url.absoluteString hasPrefix:self.redirectURLPrefix]; - if (hasPrefix) { - NSURLComponents* components = [[NSURLComponents alloc] initWithString:url.absoluteString]; - NSArray * items = components.queryItems; - if (items) { - for (NSURLQueryItem * queryItem in items) { - if ([queryItem.name isEqualToString:@"denied"]) { - [self _dismissWithSuccess:NO url:url error:nil]; - break; - } else if ([queryItem.name isEqualToString:@"oauth_verifier"] || [queryItem.name isEqualToString:@"oauth_token" ]) { - [self _dismissWithSuccess:YES url:url error:nil]; - break;; - } - } - } else { - [self _dismissWithSuccess:NO url:url error:nil]; - } - decisionHandler(WKNavigationActionPolicyCancel); - return; - } else if (navigationAction.navigationType == UIWebViewNavigationTypeLinkClicked && [self.dataSource dialog:self shouldOpenURLInExternalBrowser:url]) { - [[UIApplication sharedApplication] openURL:url]; - } else { - decisionHandler(WKNavigationActionPolicyAllow); - } -} - - - -- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation { - [[PFNetworkActivityIndicatorManager sharedManager] incrementActivityCount]; -} - -- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation { - [[PFNetworkActivityIndicatorManager sharedManager] decrementActivityCount]; - - [_activityIndicator stopAnimating]; - [_webView evaluateJavaScript:@"document.title" completionHandler:^(id _Nullable string, NSError * _Nullable error) { - self.title = (NSString *) string; - - }]; - -} - -- (void)webView:(WKWebView *)webView didFailNavigation:(WKNavigation *)navigation withError:(NSError *)error { - [[PFNetworkActivityIndicatorManager sharedManager] decrementActivityCount]; - - // 102 == WebKitErrorFrameLoadInterruptedByPolicyChange - if (!([error.domain isEqualToString:@"WebKitErrorDomain"] && error.code == 102)) { - [self _dismissWithSuccess:NO url:nil error:error]; - } -} - -#pragma mark - -#pragma mark Observers - -- (void)_addObservers { - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(_deviceOrientationDidChange:) - name:UIDeviceOrientationDidChangeNotification - object:nil]; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(_keyboardWillShow:) - name:UIKeyboardWillShowNotification - object:nil]; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(_keyboardWillHide:) - name:UIKeyboardWillHideNotification - object:nil]; -} - -- (void)_removeObservers { - [[NSNotificationCenter defaultCenter] removeObserver:self - name:UIDeviceOrientationDidChangeNotification - object:nil]; - [[NSNotificationCenter defaultCenter] removeObserver:self - name:UIKeyboardWillShowNotification - object:nil]; - [[NSNotificationCenter defaultCenter] removeObserver:self - name:UIKeyboardWillHideNotification - object:nil]; -} - -#pragma mark - -#pragma mark UIDeviceOrientationDidChangeNotification - -- (void)_deviceOrientationDidChange:(NSNotification *)notification { - UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; - if ([self _shouldRotateToOrientation:orientation]) { - NSTimeInterval duration = [UIApplication sharedApplication].statusBarOrientationAnimationDuration; - [UIView animateWithDuration:duration - animations:^{ - [self _sizeToFitOrientation]; - }]; - } -} - -- (BOOL)_shouldRotateToOrientation:(UIInterfaceOrientation)orientation { - if (orientation == _orientation) { - return NO; - } - - return (orientation == UIDeviceOrientationLandscapeLeft || - orientation == UIDeviceOrientationLandscapeRight || - orientation == UIDeviceOrientationPortrait || - orientation == UIDeviceOrientationPortraitUpsideDown); -} - -- (CGAffineTransform)_transformForOrientation:(UIInterfaceOrientation)orientation { - // No manual rotation required on iOS 8 - // There is coordinateSpace method, since iOS 8 - if (PFOAuth1FlowDialogScreenHasAutomaticRotation()) { - return CGAffineTransformIdentity; - } - - switch (orientation) { - case UIInterfaceOrientationLandscapeLeft: - return CGAffineTransformMakeRotation((CGFloat)(-M_PI / 2.0f)); - break; - case UIInterfaceOrientationLandscapeRight: - return CGAffineTransformMakeRotation((CGFloat)(M_PI / 2.0f)); - break; - case UIInterfaceOrientationPortraitUpsideDown: - return CGAffineTransformMakeRotation((CGFloat)-M_PI); - break; - case UIInterfaceOrientationPortrait: - case UIInterfaceOrientationUnknown: - default: - break; - } - - return CGAffineTransformIdentity; -} - -- (void)_sizeToFitOrientation { - _orientation = [UIApplication sharedApplication].statusBarOrientation; - CGAffineTransform transform = [self _transformForOrientation:_orientation]; - - CGRect bounds = [UIScreen mainScreen].applicationFrame; - CGRect transformedBounds = CGRectApplyAffineTransform(bounds, transform); - transformedBounds.origin = CGPointZero; - - CGPoint center = CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds)); - - CGFloat scale = (PFOAuth1FlowDialogIsDevicePad() ? 0.6f : 1.0f); - - CGFloat width = PFTFloatRound((scale * CGRectGetWidth(transformedBounds)) - PFOAuth1FlowDialogScreenInset * 2.0f, NSRoundDown); - CGFloat height = PFTFloatRound((scale * CGRectGetHeight(transformedBounds)) - PFOAuth1FlowDialogScreenInset * 2.0f, NSRoundDown); - - self.transform = transform; - self.center = center; - self.bounds = CGRectMake(0.0f, 0.0f, width, height); - - [self setNeedsLayout]; -} - -#pragma mark - -#pragma mark UIKeyboardNotifications - -- (void)_keyboardWillShow:(NSNotification *)notification { - _showingKeyboard = YES; - - if (PFOAuth1FlowDialogIsDevicePad()) { - // On the iPad the screen is large enough that we don't need to - // resize the dialog to accomodate the keyboard popping up - return; - } - - UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; - if (UIInterfaceOrientationIsLandscape(orientation)) { - NSDictionary *userInfo = [notification userInfo]; - NSTimeInterval animationDuration = [userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue]; - UIViewAnimationCurve animationCurve = [[notification userInfo][UIKeyboardAnimationCurveUserInfoKey] intValue]; - - [UIView animateWithDuration:animationDuration - delay:0.0 - options:animationCurve << 16 | UIViewAnimationOptionBeginFromCurrentState - animations:^{ - [self setNeedsLayout]; - [self layoutIfNeeded]; - - [self setNeedsDisplay]; - } - completion:nil]; - } -} - -- (void)_keyboardWillHide:(NSNotification *)notification { - _showingKeyboard = NO; - - if (PFOAuth1FlowDialogIsDevicePad()) { - return; - } - UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; - if (UIInterfaceOrientationIsLandscape(orientation)) { - NSDictionary *userInfo = [notification userInfo]; - NSTimeInterval animationDuration = [userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue]; - UIViewAnimationCurve animationCurve = [[notification userInfo][UIKeyboardAnimationCurveUserInfoKey] intValue]; - - [UIView animateWithDuration:animationDuration - delay:0.0 - options:animationCurve << 16 | UIViewAnimationOptionBeginFromCurrentState - animations:^{ - [self setNeedsLayout]; - [self layoutIfNeeded]; - - [self setNeedsDisplay]; - } - completion:nil]; - } -} - -@end diff --git a/ParseTwitterUtils/ParseTwitterUtils/Internal/OAuthCore/PF_OAuthCore.h b/ParseTwitterUtils/ParseTwitterUtils/Internal/OAuthCore/PF_OAuthCore.h deleted file mode 100644 index a44f469cb..000000000 --- a/ParseTwitterUtils/ParseTwitterUtils/Internal/OAuthCore/PF_OAuthCore.h +++ /dev/null @@ -1,63 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import - -NS_ASSUME_NONNULL_BEGIN - -@interface PFOAuthConfiguration : NSObject - -@property (nonatomic, strong) NSURL *url; -@property (nonatomic, copy) NSString *method; -@property (nullable, nonatomic, strong) NSData *body; - -@property (nonatomic, copy) NSString *consumerKey; -@property (nonatomic, copy) NSString *consumerSecret; - -@property (nullable, nonatomic, copy) NSString *token; -@property (nullable, nonatomic, copy) NSString *tokenSecret; - -@property (nullable, nonatomic, copy) NSDictionary *additionalParameters; - -@property (nonatomic, copy) NSString *nonce; -@property (nonatomic, strong) NSDate *timestampDate; - -- (instancetype)init NS_UNAVAILABLE; -+ (instancetype)new NS_UNAVAILABLE; - -+ (instancetype)configurationForURL:(NSURL *)url - method:(NSString *)method - body:(nullable NSData *)body - additionalParameters:(nullable NSDictionary *)additionalParams - consumerKey:(NSString *)consumerKey - consumerSecret:(NSString *)consumerSecret - token:(nullable NSString *)token - tokenSecret:(nullable NSString *)tokenSecret; - -@end - -@interface PFOAuth : NSObject - -+ (NSString *)authorizationHeaderFromConfiguration:(PFOAuthConfiguration *)configuration; - -@end - -@interface NSURL (PF_OAuthAdditions) - -+ (NSDictionary *)PF_ab_parseURLQueryString:(NSString *)query; - -@end - -@interface NSString (PF_OAuthAdditions) - -- (NSString *)PF_ab_RFC3986EncodedString; - -@end - -NS_ASSUME_NONNULL_END diff --git a/ParseTwitterUtils/ParseTwitterUtils/Internal/OAuthCore/PF_OAuthCore.m b/ParseTwitterUtils/ParseTwitterUtils/Internal/OAuthCore/PF_OAuthCore.m deleted file mode 100644 index 987ebcc52..000000000 --- a/ParseTwitterUtils/ParseTwitterUtils/Internal/OAuthCore/PF_OAuthCore.m +++ /dev/null @@ -1,192 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "PF_OAuthCore.h" - -#import - -static NSData *PF_HMAC_SHA1(NSString *data, NSString *key) { - unsigned char buf[CC_SHA1_DIGEST_LENGTH]; - CCHmac(kCCHmacAlgSHA1, [key UTF8String], [key length], [data UTF8String], [data length], buf); - return [NSData dataWithBytes:buf length:CC_SHA1_DIGEST_LENGTH]; -} - -@implementation PFOAuthConfiguration - -- (instancetype)init { - self = [super init]; - if (!self) return nil; - - _nonce = [[NSUUID UUID] UUIDString]; - _timestampDate = [NSDate date]; - - return self; -} - -+ (instancetype)configurationForURL:(NSURL *)url - method:(NSString *)method - body:(nullable NSData *)body - additionalParameters:(nullable NSDictionary *)additionalParams - consumerKey:(NSString *)consumerKey - consumerSecret:(NSString *)consumerSecret - token:(nullable NSString *)token - tokenSecret:(nullable NSString *)tokenSecret { - PFOAuthConfiguration *configuration = [[self alloc] init]; - configuration.url = url; - configuration.method = method; - configuration.body = body; - configuration.additionalParameters = additionalParams; - configuration.consumerKey = consumerKey; - configuration.consumerSecret = consumerSecret; - configuration.token = token; - configuration.tokenSecret = tokenSecret; - return configuration; -} - -@end - -@implementation PFOAuth - -+ (NSString *)authorizationHeaderFromConfiguration:(PFOAuthConfiguration *)configuration { - NSString *authTimeStamp = [NSString stringWithFormat:@"%llu", - (unsigned long long)floor([configuration.timestampDate timeIntervalSince1970])]; - NSString *authSignatureMethod = @"HMAC-SHA1"; - NSString *authVersion = @"1.0"; - NSURL *url = configuration.url; - - // Don't use -mutableCopy here, as that will return nil if `additionalParams` is nil. - NSMutableDictionary *oAuthAuthorizationParameters = [NSMutableDictionary dictionaryWithDictionary:configuration.additionalParameters]; - - oAuthAuthorizationParameters[@"oauth_nonce"] = configuration.nonce; - oAuthAuthorizationParameters[@"oauth_timestamp"] = authTimeStamp; - oAuthAuthorizationParameters[@"oauth_signature_method"] = authSignatureMethod; - oAuthAuthorizationParameters[@"oauth_version"] = authVersion; - oAuthAuthorizationParameters[@"oauth_consumer_key"] = configuration.consumerKey; - - if (configuration.token) { - oAuthAuthorizationParameters[@"oauth_token"] = configuration.token; - } - - // get query and body parameters - NSDictionary *additionalQueryParameters = [NSURL PF_ab_parseURLQueryString:[url query]]; - NSDictionary *additionalBodyParameters = nil; - if (configuration.body) { - NSString *string = [[NSString alloc] initWithData:configuration.body encoding:NSUTF8StringEncoding]; - additionalBodyParameters = [NSURL PF_ab_parseURLQueryString:string]; - } - - // combine all parameters - NSMutableDictionary *parameters = [oAuthAuthorizationParameters mutableCopy]; - [parameters addEntriesFromDictionary:additionalQueryParameters]; - if (additionalBodyParameters) { - [parameters addEntriesFromDictionary:additionalBodyParameters]; - } - - NSArray *sortedKeys = [[parameters allKeys] sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { - return [obj1 compare:obj2] ?: [parameters[obj1] compare:parameters[obj2]]; - }]; - - NSMutableArray *parameterArray = [NSMutableArray array]; - for (NSString *key in sortedKeys) { - [parameterArray addObject:[NSString stringWithFormat:@"%@=%@", key, [parameters[key] PF_ab_RFC3986EncodedString]]]; - } - - NSString *normalizedParameterString = [parameterArray componentsJoinedByString:@"&"]; - NSString *normalizedURLString = [NSString stringWithFormat:@"%@://%@%@", [url scheme], [url host], [url path]]; - - NSString *signatureBaseString = [NSString stringWithFormat:@"%@&%@&%@", - [configuration.method PF_ab_RFC3986EncodedString], - [normalizedURLString PF_ab_RFC3986EncodedString], - [normalizedParameterString PF_ab_RFC3986EncodedString]]; - - NSString *key = [NSString stringWithFormat:@"%@&%@", - [configuration.consumerSecret PF_ab_RFC3986EncodedString], - (configuration.tokenSecret ? [configuration.tokenSecret PF_ab_RFC3986EncodedString] : @"")]; - - NSData *signature = PF_HMAC_SHA1(signatureBaseString, key); - NSString *base64Signature = [signature base64EncodedStringWithOptions:0]; - - oAuthAuthorizationParameters[@"oauth_signature"] = base64Signature; - - NSMutableArray *authorizationHeaderItems = [NSMutableArray array]; - [oAuthAuthorizationParameters enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop) { - [authorizationHeaderItems addObject:[NSString stringWithFormat:@"%@=\"%@\"", - [key PF_ab_RFC3986EncodedString], - [value PF_ab_RFC3986EncodedString]]]; - }]; - - NSString *authorizationHeaderString = [authorizationHeaderItems componentsJoinedByString:@", "]; - authorizationHeaderString = [NSString stringWithFormat:@"OAuth %@", authorizationHeaderString]; - - return authorizationHeaderString; -} - -@end - -@implementation NSURL (OAuthAdditions) - -+ (NSDictionary *)PF_ab_parseURLQueryString:(NSString *)query { - // Use NSURLComponents if available. - if ([NSURLComponents class] != nil && [NSURLComponents instancesRespondToSelector:@selector(queryItems)]) { - NSURLComponents *components = [[NSURLComponents alloc] init]; - [components setQuery:query]; - - NSArray *queryItems = components.queryItems; - - NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithCapacity:components.queryItems.count]; - for (NSURLQueryItem *item in queryItems) { - dictionary[item.name] = [item.value stringByRemovingPercentEncoding]; - } - return dictionary; - } - - NSMutableDictionary *dict = [NSMutableDictionary dictionary]; - NSArray *pairs = [query componentsSeparatedByString:@"&"]; - for (NSString *pair in pairs) { - NSArray *keyValue = [pair componentsSeparatedByString:@"="]; - if ([keyValue count] == 2) { - NSString *key = [keyValue objectAtIndex:0]; - NSString *value = [keyValue objectAtIndex:1]; - value = [value stringByRemovingPercentEncoding]; - if (key && value) - [dict setObject:value forKey:key]; - } - } - return [NSDictionary dictionaryWithDictionary:dict]; -} - -@end - -@implementation NSString (OAuthAdditions) - -- (NSString *)PF_ab_RFC3986EncodedString // UTF-8 encodes prior to URL encoding -{ - NSMutableString *result = [NSMutableString string]; - const char *p = [self UTF8String]; - unsigned char c; - - for (; (c = *p); p++) { - switch (c) { - case '0' ... '9': - case 'A' ... 'Z': - case 'a' ... 'z': - case '.': - case '-': - case '~': - case '_': - [result appendFormat:@"%c", c]; - break; - default: - [result appendFormat:@"%%%02X", c]; - } - } - return result; -} - -@end diff --git a/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterAlertView.h b/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterAlertView.h deleted file mode 100644 index 3b8c81562..000000000 --- a/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterAlertView.h +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import - -typedef void (^PFTwitterAlertViewCompletion)(NSUInteger selectedOtherButtonIndex); - -@interface PFTwitterAlertView : NSObject - -+ (void)showAlertWithTitle:(NSString *)title - message:(NSString *)message - cancelButtonTitle:(NSString *)cancelButtonTitle - otherButtonTitles:(NSArray *)otherButtonTitles - completion:(PFTwitterAlertViewCompletion)completion NS_EXTENSION_UNAVAILABLE_IOS(""); - -@end diff --git a/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterAlertView.m b/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterAlertView.m deleted file mode 100644 index e42371b08..000000000 --- a/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterAlertView.m +++ /dev/null @@ -1,109 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "PFTwitterAlertView.h" - -@interface PFTwitterAlertView () - -@property (nonatomic, copy) PFTwitterAlertViewCompletion completion; - -@end - -@implementation PFTwitterAlertView - -///-------------------------------------- -#pragma mark - Init -///-------------------------------------- - -+ (void)showAlertWithTitle:(NSString *)title - message:(NSString *)message - cancelButtonTitle:(NSString *)cancelButtonTitle - otherButtonTitles:(NSArray *)otherButtonTitles - completion:(PFTwitterAlertViewCompletion)completion { - if ([UIAlertController class] != nil) { - __block UIAlertController *alertController = [UIAlertController alertControllerWithTitle:title - message:message - preferredStyle:UIAlertControllerStyleAlert]; - - void (^alertActionHandler)(UIAlertAction *) = [^(UIAlertAction *action) { - if (completion) { - // This block intentionally retains alertController, and releases it afterwards. - if (action.style == UIAlertActionStyleCancel) { - completion(NSNotFound); - } else { - NSUInteger index = [alertController.actions indexOfObject:action]; - completion(index - 1); - } - } - alertController = nil; - } copy]; - - [alertController addAction:[UIAlertAction actionWithTitle:cancelButtonTitle - style:UIAlertActionStyleCancel - handler:alertActionHandler]]; - - for (NSString *buttonTitle in otherButtonTitles) { - [alertController addAction:[UIAlertAction actionWithTitle:buttonTitle - style:UIAlertActionStyleDefault - handler:alertActionHandler]]; - } - - UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow; - UIViewController *viewController = keyWindow.rootViewController; - while (viewController.presentedViewController) { - viewController = viewController.presentedViewController; - } - - [viewController presentViewController:alertController animated:YES completion:nil]; - } else { -#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_8_0 - __block PFTwitterAlertView *pfAlertView = [[self alloc] init]; - UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:title - message:message - delegate:nil - cancelButtonTitle:cancelButtonTitle - otherButtonTitles:nil]; - - for (NSString *buttonTitle in otherButtonTitles) { - [alertView addButtonWithTitle:buttonTitle]; - } - - pfAlertView.completion = ^(NSUInteger index) { - if (completion) { - completion(index); - } - - pfAlertView = nil; - }; - - alertView.delegate = pfAlertView; - [alertView show]; -#endif - } -} - -#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_8_0 - -///-------------------------------------- -#pragma mark - UIAlertViewDelegate -///-------------------------------------- - -- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { - if (self.completion) { - if (buttonIndex == alertView.cancelButtonIndex) { - self.completion(NSNotFound); - } else { - self.completion(buttonIndex - 1); - } - } -} - -#endif - -@end diff --git a/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterAuthenticationProvider.h b/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterAuthenticationProvider.h deleted file mode 100644 index 6c836a102..000000000 --- a/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterAuthenticationProvider.h +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import - -@import ParseCore; - -@class BFTask<__covariant BFGenericType>; -@class PF_Twitter; - -NS_ASSUME_NONNULL_BEGIN - -extern NSString *const PFTwitterUserAuthenticationType; - -@interface PFTwitterAuthenticationProvider : NSObject - -@property (nonatomic, strong, readonly) PF_Twitter *twitter; - -- (instancetype)init NS_UNAVAILABLE; -- (instancetype)initWithTwitter:(PF_Twitter *)twitter NS_DESIGNATED_INITIALIZER; -+ (instancetype)providerWithTwitter:(PF_Twitter *)twitter; - -- (BFTask *)authenticateAsync; - -- (NSDictionary *)authDataWithTwitterId:(NSString *)twitterId - screenName:(NSString *)screenName - authToken:(NSString *)authToken - secret:(NSString *)authTokenSecret; - -@end - -NS_ASSUME_NONNULL_END diff --git a/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterAuthenticationProvider.m b/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterAuthenticationProvider.m deleted file mode 100644 index 8af1b5384..000000000 --- a/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterAuthenticationProvider.m +++ /dev/null @@ -1,117 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "PFTwitterAuthenticationProvider.h" - -#if __has_include() -#import -#else -#import "BFTask.h" -#endif - -@import ParseCore; - -#import "PFTwitterPrivateUtilities.h" -#import "PF_Twitter.h" - -NSString *const PFTwitterUserAuthenticationType = @"twitter"; - -static NSString *const _PFTwitterAuthDataIdKey = @"id"; -static NSString *const _PFTwitterAuthDataScreenNameKey = @"screen_name"; -static NSString *const _PFTwitterAuthDataAuthTokenKey = @"auth_token"; -static NSString *const _PFTwitterAuthDataAuthTokenSecretKey = @"auth_token_secret"; -static NSString *const _PFTwitterAuthDataConsumerKeyKey = @"consumer_key"; -static NSString *const _PFTwitterAuthDataConsumerSecretKey = @"consumer_secret"; - -@implementation PFTwitterAuthenticationProvider - -///-------------------------------------- -#pragma mark - Init -///-------------------------------------- - -- (instancetype)init { - PFTWConsistencyAssert(NO, @"%@ is not a designated initializer for instances of %@.", - NSStringFromSelector(_cmd), NSStringFromClass([self class])); - return nil; -} - -- (instancetype)initWithTwitter:(PF_Twitter *)twitter { - self = [super init]; - if (!self) return nil; - - _twitter = twitter; - - return self; -} - -+ (instancetype)providerWithTwitter:(PF_Twitter *)twitter { - return [[self alloc] initWithTwitter:twitter]; -} - -///-------------------------------------- -#pragma mark - Auth Data -///-------------------------------------- - -- (NSDictionary *)authDataWithTwitterId:(NSString *)twitterId - screenName:(NSString *)screenName - authToken:(NSString *)authToken - secret:(NSString *)authTokenSecret { - NSDictionary *authData = @{_PFTwitterAuthDataIdKey : twitterId, - _PFTwitterAuthDataScreenNameKey : screenName, - _PFTwitterAuthDataAuthTokenKey : authToken, - _PFTwitterAuthDataAuthTokenSecretKey : authTokenSecret, - _PFTwitterAuthDataConsumerKeyKey : self.twitter.consumerKey, - _PFTwitterAuthDataConsumerSecretKey : self.twitter.consumerSecret}; - return authData; -} - -///-------------------------------------- -#pragma mark - Authentication -///-------------------------------------- - -- (BFTask *)authenticateAsync { - return [[self.twitter authorizeInBackground] continueWithSuccessBlock:^id(BFTask *task) { - NSDictionary *authData = [self authDataWithTwitterId:self.twitter.userId - screenName:self.twitter.screenName - authToken:self.twitter.authToken - secret:self.twitter.authTokenSecret]; - return [BFTask taskWithResult:authData]; - }]; -} - -///-------------------------------------- -#pragma mark - PFUserAuthenticationDelegate -///-------------------------------------- - -- (BOOL)restoreAuthenticationWithAuthData:(NSDictionary *)authData { - // If authData is nil, this is an unlink operation, which should succeed. - if (!authData) { - self.twitter.userId = nil; - self.twitter.authToken = nil; - self.twitter.authTokenSecret = nil; - self.twitter.screenName = nil; - return YES; - } - - // Check that the authData contains the required fields, and if so, synchronize. - NSString *userId = authData[_PFTwitterAuthDataIdKey]; - NSString *screenName = authData[_PFTwitterAuthDataScreenNameKey]; - NSString *authToken = authData[_PFTwitterAuthDataAuthTokenKey]; - NSString *authTokenSecret = authData[_PFTwitterAuthDataAuthTokenSecretKey]; - if (userId && screenName && authToken && authTokenSecret) { - self.twitter.userId = userId; - self.twitter.screenName = screenName; - self.twitter.authToken = authToken; - self.twitter.authTokenSecret = authTokenSecret; - return YES; - } - return NO; -} - -@end diff --git a/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterLocalization.h b/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterLocalization.h deleted file mode 100644 index 0d1aadd03..000000000 --- a/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterLocalization.h +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#ifndef PFTwitterLocalization_h -#define PFTwitterLocalization_h - -#import - -#define PFTWLocalizedString(key, comment) \ -[PFTwitterLocalization localizedStringForKey:key] - -#endif - -/** - Used by the above macro to fetch a localized string - */ -@interface PFTwitterLocalization : NSObject - -+ (NSString *)localizedStringForKey:key; - -@end diff --git a/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterLocalization.m b/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterLocalization.m deleted file mode 100644 index bb5c51519..000000000 --- a/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterLocalization.m +++ /dev/null @@ -1,38 +0,0 @@ -// -// PFTwitterLocalization.m -// -// -// Created by Volodymyr Nazarkevych on 29.11.2022. -// - -#import "PFTwitterLocalization.h" - -@implementation PFTwitterLocalization - -+ (NSString *)localizedStringForKey:key { - return [[self resourcesBundle] localizedStringForKey:key value:nil table:@"ParseTwitterUtils"]; -} - -+ (NSBundle *)resourcesBundle { - static NSBundle *bundle; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - NSBundle *classBundle = [NSBundle bundleForClass:[self class]]; - NSURL *bundleURL = [classBundle URLForResource:@"ParseTwitterUtils" withExtension:@"bundle"]; - - if (bundleURL) { - bundle = [NSBundle bundleWithURL:bundleURL]; - } else { - bundleURL = [classBundle URLForResource:@"ParseObjC_ParseTwitterUtils" withExtension:@"bundle"]; - if (bundleURL) { - bundle = [NSBundle bundleWithURL:bundleURL]; - } - else { - bundle = [NSBundle mainBundle]; - } - } - }); - return bundle; -} - -@end diff --git a/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterPrivateUtilities.h b/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterPrivateUtilities.h deleted file mode 100644 index f90f54919..000000000 --- a/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterPrivateUtilities.h +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import - -#if __has_include() -#import -#else -#import "BFTask.h" -#endif - -@import ParseCore; - -@interface PFTwitterPrivateUtilities : NSObject - -+ (void)safePerformSelector:(SEL)selector onTarget:(id)target withObject:(id)object object:(id)anotherObject; - -@end - -@interface BFTask (ParseTwitterUtils) - -- (id)pftw_waitForResult:(NSError **)error; - -//TODO: (nlutsenko) Look into killing this and replacing with generic continueWithBlock: -- (instancetype)pftw_continueAsyncWithBlock:(BFContinuationBlock)block; - -- (instancetype)pftw_continueWithMainThreadUserBlock:(PFUserResultBlock)block; -- (instancetype)pftw_continueWithMainThreadBooleanBlock:(PFBooleanResultBlock)block; -- (instancetype)pftw_continueWithMainThreadBlock:(BFContinuationBlock)block; - -@end - -/** - Raises an `NSInternalInconsistencyException` if the `condition` does not pass. - Use `description` to supply the way to fix the exception. - */ -#define PFTWConsistencyAssert(condition, description, ...) \ -do { \ - if (!(condition)) { \ - [NSException raise:NSInternalInconsistencyException \ - format:description, ##__VA_ARGS__]; \ - } \ -} while(0) diff --git a/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterPrivateUtilities.m b/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterPrivateUtilities.m deleted file mode 100644 index ec8857a74..000000000 --- a/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterPrivateUtilities.m +++ /dev/null @@ -1,76 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "PFTwitterPrivateUtilities.h" - -#if __has_include() -#import -#else -#import "BFExecutor.h" -#endif - -@implementation PFTwitterPrivateUtilities - -+ (void)safePerformSelector:(SEL)selector - onTarget:(id)target - withObject:(id)object - object:(id)anotherObject { - if (target == nil || selector == nil || ![target respondsToSelector:selector]) { - return; - } - -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Warc-performSelector-leaks" - [target performSelector:selector withObject:object withObject:anotherObject]; -#pragma clang diagnostic pop -} - -@end - -@implementation BFTask (ParseTwitterUtils) - -- (id)pftw_waitForResult:(NSError **)error { - [self waitUntilFinished]; - - if (self.cancelled) { - return nil; - } else if (self.error && error) { - *error = self.error; - } - return self.result; -} - -- (instancetype)pftw_continueAsyncWithBlock:(BFContinuationBlock)block { - BFExecutor *executor = [BFExecutor executorWithDispatchQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)]; - return [self continueWithExecutor:executor withBlock:block]; -} - -- (instancetype)pftw_continueWithMainThreadUserBlock:(PFUserResultBlock)block { - return [self pftw_continueWithMainThreadBlock:^id(BFTask *task) { - if (block) { - block(task.result, task.error); - } - return nil; - }]; -} - -- (instancetype)pftw_continueWithMainThreadBooleanBlock:(PFBooleanResultBlock)block { - return [self pftw_continueWithMainThreadBlock:^id(BFTask *task) { - if (block) { - block([task.result boolValue], task.error); - } - return nil; - }]; -} - -- (instancetype)pftw_continueWithMainThreadBlock:(BFContinuationBlock)block { - return [self continueWithExecutor:[BFExecutor mainThreadExecutor] withBlock:block]; -} - -@end diff --git a/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterUtils_Private.h b/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterUtils_Private.h deleted file mode 100644 index aa88c8804..000000000 --- a/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterUtils_Private.h +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "PFTwitterUtils.h" - -@class PFTwitterAuthenticationProvider; - -@interface PFTwitterUtils () - -+ (PFTwitterAuthenticationProvider *)_authenticationProvider; -+ (void)_setAuthenticationProvider:(PFTwitterAuthenticationProvider *)provider; - -@end diff --git a/ParseTwitterUtils/ParseTwitterUtils/Internal/PF_Twitter_Private.h b/ParseTwitterUtils/ParseTwitterUtils/Internal/PF_Twitter_Private.h deleted file mode 100644 index 2136290e8..000000000 --- a/ParseTwitterUtils/ParseTwitterUtils/Internal/PF_Twitter_Private.h +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import - -#import "PF_Twitter.h" - -@class ACAccount; -@class ACAccountStore; -@protocol PFOAuth1FlowDialogInterface; - -NS_ASSUME_NONNULL_BEGIN - -@interface PF_Twitter () - -@property (nonatomic, strong, readonly) ACAccountStore *accountStore; -@property (nonatomic, strong, readonly) NSURLSession *urlSession; -@property (nonatomic, strong, readonly) Class oauthDialogClass; - -- (instancetype)initWithAccountStore:(ACAccountStore *)accountStore - urlSession:(NSURLSession *)urlSession - dialogClass:(Class)dialogClass; - -/** - Obtain access to the local twitter account. - Returns the twitter account if access is obtained. Otherwise, returns null. - */ -- (BFTask *)_getLocalTwitterAccountAsync; - -@end - -NS_ASSUME_NONNULL_END diff --git a/ParseTwitterUtils/ParseTwitterUtils/Resources/Info-iOS.plist b/ParseTwitterUtils/ParseTwitterUtils/Resources/Info-iOS.plist deleted file mode 100644 index 47eccb773..000000000 --- a/ParseTwitterUtils/ParseTwitterUtils/Resources/Info-iOS.plist +++ /dev/null @@ -1,28 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleExecutable - ParseTwitterUtils - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - FMWK - CFBundleShortVersionString - 2.7.3 - CFBundleSignature - ???? - CFBundleSupportedPlatforms - - iPhoneOS - - CFBundleVersion - 2.7.3 - MinimumOSVersion - 12.0 - - diff --git a/ParseTwitterUtils/ParseTwitterUtils/Resources/en.lproj/ParseTwitterUtils.strings b/ParseTwitterUtils/ParseTwitterUtils/Resources/en.lproj/ParseTwitterUtils.strings deleted file mode 100644 index 2ebc81b9e..000000000 Binary files a/ParseTwitterUtils/ParseTwitterUtils/Resources/en.lproj/ParseTwitterUtils.strings and /dev/null differ diff --git a/ParseTwitterUtils/ParseTwitterUtils/Source/PFTwitterUtils.h b/ParseTwitterUtils/ParseTwitterUtils/Source/PFTwitterUtils.h deleted file mode 100644 index 14b2344a0..000000000 --- a/ParseTwitterUtils/ParseTwitterUtils/Source/PFTwitterUtils.h +++ /dev/null @@ -1,319 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import - -@import ParseCore; - -NS_ASSUME_NONNULL_BEGIN - -@class BFTask<__covariant BFGenericType>; -@class PF_Twitter; - -/** - The `PFTwitterUtils` class provides utility functions for working with Twitter in a Parse application. - - This class is currently for iOS only. - */ -@interface PFTwitterUtils : NSObject - -///-------------------------------------- -/// @name Interacting With Twitter -///-------------------------------------- - -/** - Gets the instance of the `PF_Twitter` object that Parse uses. - - @return An instance of `PF_Twitter` object. - */ -+ (nullable PF_Twitter *)twitter; - -/** - Initializes the Twitter singleton. - - @warning You must invoke this in order to use the Twitter functionality in Parse. - - @param consumerKey Your Twitter application's consumer key. - @param consumerSecret Your Twitter application's consumer secret. - */ -+ (void)initializeWithConsumerKey:(NSString *)consumerKey consumerSecret:(NSString *)consumerSecret; - -/** - Whether the user has their account linked to Twitter. - - @param user User to check for a Twitter link. The user must be logged in on this device. - - @return `YES` if the user has their account linked to Twitter, otherwise `NO`. - */ -+ (BOOL)isLinkedWithUser:(nullable PFUser *)user; - -///-------------------------------------- -/// @name Logging In & Creating Twitter-Linked Users -///-------------------------------------- - -/** - *Asynchronously* logs in a user using Twitter. - - This method delegates to Twitter to authenticate the user, - and then automatically logs in (or creates, in the case where it is a new user) a `PFUser`. - - @return The task, that encapsulates the work being done. - */ -+ (BFTask *)logInInBackground; - -/** - *Asynchronously* logs in a user using Twitter. - - This method delegates to Twitter to authenticate the user, - and then automatically logs in (or creates, in the case where it is a new user) `PFUser`. - - @param block The block to execute. - It should have the following argument signature: `^(PFUser *user, NSError *error)`. - */ -+ (void)logInWithBlock:(nullable PFUserResultBlock)block; - -/* - *Asynchronously* Logs in a user using Twitter. - - This method delegates to Twitter to authenticate the user, - and then automatically logs in (or creates, in the case where it is a new user) a `PFUser`. - - @param target Target object for the selector - @param selector The selector that will be called when the asynchrounous request is complete. - It should have the following signature: `(void)callbackWithUser:(PFUser *)user error:(NSError **)error`. - */ -+ (void)logInWithTarget:(nullable id)target selector:(nullable SEL)selector; - -/** - *Asynchronously* logs in a user using Twitter. - - Allows you to handle user login to Twitter, then provide authentication - data to log in (or create, in the case where it is a new user) the `PFUser`. - - @param twitterId The id of the Twitter user being linked. - @param screenName The screen name of the Twitter user being linked. - @param authToken The auth token for the user's session. - @param authTokenSecret The auth token secret for the user's session. - - @return The task, that encapsulates the work being done. - */ -+ (BFTask *)logInWithTwitterIdInBackground:(NSString *)twitterId - screenName:(NSString *)screenName - authToken:(NSString *)authToken - authTokenSecret:(NSString *)authTokenSecret; - -/** - Logs in a user using Twitter. - - Allows you to handle user login to Twitter, then provide authentication data - to log in (or create, in the case where it is a new user) the `PFUser`. - - @param twitterId The id of the Twitter user being linked - @param screenName The screen name of the Twitter user being linked - @param authToken The auth token for the user's session - @param authTokenSecret The auth token secret for the user's session - @param block The block to execute. - It should have the following argument signature: `^(PFUser *user, NSError *error)`. - */ -+ (void)logInWithTwitterId:(NSString *)twitterId - screenName:(NSString *)screenName - authToken:(NSString *)authToken - authTokenSecret:(NSString *)authTokenSecret - block:(nullable PFUserResultBlock)block; - -/* - Logs in a user using Twitter. - - Allows you to handle user login to Twitter, then provide authentication data - to log in (or create, in the case where it is a new user) the `PFUser`. - - @param twitterId The id of the Twitter user being linked. - @param screenName The screen name of the Twitter user being linked. - @param authToken The auth token for the user's session. - @param authTokenSecret The auth token secret for the user's session. - @param target Target object for the selector. - @param selector The selector that will be called when the asynchronous request is complete. - It should have the following signature: `(void)callbackWithUser:(PFUser *)user error:(NSError *)error`. - */ -+ (void)logInWithTwitterId:(NSString *)twitterId - screenName:(NSString *)screenName - authToken:(NSString *)authToken - authTokenSecret:(NSString *)authTokenSecret - target:(nullable id)target - selector:(nullable SEL)selector; - -///-------------------------------------- -/// @name Linking Users with Twitter -///-------------------------------------- - -/** - *Asynchronously* links Twitter to an existing PFUser. - - This method delegates to Twitter to authenticate the user, - and then automatically links the account to the `PFUser`. - - @param user User to link to Twitter. - - @deprecated Please use `[PFTwitterUtils linkUserInBackground:]` instead. - */ -+ (void)linkUser:(PFUser *)user PARSE_DEPRECATED("Please use +linkUserInBackground: instead."); - -/** - *Asynchronously* links Twitter to an existing `PFUser`. - - This method delegates to Twitter to authenticate the user, - and then automatically links the account to the `PFUser`. - - @param user User to link to Twitter. - - @return The task, that encapsulates the work being done. - */ -+ (BFTask *)linkUserInBackground:(PFUser *)user; - -/** - *Asynchronously* links Twitter to an existing `PFUser`. - - This method delegates to Twitter to authenticate the user, - and then automatically links the account to the `PFUser`. - - @param user User to link to Twitter. - @param block The block to execute. - It should have the following argument signature: `^(BOOL success, NSError *error)`. - */ -+ (void)linkUser:(PFUser *)user block:(nullable PFBooleanResultBlock)block; - -/* - *Asynchronously* links Twitter to an existing `PFUser`. - - This method delegates to Twitter to authenticate the user, - and then automatically links the account to the `PFUser`. - - @param user User to link to Twitter. - @param target Target object for the selector - @param selector The selector that will be called when the asynchrounous request is complete. - It should have the following signature: `(void)callbackWithResult:(NSNumber *)result error:(NSError *)error`. - */ -+ (void)linkUser:(PFUser *)user target:(nullable id)target selector:(nullable SEL)selector; - -/** - *Asynchronously* links Twitter to an existing PFUser asynchronously. - - Allows you to handle user login to Twitter, - then provide authentication data to link the account to the `PFUser`. - - @param user User to link to Twitter. - @param twitterId The id of the Twitter user being linked. - @param screenName The screen name of the Twitter user being linked. - @param authToken The auth token for the user's session. - @param authTokenSecret The auth token secret for the user's session. - @return The task, that encapsulates the work being done. - */ -+ (BFTask *)linkUserInBackground:(PFUser *)user - twitterId:(NSString *)twitterId - screenName:(NSString *)screenName - authToken:(NSString *)authToken - authTokenSecret:(NSString *)authTokenSecret; - -/** - *Asynchronously* links Twitter to an existing `PFUser`. - - @discussionAllows you to handle user login to Twitter, - then provide authentication data to link the account to the `PFUser`. - - @param user User to link to Twitter. - @param twitterId The id of the Twitter user being linked. - @param screenName The screen name of the Twitter user being linked. - @param authToken The auth token for the user's session. - @param authTokenSecret The auth token secret for the user's session. - @param block The block to execute. - It should have the following argument signature: `^(BOOL success, NSError *error)`. - */ -+ (void)linkUser:(PFUser *)user - twitterId:(NSString *)twitterId - screenName:(NSString *)screenName - authToken:(NSString *)authToken - authTokenSecret:(NSString *)authTokenSecret - block:(nullable PFBooleanResultBlock)block; - -/* - Links Twitter to an existing `PFUser`. - - This method allows you to handle user login to Twitter, - then provide authentication data to link the account to the `PFUser`. - - @param user User to link to Twitter. - @param twitterId The id of the Twitter user being linked. - @param screenName The screen name of the Twitter user being linked. - @param authToken The auth token for the user's session. - @param authTokenSecret The auth token secret for the user's session. - @param target Target object for the selector. - @param selector The selector that will be called when the asynchronous request is complete. - It should have the following signature: `(void)callbackWithResult:(NSNumber *)result error:(NSError *)error`. - */ -+ (void)linkUser:(PFUser *)user - twitterId:(NSString *)twitterId - screenName:(NSString *)screenName - authToken:(NSString *)authToken - authTokenSecret:(NSString *)authTokenSecret - target:(nullable id)target - selector:(nullable SEL)selector; - -///-------------------------------------- -/// @name Unlinking Users from Twitter -///-------------------------------------- - -/** - *Synchronously* unlinks the `PFUser` from a Twitter account. - - @param user User to unlink from Twitter. - - @return Returns true if the unlink was successful. - */ -+ (BOOL)unlinkUser:(PFUser *)user; - -/** - *Synchronously* unlinks the PFUser from a Twitter account. - - @param user User to unlink from Twitter. - @param error Error object to set on error. - - @return Returns `YES` if the unlink was successful, otherwise `NO`. - */ -+ (BOOL)unlinkUser:(PFUser *)user error:(NSError **)error; - -/** - Makes an *asynchronous* request to unlink a user from a Twitter account. - - @param user User to unlink from Twitter. - - @return The task, that encapsulates the work being done. - */ -+ (BFTask *)unlinkUserInBackground:(PFUser *)user; - -/** - Makes an *asynchronous* request to unlink a user from a Twitter account. - - @param user User to unlink from Twitter. - @param block The block to execute. - It should have the following argument signature: `^(BOOL succeeded, NSError *error)`. - */ -+ (void)unlinkUserInBackground:(PFUser *)user block:(nullable PFBooleanResultBlock)block; - -/* - Makes an *asynchronous* request to unlink a user from a Twitter account. - - @param user User to unlink from Twitter - @param target Target object for the selector - @param selector The selector that will be called when the asynchrounous request is complete. - */ -+ (void)unlinkUserInBackground:(PFUser *)user target:(nullable id)target selector:(nullable SEL)selector; - -@end - -NS_ASSUME_NONNULL_END diff --git a/ParseTwitterUtils/ParseTwitterUtils/Source/PFTwitterUtils.m b/ParseTwitterUtils/ParseTwitterUtils/Source/PFTwitterUtils.m deleted file mode 100644 index c6cdb23f8..000000000 --- a/ParseTwitterUtils/ParseTwitterUtils/Source/PFTwitterUtils.m +++ /dev/null @@ -1,235 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "PFTwitterUtils.h" - -#if __has_include() -#import -#import -#else -#import "BFExecutor.h" -#import "BFTaskCompletionSource.h" -#endif - -@import ParseCore; - -#import "PFTwitterAuthenticationProvider.h" -#import "PFTwitterPrivateUtilities.h" -#import "PF_Twitter.h" - -@implementation PFTwitterUtils - -///-------------------------------------- -#pragma mark - Authentication Provider -///-------------------------------------- - -static PFTwitterAuthenticationProvider *authenticationProvider_; - -+ (PFTwitterAuthenticationProvider *)_authenticationProvider { - return authenticationProvider_; -} - -+ (void)_setAuthenticationProvider:(PFTwitterAuthenticationProvider *)provider { - authenticationProvider_ = provider; -} - -///-------------------------------------- -#pragma mark - Initialize -///-------------------------------------- - -+ (void)_assertTwitterInitialized { - PFTWConsistencyAssert([self _authenticationProvider], - @"You must call PFTwitterUtils initializeWithConsumerKey:consumerSecret: to use PFTwitterUtils."); -} - -+ (void)_assertParseInitialized { - PFTWConsistencyAssert([Parse applicationId], - @"PFTwitterUtils should be initialized after setting up Parse."); -} - -+ (void)initializeWithConsumerKey:(NSString *)consumerKey consumerSecret:(NSString *)consumerSecret { - [self _assertParseInitialized]; - if (![self _authenticationProvider]) { - PF_Twitter *twitter = [[PF_Twitter alloc] init]; - twitter.consumerKey = consumerKey; - twitter.consumerSecret = consumerSecret; - - PFTwitterAuthenticationProvider *provider = [[PFTwitterAuthenticationProvider alloc] initWithTwitter:twitter]; - [PFUser registerAuthenticationDelegate:provider forAuthType:PFTwitterUserAuthenticationType]; - - [self _setAuthenticationProvider:provider]; - } -} - -+ (PF_Twitter *)twitter { - return [self _authenticationProvider].twitter; -} - -+ (BOOL)isLinkedWithUser:(PFUser *)user { - return [user isLinkedWithAuthType:PFTwitterUserAuthenticationType]; -} - -+ (BOOL)unlinkUser:(PFUser *)user { - return [self unlinkUser:user error:nil]; -} - -+ (BOOL)unlinkUser:(PFUser *)user error:(NSError **)error { - return [[[self unlinkUserInBackground:user] pftw_waitForResult:error] boolValue]; -} - -+ (BFTask *)unlinkUserInBackground:(PFUser *)user { - [self _assertTwitterInitialized]; - return [user unlinkWithAuthTypeInBackground:PFTwitterUserAuthenticationType]; -} - -+ (void)unlinkUserInBackground:(PFUser *)user block:(PFBooleanResultBlock)block { - [[self unlinkUserInBackground:user] pftw_continueWithMainThreadBooleanBlock:block]; -} - -+ (void)unlinkUserInBackground:(PFUser *)user target:(id)target selector:(SEL)selector { - [PFTwitterUtils unlinkUserInBackground:user block:^(BOOL succeeded, NSError *error) { - [PFTwitterPrivateUtilities safePerformSelector:selector onTarget:target withObject:@(succeeded) object:error]; - }]; -} - -+ (void)linkUser:(PFUser *)user { - // This is misnamed `*InBackground` method. Left as is for backward compatability. - [self linkUserInBackground:user]; -} - -+ (BFTask *)linkUserInBackground:(PFUser *)user { - [self _assertTwitterInitialized]; - - PFTwitterAuthenticationProvider *provider = [self _authenticationProvider]; - return [[provider authenticateAsync] continueWithSuccessBlock:^id(BFTask *task) { - return [user linkWithAuthTypeInBackground:PFTwitterUserAuthenticationType authData:task.result]; - }]; -} - -+ (void)linkUser:(PFUser *)user block:(PFBooleanResultBlock)block { - [[self linkUserInBackground:user] pftw_continueWithMainThreadBooleanBlock:block]; -} - -+ (void)linkUser:(PFUser *)user target:(id)target selector:(SEL)selector { - [PFTwitterUtils linkUser:user block:^(BOOL succeeded, NSError *error) { - [PFTwitterPrivateUtilities safePerformSelector:selector onTarget:target withObject:@(succeeded) object:error]; - }]; -} - -+ (BFTask *)linkUserInBackground:(PFUser *)user - twitterId:(NSString *)twitterId - screenName:(NSString *)screenName - authToken:(NSString *)authToken - authTokenSecret:(NSString *)authTokenSecret { - [self _assertTwitterInitialized]; - - PFTwitterAuthenticationProvider *provider = [self _authenticationProvider]; - NSDictionary *authData = [provider authDataWithTwitterId:twitterId - screenName:screenName - authToken:authToken - secret:authTokenSecret]; - return [user linkWithAuthTypeInBackground:PFTwitterUserAuthenticationType authData:authData]; -} - -+ (void)linkUser:(PFUser *)user - twitterId:(NSString *)twitterId - screenName:(NSString *)screenName - authToken:(NSString *)authToken - authTokenSecret:(NSString *)authTokenSecret - block:(PFBooleanResultBlock)block { - [[self linkUserInBackground:user - twitterId:twitterId - screenName:screenName - authToken:authToken - authTokenSecret:authTokenSecret] pftw_continueWithMainThreadBooleanBlock:block]; -} - -+ (void)linkUser:(PFUser *)user - twitterId:(NSString *)twitterId - screenName:(NSString *)screenName - authToken:(NSString *)authToken - authTokenSecret:(NSString *)authTokenSecret - target:(id)target - selector:(SEL)selector { - [PFTwitterUtils linkUser:user - twitterId:twitterId - screenName:screenName - authToken:authToken - authTokenSecret:authTokenSecret - block:^(BOOL succeeded, NSError *error) { - [PFTwitterPrivateUtilities safePerformSelector:selector - onTarget:target - withObject:@(succeeded) - object:error]; - }]; -} - -+ (BFTask *)logInInBackground { - [self _assertTwitterInitialized]; - - PFTwitterAuthenticationProvider *provider = [self _authenticationProvider]; - return [[provider authenticateAsync] continueWithSuccessBlock:^id(BFTask *task) { - return [PFUser logInWithAuthTypeInBackground:PFTwitterUserAuthenticationType authData:task.result]; - }]; -} - -+ (void)logInWithBlock:(PFUserResultBlock)block { - [[self logInInBackground] pftw_continueWithMainThreadUserBlock:block]; -} - -+ (void)logInWithTarget:(id)target selector:(SEL)selector { - [self logInWithBlock:^(PFUser *user, NSError *error) { - [PFTwitterPrivateUtilities safePerformSelector:selector onTarget:target withObject:user object:error]; - }]; -} - -+ (BFTask *)logInWithTwitterIdInBackground:(NSString *)twitterId - screenName:(NSString *)screenName - authToken:(NSString *)authToken - authTokenSecret:(NSString *)authTokenSecret { - [self _assertTwitterInitialized]; - - PFTwitterAuthenticationProvider *provider = [self _authenticationProvider]; - NSDictionary *authData = [provider authDataWithTwitterId:twitterId - screenName:screenName - authToken:authToken - secret:authTokenSecret]; - return [PFUser logInWithAuthTypeInBackground:PFTwitterUserAuthenticationType authData:authData]; -} - -+ (void)logInWithTwitterId:(NSString *)twitterId - screenName:(NSString *)screenName - authToken:(NSString *)authToken - authTokenSecret:(NSString *)authTokenSecret - block:(PFUserResultBlock)block { - [[self logInWithTwitterIdInBackground:twitterId - screenName:screenName - authToken:authToken - authTokenSecret:authTokenSecret] pftw_continueWithMainThreadUserBlock:block]; -} - -+ (void)logInWithTwitterId:(NSString *)twitterId - screenName:(NSString *)screenName - authToken:(NSString *)authToken - authTokenSecret:(NSString *)authTokenSecret - target:(id)target - selector:(SEL)selector { - [self logInWithTwitterId:twitterId - screenName:screenName - authToken:authToken - authTokenSecret:authTokenSecret - block:^(PFUser *user, NSError *error) { - [PFTwitterPrivateUtilities safePerformSelector:selector - onTarget:target - withObject:user - object:error]; - }]; -} - -@end diff --git a/ParseTwitterUtils/ParseTwitterUtils/Source/PF_Twitter.h b/ParseTwitterUtils/ParseTwitterUtils/Source/PF_Twitter.h deleted file mode 100644 index bef15ba51..000000000 --- a/ParseTwitterUtils/ParseTwitterUtils/Source/PF_Twitter.h +++ /dev/null @@ -1,103 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import - -@import ParseCore; - -NS_ASSUME_NONNULL_BEGIN - -@class BFTask<__covariant BFGenericType>; - -/** - The `PF_Twitter` class is a simple interface for interacting with the Twitter REST API, - automating sign-in and OAuth signing of requests against the API. - */ -@interface PF_Twitter : NSObject - -/** - Initializes an instance of `PF_Twitter` configured to access device Twitter accounts with Accounts.framework, - and remote access to Twitter accounts - and, if no accounts are found locally - through a built-in webview. - - After setting `consumerKey` and `consumerSecret`, authorization to Twitter accounts can be requested with -`authorizeInBackground`, and then revoked with its opposite, `deauthorizeInBackground`. - */ -- (instancetype)init; - -/** - Consumer key of the application that is used to authorize with Twitter. - */ -@property (nullable, nonatomic, copy) NSString *consumerKey; - -/** - Consumer secret of the application that is used to authorize with Twitter. - */ -@property (nullable, nonatomic, copy) NSString *consumerSecret; - -/** - Auth token for the current user. - */ -@property (nullable, nonatomic, copy) NSString *authToken; - -/** - Auth token secret for the current user. - */ -@property (nullable, nonatomic, copy) NSString *authTokenSecret; - -/** - Twitter user id of the currently signed in user. - */ -@property (nullable, nonatomic, copy) NSString *userId; - -/** - Twitter screen name of the currently signed in user. - */ -@property (nullable, nonatomic, copy) NSString *screenName; - -/** - Displays an auth dialog and populates the authToken, authTokenSecret, userId, and screenName properties - if the Twitter user grants permission to the application. - - @return The task, that encapsulates the work being done. - */ -- (BFTask *)authorizeInBackground; - -/** - Invalidates an OAuth token for the current user, if the Twitter user has granted permission to the - current application. - - @return The task, that encapsulates the work being done. - */ -- (BFTask *)deauthorizeInBackground; - -/** - Displays an auth dialog and populates the authToken, authTokenSecret, userId, and screenName properties - if the Twitter user grants permission to the application. - - @param success Invoked upon successful authorization. - @param failure Invoked upon an error occurring in the authorization process. - @param cancel Invoked when the user cancels authorization. - */ -- (void)authorizeWithSuccess:(nullable void (^)(void))success - failure:(nullable void (^)(NSError *__nullable error))failure - cancel:(nullable void (^)(void))cancel; - -/** - Adds a 3-legged OAuth signature to an `NSMutableURLRequest` based - upon the properties set for the Twitter object. - - Use this function to sign requests being made to the Twitter API. - - @param request Request to sign. - */ -- (void)signRequest:(nullable NSMutableURLRequest *)request; - -@end - -NS_ASSUME_NONNULL_END diff --git a/ParseTwitterUtils/ParseTwitterUtils/Source/PF_Twitter.m b/ParseTwitterUtils/ParseTwitterUtils/Source/PF_Twitter.m deleted file mode 100644 index d7cb9e122..000000000 --- a/ParseTwitterUtils/ParseTwitterUtils/Source/PF_Twitter.m +++ /dev/null @@ -1,503 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "PF_Twitter.h" -#import "PF_Twitter_Private.h" - -#import -#import -#import - -#if __has_include() -#import -#import -#else -#import "BFExecutor.h" -#import "BFTaskCompletionSource.h" -#endif - -@import ParseCore; - -#import "PFOAuth1FlowDialog.h" -#import "PFTwitterAlertView.h" -#import "PFTwitterPrivateUtilities.h" -#import "PF_OAuthCore.h" -#import "PFTwitterLocalization.h" - -@implementation PF_Twitter - -///-------------------------------------- -#pragma mark - Init -///-------------------------------------- - -- (instancetype)init { - return [self initWithAccountStore:[[ACAccountStore alloc] init] - urlSession:[NSURLSession sharedSession] - dialogClass:[PFOAuth1FlowDialog class]]; -} - -- (instancetype)initWithAccountStore:(ACAccountStore *)accountStore - urlSession:(NSURLSession *)urlSession - dialogClass:(Class)dialogClass { - self = [super init]; - if (!self) return nil; - - _accountStore = accountStore; - _urlSession = urlSession; - _oauthDialogClass = dialogClass; - - PFTWConsistencyAssert(_oauthDialogClass == nil || - [(id)_oauthDialogClass conformsToProtocol:@protocol(PFOAuth1FlowDialogInterface)], - @"OAuth Dialog class must conform to the Dialog Interface protocol!"); - - return self; -} - -///-------------------------------------- -#pragma mark - Authorize -///-------------------------------------- - -- (BFTask *)authorizeInBackground { - if (self.consumerKey.length == 0 || self.consumerSecret.length == 0) { - //TODO: (nlutsenko) This doesn't look right, maybe we should add additional error code? - return [BFTask taskWithError:[NSError errorWithDomain:PFParseErrorDomain code:1 userInfo:nil]]; - } - - return [[self _performReverseAuthAsync] pftw_continueAsyncWithBlock:^id(BFTask *task) { - BFTaskCompletionSource *source = [BFTaskCompletionSource taskCompletionSource]; - dispatch_async(dispatch_get_main_queue(), ^{ - // if reverse auth was successful then return - if (task.cancelled) { - [source cancel]; - return; - } else if (!task.error && !task.result) { - source.result = nil; - return; - } - - // fallback to the webview auth - [[self _performWebViewAuthAsync] pftw_continueAsyncWithBlock:^id(BFTask *task) { - NSError *error = task.error; - if (task.cancelled) { - [source cancel]; - } else if (!error) { - [source setResult:task.result]; - } else { - [source setError:error]; - } - return nil; - }]; - }); - return source.task; - }]; -} -- (BFTask *)deauthorizeInBackground { - if (self.consumerKey.length == 0 || self.consumerSecret.length == 0) { - //TODO: (nlutsenko) This doesn't look right, maybe we should add additional error code? - return [BFTask taskWithError:[NSError errorWithDomain:PFParseErrorDomain code:1 userInfo:nil]]; - } - - return [[self _performDeauthAsync] pftw_continueAsyncWithBlock:^id(BFTask *task) { - BFTaskCompletionSource *source = [BFTaskCompletionSource taskCompletionSource]; - if (task.cancelled) { - [source cancel]; - } else if (!task.error && !task.result) { - source.result = nil; - } else if (task.error) { - [source trySetError:task.error]; - } else if (task.result) { - [self setLoginResultValues:nil]; - - [source trySetResult:task.result]; - } - return source.task; - }]; -} - -- (void)authorizeWithSuccess:(void (^)(void))success - failure:(void (^)(NSError *error))failure - cancel:(void (^)(void))cancel { - [[self authorizeInBackground] continueWithExecutor:[BFExecutor mainThreadExecutor] - withBlock:^id(BFTask *task) { - if (task.error) { - failure(task.error); - } else if (task.cancelled) { - cancel(); - } else { - success(); - } - return nil; - }]; -} - -// Displays the web view dialog -- (BFTask *)_showWebViewDialogAsync:(NSString *)requestToken requestSecret:(NSString *)requestSecret { - BFTaskCompletionSource *source = [BFTaskCompletionSource taskCompletionSource]; - - static NSString *twitterAuthURLString = @"https://api.twitter.com/oauth/authenticate"; - - PFOAuth1FlowDialog *dialog = [_oauthDialogClass dialogWithURL:[NSURL URLWithString:twitterAuthURLString] - queryParameters:@{ @"oauth_token" : requestToken }]; - dialog.redirectURLPrefix = @"http://twitter-oauth.callback"; - dialog.completion = ^(BOOL succeeded, NSURL *url, NSError *error) { - // In case of error - if (error) { - source.error = error; - return; - } - // In case the dialog was cancelled - if (!succeeded) { - [source cancel]; - return; - } - - // Handle URL received. - NSDictionary *authQueryParams = [NSURL PF_ab_parseURLQueryString:[url query]]; - NSString *verifier = [authQueryParams objectForKey:@"oauth_verifier"]; - NSString *token = [authQueryParams objectForKey:@"oauth_token"]; - - [[self _getAccessTokenForWebAuthAsync:verifier requestSecret:requestSecret token:token] - pftw_continueAsyncWithBlock:^id (BFTask *task) { - NSError *error = task.error; - if (!error) { - NSDictionary *accessResult = (NSDictionary*) task.result; - [self setLoginResultValues:accessResult]; - source.result = nil; - } else { - source.error = error; - } - return nil; - }]; - }; - [dialog showAnimated:YES]; - - return source.task; -} - -/** - Get the request token for the authentication. This is the first step in auth. - if isReverseAuth is YES then get the request token for reverse auth mode. Otherwise, get the request token for web auth mode. - */ -- (BFTask *)_getRequestTokenAsync:(BOOL)isReverseAuth { - NSURL *url = [NSURL URLWithString:@"https://api.twitter.com/oauth/request_token"]; - NSMutableDictionary *params = nil; - NSData *body = nil; - - if (isReverseAuth) { - body = [[NSString stringWithFormat:@"x_auth_mode=%@", @"reverse_auth"] dataUsingEncoding:NSUTF8StringEncoding]; - } else { - params = [NSMutableDictionary dictionary]; - [params setObject:@"http://twitter-oauth.callback" forKey:@"oauth_callback"]; - } - - PFOAuthConfiguration *configuration = [PFOAuthConfiguration configurationForURL:url - method:@"POST" - body:body - additionalParameters:params - consumerKey:_consumerKey - consumerSecret:_consumerSecret - token:nil - tokenSecret:nil]; - NSString *header = [PFOAuth authorizationHeaderFromConfiguration:configuration]; - NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; - [request setHTTPMethod:@"POST"]; - [request addValue:header forHTTPHeaderField:@"Authorization"]; - [request setHTTPBody:body]; - - BFTaskCompletionSource *taskCompletionSource = [BFTaskCompletionSource taskCompletionSource]; - [[self.urlSession dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { - if (error) { - [taskCompletionSource trySetError:error]; - } else { - [taskCompletionSource trySetResult:data]; - } - }] resume]; - return taskCompletionSource.task; -} - -// Get the access token for web authentication -- (BFTask *)_getAccessTokenForWebAuthAsync:(NSString *)verifier - requestSecret:(NSString *)requestSecret - token:(NSString *)token { - NSURL *accessTokenURL = [NSURL URLWithString:@"https://api.twitter.com/oauth/access_token"]; - NSData *body = [[NSString stringWithFormat:@"oauth_verifier=%@", verifier] dataUsingEncoding:NSUTF8StringEncoding]; - PFOAuthConfiguration *configuration = [PFOAuthConfiguration configurationForURL:accessTokenURL - method:@"POST" - body:body - additionalParameters:nil - consumerKey:_consumerKey - consumerSecret:_consumerSecret - token:token - tokenSecret:requestSecret]; - NSString *accessTokenHeader = [PFOAuth authorizationHeaderFromConfiguration:configuration]; - NSMutableURLRequest *accessRequest = [NSMutableURLRequest requestWithURL:accessTokenURL]; - [accessRequest setHTTPMethod:@"POST"]; - [accessRequest addValue:accessTokenHeader forHTTPHeaderField:@"Authorization"]; - [accessRequest setHTTPBody:body]; - - BFTaskCompletionSource *taskCompletionSource = [BFTaskCompletionSource taskCompletionSource]; - [[self.urlSession dataTaskWithRequest:accessRequest completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { - if (error) { - [taskCompletionSource trySetError:error]; - } else { - NSString *accessResponseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; - NSDictionary *accessResponseValues = [NSURL PF_ab_parseURLQueryString:accessResponseString]; - [taskCompletionSource trySetResult:accessResponseValues]; - } - }] resume]; - return taskCompletionSource.task; -} - -/** - Get the access token for reverse authentication. - If the Task is successful then, Task result is dictionary containing logged in user's Auth token, Screenname and other attributes. - */ -- (BFTask *)_getAccessTokenForReverseAuthAsync:(NSString *)signedReverseAuthSignature - localTwitterAccount:(ACAccount *)localTwitterAccount { - - BFTaskCompletionSource *source = [BFTaskCompletionSource taskCompletionSource]; - if (!signedReverseAuthSignature || - [signedReverseAuthSignature length] == 0 || - !localTwitterAccount) { - - source.error = [NSError errorWithDomain:PFParseErrorDomain code:1 userInfo:nil]; - return source.task; - } - - NSDictionary *params = @{ @"x_reverse_auth_parameters" : signedReverseAuthSignature, - @"x_reverse_auth_target" : _consumerKey }; - - NSURL *accessTokenUrl = [NSURL URLWithString:@"https://api.twitter.com/oauth/access_token"]; - SLRequest *accessRequest = [SLRequest requestForServiceType:SLServiceTypeTwitter - requestMethod:SLRequestMethodPOST - URL:accessTokenUrl - parameters:params]; - - [accessRequest setAccount:localTwitterAccount]; - [accessRequest performRequestWithHandler:^(NSData *data, NSHTTPURLResponse *urlResponse, NSError *error) { - if (error) { - [source setError:error]; - } else { - NSString *accessResponseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; - NSDictionary *accessResponseValues = [NSURL PF_ab_parseURLQueryString:accessResponseString]; - [source setResult:accessResponseValues]; - } - }]; - - return source.task; -} - -// Set the result parameters from the data returned om succesful login -- (void)setLoginResultValues:(NSDictionary *)resultData { - self.authToken = [resultData objectForKey:@"oauth_token"]; - self.authTokenSecret = [resultData objectForKey:@"oauth_token_secret"]; - self.userId = [resultData objectForKey:@"user_id"]; - self.screenName = [resultData objectForKey:@"screen_name"]; -} - -// Performs the Reverse auth for the the twitter account setup on the device. -- (BFTask *)_performReverseAuthAsync { - BFTaskCompletionSource *source = [BFTaskCompletionSource taskCompletionSource]; - - // get permission to access the account if its setup and available. - [[self _getLocalTwitterAccountAsync] pftw_continueAsyncWithBlock:^id(BFTask *task) { - - if (task.error) { - source.error = task.error; - return source.task; - } - - if (task.cancelled) { - [source cancel]; - return source.task; - } - - dispatch_async(dispatch_get_main_queue(), ^{ - ACAccount *localTwitterAccount = (ACAccount*) task.result; - - if(!localTwitterAccount) { - source.error = [NSError errorWithDomain:PFParseErrorDomain code:2 userInfo:nil]; - return; - } - - // continue with reverse auth since its permitted - [[self _getRequestTokenAsync:YES] pftw_continueAsyncWithBlock:^id(BFTask *task) { - if (task.error) { - source.error = task.error; - return source.task; - } - dispatch_async(dispatch_get_main_queue(), ^{ - NSString *requestTokenResponse = [[NSString alloc] initWithData:task.result encoding:NSUTF8StringEncoding]; - - [[self _getAccessTokenForReverseAuthAsync:requestTokenResponse - localTwitterAccount:localTwitterAccount] pftw_continueAsyncWithBlock:^id(BFTask *task) { - NSError *error = task.error; - if (!error) { - NSDictionary *accessResult = (NSDictionary*) task.result; - [self setLoginResultValues:accessResult]; - source.result = nil; - } else { - source.error = task.error; - } - return nil; - }]; - }); - return nil; - }]; - - }); - return nil; - }]; - - return source.task; -} - -- (BFTask *)_performWebViewAuthAsync { - BFTaskCompletionSource *source = [BFTaskCompletionSource taskCompletionSource]; - - [[self _getRequestTokenAsync:NO] pftw_continueAsyncWithBlock:^id(BFTask *task) { - if (task.error || task.isCancelled) { - if (task.error) { - [source setError:task.error]; - } else { - [source cancel]; - } - return task; - } - - dispatch_async(dispatch_get_main_queue(), ^{ - NSString *requestTokenResponse = [[NSString alloc] initWithData:task.result encoding:NSUTF8StringEncoding]; - - NSDictionary *requestTokenParsed = [NSURL PF_ab_parseURLQueryString:requestTokenResponse]; - NSString *requestToken = requestTokenParsed[@"oauth_token"]; - NSString *requestSecret = requestTokenParsed[@"oauth_token_secret"]; - - // If one of these is missing, then we failed to get a token. - if (!requestToken || !requestSecret) { - NSDictionary *userInfo = @{ NSLocalizedDescriptionKey: @"Failed to request authorization token from Twitter." }; - NSError *error = [NSError errorWithDomain:PFParseErrorDomain code:2 userInfo:userInfo]; - [source setError:error]; - return; - } - - // show the webview dialog for auth token - [[self _showWebViewDialogAsync:requestToken - requestSecret:requestSecret] pftw_continueAsyncWithBlock:^id(BFTask *task) { - NSError *error = task.error; - if (task.isCancelled) { - [source cancel]; - } else if (!error) { - [source setResult:task.result]; - } else { - [source setError:error]; - } - return nil; - }]; - }); - return nil; - }]; - - return source.task; -} - -- (BFTask *)_getLocalTwitterAccountAsync { - BFTaskCompletionSource *source = [BFTaskCompletionSource taskCompletionSource]; - - // If no twitter accounts present in the system, then no need to ask for permission to the user - if (![SLComposeViewController isAvailableForServiceType:SLServiceTypeTwitter]) { - [source setResult:nil]; - return source.task; - } - - ACAccountType *twitterType = [_accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter]; - [_accountStore requestAccessToAccountsWithType:twitterType options:nil completion:^(BOOL granted, NSError *error) { - if (error) { - [source setError:error]; - return; - } - - if (!granted) { - [source setResult:nil]; - return; - } - - NSArray *accounts = [self->_accountStore accountsWithAccountType:twitterType]; - - // No accounts - provide an empty result - if ([accounts count] == 0) { - [source setResult:nil]; - return; - } - - // Finish if there is only 1 account - if ([accounts count] == 1) { - [source setResult:accounts[0]]; - return; - } - - NSArray *usernames = [accounts valueForKey:@"accountDescription"]; - - // Call async on the main thread, as the completion isn't executed on the main thread - dispatch_async(dispatch_get_main_queue(), ^{ - [PFTwitterAlertView showAlertWithTitle:PFTWLocalizedString(@"Select a Twitter Account", @"Select a Twitter Account") - message:nil - cancelButtonTitle:PFTWLocalizedString(@"Cancel", @"Cancel") - otherButtonTitles:usernames - completion:^(NSUInteger buttonIndex) { - if (buttonIndex == NSNotFound) { - [source cancel]; - } else { - ACAccount *account = accounts[buttonIndex]; - [source setResult:account]; - } - }]; - }); - }]; - - return source.task; -} - -- (BFTask *)_performDeauthAsync { - NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; - request.URL = [NSURL URLWithString:@"https://api.twitter.com/oauth2/invalidate_token"]; - request.HTTPMethod = @"POST"; - - [self signRequest:request]; - - BFTaskCompletionSource *taskCompletionSource = [BFTaskCompletionSource taskCompletionSource]; - - [[self.urlSession dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { - if (error) { - [taskCompletionSource trySetError:error]; - } else { - [taskCompletionSource trySetResult:data]; - } - }] resume]; - - return taskCompletionSource.task; -} - -///-------------------------------------- -#pragma mark - Sign Request -///-------------------------------------- - -- (void)signRequest:(NSMutableURLRequest *)request { - PFOAuthConfiguration *configuration = [PFOAuthConfiguration configurationForURL:request.URL - method:request.HTTPMethod ?: @"GET" - body:request.HTTPBody - additionalParameters:nil - consumerKey:_consumerKey - consumerSecret:_consumerSecret - token:_authToken - tokenSecret:_authTokenSecret]; - NSString *header = [PFOAuth authorizationHeaderFromConfiguration:configuration]; - [request addValue:header forHTTPHeaderField:@"Authorization"]; -} - -@end diff --git a/ParseTwitterUtils/ParseTwitterUtils/Source/ParseTwitterUtils.h b/ParseTwitterUtils/ParseTwitterUtils/Source/ParseTwitterUtils.h deleted file mode 100644 index a14686667..000000000 --- a/ParseTwitterUtils/ParseTwitterUtils/Source/ParseTwitterUtils.h +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "PFTwitterUtils.h" -#import "PF_Twitter.h" diff --git a/ParseTwitterUtils/Tests/Other/PFTwitterTestMacros.h b/ParseTwitterUtils/Tests/Other/PFTwitterTestMacros.h deleted file mode 100644 index 5c1461e7c..000000000 --- a/ParseTwitterUtils/Tests/Other/PFTwitterTestMacros.h +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#ifndef PFTwitterTestMacros_h -#define PFTwitterTestMacros_h - -/** - To prevent retain cycles by OCMock, this macro allows us to capture a weak reference to return from a stubbed method. - */ -#define andReturnWeak(variable) _andDo( \ - ({ \ - __weak typeof(variable) variable ## _weak = (variable); \ - ^(NSInvocation *invocation) { \ - __autoreleasing typeof(variable) variable ## _block = variable ## _weak; \ - [invocation setReturnValue:&(variable ## _block)]; \ - }; \ - }) \ -) - -#endif /* PFTwitterTestMacros_h */ diff --git a/ParseTwitterUtils/Tests/Other/TestCase/PFTwitterTestCase.h b/ParseTwitterUtils/Tests/Other/TestCase/PFTwitterTestCase.h deleted file mode 100644 index 05411f71d..000000000 --- a/ParseTwitterUtils/Tests/Other/TestCase/PFTwitterTestCase.h +++ /dev/null @@ -1,78 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import - -@import XCTest; - -@interface PFTwitterTestCase : XCTestCase - -///-------------------------------------- -/// @name XCTestCase -///-------------------------------------- - -- (void)setUp NS_REQUIRES_SUPER; -- (void)tearDown NS_REQUIRES_SUPER; - -///-------------------------------------- -/// @name Expectations -///-------------------------------------- - -- (XCTestExpectation *)currentSelectorTestExpectation; -- (void)waitForTestExpectations; - -///-------------------------------------- -/// @name Mocks -///-------------------------------------- - -- (void)registerMockObject:(id)mockObject; - -@end - -#define _PFRegisterMock(mockObject) [self registerMockObject:mockObject] -#define _PFMockShim(method, args...) ({ id mock = method(args); _PFRegisterMock(mock); mock; }) -#define _PFOCMockWarning _Pragma("GCC warning \"Please use PF mocking methods instead of OCMock ones.\"") - -#define _PFStrictClassMock(kls) [OCMockObject mockForClass:kls] -#define _PFClassMock(kls) [OCMockObject niceMockForClass:kls] -#define _PFStrictProtocolMock(proto) [OCMockObject mockForProtocol:proto] -#define _PFProtocolMock(proto) [OCMockObject niceMockForProtocol:proto] -#define _PFPartialMock(obj) [OCMockObject partialMockForObject:obj] - -#define PFStrictClassMock(...) _PFMockShim(_PFStrictClassMock, __VA_ARGS__) -#define PFClassMock(...) _PFMockShim(_PFClassMock, __VA_ARGS__) -#define PFStrictProtocolMock(...) _PFMockShim(_PFStrictProtocolMock, __VA_ARGS__) -#define PFProtocolMock(...) _PFMockShim(_PFProtocolMock, __VA_ARGS__) -#define PFPartialMock(...) _PFMockShim(_PFPartialMock, __VA_ARGS__) - -#undef OCMStrictClassMock -#undef OCMClassMock -#undef OCMStrictProtocolMock -#undef OCMProtocolMock -#undef OCMPartialMock - -#define OCMStrictClassMock _PFOCMockWarning _PFStrictClassMock -#define OCMClassMock _PFOCMockWarning _PFClassMock -#define OCMStrictProtocolMock _PFOCMockWarning _PFStrictProtocolMock -#define OCMProtocolMock _PFOCMockWarning _PFProtocolMock -#define OCMPartialMock _PFOCMockWarning _PFPartialMock - -#define PFAssertIsKindOfClass(a1, a2, description...) \ -XCTAssertTrue([a1 isKindOfClass:[a2 class]], ## description) - -#define PFAssertNotKindOfClass(a1, a2, description...) \ -XCTAssertFalse([a1 isKindOfClass:[a2 class]], ## description) - -#define PFAssertThrowsInconsistencyException(expression, ...) \ -XCTAssertThrowsSpecificNamed(expression, NSException, NSInternalInconsistencyException, __VA_ARGS__) - -#define PFAssertThrowsInvalidArgumentException(expression, ...) \ -XCTAssertThrowsSpecificNamed(expression, NSException, NSInvalidArgumentException, __VA_ARGS__) - -#define PFAssertStringContains(a, b) XCTAssertTrue([(a) rangeOfString:(b)].location != NSNotFound) diff --git a/ParseTwitterUtils/Tests/Other/TestCase/PFTwitterTestCase.m b/ParseTwitterUtils/Tests/Other/TestCase/PFTwitterTestCase.m deleted file mode 100644 index 174a48226..000000000 --- a/ParseTwitterUtils/Tests/Other/TestCase/PFTwitterTestCase.m +++ /dev/null @@ -1,63 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "PFTwitterTestCase.h" - -@implementation PFTwitterTestCase { - NSMutableArray *_mocks; - dispatch_queue_t _mockQueue; -} - -///-------------------------------------- -#pragma mark - XCTestCase -///-------------------------------------- - -- (void)setUp { - [super setUp]; - - _mocks = [[NSMutableArray alloc] init]; - _mockQueue = dispatch_queue_create("com.parse.tests.mock.queue", DISPATCH_QUEUE_SERIAL); -} - -- (void)tearDown { - dispatch_sync(_mockQueue, ^{ - [self->_mocks makeObjectsPerformSelector:@selector(stopMocking)]; - }); - - _mocks = nil; - _mockQueue = nil; - - [super tearDown]; -} - -///-------------------------------------- -#pragma mark - Helpers -///-------------------------------------- - -- (XCTestExpectation *)currentSelectorTestExpectation { - NSInvocation *invocation = self.invocation; - NSString *selectorName = invocation ? NSStringFromSelector(invocation.selector) : @"testExpectation"; - return [self expectationWithDescription:selectorName]; -} - -- (void)waitForTestExpectations { - [self waitForExpectationsWithTimeout:10.0 handler:nil]; -} - -///-------------------------------------- -#pragma mark - Mock Registration -///-------------------------------------- - -- (void)registerMockObject:(id)mockObject { - dispatch_sync(_mockQueue, ^{ - [self->_mocks addObject:mockObject]; - }); -} - -@end diff --git a/ParseTwitterUtils/Tests/Resources/Info.plist b/ParseTwitterUtils/Tests/Resources/Info.plist deleted file mode 100644 index ba72822e8..000000000 --- a/ParseTwitterUtils/Tests/Resources/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/ParseTwitterUtils/Tests/TestApplication/Classes/main.m b/ParseTwitterUtils/Tests/TestApplication/Classes/main.m deleted file mode 100644 index 453fc1227..000000000 --- a/ParseTwitterUtils/Tests/TestApplication/Classes/main.m +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import - -@interface AppDelegate : NSObject - -@end - -@implementation AppDelegate - -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - UIWindow *window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].applicationFrame]; - window.rootViewController = [[UIViewController alloc] init]; - [window makeKeyAndVisible]; - return YES; -} - -@end - -int main(int argc, char * argv[]) { - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); - } -} diff --git a/ParseTwitterUtils/Tests/TestApplication/Resources/Info.plist b/ParseTwitterUtils/Tests/TestApplication/Resources/Info.plist deleted file mode 100644 index 6dcc65160..000000000 --- a/ParseTwitterUtils/Tests/TestApplication/Resources/Info.plist +++ /dev/null @@ -1,47 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIcons - - CFBundleIcons~ipad - - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - LSRequiresIPhoneOS - - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - - diff --git a/ParseTwitterUtils/Tests/Unit/OAuth1FlowDialogTests.m b/ParseTwitterUtils/Tests/Unit/OAuth1FlowDialogTests.m deleted file mode 100644 index 68d57dbf5..000000000 --- a/ParseTwitterUtils/Tests/Unit/OAuth1FlowDialogTests.m +++ /dev/null @@ -1,194 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "PFOAuth1FlowDialog.h" -#import "PFTwitterTestCase.h" -#import - -@interface UIActivityIndicatorView (Private) - -- (void)_generateImages; - -@end - -@interface FakeWKNavigationAction : WKNavigationAction -// Redefined WKNavigationAction properties as readwrite. -@property(nullable, nonatomic, copy) WKFrameInfo* sourceFrame; -@property(nullable, nonatomic, copy) WKFrameInfo* targetFrame; -@property(nonatomic) WKNavigationType navigationType; -@property(nullable, nonatomic, copy) NSURLRequest* request; - -@end - -@implementation FakeWKNavigationAction -@synthesize sourceFrame, targetFrame, navigationType, request; - -+ (Class)class { - return [super class]; -} - -+ (Class)_nilClass { - return nil; -} - -@end - -@interface OAuth1FlowDialogTests : PFTwitterTestCase -@end - -@implementation OAuth1FlowDialogTests - -///-------------------------------------- -#pragma mark - Tests -///-------------------------------------- - -- (void)testConstructors { - NSURL *exampleURL = [NSURL URLWithString:@"http://foo.bar"]; - NSDictionary *parameters = @{ @"a" : @"b" }; - - PFOAuth1FlowDialog *flowDialog = [[PFOAuth1FlowDialog alloc] initWithURL:exampleURL - queryParameters:parameters]; - XCTAssertNotNil(flowDialog); - XCTAssertEqualObjects(flowDialog.queryParameters, parameters); - XCTAssertEqualObjects(flowDialog->_baseURL, exampleURL); - - flowDialog = [PFOAuth1FlowDialog dialogWithURL:exampleURL queryParameters:parameters]; - XCTAssertNotNil(flowDialog); - XCTAssertEqualObjects(flowDialog.queryParameters, parameters); - XCTAssertEqualObjects(flowDialog->_baseURL, exampleURL); -} - -- (void)testTitle { - PFOAuth1FlowDialog *flowDialog = [[PFOAuth1FlowDialog alloc] initWithURL:nil queryParameters:nil]; - XCTAssertEqualObjects(flowDialog.title, @"Connect to Service"); - flowDialog.title = @"Bleh"; - XCTAssertEqualObjects(flowDialog.title, @"Bleh"); -} - -- (void)testShow { - PFOAuth1FlowDialog *flowDialog = [[PFOAuth1FlowDialog alloc] initWithURL:nil queryParameters:nil]; - - [flowDialog showAnimated:NO]; - [flowDialog layoutSubviews]; - [flowDialog dismissAnimated:NO]; -} - -- (void)testKeyboard { - PFOAuth1FlowDialog *flowDialog = [[PFOAuth1FlowDialog alloc] initWithURL:nil queryParameters:nil]; - [flowDialog showAnimated:NO]; - - NSDictionary *notificationuserInfo = @{ UIKeyboardAnimationDurationUserInfoKey : @0, - UIKeyboardAnimationCurveUserInfoKey : @(UIViewAnimationCurveLinear) }; - [[NSNotificationCenter defaultCenter] postNotificationName:UIKeyboardWillShowNotification - object:nil - userInfo:notificationuserInfo]; - - [[NSNotificationCenter defaultCenter] postNotificationName:UIKeyboardWillHideNotification - object:nil - userInfo:notificationuserInfo]; - - [flowDialog dismissAnimated:NO]; -} - -/** This test is broken by iOS 13. The UIDevice -setOrientation:animated is no longer available and there doesn't seem to be a new equivalent. Leaving this here so we know it was once a thing. - - If we find the need to test this again, a different approach such as a UI test should be used.*/ -- (void)skip_testRotation { - [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait]; -// [[UIDevice currentDevice] setOrientation:UIDeviceOrientationPortrait animated:NO]; - - PFOAuth1FlowDialog *flowDialog = [[PFOAuth1FlowDialog alloc] initWithURL:nil queryParameters:nil]; - - [flowDialog showAnimated:NO]; - CGRect oldBounds = flowDialog.bounds; - - [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeLeft]; -// [[UIDevice currentDevice] setOrientation:UIDeviceOrientationLandscapeLeft animated:NO]; - [[NSNotificationCenter defaultCenter] postNotificationName:UIDeviceOrientationDidChangeNotification object:nil]; - - CGRect newBounds = flowDialog.bounds; - XCTAssertFalse(CGRectEqualToRect(oldBounds, newBounds)); - - [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait]; -// [[UIDevice currentDevice] setOrientation:UIDeviceOrientationPortrait animated:NO]; - [[NSNotificationCenter defaultCenter] postNotificationName:UIDeviceOrientationDidChangeNotification object:nil]; - - newBounds = flowDialog.bounds; - XCTAssertTrue(CGRectEqualToRect(oldBounds, newBounds)); - - [flowDialog dismissAnimated:NO]; -} - -- (void)testWebViewDelegate { - NSURL *sampleURL = [NSURL URLWithString:@"http://foo.bar"]; - NSURL *successURL = [NSURL URLWithString:@"foo://success/?oauth_verifier=abcd&oauth_token=authtoken123"]; - NSURL *rejectedURL = [NSURL URLWithString:@"foo://success/?denied=authtoken123"]; - - //XCTestExpectation *flowExpectation = [[XCTestExpectation alloc] initWithDescription: @"Waiting for redirect"]; - XCTestExpectation *flowExpectation = [self currentSelectorTestExpectation]; - - PFOAuth1FlowDialog *flowDialog = [[PFOAuth1FlowDialog alloc] initWithURL:sampleURL queryParameters:nil]; - flowDialog.redirectURLPrefix = @"foo://"; - flowDialog.completion = ^(BOOL succeeded, NSURL *url, NSError *error) { - XCTAssertTrue(succeeded, @"Flow Dialogue Failed"); - XCTAssertNil(error, @"error"); - XCTAssertEqualObjects(url, successURL, @"url's arent equal"); - [flowExpectation fulfill]; - }; - - [flowDialog showAnimated:NO]; - - id webView = PFClassMock([WKWebView class]); - - NSURLRequest *request = [NSURLRequest requestWithURL:sampleURL]; - XCTestExpectation *policyExpectation = [[XCTestExpectation alloc] initWithDescription:@"Waiting for allowed policy decision"]; - - FakeWKNavigationAction *navigationAction = [[FakeWKNavigationAction alloc] init]; - navigationAction.navigationType = WKNavigationTypeOther; - navigationAction.request = request; - - [flowDialog webView:webView decidePolicyForNavigationAction:navigationAction decisionHandler:^(WKNavigationActionPolicy policy) { - XCTAssertTrue(policy == WKNavigationActionPolicyAllow, @"policy not allowed"); - [policyExpectation fulfill]; - }]; - - XCTestExpectation *canceledExpectation = [[XCTestExpectation alloc] initWithDescription:@"Waiting for canceled policy decision"]; - - WKNavigation* navigation = (WKNavigation *)([[NSObject alloc] init]); - [flowDialog webView:webView didStartProvisionalNavigation:navigation]; - [flowDialog webView:webView didFinishNavigation:navigation]; - - FakeWKNavigationAction *successAction = [[FakeWKNavigationAction alloc] init]; - successAction.navigationType = WKNavigationTypeOther; - successAction.request = [NSURLRequest requestWithURL:successURL]; - - [flowDialog webView:webView decidePolicyForNavigationAction:successAction decisionHandler:^(WKNavigationActionPolicy policy) { - XCTAssertTrue(policy == WKNavigationActionPolicyCancel); - [canceledExpectation fulfill]; - }]; - - XCTestExpectation *canceledOnDeniedExpectation = [[XCTestExpectation alloc] initWithDescription:@"Waiting for canceled policy decision"]; - - WKNavigation* rejectNavigation = (WKNavigation *)([[NSObject alloc] init]); - [flowDialog webView:webView didStartProvisionalNavigation:rejectNavigation]; - [flowDialog webView:webView didFinishNavigation:rejectNavigation]; - - FakeWKNavigationAction *rejectAction = [[FakeWKNavigationAction alloc] init]; - rejectAction.navigationType = WKNavigationTypeOther; - rejectAction.request = [NSURLRequest requestWithURL:rejectedURL]; - - [flowDialog webView:webView decidePolicyForNavigationAction:rejectAction decisionHandler:^(WKNavigationActionPolicy policy) { - XCTAssertTrue(policy == WKNavigationActionPolicyCancel); - [canceledOnDeniedExpectation fulfill]; - }]; - - [self waitForExpectations:@[policyExpectation, flowExpectation, canceledExpectation, canceledOnDeniedExpectation] timeout:20]; -} - -@end diff --git a/ParseTwitterUtils/Tests/Unit/OAuthCoreTests.m b/ParseTwitterUtils/Tests/Unit/OAuthCoreTests.m deleted file mode 100644 index c4e20cb64..000000000 --- a/ParseTwitterUtils/Tests/Unit/OAuthCoreTests.m +++ /dev/null @@ -1,168 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -@import ObjectiveC.runtime; - -#import "PFTwitterTestCase.h" -#import "PF_OAuthCore.h" - -@implementation NSURLComponents (OAuthCoreTests) - -+ (Class)class { - return [super class]; -} - -+ (Class)_nilClass { - return nil; -} - -@end - -@interface OAuthCoreTests : PFTwitterTestCase - -@property (nonatomic, strong) NSDate *authDate; -@property (nonatomic, copy) NSString *authNonce; - -@end - -@implementation OAuthCoreTests - -///-------------------------------------- -#pragma mark - Helpers -///-------------------------------------- - -- (NSURL *)sampleURL { - return [NSURL URLWithString:@"https://localhost/foo/bar"]; -} - -- (NSData *)sampleData { - return [@"sampe=@!value" dataUsingEncoding:NSUTF8StringEncoding]; -} - -- (void)assertAuthHeader:(NSString *)authHeader matchesExpectedSignature:(NSString *)signature { - XCTAssertTrue([authHeader hasPrefix:@"OAuth "]); - - PFAssertStringContains(authHeader, - ([NSString stringWithFormat:@"oauth_timestamp=\"%llu\"", - (unsigned long long)[_authDate timeIntervalSince1970]])); - - PFAssertStringContains(authHeader, ([NSString stringWithFormat:@"oauth_nonce=\"%@\"", _authNonce])); - PFAssertStringContains(authHeader, @"oauth_version=\"1.0\""); - PFAssertStringContains(authHeader, @"oauth_consumer_key=\"consumer_key\""); - PFAssertStringContains(authHeader, @"oauth_signature_method=\"HMAC-SHA1\""); - PFAssertStringContains(authHeader, ([NSString stringWithFormat:@"oauth_signature=\"%@\"", signature])); -} - -///-------------------------------------- -#pragma mark - XCTestCase -///-------------------------------------- - -- (void)setUp { - [super setUp]; - - _authDate = [NSDate dateWithTimeIntervalSinceReferenceDate:0.0]; - _authNonce = @"UUID-STRING"; -} - -///-------------------------------------- -#pragma mark - Tests -///-------------------------------------- - -- (void)testBasic { - PFOAuthConfiguration *configuration = [PFOAuthConfiguration configurationForURL:[self sampleURL] - method:@"POST" - body:[self sampleData] - additionalParameters:nil - consumerKey:@"consumer_key" - consumerSecret:@"consumer_secret" - token:nil - tokenSecret:nil]; - configuration.nonce = self.authNonce; - configuration.timestampDate = self.authDate; - NSString *authHeader = [PFOAuth authorizationHeaderFromConfiguration:configuration]; - - [self assertAuthHeader:authHeader matchesExpectedSignature:@"3Nvy4O1Ok3qkeKcjvtv4wtyjc%2FY%3D"]; -} - -- (void)testNoBody { - PFOAuthConfiguration *configuration = [PFOAuthConfiguration configurationForURL:[self sampleURL] - method:@"POST" - body:nil - additionalParameters:nil - consumerKey:@"consumer_key" - consumerSecret:@"consumer_secret" - token:nil - tokenSecret:nil]; - configuration.nonce = self.authNonce; - configuration.timestampDate = self.authDate; - NSString *authHeader = [PFOAuth authorizationHeaderFromConfiguration:configuration]; - - [self assertAuthHeader:authHeader matchesExpectedSignature:@"rXtmqPIUmMbl4e1%2Bz4JgJUuVIz0%3D"]; -} - -- (void)testWithToken { - PFOAuthConfiguration *configuration = [PFOAuthConfiguration configurationForURL:[self sampleURL] - method:@"POST" - body:nil - additionalParameters:nil - consumerKey:@"consumer_key" - consumerSecret:@"consumer_secret" - token:@"token" - tokenSecret:nil]; - configuration.nonce = self.authNonce; - configuration.timestampDate = self.authDate; - NSString *authHeader = [PFOAuth authorizationHeaderFromConfiguration:configuration]; - - XCTAssertTrue([authHeader rangeOfString:@"oauth_token=\"token\""].location != NSNotFound); - [self assertAuthHeader:authHeader matchesExpectedSignature:@"iRsvN%2FUCXyzhf3o9tIL0DAX%2F4HY%3D"]; -} - -- (void)testNoNSURLComponents { - // Disable NSURLComponents for a single test. - Method originalMethod = class_getClassMethod([NSURLComponents class], @selector(class)); - Method replacementMethod = class_getClassMethod([NSURLComponents class], @selector(_nilClass)); - method_exchangeImplementations(originalMethod, replacementMethod); - - @try { - PFOAuthConfiguration *configuration = [PFOAuthConfiguration configurationForURL:[self sampleURL] - method:@"POST" - body:[self sampleData] - additionalParameters:nil - consumerKey:@"consumer_key" - consumerSecret:@"consumer_secret" - token:nil - tokenSecret:nil]; - configuration.nonce = self.authNonce; - configuration.timestampDate = self.authDate; - NSString *authHeader = [PFOAuth authorizationHeaderFromConfiguration:configuration]; - - [self assertAuthHeader:authHeader matchesExpectedSignature:@"3Nvy4O1Ok3qkeKcjvtv4wtyjc%2FY%3D"]; - } @finally { - method_exchangeImplementations(originalMethod, replacementMethod); - } -} - -- (void)testWithQuery { - NSURL *url = [NSURL URLWithString:[[[self sampleURL] absoluteString] stringByAppendingString:@"?key=value"]]; - - PFOAuthConfiguration *configuration = [PFOAuthConfiguration configurationForURL:url - method:@"GET" - body:nil - additionalParameters:nil - consumerKey:@"consumer_key" - consumerSecret:@"consumer_secret" - token:nil - tokenSecret:nil]; - configuration.nonce = self.authNonce; - configuration.timestampDate = self.authDate; - NSString *authHeader = [PFOAuth authorizationHeaderFromConfiguration:configuration]; - [self assertAuthHeader:authHeader matchesExpectedSignature:@"LecftA2NX%2FvSD4KakdTFjPZlmc0%3D"]; -} - -@end diff --git a/ParseTwitterUtils/Tests/Unit/TwitterAuthenticationProviderTests.m b/ParseTwitterUtils/Tests/Unit/TwitterAuthenticationProviderTests.m deleted file mode 100644 index 7fe6b8aaf..000000000 --- a/ParseTwitterUtils/Tests/Unit/TwitterAuthenticationProviderTests.m +++ /dev/null @@ -1,138 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -@import Bolts; - -#import "PFTwitterAuthenticationProvider.h" -#import "PFTwitterTestCase.h" -#import "PF_Twitter.h" - -@interface TwitterAuthenticationProviderTests : PFTwitterTestCase - -@end - -@implementation TwitterAuthenticationProviderTests - -///-------------------------------------- -#pragma mark - Helpers -///-------------------------------------- - -- (PF_Twitter *)mockedTwitter { - PF_Twitter *twitter = PFStrictClassMock([PF_Twitter class]); - - OCMStub(twitter.consumerKey).andReturn(@"yarr"); - OCMStub(twitter.consumerSecret).andReturn(@"yolo"); - - return twitter; -} - -- (void)assertValidAuthenticationData:(NSDictionary *)authData forTwitter:(PF_Twitter *)twitter { - XCTAssertEqualObjects(authData[@"id"], @"a"); - XCTAssertEqualObjects(authData[@"screen_name"], @"b"); - XCTAssertEqualObjects(authData[@"auth_token"], @"c"); - XCTAssertEqualObjects(authData[@"auth_token_secret"], @"d"); - XCTAssertEqualObjects(authData[@"consumer_key"], twitter.consumerKey); - XCTAssertEqualObjects(authData[@"consumer_secret"], twitter.consumerSecret); -} - -///-------------------------------------- -#pragma mark - Tests -///-------------------------------------- - -- (void)testConstructors { - PF_Twitter *twitter = [self mockedTwitter]; - PFTwitterAuthenticationProvider *provider = [[PFTwitterAuthenticationProvider alloc] initWithTwitter:twitter]; - XCTAssertNotNil(provider); - XCTAssertEqual(provider.twitter, twitter); - - provider = [PFTwitterAuthenticationProvider providerWithTwitter:twitter]; - XCTAssertNotNil(provider); - XCTAssertEqual(provider.twitter, twitter); -} - -- (void)testAuthData { - PF_Twitter *twitter = [self mockedTwitter]; - PFTwitterAuthenticationProvider *provider = [[PFTwitterAuthenticationProvider alloc] initWithTwitter:twitter]; - - NSDictionary *authData = [provider authDataWithTwitterId:@"a" - screenName:@"b" - authToken:@"c" - secret:@"d"]; - [self assertValidAuthenticationData:authData forTwitter:twitter]; -} - -- (void)testAuthType { - XCTAssertEqualObjects(PFTwitterUserAuthenticationType, @"twitter"); -} - -- (void)testAuthenticateAsync { - PF_Twitter *twitter = [self mockedTwitter]; - - OCMStub(twitter.userId).andReturn(@"a"); - OCMStub(twitter.screenName).andReturn(@"b"); - OCMStub(twitter.authToken).andReturn(@"c"); - OCMStub(twitter.authTokenSecret).andReturn(@"d"); - - BFTask *task = [BFTask taskWithResult:nil]; - OCMStub([twitter authorizeInBackground]).andReturn(task); - - PFTwitterAuthenticationProvider *provider = [PFTwitterAuthenticationProvider providerWithTwitter:twitter]; - - XCTestExpectation *expectation = [self currentSelectorTestExpectation]; - [[provider authenticateAsync] continueWithBlock:^id(BFTask *t) { - NSDictionary *authData = t.result; - XCTAssertNotNil(authData); - [self assertValidAuthenticationData:authData forTwitter:twitter]; - - [expectation fulfill]; - return nil; - }]; - [self waitForTestExpectations]; -} - -- (void)testRestoreAuthentication { - PF_Twitter *twitter = [self mockedTwitter]; - OCMExpect(twitter.userId = @"a"); - OCMExpect(twitter.screenName = @"b"); - OCMExpect(twitter.authToken = @"c"); - OCMExpect(twitter.authTokenSecret = @"d"); - - PFTwitterAuthenticationProvider *provider = [PFTwitterAuthenticationProvider providerWithTwitter:twitter]; - - NSDictionary *authData = @{ @"id" : @"a", - @"screen_name" : @"b", - @"auth_token" : @"c", - @"auth_token_secret" : @"d" }; - XCTAssertTrue([provider restoreAuthenticationWithAuthData:authData]); - - OCMVerifyAll((id)twitter); -} - -- (void)testRestoreAuthenticationBadData { - PF_Twitter *twitter = [self mockedTwitter]; - PFTwitterAuthenticationProvider *provider = [PFTwitterAuthenticationProvider providerWithTwitter:twitter]; - - NSDictionary *authData = @{ @"bad" : @"data" }; - XCTAssertFalse([provider restoreAuthenticationWithAuthData:authData]); -} - -- (void)testRestoreAuthenticationWithNoData { - PF_Twitter *twitter = [self mockedTwitter]; - OCMExpect(twitter.userId = nil); - OCMExpect(twitter.authToken = nil); - OCMExpect(twitter.authTokenSecret = nil); - OCMExpect(twitter.screenName = nil); - - PFTwitterAuthenticationProvider *provider = [PFTwitterAuthenticationProvider providerWithTwitter:twitter]; - XCTAssertTrue([provider restoreAuthenticationWithAuthData:nil]); - - OCMVerifyAll((id)twitter); -} - -@end diff --git a/ParseTwitterUtils/Tests/Unit/TwitterTests.m b/ParseTwitterUtils/Tests/Unit/TwitterTests.m deleted file mode 100644 index a4131ffc8..000000000 --- a/ParseTwitterUtils/Tests/Unit/TwitterTests.m +++ /dev/null @@ -1,684 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -@import Accounts; -@import Bolts; -@import ParseCore; -@import Social; - -#import "PFOAuth1FlowDialog.h" -#import "PFTwitterAlertView.h" -#import "PFTwitterTestCase.h" -#import "PFTwitterTestMacros.h" -#import "PF_Twitter_Private.h" - -typedef void (^NSURLSessionDataTaskCompletionHandler)(NSData *data, NSURLResponse *response, NSError *error); - -@interface TwitterTests : PFTwitterTestCase -@end - -@implementation TwitterTests - -///-------------------------------------- -#pragma mark - Tests -///-------------------------------------- - -- (void)testConstructors { - PF_Twitter *twitter = [[PF_Twitter alloc] init]; - XCTAssertNotNil(twitter); - XCTAssertNotNil(twitter.accountStore); - - ACAccountStore *store = PFStrictClassMock([ACAccountStore class]); - NSURLSession *session = PFStrictClassMock([NSURLSession class]); - id dialogClass = PFStrictProtocolMock(@protocol(PFOAuth1FlowDialogInterface)); - twitter = [[PF_Twitter alloc] initWithAccountStore:store urlSession:session dialogClass:dialogClass]; - XCTAssertNotNil(twitter); - XCTAssertEqual(twitter.accountStore, store); - XCTAssertEqual(twitter.urlSession, session); - XCTAssertEqual(twitter.oauthDialogClass, dialogClass); -} - -- (void)testProperties { - PF_Twitter *twitter = [[PF_Twitter alloc] init]; - - XCTAssertNil(twitter.consumerKey); - XCTAssertNil(twitter.consumerKey); - XCTAssertNil(twitter.consumerSecret); - XCTAssertNil(twitter.authToken); - XCTAssertNil(twitter.authTokenSecret); - XCTAssertNil(twitter.userId); - XCTAssertNil(twitter.screenName); - - twitter.consumerKey = @"a"; - XCTAssertEqualObjects(twitter.consumerKey, @"a"); - twitter.consumerSecret = @"b"; - XCTAssertEqualObjects(twitter.consumerSecret, @"b"); - twitter.authToken = @"c"; - XCTAssertEqualObjects(twitter.authToken, @"c"); - twitter.authTokenSecret = @"d"; - XCTAssertEqualObjects(twitter.authTokenSecret, @"d"); - twitter.userId = @"e"; - XCTAssertEqualObjects(twitter.userId, @"e"); - twitter.screenName = @"f"; - XCTAssertEqualObjects(twitter.screenName, @"f"); -} - -- (void)testAuthorizeWithoutRequiredKeys { - id store = PFStrictClassMock([ACAccountStore class]); - NSURLSession *session = PFStrictClassMock([NSURLSession class]); - id mockedDialog = PFStrictProtocolMock(@protocol(PFOAuth1FlowDialogInterface)); - PF_Twitter *twitter = [[PF_Twitter alloc] initWithAccountStore:store urlSession:session dialogClass:mockedDialog]; - - XCTestExpectation *expectation = [self currentSelectorTestExpectation]; - [[twitter authorizeInBackground] continueWithBlock:^id(BFTask *task) { - NSError *error = task.error; - XCTAssertNotNil(error); - XCTAssertEqualObjects(error.domain, PFParseErrorDomain); - //TODO: (nlutsenko) Add code verification when we have proper code reported. - [expectation fulfill]; - return nil; - }]; - [self waitForTestExpectations]; -} - -- (void)testSignRequest { - id store = PFStrictClassMock([ACAccountStore class]); - NSURLSession *session = PFStrictClassMock([NSURLSession class]); - id mockedDialog = PFStrictProtocolMock(@protocol(PFOAuth1FlowDialogInterface)); - PF_Twitter *twitter = [[PF_Twitter alloc] initWithAccountStore:store urlSession:session dialogClass:mockedDialog]; - - twitter.consumerKey = @"consumer_key"; - twitter.consumerSecret = @"consumer_secret"; - - NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; - [twitter signRequest:request]; - - XCTAssertNotNil([request valueForHTTPHeaderField:@"Authorization"]); -} - -- (void)testAuthorizeWithCallbackBlocks { - id store = PFStrictClassMock([ACAccountStore class]); - NSURLSession *session = PFStrictClassMock([NSURLSession class]); - id mockedDialog = PFStrictProtocolMock(@protocol(PFOAuth1FlowDialogInterface)); - PF_Twitter *twitter = [[PF_Twitter alloc] initWithAccountStore:store urlSession:session dialogClass:mockedDialog]; - - XCTestExpectation *expectation = [self currentSelectorTestExpectation]; - [twitter authorizeWithSuccess:^{ - XCTFail(@"Did not expect success!"); - } failure:^(NSError *error) { - [expectation fulfill]; - } cancel:^{ - XCTFail(@"Did not expect cancellation!"); - }]; - - [self waitForTestExpectations]; -} - -- (void)testAuthorizeWithLocalAccountErrorAndNetworkError { - id mockedStore = PFStrictClassMock([ACAccountStore class]); - id mockedURLSession = PFStrictClassMock([NSURLSession class]); - id mockedOperationQueue = PFStrictClassMock([NSOperationQueue class]); - id mockedComposeViewController = PFStrictClassMock([SLComposeViewController class]); - - NSError *expectedError = [NSError errorWithDomain:PFParseErrorDomain code:1337 userInfo:nil]; - - OCMStub(ClassMethod([mockedComposeViewController isAvailableForServiceType:SLServiceTypeTwitter])).andReturn(YES); - OCMStub([mockedStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter]).andReturn(nil); - - OCMStub([mockedStore requestAccessToAccountsWithType:nil - options:nil - completion:OCMOCK_ANY]).andDo(^(NSInvocation *invocation) { - __unsafe_unretained ACAccountStoreRequestAccessCompletionHandler handler = nil; - [invocation getArgument:&handler atIndex:4]; - - handler(NO, expectedError); - }); - - [OCMExpect([mockedURLSession dataTaskWithRequest:[OCMArg checkWithBlock:^BOOL(id obj) { - NSURLRequest *request = obj; - return [request.URL.lastPathComponent isEqualToString:@"request_token"]; - }] completionHandler:[OCMArg isNotNil]]).andDo(^(NSInvocation *invocation) { - __unsafe_unretained NSURLSessionDataTaskCompletionHandler completionHandler = nil; - [invocation getArgument:&completionHandler atIndex:3]; - - completionHandler(nil, nil, expectedError); - }) andReturn:[OCMockObject niceMockForClass:[NSURLSessionDataTask class]]]; - - id mockedDialog = PFStrictProtocolMock(@protocol(PFOAuth1FlowDialogInterface)); - PF_Twitter *twitter = [[PF_Twitter alloc] initWithAccountStore:mockedStore - urlSession:mockedURLSession - dialogClass:mockedDialog]; - - twitter.consumerKey = @"consumer_key"; - twitter.consumerSecret = @"consumer_secret"; - - XCTestExpectation *expectation = [self currentSelectorTestExpectation]; - [[twitter authorizeInBackground] continueWithBlock:^id(BFTask *task) { - XCTAssertEqualObjects(task.error, expectedError); - - [expectation fulfill]; - - return nil; - }]; - - [self waitForTestExpectations]; - OCMVerifyAll(mockedOperationQueue); -} - -- (void)testAuthorizeWithoutLocalAccountAndNetworkError { - id mockedStore = PFStrictClassMock([ACAccountStore class]); - id mockedURLSession = PFStrictClassMock([NSURLSession class]); - id mockedOperationQueue = PFStrictClassMock([NSOperationQueue class]); - - NSError *expectedError = [NSError errorWithDomain:PFParseErrorDomain code:1337 userInfo:nil]; - - [OCMExpect([mockedURLSession dataTaskWithRequest:[OCMArg checkWithBlock:^BOOL(id obj) { - NSURLRequest *request = obj; - return [request.URL.lastPathComponent isEqualToString:@"request_token"]; - }] completionHandler:[OCMArg isNotNil]]).andDo(^(NSInvocation *invocation) { - __unsafe_unretained NSURLSessionDataTaskCompletionHandler completionHandler = nil; - [invocation getArgument:&completionHandler atIndex:3]; - - completionHandler(nil, nil, expectedError); - }) andReturn:[OCMockObject niceMockForClass:[NSURLSessionDataTask class]]]; - - id mockedDialog = PFStrictProtocolMock(@protocol(PFOAuth1FlowDialogInterface)); - PF_Twitter *twitter = [[PF_Twitter alloc] initWithAccountStore:mockedStore - urlSession:mockedURLSession - dialogClass:mockedDialog]; - - twitter.consumerKey = @"consumer_key"; - twitter.consumerSecret = @"consumer_secret"; - - XCTestExpectation *expectation = [self currentSelectorTestExpectation]; - [[twitter authorizeInBackground] continueWithBlock:^id(BFTask *task) { - XCTAssertEqualObjects(task.error, expectedError); - XCTAssertNil(task.result); - - [expectation fulfill]; - - return nil; - }]; - - [self waitForTestExpectations]; - OCMVerifyAll(mockedOperationQueue); -} - -- (void)testAuthorizeWithLocalAccountAndNetworkError { - id mockedStore = PFStrictClassMock([ACAccountStore class]); - id mockedURLSession = PFStrictClassMock([NSURLSession class]); - id mockedComposeViewController = PFStrictClassMock([SLComposeViewController class]); - - OCMStub(ClassMethod([mockedComposeViewController isAvailableForServiceType:SLServiceTypeTwitter])).andReturn(YES); - OCMStub([mockedStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter]).andReturn(nil); - - OCMStub([mockedStore requestAccessToAccountsWithType:nil - options:nil - completion:OCMOCK_ANY]).andDo(^(NSInvocation *invocation) { - __unsafe_unretained ACAccountStoreRequestAccessCompletionHandler handler = nil; - [invocation getArgument:&handler atIndex:4]; - - handler(YES, nil); - }); - - id mockedAccount = PFStrictClassMock([ACAccount class]); - - NSArray *twitterAccounts = @[ mockedAccount ]; - OCMStub([mockedStore accountsWithAccountType:nil]).andReturn(twitterAccounts); - - NSError *expectedError = [NSError errorWithDomain:PFParseErrorDomain code:1337 userInfo:nil]; - - __block NSURLSessionDataTaskCompletionHandler completionHandler = nil; - [OCMStub([mockedURLSession dataTaskWithRequest:[OCMArg checkWithBlock:^BOOL(id obj) { - NSURLRequest *request = obj; - return [request.URL.lastPathComponent isEqualToString:@"request_token"]; - }] completionHandler:[OCMArg checkWithBlock:^BOOL(id obj) { - completionHandler = obj; - return (obj != nil); - }]]).andDo(^(NSInvocation *invocation) { - completionHandler(nil, nil, expectedError); - }) andReturn:[OCMockObject niceMockForClass:[NSURLSessionDataTask class]]]; - - id mockedDialog = PFStrictProtocolMock(@protocol(PFOAuth1FlowDialogInterface)); - PF_Twitter *twitter = [[PF_Twitter alloc] initWithAccountStore:mockedStore - urlSession:mockedURLSession - dialogClass:mockedDialog]; - - twitter.consumerKey = @"consumer_key"; - twitter.consumerSecret = @"consumer_secret"; - - XCTestExpectation *expectation = [self currentSelectorTestExpectation]; - [[twitter authorizeInBackground] continueWithBlock:^id(BFTask *task) { - XCTAssertEqualObjects(task.error, expectedError); - [expectation fulfill]; - return nil; - }]; - [self waitForTestExpectations]; -} - -- (void)testAuthorizeWithSingleLocalAccountAndNetworkSuccess { - id mockedStore = PFStrictClassMock([ACAccountStore class]); - id mockedURLSession = PFStrictClassMock([NSURLSession class]); - id mockedComposeViewController = PFStrictClassMock([SLComposeViewController class]); - id mockedSLRequest = PFStrictClassMock([SLRequest class]); - - OCMStub(ClassMethod([mockedComposeViewController isAvailableForServiceType:SLServiceTypeTwitter])).andReturn(YES); - OCMStub([mockedStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter]).andReturn(nil); - - OCMStub([mockedStore requestAccessToAccountsWithType:nil - options:nil - completion:OCMOCK_ANY]).andDo(^(NSInvocation *invocation) { - __unsafe_unretained ACAccountStoreRequestAccessCompletionHandler handler = nil; - [invocation getArgument:&handler atIndex:4]; - - handler(YES, nil); - }); - - id mockedAccount = PFStrictClassMock([ACAccount class]); - OCMStub([mockedAccount accountType]).andReturn(nil); - - NSArray *twitterAccounts = @[ mockedAccount ]; - OCMStub([mockedStore accountsWithAccountType:nil]).andReturn(twitterAccounts); - - [OCMExpect([mockedURLSession dataTaskWithRequest:[OCMArg checkWithBlock:^BOOL(id obj) { - NSURLRequest *request = obj; - return [request.URL.lastPathComponent isEqualToString:@"request_token"]; - }] completionHandler:[OCMArg isNotNil]]).andDo(^(NSInvocation *invocation) { - __unsafe_unretained NSURLSessionDataTaskCompletionHandler completionHandler = nil; - [invocation getArgument:&completionHandler atIndex:3]; - - NSString *successString = @"oauth_token=request_token&oauth_token_secret=request_secret"; - completionHandler([successString dataUsingEncoding:NSUTF8StringEncoding], nil, nil); - }) andReturn:[OCMockObject niceMockForClass:[NSURLSessionDataTask class]]]; - - __weak typeof(mockedSLRequest) weakSLRequest = mockedSLRequest; - OCMStub(ClassMethod([[mockedSLRequest ignoringNonObjectArgs] requestForServiceType:SLServiceTypeTwitter - requestMethod:0 - URL:OCMOCK_ANY - parameters:OCMOCK_ANY])) - .andDo(^(NSInvocation *invocation) { - __strong typeof(mockedSLRequest) slRequest = weakSLRequest; - [invocation setReturnValue:&slRequest]; - }); - - OCMStub([mockedSLRequest setAccount:OCMOCK_ANY]); - OCMStub([mockedSLRequest performRequestWithHandler:OCMOCK_ANY]).andDo(^(NSInvocation *invocation) { - __unsafe_unretained SLRequestHandler requestHandler = nil; - [invocation getArgument:&requestHandler atIndex:2]; - - NSString *successString = @"oauth_token=access_token&oauth_token_secret=access_secret&user_id=test_user&" - @"screen_name=test_name"; - requestHandler([successString dataUsingEncoding:NSUTF8StringEncoding], nil, nil); - }); - - id mockedDialog = PFStrictProtocolMock(@protocol(PFOAuth1FlowDialogInterface)); - PF_Twitter *twitter = [[PF_Twitter alloc] initWithAccountStore:mockedStore - urlSession:mockedURLSession - dialogClass:mockedDialog]; - - twitter.consumerKey = @"consumer_key"; - twitter.consumerSecret = @"consumer_secret"; - - XCTestExpectation *expectation = [self currentSelectorTestExpectation]; - [[twitter authorizeInBackground] continueWithBlock:^id(BFTask *task) { - XCTAssertNil(task.error); - XCTAssertNil(task.result); - - XCTAssertEqualObjects(@"access_token", twitter.authToken); - XCTAssertEqualObjects(@"access_secret", twitter.authTokenSecret); - XCTAssertEqualObjects(@"test_user", twitter.userId); - XCTAssertEqualObjects(@"test_name", twitter.screenName); - - [expectation fulfill]; - - return nil; - }]; - - [self waitForTestExpectations]; -} - -- (void)testAuthorizeWithMultipleLocalAccountsAndNetworkSuccess { - id mockedStore = PFStrictClassMock([ACAccountStore class]); - id mockedSession = PFStrictClassMock([NSURLSession class]); - id mockedComposeViewController = PFStrictClassMock([SLComposeViewController class]); - id mockedSLRequest = PFStrictClassMock([SLRequest class]); - id mockedAlertView = PFStrictClassMock([PFTwitterAlertView class]); - - OCMStub(ClassMethod([mockedComposeViewController isAvailableForServiceType:SLServiceTypeTwitter])).andReturn(YES); - OCMStub([mockedStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter]).andReturn(nil); - - OCMStub([mockedStore requestAccessToAccountsWithType:nil - options:nil - completion:OCMOCK_ANY]).andDo(^(NSInvocation *invocation) { - __unsafe_unretained ACAccountStoreRequestAccessCompletionHandler handler = nil; - [invocation getArgument:&handler atIndex:4]; - - handler(YES, nil); - }); - - id mockedAccount = PFStrictClassMock([ACAccount class]); - OCMStub([mockedAccount accountType]).andReturn(nil); - OCMStub([mockedAccount valueForKey:@"accountDescription"]).andReturn(@"An Account"); - - NSArray *twitterAccounts = @[ mockedAccount, mockedAccount ]; - OCMStub([mockedStore accountsWithAccountType:nil]).andReturn(twitterAccounts); - - [OCMExpect([mockedSession dataTaskWithRequest:[OCMArg checkWithBlock:^BOOL(id obj) { - NSURLRequest *request = obj; - return [request.URL.lastPathComponent isEqualToString:@"request_token"]; - }] completionHandler:[OCMArg isNotNil]]).andDo(^(NSInvocation *invocation) { - __unsafe_unretained NSURLSessionDataTaskCompletionHandler completionHandler = nil; - [invocation getArgument:&completionHandler atIndex:3]; - - - NSString *successString = @"oauth_token=request_token&oauth_token_secret=request_secret"; - completionHandler([successString dataUsingEncoding:NSUTF8StringEncoding], nil, nil); - }) andReturn:[OCMockObject niceMockForClass:[NSURLSessionDataTask class]]]; - - __weak typeof(mockedSLRequest) weakSLRequest = mockedSLRequest; - OCMStub(ClassMethod([[mockedSLRequest ignoringNonObjectArgs] requestForServiceType:SLServiceTypeTwitter - requestMethod:0 - URL:OCMOCK_ANY - parameters:OCMOCK_ANY])) - .andDo(^(NSInvocation *invocation) { - __strong typeof(mockedSLRequest) slRequest = weakSLRequest; - [invocation setReturnValue:&slRequest]; - }); - - OCMStub([mockedSLRequest setAccount:OCMOCK_ANY]); - OCMStub([mockedSLRequest performRequestWithHandler:OCMOCK_ANY]).andDo(^(NSInvocation *invocation) { - __unsafe_unretained SLRequestHandler requestHandler = nil; - [invocation getArgument:&requestHandler atIndex:2]; - - NSString *successString = @"oauth_token=access_token&oauth_token_secret=access_secret&user_id=test_user&" - @"screen_name=test_name"; - requestHandler([successString dataUsingEncoding:NSUTF8StringEncoding], nil, nil); - }); - - OCMStub(ClassMethod([mockedAlertView showAlertWithTitle:OCMOCK_ANY - message:nil - cancelButtonTitle:@"Cancel" - otherButtonTitles:[OCMArg checkWithBlock:^BOOL(id obj) { - return [obj count] == 2; - }] - completion:OCMOCK_ANY])).andDo(^(NSInvocation *invocation) { - __unsafe_unretained PFTwitterAlertViewCompletion completionHandler = nil; - [invocation getArgument:&completionHandler atIndex:6]; - - completionHandler(0); - }); - - id mockedDialog = PFStrictProtocolMock(@protocol(PFOAuth1FlowDialogInterface)); - PF_Twitter *twitter = [[PF_Twitter alloc] initWithAccountStore:mockedStore - urlSession:mockedSession - dialogClass:mockedDialog]; - - twitter.consumerKey = @"consumer_key"; - twitter.consumerSecret = @"consumer_secret"; - - XCTestExpectation *expectation = [self currentSelectorTestExpectation]; - [[twitter authorizeInBackground] continueWithBlock:^id(BFTask *task) { - XCTAssertNil(task.error); - XCTAssertNil(task.result); - - XCTAssertEqualObjects(@"access_token", twitter.authToken); - XCTAssertEqualObjects(@"access_secret", twitter.authTokenSecret); - XCTAssertEqualObjects(@"test_user", twitter.userId); - XCTAssertEqualObjects(@"test_name", twitter.screenName); - - [expectation fulfill]; - - return nil; - }]; - - [self waitForTestExpectations]; -} - -- (void)testAuthorizeWithZeroLocalAccountsAndNetworkSuccess { - id mockedDialog = PFStrictProtocolMock(@protocol(PFOAuth1FlowDialogInterface)); - id mockedStore = PFStrictClassMock([ACAccountStore class]); - id mockedURLSession = PFStrictClassMock([NSURLSession class]); - id mockedComposeViewController = PFStrictClassMock([SLComposeViewController class]); - id mockedSLRequest = PFStrictClassMock([SLRequest class]); - - OCMStub(ClassMethod([mockedComposeViewController isAvailableForServiceType:SLServiceTypeTwitter])).andReturn(YES); - OCMStub([mockedStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter]).andReturn(nil); - - OCMStub([mockedStore requestAccessToAccountsWithType:nil - options:nil - completion:OCMOCK_ANY]).andDo(^(NSInvocation *invocation) { - __unsafe_unretained ACAccountStoreRequestAccessCompletionHandler handler = nil; - [invocation getArgument:&handler atIndex:4]; - - handler(YES, nil); - }); - - id mockedAccount = PFStrictClassMock([ACAccount class]); - OCMStub([mockedAccount accountType]).andReturn(nil); - - NSArray *twitterAccounts = @[]; - OCMStub([mockedStore accountsWithAccountType:nil]).andReturn(twitterAccounts); - - __weak typeof(mockedSLRequest) weakSLRequest = mockedSLRequest; - OCMStub(ClassMethod([[mockedSLRequest ignoringNonObjectArgs] requestForServiceType:SLServiceTypeTwitter - requestMethod:0 - URL:OCMOCK_ANY - parameters:OCMOCK_ANY])) - .andDo(^(NSInvocation *invocation) { - __strong typeof(mockedSLRequest) slRequest = weakSLRequest; - [invocation setReturnValue:&slRequest]; - }); - - [OCMExpect([mockedURLSession dataTaskWithRequest:[OCMArg checkWithBlock:^BOOL(id obj) { - NSURLRequest *request = obj; - return [request.URL.lastPathComponent isEqualToString:@"request_token"]; - }] completionHandler:[OCMArg isNotNil]]).andDo(^(NSInvocation *invocation) { - __unsafe_unretained NSURLSessionDataTaskCompletionHandler completionHandler = nil; - [invocation getArgument:&completionHandler atIndex:3]; - - - NSString *successString = @"oauth_token=request_token&oauth_token_secret=request_secret"; - completionHandler([successString dataUsingEncoding:NSUTF8StringEncoding], nil, nil); - }) andReturn:[OCMockObject niceMockForClass:[NSURLSessionDataTask class]]]; - [OCMExpect([mockedURLSession dataTaskWithRequest:[OCMArg checkWithBlock:^BOOL(id obj) { - NSURLRequest *request = obj; - return [request.URL.lastPathComponent isEqualToString:@"access_token"]; - }] completionHandler:[OCMArg isNotNil]]).andDo(^(NSInvocation *invocation) { - __unsafe_unretained NSURLSessionDataTaskCompletionHandler completionHandler = nil; - [invocation getArgument:&completionHandler atIndex:3]; - - - NSString *successString = @"oauth_token=access_token&oauth_token_secret=access_secret&user_id=test_user&" - @"screen_name=test_name"; - completionHandler([successString dataUsingEncoding:NSUTF8StringEncoding], nil, nil); - }) andReturn:[OCMockObject niceMockForClass:[NSURLSessionDataTask class]]]; - - OCMExpect([mockedDialog dialogWithURL:OCMOCK_ANY queryParameters:OCMOCK_ANY]).andReturnWeak(mockedDialog); - OCMExpect([mockedDialog setRedirectURLPrefix:@"http://twitter-oauth.callback"]); - - __block PFOAuth1FlowDialogCompletion completionHandler = nil; - OCMExpect([mockedDialog setCompletion:OCMOCK_ANY]).andDo(^(NSInvocation *invocation) { - __unsafe_unretained PFOAuth1FlowDialogCompletion newHandler = nil; - [invocation getArgument:&newHandler atIndex:2]; - - completionHandler = [newHandler copy]; - }); - - OCMExpect([[mockedDialog ignoringNonObjectArgs] showAnimated:NO]).andDo(^(NSInvocation *invocation) { - completionHandler( - YES, - [NSURL URLWithString:@"http://twitter-oauth.callback/?oauth_token=sucess_token&oauth_token_secret=success_secret"], - nil - ); - }); - - PF_Twitter *twitter = [[PF_Twitter alloc] initWithAccountStore:mockedStore - urlSession:mockedURLSession - dialogClass:mockedDialog]; - - twitter.consumerKey = @"consumer_key"; - twitter.consumerSecret = @"consumer_secret"; - - XCTestExpectation *expectation = [self currentSelectorTestExpectation]; - [[twitter authorizeInBackground] continueWithBlock:^id(BFTask *task) { - XCTAssertNil(task.error); - XCTAssertNil(task.result); - - XCTAssertEqualObjects(@"access_token", twitter.authToken); - XCTAssertEqualObjects(@"access_secret", twitter.authTokenSecret); - XCTAssertEqualObjects(@"test_user", twitter.userId); - XCTAssertEqualObjects(@"test_name", twitter.screenName); - - [expectation fulfill]; - - return nil; - }]; - - [self waitForTestExpectations]; - - OCMVerifyAll(mockedDialog); - OCMVerifyAll(mockedURLSession); -} - -- (void)testAuthorizeWithoutLocalAccountAndNetworkSuccess { - id mockedDialog = PFStrictProtocolMock(@protocol(PFOAuth1FlowDialogInterface)); - id mockedStore = PFStrictClassMock([ACAccountStore class]); - id mockedURLSession = PFStrictClassMock([NSURLSession class]); - - [OCMExpect([mockedURLSession dataTaskWithRequest:[OCMArg checkWithBlock:^BOOL(id obj) { - NSURLRequest *request = obj; - return [request.URL.lastPathComponent isEqualToString:@"request_token"]; - }] completionHandler:[OCMArg isNotNil]]).andDo(^(NSInvocation *invocation) { - __unsafe_unretained NSURLSessionDataTaskCompletionHandler completionHandler = nil; - [invocation getArgument:&completionHandler atIndex:3]; - - - NSString *successString = @"oauth_token=request_token&oauth_token_secret=request_secret"; - completionHandler([successString dataUsingEncoding:NSUTF8StringEncoding], nil, nil); - }) andReturn:[OCMockObject niceMockForClass:[NSURLSessionDataTask class]]]; - [OCMExpect([mockedURLSession dataTaskWithRequest:[OCMArg checkWithBlock:^BOOL(id obj) { - NSURLRequest *request = obj; - return [request.URL.lastPathComponent isEqualToString:@"access_token"]; - }] completionHandler:[OCMArg isNotNil]]).andDo(^(NSInvocation *invocation) { - __unsafe_unretained NSURLSessionDataTaskCompletionHandler completionHandler = nil; - [invocation getArgument:&completionHandler atIndex:3]; - - - NSString *successString = @"oauth_token=access_token&oauth_token_secret=access_secret&user_id=test_user&" - @"screen_name=test_name"; - completionHandler([successString dataUsingEncoding:NSUTF8StringEncoding], nil, nil); - }) andReturn:[OCMockObject niceMockForClass:[NSURLSessionDataTask class]]]; - - OCMExpect([mockedDialog dialogWithURL:OCMOCK_ANY queryParameters:OCMOCK_ANY]).andReturnWeak(mockedDialog); - OCMExpect([mockedDialog setRedirectURLPrefix:@"http://twitter-oauth.callback"]); - - __block PFOAuth1FlowDialogCompletion completionHandler = nil; - OCMExpect([mockedDialog setCompletion:OCMOCK_ANY]).andDo(^(NSInvocation *invocation) { - __unsafe_unretained PFOAuth1FlowDialogCompletion newHandler = nil; - [invocation getArgument:&newHandler atIndex:2]; - - completionHandler = [newHandler copy]; - }); - - OCMExpect([[mockedDialog ignoringNonObjectArgs] showAnimated:NO]).andDo(^(NSInvocation *invocation) { - completionHandler( - YES, - [NSURL URLWithString:@"http://twitter-oauth.callback/?oauth_token=sucess_token&oauth_token_secret=success_secret"], - nil - ); - }); - - PF_Twitter *twitter = [[PF_Twitter alloc] initWithAccountStore:mockedStore - urlSession:mockedURLSession - dialogClass:mockedDialog]; - - twitter.consumerKey = @"consumer_key"; - twitter.consumerSecret = @"consumer_secret"; - - XCTestExpectation *expectation = [self currentSelectorTestExpectation]; - [[twitter authorizeInBackground] continueWithBlock:^id(BFTask *task) { - XCTAssertNil(task.error); - XCTAssertNil(task.result); - - XCTAssertEqualObjects(@"access_token", twitter.authToken); - XCTAssertEqualObjects(@"access_secret", twitter.authTokenSecret); - XCTAssertEqualObjects(@"test_user", twitter.userId); - XCTAssertEqualObjects(@"test_name", twitter.screenName); - - [expectation fulfill]; - - return nil; - }]; - - [self waitForTestExpectations]; - - OCMVerifyAll(mockedDialog); - OCMVerifyAll(mockedURLSession); -} - -- (void)testDeauthorizeLoggedOutAccount { - id store = PFStrictClassMock([ACAccountStore class]); - NSURLSession *session = PFStrictClassMock([NSURLSession class]); - id mockedDialog = PFStrictProtocolMock(@protocol(PFOAuth1FlowDialogInterface)); - PF_Twitter *twitter = [[PF_Twitter alloc] initWithAccountStore:store urlSession:session dialogClass:mockedDialog]; - - XCTestExpectation *expectation = [self currentSelectorTestExpectation]; - [[twitter authorizeInBackground] continueWithBlock:^id(BFTask *task) { - NSError *error = task.error; - XCTAssertNotNil(error); - XCTAssertEqualObjects(error.domain, PFParseErrorDomain); - XCTAssertEqual(error.code, 1); - [expectation fulfill]; - return nil; - }]; - [self waitForTestExpectations]; -} - -- (void)testDeauthorizeLoggedInAccount { - id mockedStore = PFStrictClassMock([ACAccountStore class]); - id mockedURLSession = PFStrictClassMock([NSURLSession class]); - - id mockedDialog = PFStrictProtocolMock(@protocol(PFOAuth1FlowDialogInterface)); - PF_Twitter *twitter = [[PF_Twitter alloc] initWithAccountStore:mockedStore urlSession:mockedURLSession dialogClass:mockedDialog]; - twitter.consumerKey = @"consumer_key"; - twitter.consumerSecret = @"consumer_secret"; - twitter.authToken = @"auth_token"; - twitter.authTokenSecret = @"auth_token_secret"; - twitter.userId = @"user_id"; - twitter.screenName = @"screen_name"; - - __block NSURLSessionDataTaskCompletionHandler completionHandler = nil; - [OCMStub([mockedURLSession dataTaskWithRequest:[OCMArg checkWithBlock:^BOOL(id obj) { - NSURLRequest *request = obj; - return [request.URL.lastPathComponent isEqualToString:@"invalidate_token"]; - }] completionHandler:[OCMArg checkWithBlock:^BOOL(id obj) { - completionHandler = obj; - return (obj != nil); - }]]).andDo(^(NSInvocation *invocation) { - completionHandler([NSData data], nil, nil); - }) andReturn:[OCMockObject niceMockForClass:[NSURLSessionDataTask class]]]; - - XCTestExpectation *expectation = [self currentSelectorTestExpectation]; - [[twitter deauthorizeInBackground] continueWithBlock:^id(BFTask *task) { - NSError *error = task.error; - XCTAssertNil(error); - XCTAssertNotNil(task.result); - - XCTAssertNil(twitter.authToken); - XCTAssertNil(twitter.authTokenSecret); - XCTAssertNil(twitter.userId); - XCTAssertNil(twitter.screenName); - - [expectation fulfill]; - return nil; - }]; - [self waitForTestExpectations]; -} - -@end diff --git a/ParseTwitterUtils/Tests/Unit/TwitterUtilsTests.m b/ParseTwitterUtils/Tests/Unit/TwitterUtilsTests.m deleted file mode 100644 index 63121d04a..000000000 --- a/ParseTwitterUtils/Tests/Unit/TwitterUtilsTests.m +++ /dev/null @@ -1,82 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "PFTwitterTestCase.h" -#import "PFTwitterUtils_Private.h" -#import "PF_Twitter.h" - -@import ParseCore; - -///-------------------------------------- -#pragma mark - Tests -///-------------------------------------- - -@interface TwitterUtilsTests : PFTwitterTestCase - -@end - -@implementation TwitterUtilsTests - -///-------------------------------------- -#pragma mark - XCTestCase -///-------------------------------------- - -- (void)tearDown { - [PFTwitterUtils _setAuthenticationProvider:nil]; - - [super tearDown]; -} - -///-------------------------------------- -#pragma mark - Tests -///-------------------------------------- - -- (void)testInitialize { - id parseMock = PFStrictClassMock([Parse class]); - OCMStub([parseMock applicationId]).andReturn(@"yolo"); - OCMStub([parseMock clientKey]).andReturn(@"yarr"); - - id userMock = PFStrictClassMock([PFUser class]); - OCMExpect(ClassMethod([userMock registerAuthenticationDelegate:[OCMArg checkWithBlock:^BOOL(id obj) { - return (obj != nil); - }] forAuthType:@"twitter"])); - - [PFTwitterUtils initializeWithConsumerKey:@"a" consumerSecret:@"b"]; - XCTAssertNotNil([PFTwitterUtils twitter]); - XCTAssertEqualObjects([PFTwitterUtils twitter].consumerKey, @"a"); - XCTAssertEqualObjects([PFTwitterUtils twitter].consumerSecret, @"b"); - - OCMVerifyAll(userMock); -} - -- (void)testInitializeTwice { - id parseMock = PFStrictClassMock([Parse class]); - OCMStub([parseMock applicationId]).andReturn(@"yolo"); - OCMStub([parseMock clientKey]).andReturn(@"yarr"); - - id userMock = PFStrictClassMock([PFUser class]); - - [PFTwitterUtils initializeWithConsumerKey:@"a" consumerSecret:@"b"]; - XCTAssertNotNil([PFTwitterUtils twitter]); - XCTAssertEqualObjects([PFTwitterUtils twitter].consumerKey, @"a"); - XCTAssertEqualObjects([PFTwitterUtils twitter].consumerSecret, @"b"); - - [PFTwitterUtils initializeWithConsumerKey:@"b" consumerSecret:@"c"]; - XCTAssertNotNil([PFTwitterUtils twitter]); - XCTAssertEqualObjects([PFTwitterUtils twitter].consumerKey, @"a"); - XCTAssertEqualObjects([PFTwitterUtils twitter].consumerSecret, @"b"); - - OCMVerifyAll(userMock); -} - -- (void)testInitializeRequiresParseInitialize { - PFAssertThrowsInconsistencyException([PFTwitterUtils initializeWithConsumerKey:@"a" consumerSecret:@"b"]); -} - -@end diff --git a/ParseTwitterUtils/third_party_licenses.txt b/ParseTwitterUtils/third_party_licenses.txt deleted file mode 100644 index 492c44335..000000000 --- a/ParseTwitterUtils/third_party_licenses.txt +++ /dev/null @@ -1,35 +0,0 @@ -THE FOLLOWING SETS FORTH ATTRIBUTION NOTICES FOR THIRD PARTY SOFTWARE THAT MAY BE CONTAINED IN PORTIONS OF THE PARSE PRODUCT. - ------ - -The following software may be included in this product: OAuthCore. This software contains the following license and notice below: - -Copyright (C) 2012 Loren Brichter - -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. - --------------------------------------------------------------------- - -Copyright 2001-2004 Unicode, Inc. - -Disclaimer - -This source code is provided as is by Unicode, Inc. No claims are -made as to fitness for any particular purpose. No warranties of any -kind are expressed or implied. The recipient agrees to determine -applicability of information provided. If this file has been -purchased on magnetic or optical media from Unicode, Inc., the -sole remedy for any claim will be exchange of defective media -within 90 days of receipt. - -Limitations on Rights to Redistribute This Code - -Unicode, Inc. hereby grants the right to freely use the information -supplied in this file in the creation of products supporting the -Unicode Standard, and to make copies of this file in any form -for internal or external distribution as long as this notice -remains attached. diff --git a/ParseUI/ParseUI.xcodeproj/project.pbxproj b/ParseUI/ParseUI.xcodeproj/project.pbxproj index dead509ac..95eaad508 100644 --- a/ParseUI/ParseUI.xcodeproj/project.pbxproj +++ b/ParseUI/ParseUI.xcodeproj/project.pbxproj @@ -3,21 +3,18 @@ archiveVersion = 1; classes = { }; - objectVersion = 52; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ - 39452DEA2AD8FB9A0066C2AE /* ParseTwitterUtils in Frameworks */ = {isa = PBXBuildFile; productRef = 39452DE92AD8FB9A0066C2AE /* ParseTwitterUtils */; }; 39452DEC2AD8FC110066C2AE /* ParseObjC in Frameworks */ = {isa = PBXBuildFile; productRef = 39452DEB2AD8FC110066C2AE /* ParseObjC */; }; 39452DF82AD9121D0066C2AE /* ParseObjC in Frameworks */ = {isa = PBXBuildFile; productRef = 39452DF72AD9121D0066C2AE /* ParseObjC */; }; 39452DFA2AD9121D0066C2AE /* ParseUI in Frameworks */ = {isa = PBXBuildFile; productRef = 39452DF92AD9121D0066C2AE /* ParseUI */; }; 39452DFD2AD914110066C2AE /* BoltsSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 39452DFC2AD914110066C2AE /* BoltsSwift */; }; 39E22AD72AD0676700D9AE5C /* OCMock in Frameworks */ = {isa = PBXBuildFile; productRef = 39E22AD62AD0676700D9AE5C /* OCMock */; }; - 39E249A12AD1DD2E0014357C /* ParseFacebookUtils in Frameworks */ = {isa = PBXBuildFile; productRef = 39E249A02AD1DD2E0014357C /* ParseFacebookUtils */; }; - 39E249A32AD1DD2E0014357C /* ParseFacebookUtilsiOS in Frameworks */ = {isa = PBXBuildFile; productRef = 39E249A22AD1DD2E0014357C /* ParseFacebookUtilsiOS */; }; 39E249A52AD1DD2E0014357C /* ParseObjC in Frameworks */ = {isa = PBXBuildFile; productRef = 39E249A42AD1DD2E0014357C /* ParseObjC */; }; - 39E249A72AD1DD3A0014357C /* ParseTwitterUtils in Frameworks */ = {isa = PBXBuildFile; productRef = 39E249A62AD1DD3A0014357C /* ParseTwitterUtils */; }; - 39E249AB2AD1DE8F0014357C /* ParseFacebookUtilsiOS in Frameworks */ = {isa = PBXBuildFile; productRef = 39E249AA2AD1DE8F0014357C /* ParseFacebookUtilsiOS */; }; + 6B63F1602BC34E4A00F89DEE /* ParseObjC in Frameworks */ = {isa = PBXBuildFile; productRef = 6B63F15F2BC34E4A00F89DEE /* ParseObjC */; }; + 6B63F1662BC3508200F89DEE /* ParseObjC in Frameworks */ = {isa = PBXBuildFile; productRef = 6B63F1652BC3508200F89DEE /* ParseObjC */; }; 7C77D109292A509000C4D90E /* PFPurchaseTableViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0C9292A507500C4D90E /* PFPurchaseTableViewCell.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7C77D10A292A509000C4D90E /* PFTextField.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0CB292A507500C4D90E /* PFTextField.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7C77D10B292A509000C4D90E /* PFQueryTableViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0CD292A507500C4D90E /* PFQueryTableViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -225,18 +222,12 @@ 4A9A948F200D02CE005D8F4B /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; 4A9A9490200D02CE005D8F4B /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; 4A9A9491200D02CE005D8F4B /* ParseUI-iOS-Dynamic.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "ParseUI-iOS-Dynamic.xcconfig"; sourceTree = ""; }; - 7C77D0B3292A507500C4D90E /* twitter_icon@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "twitter_icon@3x.png"; sourceTree = ""; }; 7C77D0B4292A507500C4D90E /* apple_icon@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "apple_icon@3x.png"; sourceTree = ""; }; - 7C77D0B5292A507500C4D90E /* facebook_icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "facebook_icon@2x.png"; sourceTree = ""; }; 7C77D0B6292A507500C4D90E /* parse_logo.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = parse_logo.png; sourceTree = ""; }; - 7C77D0B7292A507500C4D90E /* facebook_icon@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "facebook_icon@3x.png"; sourceTree = ""; }; 7C77D0B8292A507500C4D90E /* apple_icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "apple_icon@2x.png"; sourceTree = ""; }; - 7C77D0B9292A507500C4D90E /* twitter_icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "twitter_icon@2x.png"; sourceTree = ""; }; 7C77D0BA292A507500C4D90E /* parse_logo@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "parse_logo@2x.png"; sourceTree = ""; }; 7C77D0BB292A507500C4D90E /* parse_logo@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "parse_logo@3x.png"; sourceTree = ""; }; 7C77D0BC292A507500C4D90E /* apple_icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = apple_icon.png; sourceTree = ""; }; - 7C77D0BD292A507500C4D90E /* facebook_icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = facebook_icon.png; sourceTree = ""; }; - 7C77D0BE292A507500C4D90E /* twitter_icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = twitter_icon.png; sourceTree = ""; }; 7C77D0BF292A507500C4D90E /* Info-iOS.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Info-iOS.plist"; sourceTree = ""; }; 7C77D0C2292A507500C4D90E /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/ParseUI.strings; sourceTree = ""; }; 7C77D0C3292A507500C4D90E /* he */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = he; path = he.lproj/ParseUI.strings; sourceTree = ""; }; @@ -381,6 +372,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 6B63F1602BC34E4A00F89DEE /* ParseObjC in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -388,10 +380,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 39E249A72AD1DD3A0014357C /* ParseTwitterUtils in Frameworks */, 39E249A52AD1DD2E0014357C /* ParseObjC in Frameworks */, - 39E249A32AD1DD2E0014357C /* ParseFacebookUtilsiOS in Frameworks */, - 39E249A12AD1DD2E0014357C /* ParseFacebookUtils in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -410,8 +399,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 39452DEA2AD8FB9A0066C2AE /* ParseTwitterUtils in Frameworks */, - 39E249AB2AD1DE8F0014357C /* ParseFacebookUtilsiOS in Frameworks */, + 6B63F1662BC3508200F89DEE /* ParseObjC in Frameworks */, 7C77D222292A580800C4D90E /* Social.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -555,18 +543,12 @@ 7C77D0B2292A507500C4D90E /* Images */ = { isa = PBXGroup; children = ( - 7C77D0B3292A507500C4D90E /* twitter_icon@3x.png */, 7C77D0B4292A507500C4D90E /* apple_icon@3x.png */, - 7C77D0B5292A507500C4D90E /* facebook_icon@2x.png */, 7C77D0B6292A507500C4D90E /* parse_logo.png */, - 7C77D0B7292A507500C4D90E /* facebook_icon@3x.png */, 7C77D0B8292A507500C4D90E /* apple_icon@2x.png */, - 7C77D0B9292A507500C4D90E /* twitter_icon@2x.png */, 7C77D0BA292A507500C4D90E /* parse_logo@2x.png */, 7C77D0BB292A507500C4D90E /* parse_logo@3x.png */, 7C77D0BC292A507500C4D90E /* apple_icon.png */, - 7C77D0BD292A507500C4D90E /* facebook_icon.png */, - 7C77D0BE292A507500C4D90E /* twitter_icon.png */, ); path = Images; sourceTree = ""; @@ -999,6 +981,9 @@ dependencies = ( ); name = "ParseUI-Dynamic"; + packageProductDependencies = ( + 6B63F15F2BC34E4A00F89DEE /* ParseObjC */, + ); productName = ParseUI; productReference = 7C77D162292A510400C4D90E /* ParseUI.framework */; productType = "com.apple.product-type.framework"; @@ -1018,10 +1003,7 @@ ); name = ParseUI; packageProductDependencies = ( - 39E249A02AD1DD2E0014357C /* ParseFacebookUtils */, - 39E249A22AD1DD2E0014357C /* ParseFacebookUtilsiOS */, 39E249A42AD1DD2E0014357C /* ParseObjC */, - 39E249A62AD1DD3A0014357C /* ParseTwitterUtils */, ); productName = ParseUI; productReference = 7C77D22D292A604700C4D90E /* ParseUI.framework */; @@ -1064,8 +1046,7 @@ ); name = ParseUIDemo; packageProductDependencies = ( - 39E249AA2AD1DE8F0014357C /* ParseFacebookUtilsiOS */, - 39452DE92AD8FB9A0066C2AE /* ParseTwitterUtils */, + 6B63F1652BC3508200F89DEE /* ParseObjC */, ); productName = ParseUIDemo; productReference = 7C77D21F292A56F600C4D90E /* ParseUIDemo.app */; @@ -1631,7 +1612,11 @@ DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)", + "$(PROJECT_DIR)", + ); GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -1702,7 +1687,11 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)", + "$(PROJECT_DIR)", + ); GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -1746,7 +1735,11 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; COPY_PHASE_STRIP = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)", + "$(PROJECT_DIR)", + ); GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( @@ -1793,7 +1786,11 @@ COPY_PHASE_STRIP = YES; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)", + "$(PROJECT_DIR)", + ); GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; @@ -1834,7 +1831,11 @@ COPY_PHASE_STRIP = NO; DEVELOPMENT_TEAM = ""; ENABLE_STRICT_OBJC_MSGSEND = YES; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)", + "$(PROJECT_DIR)", + ); GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( @@ -1880,7 +1881,11 @@ COPY_PHASE_STRIP = YES; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)", + "$(PROJECT_DIR)", + ); GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; @@ -2066,10 +2071,6 @@ /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ - 39452DE92AD8FB9A0066C2AE /* ParseTwitterUtils */ = { - isa = XCSwiftPackageProductDependency; - productName = ParseTwitterUtils; - }; 39452DEB2AD8FC110066C2AE /* ParseObjC */ = { isa = XCSwiftPackageProductDependency; productName = ParseObjC; @@ -2092,25 +2093,17 @@ package = 39E22AD52AD0676700D9AE5C /* XCRemoteSwiftPackageReference "ocmock" */; productName = OCMock; }; - 39E249A02AD1DD2E0014357C /* ParseFacebookUtils */ = { - isa = XCSwiftPackageProductDependency; - productName = ParseFacebookUtils; - }; - 39E249A22AD1DD2E0014357C /* ParseFacebookUtilsiOS */ = { - isa = XCSwiftPackageProductDependency; - productName = ParseFacebookUtilsiOS; - }; 39E249A42AD1DD2E0014357C /* ParseObjC */ = { isa = XCSwiftPackageProductDependency; productName = ParseObjC; }; - 39E249A62AD1DD3A0014357C /* ParseTwitterUtils */ = { + 6B63F15F2BC34E4A00F89DEE /* ParseObjC */ = { isa = XCSwiftPackageProductDependency; - productName = ParseTwitterUtils; + productName = ParseObjC; }; - 39E249AA2AD1DE8F0014357C /* ParseFacebookUtilsiOS */ = { + 6B63F1652BC3508200F89DEE /* ParseObjC */ = { isa = XCSwiftPackageProductDependency; - productName = ParseFacebookUtilsiOS; + productName = ParseObjC; }; /* End XCSwiftPackageProductDependency section */ }; diff --git a/ParseUI/ParseUI/Internal/Extensions/PFColor.h b/ParseUI/ParseUI/Internal/Extensions/PFColor.h index c03100352..7e03aa06b 100644 --- a/ParseUI/ParseUI/Internal/Extensions/PFColor.h +++ b/ParseUI/ParseUI/Internal/Extensions/PFColor.h @@ -44,8 +44,6 @@ + (UIColor *)loginButtonBackgroundColor; + (UIColor *)signupButtonBackgroundColor; -+ (UIColor *)facebookButtonBackgroundColor; -+ (UIColor *)twitterButtonBackgroundColor; + (UIColor *)appleButtonBackgroundColor; @end diff --git a/ParseUI/ParseUI/Internal/Extensions/PFColor.m b/ParseUI/ParseUI/Internal/Extensions/PFColor.m index 4d873ed2f..59b6c9bc7 100644 --- a/ParseUI/ParseUI/Internal/Extensions/PFColor.m +++ b/ParseUI/ParseUI/Internal/Extensions/PFColor.m @@ -69,20 +69,6 @@ + (UIColor *)signupButtonBackgroundColor { alpha:1.0f]; } -+ (UIColor *)facebookButtonBackgroundColor { - return [UIColor colorWithRed:58.0f/255.0f - green:89.0f/255.0f - blue:152.0f/255.0f - alpha:1.0f]; -} - -+ (UIColor *)twitterButtonBackgroundColor { - return [UIColor colorWithRed:45.0f/255.0f - green:170.0f/255.0f - blue:1.0f - alpha:1.0f]; -} - + (UIColor *)appleButtonBackgroundColor { return [UIColor blackColor]; } diff --git a/ParseUI/ParseUI/Resources/Localization/de.lproj/ParseUI.strings b/ParseUI/ParseUI/Resources/Localization/de.lproj/ParseUI.strings index 88587dcca..7f8656356 100644 --- a/ParseUI/ParseUI/Resources/Localization/de.lproj/ParseUI.strings +++ b/ParseUI/ParseUI/Resources/Localization/de.lproj/ParseUI.strings @@ -22,9 +22,6 @@ /* Error occurred during deletion */ "Error occurred during deletion" = "Fehler beim Löschen"; -/* Facebook */ -"Facebook" = "Facebook"; - /* Forgot Password? */ "Forgot Password?" = "Passwort vergessen?"; @@ -40,12 +37,6 @@ /* Log In */ "Log In" = "Einloggen"; -/* Log In with Facebook */ -"Log In with Facebook" = "Einloggen mit Facebook"; - -/* Log In with Twitter */ -"Log In with Twitter" = "Einloggen mit Twitter"; - /* Login failed alert title in PFLogInViewController */ "Login Failed" = "Anmeldung fehlgeschlagen"; @@ -103,8 +94,5 @@ /* Invalid login credentials alert message in PFLogInViewController */ "The username and password you entered don't match" = "Der Benutzername und das eingegebene Passwort stimmen nicht überein"; -/* Twitter */ -"Twitter" = "Twitter"; - /* Username */ "Username" = "Benutzername"; diff --git a/ParseUI/ParseUI/Resources/Localization/en.lproj/ParseUI.strings b/ParseUI/ParseUI/Resources/Localization/en.lproj/ParseUI.strings index 998662295..d656c63c6 100644 Binary files a/ParseUI/ParseUI/Resources/Localization/en.lproj/ParseUI.strings and b/ParseUI/ParseUI/Resources/Localization/en.lproj/ParseUI.strings differ diff --git a/ParseUI/ParseUI/Resources/Localization/fr.lproj/ParseUI.strings b/ParseUI/ParseUI/Resources/Localization/fr.lproj/ParseUI.strings index 5e1918b67..cf2015c3e 100644 Binary files a/ParseUI/ParseUI/Resources/Localization/fr.lproj/ParseUI.strings and b/ParseUI/ParseUI/Resources/Localization/fr.lproj/ParseUI.strings differ diff --git a/ParseUI/ParseUI/Resources/Localization/he.lproj/ParseUI.strings b/ParseUI/ParseUI/Resources/Localization/he.lproj/ParseUI.strings index a3e85e3aa..bea566232 100644 Binary files a/ParseUI/ParseUI/Resources/Localization/he.lproj/ParseUI.strings and b/ParseUI/ParseUI/Resources/Localization/he.lproj/ParseUI.strings differ diff --git a/ParseUI/ParseUI/Resources/Localization/pt-BR.lproj/ParseUI.strings b/ParseUI/ParseUI/Resources/Localization/pt-BR.lproj/ParseUI.strings index 9fb6f02bc..97cb0edda 100644 --- a/ParseUI/ParseUI/Resources/Localization/pt-BR.lproj/ParseUI.strings +++ b/ParseUI/ParseUI/Resources/Localization/pt-BR.lproj/ParseUI.strings @@ -22,9 +22,6 @@ /* Error occurred during deletion */ "Error occurred during deletion" = "Ocorreu um erro ao apagar"; -/* Facebook */ -"Facebook" = "Facebook"; - /* Forgot Password? */ "Forgot Password?" = "Esqueceu a senha?"; @@ -40,12 +37,6 @@ /* Log In */ "Log In" = "Inicial Sessão"; -/* Log In with Facebook */ -"Log In with Facebook" = "Iniciar Sessão com o Facebook"; - -/* Log In with Twitter */ -"Log In with Twitter" = "Iniciar Sessão com o Twitter"; - /* Login failed alert title in PFLogInViewController */ "Login Failed" = "Falha ao Entrar"; @@ -103,9 +94,6 @@ /* Invalid login credentials alert message in PFLogInViewController */ "The username and password you entered don't match" = "O nome de usuário e a senha fornecidas não batem"; -/* Twitter */ -"Twitter" = "Twitter"; - /* Username */ "Username" = "Nome de usuário"; diff --git a/ParseUI/ParseUI/Resources/Localization/sv.lproj/ParseUI.strings b/ParseUI/ParseUI/Resources/Localization/sv.lproj/ParseUI.strings index 2ab3c1b9b..ca1c83bd8 100644 Binary files a/ParseUI/ParseUI/Resources/Localization/sv.lproj/ParseUI.strings and b/ParseUI/ParseUI/Resources/Localization/sv.lproj/ParseUI.strings differ diff --git a/ParseUI/ParseUI/Source/PFLogInView.h b/ParseUI/ParseUI/Source/PFLogInView.h index f6381d113..97b1b1e82 100644 --- a/ParseUI/ParseUI/Source/PFLogInView.h +++ b/ParseUI/ParseUI/Source/PFLogInView.h @@ -40,10 +40,6 @@ typedef NS_OPTIONS(NSInteger, PFLogInFields) { PFLogInFieldsPasswordForgotten = 1 << 1, /** Login button. */ PFLogInFieldsLogInButton = 1 << 2, - /** Button to login with Facebook. */ - PFLogInFieldsFacebook = 1 << 3, - /** Button to login with Twitter. */ - PFLogInFieldsTwitter = 1 << 4, /** Signup Button. */ PFLogInFieldsSignUpButton = 1 << 5, /** Dismiss Button. */ @@ -68,8 +64,6 @@ extern NSString *const PFLogInViewPasswordFieldAccessibilityIdentifier; extern NSString *const PFLogInViewLogInButtonAccessibilityIdentifier; extern NSString *const PFLogInViewSignUpButtonAccessibilityIdentifier; extern NSString *const PFLogInViewPasswordForgottenButtonAccessibilityIdentifier; -extern NSString *const PFLogInViewTwitterButtonAccessibilityIdentifier; -extern NSString *const PFLogInViewFacebookButtonAccessibilityIdentifier; extern NSString *const PFLogInViewAppleButtonAccessibilityIdentifier; extern NSString *const PFLogInViewDismissButtonAccessibilityIdentifier; @@ -149,16 +143,6 @@ extern NSString *const PFLogInViewDismissButtonAccessibilityIdentifier; */ @property (nullable, nonatomic, strong, readonly) UIButton *logInButton; -/** - The Facebook button. It is `nil` if the element is not enabled. - */ -@property (nullable, nonatomic, strong, readonly) UIButton *facebookButton; - -/** - The Twitter button. It is `nil` if the element is not enabled. - */ -@property (nullable, nonatomic, strong, readonly) UIButton *twitterButton; - /** The Apple button. It is 'nil if the element is not enabled. */ @@ -174,20 +158,6 @@ extern NSString *const PFLogInViewDismissButtonAccessibilityIdentifier; */ @property (nullable, nonatomic, strong, readonly) UIButton *dismissButton; -/** - The facebook/twitter login label. - - @deprecated This property is deprecated and will always be nil. - */ -@property (nullable, nonatomic, strong, readonly) UILabel *externalLogInLabel __attribute__(PARSE_UI_DEPRECATED("This property is deprecated and will always be nil.")); - -/** - The sign up label. - - @deprecated This property is deprecated and will always be nil. - */ -@property (nullable, nonatomic, strong, readonly) UILabel *signUpLabel __attribute__(PARSE_UI_DEPRECATED("This property is deprecated and will always be nil.")); - @end NS_ASSUME_NONNULL_END diff --git a/ParseUI/ParseUI/Source/PFLogInView.m b/ParseUI/ParseUI/Source/PFLogInView.m index f5c1b6dbe..de3a9da81 100644 --- a/ParseUI/ParseUI/Source/PFLogInView.m +++ b/ParseUI/ParseUI/Source/PFLogInView.m @@ -32,8 +32,6 @@ #import "PFTextField.h" static NSString *const PFLogInViewDefaultLogoImageName = @"parse_logo.png"; -static NSString *const PFLogInViewDefaultFacebookButtonImageName = @"facebook_icon.png"; -static NSString *const PFLogInViewDefaultTwitterButtonImageName = @"twitter_icon.png"; static NSString *const PFLogInViewDefaultAppleButtonImageName = @"apple_icon.png"; ///-------------------------------------- @@ -45,8 +43,6 @@ NSString *const PFLogInViewLogInButtonAccessibilityIdentifier = @"PFLogInViewLogInButtonAccessibilityIdentifier"; NSString *const PFLogInViewSignUpButtonAccessibilityIdentifier = @"PFLogInViewSignUpButtonAccessibilityIdentifier"; NSString *const PFLogInViewPasswordForgottenButtonAccessibilityIdentifier = @"PFLogInViewPasswordForgottenButtonAccessibilityIdentifier"; -NSString *const PFLogInViewTwitterButtonAccessibilityIdentifier = @"PFLogInViewTwitterButtonAccessibilityIdentifier"; -NSString *const PFLogInViewFacebookButtonAccessibilityIdentifier = @"PFLogInViewFacebookButtonAccessibilityIdentifier"; NSString *const PFLogInViewAppleButtonAccessibilityIdentifier = @"PFLogInViewAppleButtonAccessibilityIdentifier"; NSString *const PFLogInViewDismissButtonAccessibilityIdentifier = @"PFLogInViewDismissButtonAccessibilityIdentifier"; @@ -66,32 +62,6 @@ + (PFActionButtonConfiguration *)_defaultSignUpButtonConfiguration { return configuration; } -+ (PFActionButtonConfiguration *)_defaultFacebookButtonConfiguration { - PFActionButtonConfiguration *configuration = [[PFActionButtonConfiguration alloc] initWithBackgroundImageColor:[PFColor facebookButtonBackgroundColor] - image:[PFImage imageNamed:PFLogInViewDefaultFacebookButtonImageName]]; - - [configuration setTitle:PFLocalizedString(@"Facebook", @"Facebook") - forButtonStyle:PFActionButtonStyleNormal]; - [configuration setTitle:PFLocalizedString(@"Log In with Facebook", @"Log In with Facebook") - - forButtonStyle:PFActionButtonStyleWide]; - - return configuration; -} - -+ (PFActionButtonConfiguration *)_defaultTwitterButtonConfiguration { - PFActionButtonConfiguration *configuration = [[PFActionButtonConfiguration alloc] initWithBackgroundImageColor:[PFColor twitterButtonBackgroundColor] - image:[PFImage imageNamed:PFLogInViewDefaultTwitterButtonImageName]]; - - [configuration setTitle:PFLocalizedString(@"Twitter", @"Twitter") - forButtonStyle:PFActionButtonStyleNormal]; - [configuration setTitle:PFLocalizedString(@"Log In with Twitter", @"Log In with Twitter") - - forButtonStyle:PFActionButtonStyleWide]; - - return configuration; -} - + (PFActionButtonConfiguration *)_defaultAppleButtonConfiguration { PFActionButtonConfiguration *configuration = [[PFActionButtonConfiguration alloc] initWithBackgroundImageColor:[PFColor appleButtonBackgroundColor] image:[PFImage imageNamed:PFLogInViewDefaultAppleButtonImageName]]; @@ -213,30 +183,6 @@ - (void)_updateAllFields { [_logInButton removeFromSuperview]; _logInButton = nil; } - - if (_fields & PFLogInFieldsFacebook) { - if (!_facebookButton) { - _facebookButton = [[PFActionButton alloc] initWithConfiguration:[[self class] _defaultFacebookButtonConfiguration] - buttonStyle:PFActionButtonStyleNormal]; - _facebookButton.accessibilityIdentifier = PFLogInViewFacebookButtonAccessibilityIdentifier; - [self addSubview:_facebookButton]; - } - } else { - [_facebookButton removeFromSuperview]; - _facebookButton = nil; - } - - if (_fields & PFLogInFieldsTwitter) { - if (!_twitterButton) { - _twitterButton = [[PFActionButton alloc] initWithConfiguration:[[self class] _defaultTwitterButtonConfiguration] - buttonStyle:PFActionButtonStyleNormal]; - _twitterButton.accessibilityIdentifier = PFLogInViewTwitterButtonAccessibilityIdentifier; - [self addSubview:_twitterButton]; - } - } else { - [_twitterButton removeFromSuperview]; - _twitterButton = nil; - } if (_fields & PFLogInFieldsApple) { if (!_appleButton) { @@ -298,40 +244,6 @@ - (void)layoutSubviews { contentRect.size.height = CGRectGetMinY(frame) - CGRectGetMinY(contentRect); socialButtonsRect = UIEdgeInsetsInsetRect(contentRect, socialButtonsRectInsets); } - - if (_facebookButton && _twitterButton) { - CGSize buttonSize = [_facebookButton sizeThatFits:socialButtonsRect.size]; - buttonSize.width = (socialButtonsRect.size.width - socialButtonsDefaultInset) / 2.0f; - - CGRect frame = PFRectMakeWithOriginSize(socialButtonsRect.origin, buttonSize); - frame.origin.y = CGRectGetMaxY(socialButtonsRect) - buttonSize.height - socialButtonsDefaultInset; - [(PFActionButton *)_facebookButton setButtonStyle:PFActionButtonStyleNormal]; - _facebookButton.frame = frame; - - frame.origin.x = CGRectGetMaxX(frame) + socialButtonsDefaultInset; - [(PFActionButton *)_twitterButton setButtonStyle:PFActionButtonStyleNormal]; - _twitterButton.frame = frame; - - contentRect.size.height = CGRectGetMinY(frame) - CGRectGetMinY(contentRect); - } else if (_facebookButton) { - CGSize buttonSize = [_facebookButton sizeThatFits:socialButtonsRect.size]; - CGRect frame = PFRectMakeWithOriginSize(socialButtonsRect.origin, buttonSize); - frame.origin.y = CGRectGetMaxY(socialButtonsRect) - buttonSize.height - socialButtonsDefaultInset; - _facebookButton.frame = frame; - - [(PFActionButton *)_facebookButton setButtonStyle:PFActionButtonStyleWide]; - - contentRect.size.height = CGRectGetMinY(frame) - CGRectGetMinY(contentRect); - } else if (_twitterButton) { - CGSize buttonSize = [_twitterButton sizeThatFits:socialButtonsRect.size]; - CGRect frame = PFRectMakeWithOriginSize(socialButtonsRect.origin, buttonSize); - frame.origin.y = CGRectGetMaxY(socialButtonsRect) - buttonSize.height - socialButtonsDefaultInset; - _twitterButton.frame = frame; - - [(PFActionButton *)_twitterButton setButtonStyle:PFActionButtonStyleWide]; - - contentRect.size.height = CGRectGetMinY(frame) - CGRectGetMinY(contentRect); - } if (_appleButton) { CGSize buttonSize = [_appleButton sizeThatFits:socialButtonsRect.size]; @@ -343,7 +255,7 @@ - (void)layoutSubviews { contentRect.size.height = CGRectGetMinY(frame) - CGRectGetMinY(contentRect); } - if (_signUpButton || _facebookButton || _twitterButton || _appleButton) { + if (_signUpButton || _appleButton) { contentRect.size.height -= socialButtonsDefaultInset; } diff --git a/ParseUI/ParseUI/Source/PFLogInViewController.h b/ParseUI/ParseUI/Source/PFLogInViewController.h index b5e8ffee7..d38ce165d 100644 --- a/ParseUI/ParseUI/Source/PFLogInViewController.h +++ b/ParseUI/ParseUI/Source/PFLogInViewController.h @@ -68,13 +68,6 @@ NS_ASSUME_NONNULL_BEGIN */ @property (nullable, nonatomic, weak) id delegate; -/** - The facebook permissions that Facebook log in requests for. - - If unspecified, the default is basic facebook permissions. - */ -@property (nullable, nonatomic, copy) NSArray *facebookPermissions; - /** The sign up controller if sign up is enabled. diff --git a/ParseUI/ParseUI/Source/PFLogInViewController.m b/ParseUI/ParseUI/Source/PFLogInViewController.m index 58b1828be..cb3cac51f 100644 --- a/ParseUI/ParseUI/Source/PFLogInViewController.m +++ b/ParseUI/ParseUI/Source/PFLogInViewController.m @@ -35,26 +35,6 @@ NSString *const PFLogInFailureNotification = @"com.parse.ui.login.failure"; NSString *const PFLogInCancelNotification = @"com.parse.ui.login.cancel"; -/** - This protocol exists so that we can weakly refer to messages to pass to PFFacebookUtils without - actually taking a dependency on the symbols. - */ -@protocol WeaklyReferencedFBUtils - -// FBSDKv3 -+ (void)logInWithPermissions:(NSArray *)permissions block:(PFUserResultBlock)block; -// FBSDKv4 -+ (void)logInInBackgroundWithReadPermissions:(NSArray *)permissions block:(PFUserResultBlock)block; -+ (void)logInInBackgroundWithPublishPermissions:(NSArray *)permissions block:(PFUserResultBlock)block; - -@end - -@protocol WeaklyReferenceTwitterUtils - -+ (void)logInWithBlock:(PFUserResultBlock)block; - -@end - @protocol WeaklyReferencedAppleUtils + (BFTask *)logInInBackground; @@ -112,8 +92,6 @@ - (void)_commonInit { self.modalPresentationStyle = UIModalPresentationFormSheet; _fields = PFLogInFieldsDefault; - _facebookPermissions = @[ @"public_profile" ]; - if ([self respondsToSelector:@selector(automaticallyAdjustsScrollViewInsets)]) { self.automaticallyAdjustsScrollViewInsets = NO; } @@ -266,12 +244,6 @@ - (void)_setupLogInViewActions { [_logInView.passwordForgottenButton removeTarget:nil action:nil forControlEvents:UIControlEventAllEvents]; [_logInView.passwordForgottenButton addTarget:self action:@selector(_forgotPasswordAction) forControlEvents:UIControlEventTouchUpInside]; - - [_logInView.facebookButton removeTarget:nil action:nil forControlEvents:UIControlEventAllEvents]; - [_logInView.facebookButton addTarget:self action:@selector(_loginWithFacebook) forControlEvents:UIControlEventTouchUpInside]; - - [_logInView.twitterButton removeTarget:nil action:nil forControlEvents:UIControlEventAllEvents]; - [_logInView.twitterButton addTarget:self action:@selector(_loginWithTwitter) forControlEvents:UIControlEventTouchUpInside]; [_logInView.appleButton removeTarget:nil action:nil forControlEvents:UIControlEventAllEvents]; [_logInView.appleButton addTarget:self action:@selector(_loginWithApple) forControlEvents:UIControlEventTouchUpInside]; @@ -366,99 +338,6 @@ -(void)_loginWithApple API_AVAILABLE(ios(13.0)){ }]; } -#pragma mark Log In With Facebook - -- (void)_loginWithFacebook { - if (self.loading) { - return; - } - - self.loading = YES; - if ([_logInView.facebookButton isKindOfClass:[PFActionButton class]]) { - [(PFActionButton *)_logInView.facebookButton setLoading:YES]; - } - - __weak typeof(self) wself = self; - PFUserResultBlock resultBlock = ^(PFUser *user, NSError *error) { - __strong typeof(wself) sself = wself; - sself.loading = NO; - if ([sself->_logInView.facebookButton isKindOfClass:[PFActionButton class]]) { - [(PFActionButton *)sself->_logInView.facebookButton setLoading:NO]; - } - - if (user) { - [sself _loginDidSucceedWithUser:user]; - } else if (error) { - [sself _loginDidFailWithError:error]; - } else { - // User cancelled login. - } - }; - - Class fbUtils = NSClassFromString(@"PFFacebookUtils"); - if ([fbUtils respondsToSelector:@selector(logInWithPermissions:block:)]) { - // Facebook SDK v3 Login - [fbUtils logInWithPermissions:_facebookPermissions block:resultBlock]; - } else if ([fbUtils respondsToSelector:@selector(logInInBackgroundWithReadPermissions:block:)]) { - // Facebook SDK v4 Login - if ([self _permissionsContainsFacebookPublishPermission:_facebookPermissions]) { - [fbUtils logInInBackgroundWithPublishPermissions:_facebookPermissions block:resultBlock]; - } else { - [fbUtils logInInBackgroundWithReadPermissions:_facebookPermissions block:resultBlock]; - } - } else { - [NSException raise:NSInternalInconsistencyException - format:@"Can't find PFFacebookUtils. Please link with ParseFacebookUtils or ParseFacebookUtilsV4 to enable login with Facebook."]; - } -} - -- (BOOL)_permissionsContainsFacebookPublishPermission:(NSArray *)permissions { - for (NSString *permission in permissions) { - if ([permission hasPrefix:@"publish"] || - [permission hasPrefix:@"manage"] || - [permission isEqualToString:@"ads_management"] || - [permission isEqualToString:@"create_event"] || - [permission isEqualToString:@"rsvp_event"]) { - return YES; - } - } - return NO; -} - -#pragma mark Log In With Twitter - -- (void)_loginWithTwitter { - if (self.loading) { - return; - } - - if ([_logInView.facebookButton isKindOfClass:[PFActionButton class]]) { - [(PFActionButton *)_logInView.twitterButton setLoading:YES]; - } - self.loading = YES; - - Class twitterUtils = NSClassFromString(@"PFTwitterUtils"); - if (twitterUtils && [twitterUtils respondsToSelector:@selector(logInWithBlock:)]) { - [twitterUtils logInWithBlock:^(PFUser *user, NSError *error) { - self.loading = NO; - if ([self->_logInView.facebookButton isKindOfClass:[PFActionButton class]]) { - [(PFActionButton *)self->_logInView.twitterButton setLoading:NO]; - } - - if (user) { - [self _loginDidSucceedWithUser:user]; - } else if (error) { - [self _loginDidFailWithError:error]; - } else { - // User cancelled login. - } - }]; - } else { - [NSException raise:NSInternalInconsistencyException - format:@"Can't find PFTwitterUtils. Please link with ParseTwitterUtils to enable login with Twitter."]; - } -} - #pragma mark Log In - (void)_loginAction { diff --git a/ParseUI/ParseUI/Source/PFResources.h b/ParseUI/ParseUI/Source/PFResources.h index df9f7a399..3adb9f110 100644 --- a/ParseUI/ParseUI/Source/PFResources.h +++ b/ParseUI/ParseUI/Source/PFResources.h @@ -1,16 +1,10 @@ // This is an auto-generated file. #import @interface PFResources : NSObject -+ (NSData *)twitter_icon3x_png;//modified:2022-11-07 15:10:28 +0300 + (NSData *)apple_icon3x_png;//modified:2022-11-07 15:10:28 +0300 -+ (NSData *)facebook_icon2x_png;//modified:2022-11-07 15:10:28 +0300 + (NSData *)parse_logo_png;//modified:2022-11-07 15:10:28 +0300 -+ (NSData *)facebook_icon3x_png;//modified:2022-11-07 15:10:28 +0300 + (NSData *)apple_icon2x_png;//modified:2022-11-07 15:10:28 +0300 -+ (NSData *)twitter_icon2x_png;//modified:2022-11-07 15:10:28 +0300 + (NSData *)parse_logo2x_png;//modified:2022-11-07 15:10:28 +0300 + (NSData *)parse_logo3x_png;//modified:2022-11-07 15:10:28 +0300 + (NSData *)apple_icon_png;//modified:2022-11-07 15:10:28 +0300 -+ (NSData *)facebook_icon_png;//modified:2022-11-07 15:10:28 +0300 -+ (NSData *)twitter_icon_png;//modified:2022-11-07 15:10:28 +0300 @end diff --git a/ParseUI/ParseUI/Source/PFResources.m b/ParseUI/ParseUI/Source/PFResources.m index dc9b1db53..67106e827 100644 --- a/ParseUI/ParseUI/Source/PFResources.m +++ b/ParseUI/ParseUI/Source/PFResources.m @@ -1,14 +1,6 @@ // This is an auto-generated file. #import "PFResources.h" @implementation PFResources - static const unsigned char twitter_icon3x_png[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0x42, 0x0, 0x0, 0x0, 0x36, 0x8, 0x6, 0x0, 0x0, 0x0, 0x73, 0xe7, 0x4f, 0x3f, 0x0, 0x0, 0x0, 0x1, 0x73, 0x52, 0x47, 0x42, 0x0, 0xae, 0xce, 0x1c, 0xe9, 0x0, 0x0, 0x0, 0x9, 0x70, 0x48, 0x59, 0x73, 0x0, 0x0, 0x2e, 0x23, 0x0, 0x0, 0x2e, 0x23, 0x1, 0x78, 0xa5, 0x3f, 0x76, 0x0, 0x0, 0x1, 0xcb, 0x69, 0x54, 0x58, 0x74, 0x58, 0x4d, 0x4c, 0x3a, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x78, 0x6d, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x3d, 0x22, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x3a, 0x6e, 0x73, 0x3a, 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x22, 0x20, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x74, 0x6b, 0x3d, 0x22, 0x58, 0x4d, 0x50, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x35, 0x2e, 0x34, 0x2e, 0x30, 0x22, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x72, 0x64, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x31, 0x39, 0x39, 0x39, 0x2f, 0x30, 0x32, 0x2f, 0x32, 0x32, 0x2d, 0x72, 0x64, 0x66, 0x2d, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2d, 0x6e, 0x73, 0x23, 0x22, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x64, 0x66, 0x3a, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x3d, 0x22, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x74, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x69, 0x66, 0x66, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x22, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x78, 0x6d, 0x70, 0x3a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x6f, 0x6c, 0x3e, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x61, 0x64, 0x79, 0x3c, 0x2f, 0x78, 0x6d, 0x70, 0x3a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x6f, 0x6c, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x66, 0x66, 0x3a, 0x4f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x31, 0x3c, 0x2f, 0x74, 0x69, 0x66, 0x66, 0x3a, 0x4f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x3e, 0xa, 0x3c, 0x2f, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x3e, 0xa, 0x29, 0x2e, 0xcd, 0x3d, 0x0, 0x0, 0xb, 0x9, 0x49, 0x44, 0x41, 0x54, 0x68, 0x5, 0xd5, 0x9a, 0x7b, 0xa8, 0xe5, 0x55, 0x15, 0xc7, 0xe7, 0xce, 0x1d, 0xc7, 0xd1, 0x44, 0xcd, 0xde, 0x33, 0x15, 0xa9, 0x94, 0x56, 0x14, 0x64, 0x30, 0x44, 0xa1, 0x5d, 0x1a, 0x2c, 0x6d, 0xe8, 0x61, 0x94, 0x45, 0x30, 0x4a, 0x49, 0x52, 0x50, 0x4a, 0x18, 0x18, 0x64, 0xd0, 0x3, 0x26, 0x8, 0x89, 0xe8, 0x41, 0xfd, 0xa3, 0x21, 0x15, 0xa5, 0xff, 0x68, 0x62, 0x89, 0x77, 0xd4, 0x92, 0xc9, 0xc7, 0x58, 0x8, 0x9a, 0x64, 0xce, 0x4c, 0x83, 0x36, 0x39, 0x5a, 0x96, 0x8f, 0xd1, 0xd2, 0x79, 0xdc, 0xb9, 0x7d, 0x3e, 0xfb, 0xec, 0xf5, 0x73, 0xff, 0x7e, 0xe7, 0xf7, 0x3b, 0xf7, 0x9e, 0x39, 0xe7, 0xdc, 0x99, 0x16, 0x7c, 0xcf, 0x5a, 0x7b, 0xed, 0xb5, 0xd7, 0xde, 0x7b, 0xed, 0xb5, 0xf7, 0x6f, 0x9f, 0x73, 0x7e, 0x53, 0xcb, 0x1a, 0x34, 0x3f, 0x3f, 0x3f, 0x8d, 0x6a, 0x7e, 0x6a, 0x6a, 0xea, 0x40, 0xa3, 0x6a, 0x49, 0x8a, 0xf4, 0xbf, 0xdc, 0x8e, 0xa2, 0x7f, 0xca, 0xab, 0x29, 0xce, 0x80, 0x33, 0xc0, 0xa9, 0xe0, 0x64, 0xf0, 0x6a, 0xb0, 0x1b, 0x6c, 0x7, 0x3b, 0xc0, 0xdd, 0xe0, 0x16, 0xda, 0xdc, 0x3, 0x4f, 0x44, 0xbb, 0x15, 0x94, 0xf7, 0x17, 0xe5, 0x29, 0x64, 0xe7, 0xa6, 0xef, 0x52, 0x7f, 0x24, 0xe5, 0x3d, 0x61, 0xb7, 0x8c, 0x86, 0x1a, 0x56, 0x44, 0x39, 0x35, 0xaa, 0x14, 0x4b, 0x20, 0x94, 0x7d, 0x22, 0xbf, 0x1c, 0x5c, 0x6, 0xb6, 0x82, 0x1a, 0x1d, 0x80, 0x6a, 0x8a, 0x5e, 0xe1, 0x19, 0xd8, 0x2f, 0xc0, 0xbb, 0x62, 0xa8, 0xc8, 0x2b, 0xc1, 0x11, 0x22, 0x74, 0xc1, 0xd1, 0xad, 0x5, 0x5f, 0x7, 0x6b, 0x42, 0x67, 0x10, 0xd2, 0x2a, 0xc0, 0xa7, 0xc1, 0x9b, 0xc0, 0x31, 0x56, 0xc2, 0xfb, 0x1c, 0x54, 0x8d, 0xc6, 0x2c, 0xd8, 0x77, 0xb8, 0x44, 0x7e, 0x1f, 0xb8, 0x17, 0x24, 0xca, 0xf3, 0xde, 0x47, 0x61, 0x2f, 0xd8, 0xf, 0xc, 0xc4, 0x1c, 0x28, 0x75, 0x14, 0x13, 0x3d, 0xc7, 0xa7, 0x13, 0x5c, 0x15, 0xfe, 0x82, 0xab, 0x3, 0xa7, 0x83, 0xef, 0x2, 0xdb, 0x5f, 0x13, 0x75, 0x89, 0xa3, 0x48, 0x13, 0x86, 0xaf, 0x1, 0xf7, 0x81, 0x8d, 0x61, 0x80, 0xbc, 0x22, 0xe4, 0x49, 0x71, 0xfa, 0x48, 0xb, 0xa1, 0x7f, 0xe4, 0xb, 0xc1, 0x1e, 0x20, 0xc5, 0x44, 0x1d, 0xb4, 0x93, 0x6f, 0x45, 0xce, 0x10, 0x6d, 0x9f, 0x7, 0x41, 0xd7, 0x20, 0xbc, 0x12, 0x1c, 0xb, 0xce, 0x0, 0x97, 0x80, 0x9b, 0xc0, 0x6e, 0x20, 0x19, 0xd4, 0x37, 0xe7, 0x3e, 0xa7, 0xd3, 0x96, 0x40, 0x91, 0xb6, 0x5, 0x7c, 0x3, 0x8, 0xba, 0x20, 0x26, 0x8e, 0x62, 0x62, 0xc1, 0xc0, 0xf7, 0x94, 0xc8, 0x3, 0xba, 0x20, 0x3a, 0x87, 0xbb, 0xb2, 0x73, 0x39, 0x1b, 0x5a, 0x3, 0x40, 0x7d, 0x4d, 0x9f, 0x6d, 0x23, 0x88, 0xba, 0xba, 0x7, 0x6c, 0x6, 0xcf, 0x5a, 0x68, 0xd0, 0xa5, 0xb9, 0x4f, 0xb7, 0x4e, 0xa, 0x44, 0x35, 0x49, 0x14, 0xee, 0xb1, 0x20, 0x23, 0x76, 0xde, 0xa4, 0x83, 0x41, 0x1f, 0xa9, 0x7f, 0xf8, 0xbb, 0x41, 0xc, 0xf8, 0xf9, 0x61, 0x2, 0x40, 0xbb, 0x32, 0x20, 0x14, 0xd3, 0xf6, 0x71, 0xb, 0x95, 0xe4, 0x7c, 0xc, 0xae, 0x74, 0x3d, 0x38, 0x3a, 0xe6, 0x96, 0x38, 0x8a, 0x18, 0x88, 0x69, 0xf4, 0x0, 0x90, 0xfe, 0xd3, 0x63, 0x29, 0x7d, 0x2e, 0x8c, 0x6, 0xe8, 0xc6, 0x7a, 0x66, 0xe0, 0x2f, 0xfa, 0x3e, 0x6, 0xf9, 0x8e, 0xdc, 0xa7, 0x2b, 0x5a, 0x4e, 0x6c, 0x68, 0xb9, 0x8, 0xa2, 0xbe, 0xdc, 0x2e, 0xe5, 0x96, 0xf9, 0x15, 0xe5, 0xf2, 0x3c, 0x7a, 0xb, 0xe5, 0xf5, 0x6e, 0x8d, 0xa4, 0x84, 0x9f, 0x6, 0x9e, 0x6, 0x92, 0xd1, 0x2c, 0x53, 0xec, 0xb2, 0x32, 0x18, 0xd4, 0xd5, 0x9e, 0x30, 0x51, 0x37, 0x2c, 0xc7, 0x4f, 0xf4, 0x7d, 0x11, 0x72, 0x90, 0x7b, 0x5d, 0x1a, 0x3a, 0x0, 0x2d, 0x6d, 0xc2, 0x8f, 0xdc, 0x6c, 0xf8, 0x11, 0x58, 0xd, 0x5e, 0x7, 0xce, 0x7, 0xee, 0x80, 0xad, 0xe0, 0x23, 0x6, 0x22, 0x9e, 0x18, 0xeb, 0x90, 0x3d, 0x94, 0xa4, 0x48, 0xab, 0x2a, 0x18, 0x73, 0x73, 0x73, 0x3f, 0x41, 0x7f, 0x9c, 0x93, 0x85, 0x2f, 0x7, 0x55, 0x54, 0x87, 0xd, 0x40, 0xf6, 0x11, 0xd9, 0xe0, 0x61, 0x76, 0x27, 0x90, 0xa2, 0xbf, 0x71, 0x4, 0x21, 0x7c, 0xc4, 0x9c, 0x1e, 0xc6, 0xff, 0xcf, 0xc0, 0x2c, 0x78, 0x14, 0x4, 0xf5, 0x1e, 0xc, 0x94, 0x22, 0x10, 0x67, 0x45, 0xd, 0x3c, 0x1e, 0x51, 0xaa, 0xf6, 0x16, 0xfa, 0x2d, 0xc8, 0xef, 0x8c, 0x89, 0x23, 0xaf, 0x0, 0x6, 0x65, 0xe8, 0xc, 0xa1, 0xcd, 0xca, 0x1c, 0x90, 0xb3, 0x91, 0x63, 0xef, 0x46, 0x5f, 0x31, 0x89, 0x81, 0xbc, 0xd8, 0x2, 0x3, 0xed, 0xf0, 0x6f, 0x7d, 0x2c, 0x2e, 0x62, 0x45, 0xdf, 0x8f, 0xb9, 0x18, 0x84, 0x98, 0xc4, 0x73, 0xc8, 0xfb, 0xa2, 0x22, 0xf3, 0x79, 0xb8, 0xe7, 0x82, 0x37, 0x31, 0x6f, 0x9a, 0x6b, 0xc1, 0x8d, 0xb8, 0xf9, 0xa, 0x58, 0xe5, 0xd, 0xd, 0xa8, 0x37, 0x18, 0x8b, 0xe, 0x8, 0xb6, 0xf6, 0x19, 0xb7, 0x3b, 0x7d, 0xfa, 0xcc, 0xb7, 0x2f, 0xb3, 0x4c, 0x5e, 0xa3, 0x6c, 0x5f, 0xd3, 0x75, 0x15, 0x6, 0xd8, 0xea, 0x7b, 0x2e, 0xc3, 0xe6, 0x57, 0x80, 0x8b, 0x15, 0x68, 0xb3, 0xa2, 0xf7, 0xd1, 0x2b, 0x78, 0x91, 0x7a, 0x1c, 0x48, 0xee, 0xd3, 0x32, 0xca, 0xea, 0x8c, 0x68, 0xec, 0x5f, 0xcb, 0xb7, 0x83, 0xf7, 0xeb, 0x28, 0x88, 0x72, 0xda, 0x32, 0xf2, 0xd0, 0xb5, 0x71, 0xea, 0xab, 0x6d, 0x85, 0xfc, 0x73, 0x20, 0x99, 0xd, 0x65, 0x9f, 0x63, 0x93, 0x73, 0xe6, 0x94, 0x63, 0xff, 0x31, 0x7d, 0xc5, 0xd6, 0x4c, 0xbc, 0xc, 0xc4, 0xf1, 0x54, 0xfe, 0x1, 0x48, 0xee, 0xd5, 0xda, 0x40, 0x8a, 0x34, 0x2c, 0x1d, 0xba, 0xff, 0xae, 0x6, 0xd5, 0xb5, 0x36, 0x26, 0x8e, 0xce, 0x5b, 0xaa, 0x5b, 0x47, 0x1e, 0x59, 0x97, 0xaa, 0xd5, 0x2b, 0xc0, 0x8f, 0x2, 0x9b, 0x80, 0x34, 0x89, 0xf3, 0x21, 0xe6, 0x10, 0xe7, 0x84, 0xc1, 0xfe, 0x6a, 0x31, 0xc6, 0x5e, 0x10, 0x50, 0xb8, 0x72, 0x29, 0x15, 0x49, 0xf1, 0xa7, 0x90, 0xef, 0xca, 0x46, 0xb5, 0x81, 0xab, 0xa3, 0x3e, 0x52, 0x36, 0x52, 0xcc, 0xd4, 0xb6, 0xfd, 0xb9, 0xe0, 0x16, 0x3a, 0xf0, 0x26, 0xb7, 0x1e, 0xbc, 0x88, 0xb2, 0xf6, 0x73, 0xc0, 0xad, 0x63, 0x3a, 0x7a, 0x69, 0x32, 0x28, 0xbd, 0xcb, 0x4b, 0xfe, 0xf2, 0x83, 0xde, 0x73, 0xa2, 0xef, 0x2a, 0x8c, 0x6e, 0x9c, 0xe4, 0xb8, 0x23, 0x43, 0xbf, 0xcc, 0x78, 0xbe, 0xa9, 0x73, 0xc7, 0xe3, 0xf8, 0xa2, 0xa3, 0xe5, 0xe, 0x14, 0x65, 0xa4, 0xea, 0x6f, 0x72, 0x85, 0xe7, 0x82, 0x7b, 0xbf, 0x95, 0xb4, 0xcf, 0x6d, 0x62, 0xcf, 0x1d, 0x89, 0xe1, 0xc7, 0xc0, 0xd, 0xe0, 0x66, 0xea, 0x2e, 0x5, 0x6f, 0x7, 0x47, 0xe9, 0x80, 0x3e, 0xe, 0xd8, 0x29, 0xd8, 0x67, 0x7f, 0xa8, 0xe2, 0x2c, 0xb2, 0xf, 0xcb, 0x93, 0xa4, 0x58, 0x40, 0xfb, 0x78, 0xc0, 0xf, 0xc6, 0x75, 0x84, 0xe3, 0x51, 0xe, 0x8a, 0xd4, 0x88, 0xc, 0xb8, 0x95, 0x8a, 0x59, 0xf0, 0x5e, 0xa0, 0xa1, 0x13, 0x2c, 0x1d, 0x51, 0xac, 0x65, 0x87, 0x67, 0x42, 0x5a, 0xfd, 0x6c, 0xa7, 0xbf, 0x77, 0x64, 0x3c, 0xb, 0xff, 0x23, 0xf5, 0xbf, 0x97, 0x83, 0x7, 0xc1, 0x2e, 0x6, 0xb0, 0x1b, 0xa4, 0x20, 0xc3, 0xfd, 0xc6, 0xf8, 0x77, 0xf4, 0x92, 0x63, 0xe8, 0xeb, 0x2b, 0xd5, 0x8c, 0xef, 0x23, 0x7d, 0x99, 0xc4, 0x5d, 0x5f, 0xf0, 0x53, 0x20, 0x8c, 0x4e, 0x8e, 0x92, 0xfb, 0xf4, 0x3b, 0x18, 0xae, 0x3, 0x6, 0x61, 0x2f, 0x30, 0x7d, 0x3b, 0x7, 0x48, 0x5b, 0xaa, 0xab, 0xd4, 0x73, 0x82, 0x42, 0xa5, 0x9d, 0xce, 0x64, 0xc0, 0x96, 0x3d, 0x6, 0x76, 0xe0, 0x7f, 0x7, 0x7c, 0x27, 0x78, 0x34, 0xe3, 0x78, 0xb8, 0x14, 0x59, 0x99, 0xa, 0xd8, 0xe1, 0xba, 0xb7, 0x1d, 0x4b, 0x39, 0x55, 0xe6, 0x8f, 0x36, 0x7d, 0xa9, 0xcb, 0x72, 0xd9, 0xc4, 0xf9, 0x48, 0xb1, 0xf0, 0xbd, 0x52, 0x9b, 0xc2, 0x1a, 0x1c, 0x5c, 0xe, 0xbb, 0x44, 0x11, 0x98, 0x19, 0x6e, 0x95, 0xce, 0x60, 0x50, 0xd7, 0x24, 0x6d, 0x45, 0x4, 0x25, 0x5, 0xbc, 0x69, 0x94, 0xcb, 0x74, 0x97, 0xb2, 0xaa, 0xa3, 0x7a, 0x24, 0xb5, 0x13, 0x76, 0xf5, 0xd, 0xb2, 0xf3, 0x58, 0x4f, 0x70, 0x67, 0xe9, 0xaf, 0x76, 0x3e, 0xa0, 0xaf, 0x56, 0xd2, 0xc9, 0x9b, 0x1, 0x89, 0x30, 0xfe, 0x12, 0x82, 0xdf, 0xd5, 0x75, 0x64, 0x10, 0x3c, 0x47, 0xfa, 0xa2, 0x88, 0xbe, 0x8b, 0xb4, 0xf5, 0x80, 0x32, 0x0, 0xe, 0xc2, 0x80, 0x78, 0x2e, 0xb8, 0x22, 0xc2, 0x41, 0xa9, 0x93, 0x5c, 0xf9, 0x9e, 0x54, 0x7c, 0x96, 0xfd, 0x95, 0x72, 0x61, 0xe2, 0x98, 0xfb, 0x1a, 0x96, 0x3a, 0x64, 0xcd, 0x63, 0x1, 0xbd, 0x27, 0x3d, 0x53, 0xb6, 0x2f, 0xe5, 0x38, 0x4d, 0xd5, 0x9d, 0x49, 0xc3, 0x2b, 0xc0, 0xba, 0x6c, 0xf0, 0x49, 0xf8, 0xf, 0x80, 0x13, 0x98, 0x66, 0xb0, 0x31, 0xf0, 0x5c, 0x3d, 0x14, 0xf3, 0xa9, 0x61, 0x40, 0xdd, 0x66, 0xf2, 0xd8, 0x6, 0xfa, 0x6c, 0xf5, 0x4b, 0x7f, 0x31, 0x1, 0x23, 0x55, 0xc9, 0xd8, 0x57, 0xd4, 0xa6, 0x2f, 0x75, 0xc8, 0xda, 0x46, 0x5b, 0x7f, 0xda, 0x7b, 0x32, 0x37, 0xee, 0xb, 0x60, 0xba, 0x22, 0xd3, 0xc0, 0xc1, 0xb8, 0xa7, 0x3f, 0xd, 0xce, 0x65, 0xd0, 0xf7, 0xc2, 0x37, 0x83, 0x47, 0xc0, 0x76, 0xf0, 0x46, 0x30, 0x12, 0x95, 0x3, 0xcc, 0x8e, 0xd2, 0xef, 0x10, 0x2d, 0xfa, 0x91, 0xfa, 0x69, 0x69, 0x1c, 0x81, 0x78, 0x9c, 0xba, 0x27, 0x5a, 0xea, 0x93, 0xca, 0xd4, 0x8d, 0xe8, 0xfc, 0x15, 0xd9, 0x93, 0xde, 0x80, 0x78, 0x41, 0x12, 0x92, 0x29, 0x45, 0x6c, 0xe6, 0x7d, 0xd4, 0x86, 0xd3, 0x94, 0x96, 0x51, 0xa6, 0xe, 0xf1, 0x85, 0x83, 0xcd, 0x46, 0x51, 0x56, 0xee, 0xa2, 0x41, 0x36, 0x4d, 0x9f, 0x6d, 0xb6, 0xa5, 0x4d, 0x57, 0x1f, 0x85, 0x7e, 0x27, 0x72, 0x64, 0x44, 0x35, 0x8f, 0xa8, 0x77, 0x6b, 0x44, 0x20, 0x34, 0x14, 0xd2, 0x7f, 0x41, 0x3c, 0x62, 0xe2, 0x2e, 0x50, 0x6b, 0x5c, 0xe, 0xac, 0x29, 0x97, 0xe5, 0xe4, 0xed, 0x20, 0x3e, 0x4a, 0x1f, 0xa5, 0x5c, 0xba, 0xea, 0xd2, 0x17, 0x36, 0x8e, 0x39, 0xb6, 0xff, 0x36, 0xec, 0xdd, 0xe6, 0x52, 0xdf, 0x76, 0xd4, 0x28, 0x4d, 0x10, 0x23, 0x1f, 0x6f, 0x77, 0x6a, 0x5, 0xb9, 0x8f, 0xad, 0xf3, 0x50, 0x8b, 0x80, 0x20, 0xfe, 0xdf, 0x91, 0x13, 0x8e, 0x27, 0xd6, 0x9f, 0x1d, 0xbd, 0x99, 0x2d, 0x53, 0x2e, 0x49, 0xa5, 0xf7, 0x71, 0xb9, 0x74, 0x7d, 0x8f, 0xa5, 0x40, 0x84, 0x93, 0xa8, 0xcb, 0x55, 0x3d, 0x66, 0x5a, 0x86, 0x62, 0x31, 0x72, 0xd8, 0x6, 0xb7, 0x4d, 0xd9, 0xae, 0xd4, 0x2b, 0x97, 0x75, 0xa5, 0x1c, 0x76, 0x4d, 0x9b, 0x52, 0x9f, 0x65, 0xc7, 0x17, 0x2b, 0xef, 0x96, 0xb8, 0x3f, 0xeb, 0x3d, 0xf8, 0xfb, 0x3, 0x91, 0x95, 0x31, 0xd9, 0x59, 0x8c, 0x6f, 0xce, 0xd, 0x22, 0x8d, 0x72, 0xb1, 0xce, 0x4a, 0x67, 0x8b, 0x91, 0xeb, 0xad, 0x7b, 0x67, 0x48, 0xd9, 0x2e, 0xea, 0x43, 0x17, 0x5c, 0x7d, 0x29, 0x87, 0xdd, 0x20, 0x7d, 0x61, 0x13, 0x81, 0xf8, 0xb, 0xba, 0xad, 0x85, 0xbe, 0x4f, 0x4c, 0x1, 0xa0, 0x23, 0x6f, 0x96, 0x46, 0xca, 0x83, 0xd1, 0xcb, 0x94, 0x5b, 0xc2, 0x2f, 0x43, 0x3e, 0xf3, 0xab, 0x95, 0x47, 0xee, 0xa3, 0xae, 0xd5, 0xea, 0x33, 0x5c, 0x7a, 0x85, 0xab, 0x3e, 0x9d, 0xbb, 0xdd, 0xc2, 0xdc, 0xe2, 0xa0, 0x6c, 0xdd, 0xea, 0x91, 0x9, 0xda, 0xc7, 0x59, 0x71, 0x13, 0xf2, 0xc6, 0xec, 0xc0, 0xe7, 0x7e, 0x4, 0xa3, 0x35, 0x20, 0x5d, 0xab, 0x95, 0xdb, 0x1f, 0x2a, 0xe6, 0x58, 0x9d, 0xb0, 0xe7, 0x83, 0xfc, 0x36, 0xe0, 0x76, 0xf3, 0xcb, 0x56, 0x64, 0x89, 0xaa, 0x8a, 0xaa, 0x40, 0x68, 0x80, 0x61, 0x1c, 0x2c, 0xdf, 0xc0, 0xe2, 0xca, 0x6c, 0x65, 0x30, 0xfc, 0x6f, 0x50, 0x7, 0x76, 0xd0, 0x1a, 0x10, 0xf4, 0x87, 0x1b, 0xc5, 0xca, 0xdf, 0xc7, 0xc0, 0xee, 0x58, 0x68, 0x70, 0x55, 0x20, 0x34, 0x24, 0x18, 0x6e, 0x11, 0xef, 0xe1, 0x3a, 0xf9, 0x2c, 0xf8, 0xa1, 0x7a, 0x28, 0xae, 0xdf, 0x6, 0x64, 0xe0, 0xd9, 0x91, 0xac, 0xf, 0xfd, 0x87, 0x8b, 0xe6, 0x93, 0x4f, 0x9a, 0x65, 0x3e, 0xff, 0xec, 0x89, 0x69, 0xcb, 0x67, 0xb1, 0xce, 0x6a, 0x81, 0xb0, 0xaa, 0x8, 0x86, 0xbf, 0x1d, 0x7c, 0x1e, 0xd5, 0x45, 0x60, 0x17, 0xd0, 0xd6, 0x80, 0xd8, 0x41, 0x67, 0x56, 0x94, 0x67, 0x46, 0x29, 0xd3, 0xa6, 0x46, 0xd6, 0xb5, 0xd5, 0x87, 0x2e, 0xb8, 0x8d, 0x4a, 0xb9, 0x74, 0xd2, 0xa1, 0x77, 0x6c, 0x9e, 0x71, 0x8e, 0xd7, 0x73, 0xe1, 0x3a, 0xa0, 0x8f, 0x95, 0xcc, 0xa7, 0xef, 0x69, 0x61, 0x9d, 0x34, 0x68, 0x42, 0xee, 0xa7, 0xb4, 0xfa, 0x38, 0x79, 0x29, 0xb6, 0x9f, 0x1, 0xeb, 0xc1, 0x29, 0xe0, 0xc5, 0xa0, 0x2f, 0x88, 0xe8, 0xe, 0x17, 0x8a, 0xf3, 0xe1, 0x6a, 0xe6, 0xf0, 0x9, 0x7, 0xc5, 0x1c, 0xbc, 0x19, 0xb7, 0x9e, 0xf, 0xd6, 0x77, 0x6, 0x22, 0x37, 0xf6, 0x3b, 0x86, 0x93, 0xde, 0x9e, 0x6d, 0xd7, 0xc2, 0x75, 0xfc, 0x41, 0xe0, 0x55, 0x3c, 0xce, 0xd, 0xc4, 0xc3, 0x82, 0x9c, 0x8f, 0x8b, 0x67, 0xd6, 0xba, 0x8d, 0xcf, 0x61, 0xf2, 0xfe, 0xea, 0x5e, 0x2d, 0x2a, 0xba, 0x56, 0x8a, 0xc3, 0xb1, 0x56, 0x49, 0xc3, 0xf8, 0xbe, 0xee, 0xc4, 0xfd, 0xa1, 0x46, 0xa7, 0x5e, 0xbb, 0x25, 0x3, 0xe0, 0xa3, 0x55, 0x1a, 0x18, 0xc8, 0x9e, 0xc9, 0xd2, 0x7d, 0x32, 0xee, 0xf4, 0xa5, 0x27, 0xf7, 0x78, 0xa3, 0x41, 0xc8, 0x72, 0x1c, 0x9c, 0x9d, 0x83, 0x69, 0xd, 0x44, 0x61, 0xbd, 0x9, 0xf9, 0x69, 0x70, 0x62, 0xa1, 0xb, 0xb1, 0x75, 0xbf, 0xe5, 0xb1, 0xb4, 0xd6, 0x45, 0xc3, 0x9, 0x71, 0xe6, 0x9d, 0xb6, 0xb2, 0xd9, 0xe0, 0x7d, 0xe8, 0x7b, 0xf6, 0xc3, 0x78, 0x16, 0xcc, 0x6, 0xed, 0x5a, 0xf7, 0x39, 0xe, 0xe3, 0xe9, 0xe1, 0x21, 0xb9, 0x51, 0x43, 0xc8, 0xa8, 0x9a, 0x15, 0xd6, 0x75, 0x4e, 0x94, 0xb6, 0x9d, 0x75, 0x3a, 0x99, 0x4, 0x19, 0x7c, 0xfc, 0xba, 0x4d, 0xe3, 0x2, 0xf5, 0x53, 0xc6, 0xf1, 0xdb, 0xdc, 0x97, 0x7, 0xe7, 0x82, 0xd4, 0x99, 0xda, 0x38, 0xf7, 0xa6, 0x19, 0xbf, 0x4c, 0x5d, 0x8b, 0xa7, 0xf, 0x81, 0x48, 0x31, 0x3b, 0x5c, 0xf2, 0x9, 0x2f, 0x30, 0x1b, 0x27, 0x6c, 0x36, 0x3c, 0x4, 0x66, 0x18, 0xfb, 0xc3, 0xcc, 0x21, 0xb6, 0x38, 0xaa, 0xc1, 0xd4, 0x9a, 0x11, 0x36, 0xc9, 0x41, 0xd0, 0x91, 0x13, 0xfe, 0x2, 0xf8, 0x13, 0x30, 0x0, 0x46, 0x3e, 0x45, 0x39, 0xaf, 0x4, 0xc5, 0x43, 0x4a, 0x2e, 0xa6, 0xb, 0x64, 0x10, 0xa4, 0xaf, 0xe5, 0x20, 0xb8, 0x90, 0x8b, 0xca, 0x6, 0x1b, 0x75, 0x6, 0xc2, 0x4a, 0x1d, 0xe5, 0xa8, 0xee, 0xa4, 0xf8, 0x71, 0x60, 0x30, 0xec, 0x30, 0x5d, 0x5d, 0xa9, 0x77, 0x0, 0x91, 0x19, 0x9d, 0xd9, 0x85, 0xcd, 0x24, 0xa9, 0x7c, 0x72, 0x5d, 0xc9, 0x98, 0xae, 0xca, 0x9d, 0xc5, 0xb8, 0xc6, 0xd3, 0xb7, 0xab, 0xe, 0xd2, 0xde, 0x83, 0xbf, 0x6, 0x5c, 0xb, 0x4a, 0x72, 0xfb, 0xf8, 0x37, 0xa0, 0x7f, 0xa7, 0x19, 0xb8, 0xf8, 0x9b, 0x6d, 0xa9, 0xb8, 0xfd, 0x4a, 0xfe, 0x87, 0xf2, 0x12, 0x67, 0xd, 0x5f, 0xe8, 0x21, 0x70, 0x70, 0xc1, 0xc1, 0x71, 0x19, 0xc, 0xff, 0xd4, 0xf1, 0x85, 0xaf, 0xfb, 0x41, 0x1b, 0x2d, 0x55, 0x0, 0xec, 0x27, 0xfe, 0x2f, 0xfd, 0x7, 0xf2, 0x69, 0xa3, 0x4, 0x61, 0xa8, 0x74, 0xa6, 0xb3, 0x74, 0x80, 0xe6, 0xe, 0xbd, 0x68, 0x7d, 0x20, 0xe3, 0x6d, 0x70, 0xef, 0x17, 0x2b, 0xc1, 0x71, 0xc0, 0x2d, 0x57, 0x4b, 0x4d, 0xda, 0x92, 0xb5, 0x2f, 0x3c, 0x51, 0x2c, 0x63, 0xe3, 0xf6, 0x1b, 0x68, 0xa7, 0x4d, 0x7, 0x79, 0x71, 0xb2, 0x3f, 0xef, 0x38, 0x1f, 0xc5, 0xcf, 0xd, 0xf8, 0x4c, 0xfd, 0x36, 0x7d, 0x76, 0xb4, 0x1f, 0x4d, 0x6d, 0x67, 0x31, 0x89, 0xf0, 0x44, 0xd9, 0x3f, 0x77, 0x7d, 0x17, 0xe9, 0x97, 0x20, 0xc8, 0x2d, 0x33, 0xd6, 0xec, 0x28, 0xfe, 0x91, 0x8f, 0x4c, 0xd0, 0xff, 0x86, 0x62, 0x1c, 0x3, 0xcf, 0xbc, 0xb0, 0x1b, 0xb, 0xa7, 0x63, 0x3, 0xe1, 0x1b, 0xad, 0xd5, 0x3e, 0x44, 0x7e, 0x15, 0xf0, 0x25, 0xce, 0x78, 0x2b, 0xae, 0x2f, 0x8, 0xc5, 0x24, 0x52, 0x70, 0x2c, 0x37, 0x75, 0xb4, 0x1f, 0x14, 0x38, 0xaa, 0xd3, 0xab, 0x4d, 0xf1, 0x62, 0x98, 0xe7, 0xd1, 0xa7, 0x62, 0x52, 0xc8, 0xe9, 0x1c, 0x8b, 0xf2, 0xd8, 0x39, 0x1d, 0xa4, 0xf3, 0x1, 0xee, 0xaa, 0xc7, 0x23, 0x2a, 0xf5, 0x43, 0xf9, 0x4, 0xe0, 0x8b, 0x60, 0x7f, 0x3, 0x41, 0xfb, 0x87, 0x9c, 0xe0, 0xa0, 0xc9, 0x47, 0x9d, 0xbe, 0x9d, 0x78, 0x1c, 0x8c, 0xbe, 0xf4, 0xe6, 0x53, 0x2c, 0xc6, 0x31, 0x7a, 0x10, 0x70, 0x18, 0x2b, 0x9c, 0x26, 0x4a, 0x59, 0xee, 0x8a, 0xb, 0xe5, 0xbe, 0x74, 0x43, 0xf7, 0x5a, 0xf0, 0x39, 0xb0, 0x5, 0x4, 0xf9, 0xe4, 0x18, 0x6b, 0x10, 0x72, 0x40, 0xf5, 0xbf, 0xa7, 0x90, 0xb7, 0x51, 0x7e, 0xcf, 0x58, 0x83, 0x80, 0xb3, 0x45, 0x1f, 0x96, 0x74, 0xbe, 0x6, 0x7b, 0xf, 0xc5, 0x75, 0xe0, 0x2c, 0x70, 0x2a, 0x90, 0x3c, 0xec, 0xe2, 0x1b, 0x5f, 0x52, 0x8c, 0xe9, 0xc3, 0xb1, 0x79, 0x4f, 0xf1, 0x52, 0x14, 0x3f, 0xc, 0xfd, 0x1a, 0xf9, 0x8b, 0x1c, 0x86, 0x6, 0x23, 0x2d, 0x10, 0xb2, 0xf7, 0x88, 0x91, 0xc9, 0xb4, 0x7f, 0x3d, 0x5e, 0x7c, 0xfe, 0x3e, 0x6, 0xfc, 0x2e, 0xe1, 0x1f, 0x3a, 0x3e, 0x1, 0x7c, 0x2a, 0xac, 0x6, 0x27, 0x3, 0xdf, 0x59, 0x7e, 0x2b, 0x70, 0xf2, 0xe5, 0xf6, 0xf0, 0xf7, 0x4c, 0xcf, 0xa, 0x7, 0x55, 0x3b, 0xfd, 0x29, 0x1f, 0x14, 0x31, 0x1e, 0xe6, 0x96, 0x26, 0x67, 0x70, 0x23, 0x0, 0xbb, 0x91, 0xbf, 0xd, 0x2e, 0xa7, 0xce, 0x83, 0x32, 0x2e, 0x74, 0x63, 0xe9, 0xd3, 0x81, 0xea, 0xd0, 0xce, 0xce, 0x3, 0x67, 0x83, 0x55, 0xc0, 0x4e, 0xd5, 0xfb, 0xde, 0x82, 0x68, 0x6e, 0xd, 0x57, 0xc8, 0x55, 0xd0, 0xc6, 0xc7, 0x97, 0x83, 0x19, 0xd7, 0x80, 0x7c, 0xb3, 0x26, 0xae, 0xcb, 0x11, 0x4, 0xb3, 0xe0, 0x5b, 0xe8, 0x6f, 0x87, 0x2f, 0xfa, 0xdb, 0xa4, 0xb6, 0x43, 0x13, 0x11, 0x7e, 0x5, 0xb8, 0x18, 0x3c, 0x8, 0x9a, 0xe4, 0x21, 0xe5, 0x2a, 0x78, 0x5a, 0x7b, 0x58, 0x79, 0x80, 0x55, 0x27, 0xfe, 0x28, 0x7, 0x23, 0x6d, 0xf5, 0x55, 0xde, 0x4c, 0x75, 0x1d, 0x74, 0x17, 0xc2, 0x6, 0x60, 0xb0, 0x13, 0x21, 0x1b, 0xfc, 0x89, 0x50, 0xed, 0x8c, 0xa0, 0x23, 0x5f, 0x4, 0xfb, 0x30, 0x38, 0x1f, 0xcc, 0x80, 0x72, 0x1b, 0xb8, 0x52, 0x41, 0x55, 0x3b, 0xda, 0xb0, 0x58, 0x55, 0x31, 0xea, 0x9b, 0xbc, 0x99, 0x31, 0x65, 0x16, 0x35, 0x27, 0xf7, 0x3b, 0x1a, 0x5f, 0x5, 0xae, 0xc3, 0xef, 0x53, 0x3a, 0xa2, 0xf, 0xc7, 0xe1, 0xcb, 0x69, 0x63, 0x39, 0xf, 0xf4, 0xd9, 0x24, 0xcf, 0x8, 0x67, 0xe1, 0x60, 0xaa, 0x8e, 0xd0, 0x1d, 0x4d, 0xf9, 0x74, 0x70, 0xe, 0x38, 0x13, 0x9c, 0x4, 0x9a, 0xe4, 0xa0, 0x9a, 0x13, 0xd4, 0x97, 0x3e, 0xbd, 0x31, 0xb6, 0xd, 0xda, 0x6d, 0xd6, 0x16, 0xb5, 0x1d, 0xe8, 0x37, 0x1, 0xbf, 0xee, 0x6f, 0xa6, 0x6d, 0xfa, 0x35, 0xc, 0x3f, 0xda, 0xfb, 0x5b, 0xe3, 0xa2, 0xbf, 0x45, 0x62, 0x7f, 0x50, 0x54, 0xd, 0x2a, 0x7, 0xc4, 0xe7, 0xb1, 0x1, 0xa9, 0x26, 0x88, 0xde, 0xa7, 0x85, 0x2f, 0x88, 0xcd, 0x80, 0xb5, 0xe0, 0xd, 0xc0, 0xb3, 0x63, 0x14, 0xfa, 0x37, 0x8d, 0xb7, 0x81, 0xbb, 0xc1, 0x6d, 0xc0, 0x7f, 0xa2, 0x1e, 0x81, 0x27, 0xea, 0x1a, 0x4b, 0xd4, 0x4f, 0x82, 0x57, 0x81, 0x8, 0xe7, 0xc5, 0x20, 0x3c, 0xb8, 0x6a, 0xab, 0x4a, 0x9d, 0x5b, 0xe7, 0x44, 0x70, 0x4a, 0x86, 0x99, 0xe2, 0x93, 0xe5, 0x4, 0x70, 0x2c, 0x78, 0x19, 0xd0, 0xc6, 0x76, 0x4f, 0x82, 0x27, 0x80, 0xef, 0x5c, 0xfc, 0xb, 0xec, 0x2, 0xae, 0xbc, 0x1, 0xd8, 0xa, 0x1e, 0xc2, 0x7f, 0x5a, 0x79, 0xe4, 0x44, 0xf8, 0x4f, 0x19, 0x40, 0xa1, 0xb6, 0x18, 0xb9, 0x7a, 0xa2, 0xec, 0x7f, 0x27, 0x77, 0xca, 0xf8, 0x2b, 0x28, 0xe6, 0x63, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; - - - - + (NSData *)twitter_icon3x_png { - return [NSData dataWithBytes:twitter_icon3x_png length:sizeof(twitter_icon3x_png)]; - } - static const unsigned char apple_icon3x_png[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0x36, 0x0, 0x0, 0x0, 0x42, 0x8, 0x6, 0x0, 0x0, 0x0, 0x1c, 0xf6, 0x25, 0xa, 0x0, 0x0, 0x0, 0x1, 0x73, 0x52, 0x47, 0x42, 0x0, 0xae, 0xce, 0x1c, 0xe9, 0x0, 0x0, 0x4, 0xca, 0x49, 0x44, 0x41, 0x54, 0x68, 0x5, 0xdd, 0x9b, 0x5b, 0x68, 0x15, 0x47, 0x1c, 0xc6, 0x3d, 0xb1, 0xde, 0xad, 0x22, 0xde, 0x83, 0x60, 0xad, 0x18, 0x44, 0xd4, 0x34, 0x6a, 0xd1, 0x7, 0x93, 0xa7, 0x5a, 0xaa, 0x6d, 0xbc, 0xd5, 0x27, 0x9, 0xf8, 0x50, 0x21, 0xa8, 0x8, 0xa2, 0x42, 0x15, 0xbc, 0xa1, 0xc5, 0xb, 0x14, 0x44, 0x41, 0x2d, 0xe2, 0x83, 0x60, 0x29, 0x5a, 0xa8, 0x2d, 0x48, 0x20, 0x79, 0xb0, 0x8d, 0xf, 0xad, 0xd7, 0x62, 0xa9, 0x4a, 0x51, 0x50, 0xe2, 0x9d, 0x88, 0xe2, 0x2d, 0x78, 0x8d, 0xc6, 0xdf, 0x77, 0x3c, 0x7b, 0xd8, 0x73, 0x32, 0xbb, 0xb3, 0xe7, 0x44, 0xe8, 0x8c, 0x7f, 0xf8, 0x32, 0xb3, 0xf3, 0x9f, 0x99, 0xfd, 0xbe, 0xf3, 0x9f, 0xdd, 0x9d, 0x9d, 0xd9, 0xa4, 0x3a, 0x39, 0x66, 0x6d, 0x6d, 0x6d, 0x13, 0xa1, 0x54, 0x3, 0x2a, 0xc0, 0x68, 0x50, 0x9a, 0x4a, 0xa5, 0x5e, 0x93, 0xfa, 0x69, 0x8, 0x9a, 0xb, 0x4e, 0x83, 0x7c, 0xeb, 0xe9, 0xa5, 0x22, 0x54, 0x94, 0x82, 0x5f, 0xf3, 0xd5, 0x64, 0x8e, 0x1f, 0xf9, 0x2a, 0x6a, 0x12, 0x2, 0xee, 0x46, 0x88, 0x52, 0xf1, 0x7f, 0xc5, 0xa, 0x2b, 0x29, 0xb6, 0x61, 0x47, 0xdb, 0x41, 0xba, 0x92, 0x3e, 0x8e, 0x82, 0xfe, 0x31, 0x7d, 0xfd, 0x19, 0xe3, 0x73, 0xcf, 0x85, 0xa8, 0x51, 0xe0, 0x11, 0xb0, 0xd9, 0x6c, 0xf7, 0xd8, 0x47, 0x30, 0x42, 0x49, 0x37, 0xf0, 0x8f, 0x4d, 0x11, 0xfe, 0x7b, 0xc0, 0x9f, 0x1b, 0x7, 0x64, 0x57, 0x26, 0x10, 0xa5, 0x2a, 0x6b, 0x22, 0x7e, 0x1b, 0xf7, 0x8a, 0x21, 0xdb, 0x17, 0x28, 0x12, 0x36, 0xbb, 0x43, 0x85, 0xbe, 0xee, 0x29, 0x88, 0x60, 0x4, 0xd9, 0x25, 0x36, 0x45, 0x19, 0xff, 0xac, 0x88, 0x2e, 0xdc, 0x2c, 0x86, 0x74, 0x63, 0x2, 0x61, 0x3b, 0xdd, 0x64, 0x1f, 0xc1, 0xa, 0x41, 0x1a, 0x86, 0xaf, 0x2c, 0xc2, 0x76, 0xe3, 0x4f, 0x45, 0x74, 0xe1, 0x66, 0x31, 0x84, 0xcb, 0x63, 0x44, 0xbd, 0xc0, 0xb7, 0xce, 0x4d, 0xe6, 0x16, 0x56, 0x10, 0xaf, 0x8e, 0x10, 0x76, 0x86, 0xf2, 0x72, 0x4b, 0xf3, 0x82, 0xdd, 0x1f, 0x14, 0xdc, 0xa2, 0xf8, 0x6, 0xe1, 0x73, 0x3d, 0xa6, 0x9b, 0x7a, 0xb0, 0x87, 0x99, 0xfb, 0x1f, 0xc5, 0x77, 0xe9, 0x40, 0x4b, 0xa2, 0xd2, 0x3, 0x4c, 0x4, 0x43, 0x93, 0xd0, 0xa1, 0x5e, 0x57, 0xd0, 0x2b, 0x49, 0x5d, 0x53, 0x9d, 0x82, 0x2e, 0x54, 0x4e, 0xd4, 0x99, 0x4e, 0xaa, 0xc0, 0xc, 0x30, 0x2, 0x94, 0x82, 0xc1, 0xa0, 0x5, 0x34, 0x81, 0x13, 0xe0, 0x37, 0xa2, 0x50, 0xd0, 0xe4, 0x55, 0x22, 0x68, 0xf7, 0x39, 0xa8, 0x6, 0x9f, 0x82, 0x32, 0x10, 0x88, 0x7a, 0x49, 0xfe, 0x6, 0x38, 0xf, 0x1a, 0x41, 0x1d, 0xfd, 0x5f, 0x24, 0xed, 0xb8, 0x71, 0x62, 0xbd, 0x5a, 0xe8, 0x8e, 0x15, 0x37, 0x13, 0xc7, 0x9d, 0x35, 0x4d, 0x99, 0xbe, 0x5, 0x91, 0xd1, 0xc1, 0x57, 0x2, 0xa6, 0x81, 0x3, 0xe0, 0x21, 0x28, 0xc4, 0xf4, 0xd8, 0xd0, 0x8f, 0x50, 0x9c, 0xd1, 0xb8, 0x27, 0x58, 0xf, 0x5a, 0x40, 0x31, 0xd6, 0x4a, 0xa3, 0x23, 0xa0, 0x6, 0x8c, 0x0, 0xfd, 0xc0, 0x14, 0xf0, 0x1d, 0xb8, 0xa, 0x3a, 0x6a, 0xf5, 0x74, 0xf0, 0xb1, 0x49, 0x5d, 0xe4, 0x50, 0xa4, 0xc1, 0x30, 0x1a, 0xd4, 0x81, 0xf1, 0xa6, 0x86, 0xe, 0x95, 0xdd, 0x87, 0xcb, 0xd7, 0xf9, 0x37, 0x21, 0xe3, 0xfb, 0x18, 0xa2, 0x3e, 0xa1, 0xf2, 0x49, 0xe0, 0xba, 0x28, 0xfd, 0xbe, 0xfd, 0x40, 0x3, 0x9c, 0xe7, 0xea, 0x20, 0xb0, 0x76, 0x11, 0xa3, 0xc2, 0x28, 0x9c, 0x67, 0x40, 0x9f, 0xa0, 0x92, 0x27, 0xe9, 0x13, 0x78, 0x56, 0x11, 0xb9, 0xbf, 0xc5, 0x37, 0x27, 0x62, 0x88, 0xea, 0x41, 0xd9, 0x2f, 0xc0, 0x37, 0x51, 0xd2, 0xa2, 0x77, 0xb7, 0xec, 0xec, 0x25, 0x47, 0x18, 0x8e, 0xdd, 0x60, 0x1c, 0xf0, 0xd1, 0x76, 0x41, 0x7a, 0x5e, 0x40, 0x3c, 0x3b, 0x14, 0x89, 0xd6, 0x14, 0xa, 0x8f, 0x7, 0xe, 0xcf, 0xd2, 0x55, 0xc, 0xc1, 0x6d, 0x61, 0xce, 0xe1, 0x88, 0xad, 0xd, 0x3b, 0x3c, 0xca, 0x6f, 0xca, 0x17, 0x25, 0xee, 0xe9, 0x88, 0x11, 0xad, 0x9, 0xe4, 0xd3, 0x17, 0x9d, 0x47, 0x82, 0x44, 0xb5, 0x1, 0x4c, 0x47, 0x58, 0x5b, 0x3e, 0xef, 0x20, 0x62, 0x4b, 0xf3, 0x1d, 0x1e, 0x1c, 0x6b, 0x31, 0x75, 0x81, 0x49, 0x94, 0xb8, 0x7, 0xc2, 0x34, 0x4f, 0xf3, 0xcd, 0xb6, 0x23, 0xaa, 0x39, 0x8a, 0x74, 0x8a, 0x61, 0x38, 0x6, 0xe7, 0x85, 0xa8, 0xa, 0x8e, 0x96, 0xeb, 0xb5, 0x67, 0x18, 0xc2, 0x14, 0x35, 0xa3, 0x29, 0x62, 0x9f, 0x19, 0x3d, 0x6e, 0x17, 0x36, 0xc4, 0x89, 0x12, 0x75, 0x9, 0x9b, 0xec, 0xb6, 0x6, 0x23, 0xbb, 0x23, 0xc6, 0xd2, 0x50, 0xa1, 0x84, 0xd, 0xa, 0x1d, 0xfb, 0x92, 0xb5, 0x3e, 0x6f, 0x25, 0x6c, 0xa0, 0x2f, 0x6a, 0x42, 0x3c, 0x6f, 0x87, 0xf2, 0xc6, 0xac, 0x8f, 0xc2, 0x5a, 0xb8, 0xbe, 0xf4, 0xc6, 0x1e, 0x6b, 0x12, 0x36, 0x20, 0xb6, 0x86, 0x7b, 0xce, 0x44, 0xdb, 0xb6, 0x12, 0x96, 0xa8, 0xa2, 0x43, 0xfa, 0xfa, 0xf0, 0x88, 0xea, 0x6d, 0xe3, 0x23, 0x61, 0xd6, 0xb0, 0xda, 0x3a, 0xf9, 0x1f, 0xfc, 0x7a, 0xbb, 0x8f, 0x35, 0x9, 0xd3, 0xc3, 0xce, 0x37, 0xd3, 0xcb, 0x70, 0xac, 0x49, 0x98, 0x96, 0xb6, 0x7c, 0xb3, 0x9c, 0x65, 0x0, 0x13, 0x79, 0x9, 0xbb, 0x6c, 0x72, 0x38, 0x5e, 0x36, 0x87, 0xeb, 0xac, 0x6b, 0x1c, 0x47, 0x5f, 0x85, 0x69, 0x53, 0x70, 0xbe, 0x4d, 0x98, 0x56, 0x6f, 0x7d, 0xb4, 0x2d, 0x44, 0x2d, 0x72, 0x6d, 0x46, 0x11, 0xfb, 0xb, 0xbc, 0xf0, 0x50, 0xd9, 0x10, 0x38, 0x6f, 0x8d, 0xe2, 0x5d, 0xc2, 0x53, 0x5c, 0xcb, 0x56, 0x5a, 0x43, 0xf4, 0xd1, 0x16, 0x11, 0xb5, 0xc5, 0x26, 0xe2, 0x8a, 0x98, 0xac, 0x31, 0xfd, 0xd7, 0xcf, 0x3f, 0x3b, 0x11, 0xa7, 0x8f, 0xca, 0x72, 0x2c, 0x10, 0xe6, 0xf3, 0x1e, 0x95, 0x76, 0x80, 0xb4, 0xb1, 0xb1, 0x11, 0x4, 0x7a, 0xb2, 0x8b, 0x39, 0xdd, 0x71, 0xde, 0x3, 0x5a, 0x74, 0xf4, 0xd9, 0x74, 0x23, 0xac, 0xe5, 0xf2, 0xfa, 0x37, 0xbc, 0xae, 0xb8, 0x8f, 0xc2, 0x6f, 0x7c, 0x56, 0x95, 0xe1, 0xae, 0xb9, 0xef, 0xea, 0x6c, 0xe8, 0x38, 0xf8, 0xe1, 0x3d, 0x10, 0x25, 0x9, 0xd2, 0xd4, 0x94, 0x8d, 0x98, 0x4a, 0x18, 0xa3, 0xa7, 0x49, 0x26, 0x29, 0xef, 0xb1, 0x69, 0x5b, 0xa9, 0x34, 0x1c, 0x31, 0x69, 0x79, 0x1f, 0xa2, 0xb6, 0x9f, 0x6b, 0xec, 0x59, 0x7e, 0xc4, 0x74, 0xf3, 0xb8, 0x5, 0x34, 0x65, 0xf1, 0xd1, 0xb4, 0x5f, 0x3d, 0x12, 0x61, 0xd7, 0x73, 0x22, 0x96, 0x79, 0x58, 0xef, 0xf0, 0x51, 0x51, 0x86, 0xf3, 0x8f, 0x12, 0xa5, 0x7c, 0x4e, 0xc4, 0x54, 0xc0, 0x75, 0xf6, 0x21, 0x89, 0x66, 0xfc, 0xbe, 0x2d, 0xf2, 0x28, 0x5a, 0x63, 0x11, 0x76, 0x89, 0x34, 0xbb, 0xc4, 0xad, 0x7c, 0xda, 0x70, 0xe8, 0xc5, 0x73, 0xc3, 0xdb, 0x23, 0xaf, 0xfe, 0x6a, 0xc9, 0x3b, 0x2d, 0x4a, 0xac, 0xdb, 0x45, 0x4c, 0x85, 0x99, 0x27, 0xb8, 0xbe, 0xc7, 0xd5, 0x9e, 0x99, 0xf, 0x76, 0x13, 0x92, 0xa3, 0x11, 0x96, 0x5d, 0xe6, 0xc8, 0xb9, 0xc6, 0x2, 0x5, 0x54, 0xd0, 0x43, 0x6e, 0x21, 0x78, 0x1e, 0x94, 0x39, 0x9e, 0x2e, 0xf, 0x8b, 0x12, 0x57, 0xa3, 0x30, 0x39, 0xa8, 0xa8, 0x8d, 0x8a, 0x15, 0xca, 0x3b, 0x6e, 0x3f, 0xc1, 0xf5, 0xe7, 0x7c, 0x8e, 0xc6, 0xa1, 0x18, 0xae, 0xc4, 0xb0, 0x3c, 0xcc, 0xf1, 0x9c, 0x70, 0x99, 0x43, 0xf9, 0x2b, 0x70, 0xa9, 0x40, 0x58, 0xbb, 0x5d, 0x97, 0x24, 0xc2, 0xf4, 0x1d, 0xc5, 0x59, 0x30, 0xdc, 0x21, 0x41, 0xa2, 0xa2, 0x97, 0xe3, 0x4a, 0x44, 0x9d, 0x32, 0xf1, 0x8a, 0x1c, 0x8a, 0x41, 0x65, 0x1a, 0x6a, 0x8a, 0xf2, 0x25, 0x78, 0x10, 0x94, 0x39, 0x90, 0x6a, 0x6b, 0x56, 0xbb, 0x99, 0x46, 0x51, 0x5, 0xf1, 0x63, 0x48, 0x4e, 0x5, 0x4f, 0x81, 0xb, 0xb6, 0xcc, 0x46, 0xde, 0x3a, 0x14, 0xc3, 0x1d, 0xa0, 0x68, 0x26, 0xc7, 0x7, 0x81, 0x3e, 0x74, 0x49, 0x6a, 0xe7, 0xa8, 0xf8, 0x3b, 0x50, 0xaa, 0x77, 0xbe, 0x56, 0xa0, 0xe1, 0x5d, 0x6, 0xaa, 0x40, 0x25, 0x48, 0xca, 0x43, 0x91, 0x5a, 0x43, 0xa4, 0x36, 0x93, 0xbe, 0x5b, 0x43, 0x9c, 0xfe, 0xd1, 0xe6, 0xa2, 0x25, 0x6c, 0xcd, 0xf8, 0xbf, 0x7, 0xe5, 0xb6, 0xb3, 0x53, 0xe7, 0x23, 0xb0, 0x1e, 0x34, 0x81, 0x38, 0xbb, 0x86, 0xf3, 0x2b, 0x5b, 0x7f, 0x1d, 0xf2, 0x73, 0x2, 0x7d, 0xfd, 0x59, 0xb, 0x8e, 0x1, 0x7d, 0xc3, 0xf8, 0xc, 0x88, 0xd8, 0x21, 0x30, 0xf, 0x74, 0x29, 0xf4, 0x4, 0xb4, 0xd1, 0xf7, 0x8b, 0x5f, 0x80, 0xbd, 0x40, 0xdf, 0x9, 0x4b, 0x88, 0x7e, 0xc0, 0x3a, 0xb0, 0x10, 0x68, 0x82, 0x9e, 0xd8, 0xde, 0x0, 0xa1, 0x3b, 0xe4, 0xa8, 0x44, 0xd8, 0xd7, 0x91, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; @@ -17,14 +9,6 @@ + (NSData *)apple_icon3x_png { return [NSData dataWithBytes:apple_icon3x_png length:sizeof(apple_icon3x_png)]; } - static const unsigned char facebook_icon2x_png[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0x2c, 0x0, 0x0, 0x0, 0x2c, 0x8, 0x6, 0x0, 0x0, 0x0, 0x1e, 0x84, 0x5a, 0x1, 0x0, 0x0, 0x0, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x0, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x61, 0x64, 0x79, 0x71, 0xc9, 0x65, 0x3c, 0x0, 0x0, 0x3, 0x23, 0x69, 0x54, 0x58, 0x74, 0x58, 0x4d, 0x4c, 0x3a, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x78, 0x6d, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x3d, 0x22, 0xef, 0xbb, 0xbf, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x57, 0x35, 0x4d, 0x30, 0x4d, 0x70, 0x43, 0x65, 0x68, 0x69, 0x48, 0x7a, 0x72, 0x65, 0x53, 0x7a, 0x4e, 0x54, 0x63, 0x7a, 0x6b, 0x63, 0x39, 0x64, 0x22, 0x3f, 0x3e, 0x20, 0x3c, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x3d, 0x22, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x3a, 0x6e, 0x73, 0x3a, 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x22, 0x20, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x74, 0x6b, 0x3d, 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x58, 0x4d, 0x50, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x35, 0x2e, 0x35, 0x2d, 0x63, 0x30, 0x31, 0x34, 0x20, 0x37, 0x39, 0x2e, 0x31, 0x35, 0x31, 0x34, 0x38, 0x31, 0x2c, 0x20, 0x32, 0x30, 0x31, 0x33, 0x2f, 0x30, 0x33, 0x2f, 0x31, 0x33, 0x2d, 0x31, 0x32, 0x3a, 0x30, 0x39, 0x3a, 0x31, 0x35, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x3e, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x72, 0x64, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x31, 0x39, 0x39, 0x39, 0x2f, 0x30, 0x32, 0x2f, 0x32, 0x32, 0x2d, 0x72, 0x64, 0x66, 0x2d, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2d, 0x6e, 0x73, 0x23, 0x22, 0x3e, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x64, 0x66, 0x3a, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x3d, 0x22, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x6d, 0x6d, 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x73, 0x54, 0x79, 0x70, 0x65, 0x2f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x23, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x3a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x6f, 0x6c, 0x3d, 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x73, 0x68, 0x6f, 0x70, 0x20, 0x43, 0x43, 0x20, 0x28, 0x4d, 0x61, 0x63, 0x69, 0x6e, 0x74, 0x6f, 0x73, 0x68, 0x29, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x69, 0x69, 0x64, 0x3a, 0x37, 0x32, 0x42, 0x32, 0x44, 0x31, 0x37, 0x44, 0x33, 0x44, 0x43, 0x39, 0x31, 0x31, 0x45, 0x34, 0x38, 0x33, 0x35, 0x43, 0x42, 0x42, 0x36, 0x30, 0x39, 0x42, 0x42, 0x31, 0x39, 0x35, 0x32, 0x44, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x64, 0x69, 0x64, 0x3a, 0x37, 0x32, 0x42, 0x32, 0x44, 0x31, 0x37, 0x45, 0x33, 0x44, 0x43, 0x39, 0x31, 0x31, 0x45, 0x34, 0x38, 0x33, 0x35, 0x43, 0x42, 0x42, 0x36, 0x30, 0x39, 0x42, 0x42, 0x31, 0x39, 0x35, 0x32, 0x44, 0x22, 0x3e, 0x20, 0x3c, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x20, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x69, 0x69, 0x64, 0x3a, 0x37, 0x32, 0x42, 0x32, 0x44, 0x31, 0x37, 0x42, 0x33, 0x44, 0x43, 0x39, 0x31, 0x31, 0x45, 0x34, 0x38, 0x33, 0x35, 0x43, 0x42, 0x42, 0x36, 0x30, 0x39, 0x42, 0x42, 0x31, 0x39, 0x35, 0x32, 0x44, 0x22, 0x20, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x64, 0x69, 0x64, 0x3a, 0x37, 0x32, 0x42, 0x32, 0x44, 0x31, 0x37, 0x43, 0x33, 0x44, 0x43, 0x39, 0x31, 0x31, 0x45, 0x34, 0x38, 0x33, 0x35, 0x43, 0x42, 0x42, 0x36, 0x30, 0x39, 0x42, 0x42, 0x31, 0x39, 0x35, 0x32, 0x44, 0x22, 0x2f, 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x3e, 0x20, 0x3c, 0x2f, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x3e, 0x20, 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x65, 0x6e, 0x64, 0x3d, 0x22, 0x72, 0x22, 0x3f, 0x3e, 0x64, 0xec, 0x39, 0x7f, 0x0, 0x0, 0x2, 0x9a, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xec, 0x97, 0xcf, 0x8f, 0xd2, 0x40, 0x14, 0xc7, 0x99, 0x96, 0xd2, 0xf2, 0x63, 0xbb, 0x18, 0x10, 0x83, 0x42, 0x14, 0x12, 0x4f, 0x12, 0xaf, 0x60, 0xbc, 0x60, 0xf8, 0x2f, 0x8c, 0x81, 0x4, 0x88, 0x5c, 0xbc, 0x7a, 0xf2, 0x60, 0xb8, 0xb0, 0x7f, 0x0, 0xc6, 0x13, 0x7, 0xc2, 0xdd, 0x83, 0x37, 0xc2, 0xca, 0x9, 0x3, 0x44, 0x8d, 0x82, 0x31, 0x21, 0x1c, 0x48, 0x5c, 0x12, 0x48, 0x38, 0xd8, 0x8, 0xba, 0x14, 0x97, 0xa5, 0xf8, 0x6a, 0x62, 0xb2, 0x36, 0x9d, 0x2e, 0x34, 0xed, 0xb2, 0x8d, 0x7d, 0xc9, 0x24, 0x4d, 0xdf, 0xcc, 0x9b, 0x4f, 0xa7, 0x6f, 0xde, 0x7c, 0x7, 0x5, 0x2, 0x1, 0x5f, 0xa9, 0x54, 0x7a, 0x19, 0x8f, 0xc7, 0x1f, 0xd0, 0x34, 0x4d, 0x5a, 0x2e, 0xa1, 0x2d, 0x97, 0x4b, 0xe1, 0x1d, 0x58, 0x36, 0x9b, 0xcd, 0x59, 0xaa, 0xd5, 0xea, 0xab, 0xb5, 0x41, 0xac, 0xdd, 0x6e, 0x1f, 0x22, 0x41, 0x10, 0x7e, 0x20, 0x84, 0x5c, 0x16, 0x63, 0xd8, 0x9, 0x2, 0xf0, 0x29, 0x3c, 0xb0, 0x6, 0x1, 0x5e, 0x88, 0xc0, 0xdf, 0xe1, 0x61, 0xdf, 0x20, 0xc0, 0xbc, 0x9, 0xbc, 0xd1, 0x7f, 0x5d, 0x2c, 0x66, 0xc3, 0xe1, 0xf0, 0x2b, 0xc7, 0x71, 0xdf, 0x4e, 0xc1, 0xec, 0x76, 0x3b, 0x45, 0x92, 0x24, 0xe3, 0x72, 0xb9, 0x9c, 0x2c, 0xcb, 0xee, 0x7b, 0xbd, 0xde, 0xeb, 0x4, 0x41, 0x58, 0xe5, 0x80, 0x2d, 0x22, 0xf0, 0x45, 0xed, 0xf2, 0x6e, 0xb7, 0xdb, 0xcc, 0xe5, 0x72, 0x8f, 0xc2, 0xe1, 0xf0, 0xd, 0x8a, 0xa2, 0x90, 0x94, 0xc6, 0x66, 0xb3, 0x21, 0x8f, 0xc7, 0xe3, 0x18, 0xc, 0x6, 0x9f, 0x31, 0x21, 0xe6, 0x17, 0x6, 0x5c, 0x28, 0x14, 0x9e, 0x31, 0xc, 0x43, 0x6c, 0xf2, 0x7, 0xfa, 0xfd, 0xfe, 0xa7, 0x9d, 0x2, 0xe7, 0xf3, 0xf9, 0xa7, 0x9b, 0xa6, 0x8b, 0xd5, 0x6a, 0xdd, 0x2d, 0x30, 0x14, 0xfb, 0x37, 0xdb, 0xe4, 0xf7, 0x79, 0xc0, 0x84, 0xde, 0x1b, 0xec, 0x0, 0x6c, 0x9b, 0xfe, 0xb0, 0x7, 0xc5, 0x45, 0x5c, 0x63, 0x3f, 0x48, 0x4f, 0xd8, 0xc9, 0x64, 0x72, 0x54, 0xaf, 0xd7, 0xdf, 0x2a, 0xf5, 0xf1, 0xf9, 0x7c, 0x62, 0x55, 0x70, 0x43, 0x95, 0x40, 0x7f, 0x57, 0x18, 0x72, 0x9d, 0xc6, 0xe, 0xd0, 0x33, 0x25, 0x6a, 0xb5, 0xda, 0x6b, 0xdc, 0xbc, 0x4e, 0xa7, 0x93, 0x2e, 0x97, 0xcb, 0x45, 0x28, 0x6d, 0xe3, 0xd5, 0x6a, 0x35, 0x87, 0xee, 0xfc, 0x99, 0x26, 0xe0, 0x52, 0x42, 0xd7, 0x15, 0x1e, 0x8d, 0x46, 0x43, 0x9c, 0x2f, 0x93, 0xc9, 0x3c, 0x4c, 0xa5, 0x52, 0x4f, 0xb6, 0x8d, 0xa9, 0x6b, 0xe, 0x43, 0x3e, 0x2e, 0x70, 0xbe, 0x58, 0x2c, 0x76, 0x4f, 0x4d, 0x4c, 0x5d, 0x81, 0x41, 0x5, 0x62, 0x7d, 0xa0, 0xbd, 0x6d, 0x97, 0xe, 0x58, 0xc9, 0x40, 0xd6, 0xae, 0xd, 0x5, 0xac, 0xd6, 0x74, 0x5, 0x6, 0x51, 0xc3, 0xe0, 0x7c, 0xe, 0x87, 0xc3, 0xae, 0x2a, 0xcd, 0xb4, 0x50, 0x6b, 0xe3, 0xf1, 0xf8, 0xe8, 0x39, 0x98, 0x34, 0x36, 0x9c, 0x58, 0x5f, 0x1a, 0x8d, 0xc6, 0x7, 0xb9, 0x31, 0x89, 0x44, 0xe2, 0x7e, 0x28, 0x14, 0xba, 0x2d, 0x56, 0xd6, 0xb3, 0xef, 0xe1, 0x8e, 0x79, 0xd, 0x42, 0x1d, 0x60, 0x16, 0x53, 0x1b, 0xb5, 0x6, 0x2a, 0xec, 0xbd, 0x56, 0x7f, 0x25, 0x1a, 0x8d, 0xde, 0x55, 0x98, 0x4a, 0x9b, 0xa3, 0x19, 0xb4, 0x2b, 0xa1, 0x54, 0x11, 0xb6, 0xb1, 0x48, 0x24, 0x72, 0xc7, 0x50, 0x9b, 0xe, 0xd2, 0xe4, 0x96, 0x9, 0x2c, 0xa3, 0x47, 0x94, 0x4, 0xd6, 0x56, 0x16, 0xc, 0x6, 0x6f, 0x2a, 0xca, 0x4f, 0x2d, 0x26, 0x81, 0xab, 0xd, 0xe5, 0xf7, 0xfb, 0xaf, 0x4a, 0xa1, 0x79, 0x9e, 0x9f, 0x4f, 0xa7, 0xd3, 0x63, 0xb9, 0x31, 0x6e, 0xb7, 0x7b, 0xf, 0x54, 0xd9, 0x3f, 0x65, 0x4f, 0xbc, 0x36, 0x9d, 0x7, 0xac, 0x49, 0x95, 0x0, 0xb5, 0x75, 0xa, 0x60, 0x9c, 0xb4, 0x15, 0x8b, 0xc5, 0x3c, 0x6e, 0xde, 0x4a, 0xa5, 0xf2, 0x42, 0xda, 0x7f, 0x36, 0x9b, 0x71, 0xa, 0x4a, 0x4d, 0x3b, 0xb5, 0x6, 0x45, 0x82, 0x84, 0xdb, 0xee, 0x15, 0xe9, 0x7b, 0xb8, 0x5, 0xef, 0xe1, 0xc6, 0x80, 0x8f, 0x95, 0x1b, 0xb3, 0xd3, 0x93, 0xe, 0x56, 0x7e, 0xa5, 0xc6, 0x67, 0x6a, 0x9, 0x13, 0xd8, 0x4, 0x36, 0x81, 0x4d, 0x60, 0x13, 0xf8, 0xff, 0x6, 0x46, 0x6, 0xe2, 0x45, 0x22, 0x30, 0x69, 0x20, 0x60, 0x92, 0x68, 0xb5, 0x5a, 0x4d, 0x3d, 0x57, 0x44, 0xa5, 0x4f, 0xd6, 0x7a, 0xbd, 0xde, 0x47, 0x22, 0x9d, 0x4e, 0x3f, 0x6, 0xe8, 0x43, 0x10, 0x4f, 0x3f, 0xff, 0x5c, 0xa3, 0xb5, 0x6d, 0x27, 0xa, 0xf3, 0xff, 0xda, 0x34, 0x8e, 0x20, 0x8, 0xc7, 0x9d, 0x4e, 0xa7, 0x99, 0x4c, 0x26, 0xd3, 0xbf, 0x5, 0x18, 0x0, 0x98, 0xef, 0x3, 0xa7, 0xc, 0x73, 0xce, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; - - - - + (NSData *)facebook_icon2x_png { - return [NSData dataWithBytes:facebook_icon2x_png length:sizeof(facebook_icon2x_png)]; - } - static const unsigned char parse_logo_png[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0xde, 0x0, 0x0, 0x0, 0x44, 0x8, 0x6, 0x0, 0x0, 0x0, 0xee, 0x9a, 0x8b, 0x92, 0x0, 0x0, 0x0, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x0, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x61, 0x64, 0x79, 0x71, 0xc9, 0x65, 0x3c, 0x0, 0x0, 0x3, 0x23, 0x69, 0x54, 0x58, 0x74, 0x58, 0x4d, 0x4c, 0x3a, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x78, 0x6d, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x3d, 0x22, 0xef, 0xbb, 0xbf, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x57, 0x35, 0x4d, 0x30, 0x4d, 0x70, 0x43, 0x65, 0x68, 0x69, 0x48, 0x7a, 0x72, 0x65, 0x53, 0x7a, 0x4e, 0x54, 0x63, 0x7a, 0x6b, 0x63, 0x39, 0x64, 0x22, 0x3f, 0x3e, 0x20, 0x3c, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x3d, 0x22, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x3a, 0x6e, 0x73, 0x3a, 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x22, 0x20, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x74, 0x6b, 0x3d, 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x58, 0x4d, 0x50, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x35, 0x2e, 0x35, 0x2d, 0x63, 0x30, 0x31, 0x34, 0x20, 0x37, 0x39, 0x2e, 0x31, 0x35, 0x31, 0x34, 0x38, 0x31, 0x2c, 0x20, 0x32, 0x30, 0x31, 0x33, 0x2f, 0x30, 0x33, 0x2f, 0x31, 0x33, 0x2d, 0x31, 0x32, 0x3a, 0x30, 0x39, 0x3a, 0x31, 0x35, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x3e, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x72, 0x64, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x31, 0x39, 0x39, 0x39, 0x2f, 0x30, 0x32, 0x2f, 0x32, 0x32, 0x2d, 0x72, 0x64, 0x66, 0x2d, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2d, 0x6e, 0x73, 0x23, 0x22, 0x3e, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x64, 0x66, 0x3a, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x3d, 0x22, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x6d, 0x6d, 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x73, 0x54, 0x79, 0x70, 0x65, 0x2f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x23, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x3a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x6f, 0x6c, 0x3d, 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x73, 0x68, 0x6f, 0x70, 0x20, 0x43, 0x43, 0x20, 0x28, 0x4d, 0x61, 0x63, 0x69, 0x6e, 0x74, 0x6f, 0x73, 0x68, 0x29, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x69, 0x69, 0x64, 0x3a, 0x37, 0x44, 0x43, 0x37, 0x45, 0x43, 0x42, 0x35, 0x34, 0x30, 0x30, 0x43, 0x31, 0x31, 0x45, 0x34, 0x41, 0x33, 0x35, 0x31, 0x39, 0x31, 0x30, 0x33, 0x32, 0x36, 0x42, 0x31, 0x39, 0x32, 0x31, 0x42, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x64, 0x69, 0x64, 0x3a, 0x37, 0x44, 0x43, 0x37, 0x45, 0x43, 0x42, 0x36, 0x34, 0x30, 0x30, 0x43, 0x31, 0x31, 0x45, 0x34, 0x41, 0x33, 0x35, 0x31, 0x39, 0x31, 0x30, 0x33, 0x32, 0x36, 0x42, 0x31, 0x39, 0x32, 0x31, 0x42, 0x22, 0x3e, 0x20, 0x3c, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x20, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x69, 0x69, 0x64, 0x3a, 0x34, 0x31, 0x30, 0x31, 0x39, 0x34, 0x31, 0x30, 0x34, 0x30, 0x30, 0x43, 0x31, 0x31, 0x45, 0x34, 0x41, 0x33, 0x35, 0x31, 0x39, 0x31, 0x30, 0x33, 0x32, 0x36, 0x42, 0x31, 0x39, 0x32, 0x31, 0x42, 0x22, 0x20, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x64, 0x69, 0x64, 0x3a, 0x37, 0x44, 0x43, 0x37, 0x45, 0x43, 0x42, 0x34, 0x34, 0x30, 0x30, 0x43, 0x31, 0x31, 0x45, 0x34, 0x41, 0x33, 0x35, 0x31, 0x39, 0x31, 0x30, 0x33, 0x32, 0x36, 0x42, 0x31, 0x39, 0x32, 0x31, 0x42, 0x22, 0x2f, 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x3e, 0x20, 0x3c, 0x2f, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x3e, 0x20, 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x65, 0x6e, 0x64, 0x3d, 0x22, 0x72, 0x22, 0x3f, 0x3e, 0xf6, 0xc4, 0x10, 0x9d, 0x0, 0x0, 0x11, 0x8e, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xec, 0x5d, 0x9, 0x98, 0x54, 0xc5, 0x11, 0xae, 0xdd, 0x9d, 0x5, 0x59, 0x90, 0x9b, 0x5, 0xb9, 0x5, 0x11, 0xf0, 0x2, 0x14, 0x54, 0x54, 0x22, 0x6e, 0x44, 0x3c, 0x50, 0xbc, 0x95, 0xc3, 0x88, 0x9, 0x41, 0x3c, 0x21, 0x1e, 0x68, 0x30, 0x11, 0x8f, 0x18, 0x3c, 0x51, 0x14, 0x13, 0x94, 0x28, 0x26, 0x9e, 0x78, 0x44, 0x12, 0x15, 0x25, 0xe0, 0x89, 0x8a, 0x28, 0x88, 0xa0, 0xe2, 0xe2, 0x2, 0x72, 0xca, 0xd, 0xcb, 0xd, 0x7b, 0xb0, 0xe9, 0xdf, 0xf7, 0xf7, 0x37, 0x9d, 0x9, 0xc8, 0xcc, 0xce, 0x3b, 0xe6, 0x3d, 0xba, 0xbe, 0xaf, 0xbe, 0xe9, 0xd9, 0x9d, 0x79, 0xd3, 0xaf, 0xbb, 0xff, 0xea, 0xaa, 0xea, 0xaa, 0x7a, 0x59, 0xfd, 0xae, 0xbd, 0xe5, 0x55, 0x11, 0x69, 0xa3, 0xb8, 0x5c, 0xfc, 0xa1, 0x2c, 0xc5, 0x6b, 0x15, 0x17, 0x2a, 0xfe, 0x54, 0xf1, 0xc7, 0x8a, 0x97, 0x8b, 0x25, 0x4b, 0x11, 0xa5, 0x8a, 0x8a, 0xa, 0xc5, 0x22, 0xf7, 0xe, 0x1f, 0x2a, 0xcd, 0x9b, 0x1c, 0xf4, 0xd3, 0xdf, 0x62, 0x8a, 0x4f, 0x52, 0xdc, 0x30, 0x80, 0xfe, 0xf4, 0x50, 0x7c, 0x9d, 0xe2, 0x95, 0x8a, 0xa7, 0x29, 0xfe, 0x87, 0xe2, 0xc9, 0x8a, 0xcb, 0xec, 0x54, 0x59, 0x8a, 0x3a, 0x1, 0x78, 0xbb, 0xd9, 0xde, 0xaa, 0x78, 0x1, 0x77, 0x24, 0xcf, 0xc0, 0xaf, 0xb8, 0x8a, 0xe2, 0x3a, 0x8a, 0x1b, 0xf0, 0xf7, 0x21, 0x2, 0x2e, 0x26, 0xcf, 0x54, 0x7c, 0xa7, 0xe2, 0x37, 0xed, 0xd4, 0x58, 0x8a, 0x3a, 0xf0, 0x34, 0xcd, 0x50, 0x7c, 0xaa, 0x4f, 0xbf, 0x59, 0x53, 0x71, 0x63, 0xc5, 0xc7, 0x2a, 0x3e, 0x9b, 0xbb, 0x5f, 0x75, 0xc5, 0x9d, 0x15, 0xbf, 0xa1, 0x78, 0x82, 0xe2, 0x6b, 0x15, 0xaf, 0xb3, 0x53, 0x64, 0x29, 0x8a, 0x94, 0x9d, 0x60, 0x7b, 0xf9, 0x41, 0x50, 0x25, 0x37, 0x28, 0xfe, 0x46, 0xf1, 0xd3, 0x8a, 0xcf, 0x53, 0xdc, 0x41, 0xf1, 0x63, 0x8a, 0x77, 0xf2, 0x33, 0x97, 0xd0, 0xfe, 0xeb, 0x64, 0xa7, 0xc8, 0x52, 0xd4, 0x81, 0x17, 0x24, 0x2d, 0x54, 0x7c, 0xbd, 0xe2, 0xe3, 0x15, 0x4f, 0xe7, 0xdf, 0xe0, 0xf0, 0x79, 0x57, 0x71, 0x81, 0x9d, 0x26, 0x4b, 0x16, 0x78, 0xde, 0xd2, 0x1c, 0xc5, 0xa7, 0x28, 0xfe, 0x2b, 0xdf, 0xc3, 0x16, 0x7c, 0x4d, 0xf1, 0x71, 0x76, 0xaa, 0x2c, 0x59, 0xe0, 0x79, 0x4b, 0xbb, 0x14, 0x5f, 0xad, 0xf8, 0x76, 0xbe, 0xaf, 0xad, 0xf8, 0x45, 0xc5, 0xcd, 0xec, 0x74, 0x59, 0xb2, 0xc0, 0xf3, 0x9e, 0xee, 0x56, 0xfc, 0x0, 0xdb, 0x7, 0x2b, 0xfe, 0x8b, 0x8f, 0x76, 0xa8, 0x25, 0x4b, 0xfb, 0x2d, 0xf0, 0x40, 0xb7, 0x88, 0xe3, 0xe5, 0x4, 0xf5, 0x52, 0x7c, 0xa5, 0x9d, 0x32, 0x4b, 0x16, 0x78, 0xde, 0x13, 0xce, 0xfd, 0xe0, 0x74, 0x59, 0xc5, 0xf7, 0xb7, 0x29, 0xce, 0xb7, 0xd3, 0x66, 0xc9, 0x2, 0xcf, 0x7b, 0x5a, 0xac, 0x78, 0x4, 0xdb, 0x4d, 0xc5, 0x89, 0x76, 0xb1, 0x64, 0xc9, 0x2, 0xcf, 0x7, 0x7a, 0x46, 0xf1, 0x6c, 0xb6, 0x2f, 0x57, 0x5c, 0xd7, 0x4e, 0x9d, 0x25, 0xb, 0x3c, 0xef, 0xa9, 0x44, 0xf1, 0xe3, 0x6c, 0xc3, 0xbb, 0xd9, 0xdb, 0x4e, 0x9d, 0x25, 0xb, 0x3c, 0x7f, 0x68, 0xa2, 0x38, 0x1, 0xd5, 0xa0, 0xf3, 0xec, 0xd4, 0x59, 0xb2, 0xc0, 0xf3, 0x87, 0xd6, 0x2b, 0x7e, 0x8f, 0x6d, 0x44, 0xb8, 0x34, 0xb0, 0xd3, 0x67, 0xc9, 0x2, 0xcf, 0x1f, 0xd2, 0xc0, 0x3, 0xe8, 0xe, 0xb7, 0xd3, 0x67, 0x29, 0xac, 0x14, 0xb, 0x59, 0x7f, 0xbf, 0x34, 0xda, 0x0, 0xde, 0x7, 0x2e, 0x5f, 0x1f, 0x7, 0xf4, 0x4d, 0x79, 0xed, 0x76, 0x8a, 0x9b, 0x28, 0xce, 0x13, 0xe7, 0x58, 0x3, 0xb4, 0x51, 0xf1, 0xf, 0x8a, 0xe7, 0x8b, 0x93, 0xc8, 0xbb, 0xde, 0xa7, 0xfb, 0x46, 0xbf, 0xaa, 0x89, 0x93, 0xac, 0xbc, 0xcb, 0xa5, 0x6b, 0xe6, 0x48, 0xfa, 0xc9, 0xcf, 0xb8, 0x46, 0x73, 0xc5, 0x6d, 0xc5, 0x9, 0x72, 0x40, 0xc6, 0x49, 0x9d, 0x84, 0xcf, 0x14, 0x8b, 0x73, 0x1c, 0xb4, 0x48, 0x9c, 0xb4, 0xb3, 0x25, 0x2e, 0xde, 0x83, 0x9b, 0x73, 0xde, 0x8e, 0xf7, 0x1, 0x1f, 0x42, 0xd, 0xce, 0x39, 0xfe, 0xb7, 0x59, 0x9c, 0x44, 0xed, 0x22, 0xc5, 0xf3, 0x14, 0xaf, 0x30, 0xd6, 0xc3, 0x7e, 0x3, 0xbc, 0x95, 0x5c, 0xec, 0xf5, 0x14, 0xb7, 0x76, 0x71, 0xd7, 0xef, 0x48, 0xbb, 0xb1, 0xa7, 0xe2, 0xf6, 0x1c, 0xf8, 0x7d, 0x11, 0xb2, 0xe8, 0x91, 0x41, 0xf1, 0x8a, 0x38, 0x87, 0xfc, 0x9b, 0x3d, 0xbc, 0xef, 0x2b, 0x14, 0xdf, 0x27, 0xce, 0xd1, 0xca, 0x99, 0xfc, 0xed, 0x64, 0xa9, 0x85, 0xe2, 0x13, 0x15, 0x1f, 0xa3, 0xb8, 0x15, 0xb5, 0x85, 0xfa, 0x4, 0xc1, 0xf9, 0xe2, 0x38, 0xae, 0x52, 0x5, 0xdb, 0x9, 0x8a, 0x2f, 0x54, 0xdc, 0x5d, 0x9c, 0x60, 0xf6, 0x6a, 0x49, 0x7e, 0xb7, 0x84, 0xc0, 0xfb, 0x94, 0x36, 0xfb, 0x54, 0x71, 0xf2, 0x40, 0x83, 0xa0, 0xc3, 0x14, 0x5f, 0xa4, 0xf8, 0x74, 0xc5, 0x47, 0x24, 0x39, 0xe7, 0x5b, 0x8, 0xbe, 0x77, 0x14, 0xa3, 0x72, 0xc3, 0x37, 0xfb, 0xb, 0xf0, 0x70, 0xe3, 0x1b, 0x8, 0xbc, 0xfa, 0x69, 0x5e, 0xb, 0x3, 0x8d, 0xe4, 0xdb, 0xdf, 0x8a, 0x13, 0x84, 0x9d, 0x18, 0x8e, 0xb6, 0x9b, 0xd2, 0x7a, 0x13, 0x77, 0x6, 0xec, 0x7c, 0xb5, 0xf9, 0xaa, 0xd5, 0xdd, 0xde, 0x64, 0x2c, 0xa6, 0x87, 0x14, 0x8f, 0x93, 0x78, 0x6a, 0x93, 0x9b, 0xd4, 0x8a, 0xf7, 0x8b, 0x9c, 0xc5, 0x9a, 0x49, 0x0, 0xf, 0xf3, 0x8a, 0x3c, 0xc7, 0x41, 0x8a, 0xbb, 0xf1, 0x7b, 0x89, 0x54, 0x93, 0x80, 0x29, 0x49, 0x41, 0x40, 0x61, 0xbc, 0x6e, 0x56, 0x7c, 0xf4, 0x1e, 0xfe, 0x5f, 0xc6, 0xb1, 0xda, 0xc6, 0x6b, 0x66, 0xf1, 0x77, 0x6b, 0x19, 0xc0, 0xac, 0x42, 0xa0, 0x82, 0x2f, 0xe7, 0xb8, 0x3d, 0x25, 0x4e, 0x38, 0xa0, 0x5f, 0xda, 0x43, 0x77, 0xde, 0xc3, 0xa9, 0xec, 0x8f, 0x49, 0x15, 0x9c, 0x73, 0x8, 0xd1, 0x52, 0xc5, 0xb9, 0x8a, 0xf, 0xe4, 0x3d, 0xe4, 0xb0, 0x7d, 0x1c, 0xf9, 0x36, 0x9a, 0x3e, 0xf, 0x13, 0x88, 0x91, 0x6, 0xde, 0xe, 0x4e, 0xac, 0x96, 0xbc, 0x95, 0x5, 0xdc, 0x60, 0x71, 0x12, 0x6d, 0x5b, 0x24, 0x0, 0xed, 0x3b, 0xc5, 0x1f, 0x2a, 0xfe, 0x84, 0xd2, 0x6c, 0xd, 0x25, 0x72, 0x39, 0x17, 0x4f, 0x4d, 0xaa, 0x56, 0x5d, 0xc4, 0x49, 0xde, 0xfd, 0x5, 0xff, 0x8e, 0xeb, 0x3c, 0xca, 0x9d, 0x69, 0x60, 0x82, 0x4a, 0xec, 0x6, 0x95, 0x1b, 0xb, 0x63, 0x5f, 0x6a, 0xe, 0x42, 0xeb, 0xee, 0x92, 0x3d, 0xe7, 0x32, 0x6e, 0xa5, 0xd6, 0xa0, 0xf3, 0x21, 0x93, 0x15, 0x12, 0x87, 0x2a, 0x1e, 0x2b, 0x4e, 0xe6, 0x88, 0x79, 0xad, 0x4f, 0xa9, 0xee, 0xcf, 0xe6, 0x6e, 0xac, 0x81, 0x57, 0x4a, 0xe0, 0xe5, 0x71, 0xb1, 0xe6, 0x73, 0x87, 0x41, 0xa2, 0xf3, 0x49, 0x6c, 0xc7, 0x38, 0x6e, 0xe8, 0x2b, 0x42, 0x1, 0x6f, 0x55, 0xfc, 0x9c, 0x87, 0x6b, 0x7, 0xf7, 0x70, 0xbf, 0xfc, 0xff, 0x51, 0xd4, 0x7c, 0x2, 0x8, 0x73, 0xfe, 0xad, 0x31, 0xe7, 0xa5, 0xec, 0x63, 0xd, 0xa, 0x7a, 0x7c, 0xbf, 0xab, 0x38, 0x69, 0x6a, 0x1d, 0xf8, 0xbf, 0xd3, 0xc8, 0x28, 0x59, 0x82, 0xf0, 0xc6, 0x39, 0x51, 0x5, 0x5e, 0x2e, 0x59, 0x24, 0xf5, 0x80, 0x69, 0x48, 0xec, 0x3e, 0xe2, 0x94, 0x96, 0x30, 0xd5, 0xd4, 0xd5, 0x8a, 0x5f, 0xe6, 0xa4, 0x7f, 0x29, 0x7b, 0xaf, 0xf9, 0xb2, 0x83, 0xb, 0x16, 0xb, 0xec, 0x23, 0xee, 0x70, 0x87, 0x28, 0xbe, 0x8a, 0xbb, 0xe6, 0x81, 0x5c, 0xec, 0xd3, 0x8, 0xbe, 0x17, 0x7d, 0x1e, 0x9b, 0x7c, 0x4a, 0xdf, 0xbe, 0x9, 0x7f, 0x2f, 0xa2, 0x2a, 0x3c, 0x85, 0x6a, 0xd2, 0xaa, 0x14, 0xd5, 0xcb, 0xd3, 0x39, 0x36, 0xf5, 0xf8, 0x7e, 0xa9, 0xe2, 0x31, 0x8a, 0x5f, 0x52, 0xbc, 0x6c, 0x1f, 0xdf, 0xdd, 0x2e, 0x4e, 0x15, 0x1, 0xd8, 0xc5, 0xa8, 0x70, 0x30, 0x9e, 0x2, 0xf3, 0x8, 0xf6, 0x73, 0x0, 0xfb, 0xd, 0x5b, 0xfa, 0x59, 0xaa, 0xb0, 0x43, 0xb8, 0xe8, 0xdd, 0xa4, 0x6b, 0x14, 0x8f, 0xe4, 0x1c, 0x9, 0x6d, 0xcc, 0x7f, 0x29, 0x7e, 0x42, 0x9c, 0x62, 0x5b, 0x25, 0xfb, 0xd0, 0xb2, 0x56, 0x52, 0x50, 0xfd, 0x93, 0xeb, 0xa8, 0x13, 0x85, 0x6c, 0x7f, 0xee, 0x86, 0x3d, 0xb9, 0x93, 0xde, 0x45, 0x93, 0xa0, 0x3c, 0x99, 0xc5, 0x18, 0x26, 0xca, 0xe3, 0xae, 0x23, 0x29, 0xda, 0x6, 0x47, 0x71, 0xe1, 0x3d, 0x67, 0x80, 0xe, 0x8b, 0x61, 0x28, 0xa5, 0x2f, 0xe2, 0x41, 0x3f, 0x97, 0xd4, 0xb, 0x2d, 0xc1, 0x4e, 0xba, 0x91, 0x92, 0x7c, 0xaa, 0xd1, 0x47, 0x2c, 0xa2, 0x5f, 0xf9, 0x38, 0x2e, 0x28, 0xa1, 0x31, 0x3d, 0x1, 0x74, 0xef, 0x2b, 0x3e, 0x47, 0xf1, 0x91, 0xec, 0xe3, 0x3b, 0x4, 0x4d, 0x2a, 0xa0, 0xc3, 0xae, 0xfe, 0xba, 0x1, 0xba, 0xd1, 0x1c, 0xcb, 0x7, 0x92, 0x0, 0xdd, 0xcf, 0xed, 0xde, 0x73, 0xb8, 0x43, 0x1c, 0xce, 0x5d, 0x48, 0xef, 0xbc, 0x57, 0x11, 0x9c, 0x6e, 0xd1, 0x1, 0xbc, 0xde, 0x18, 0x3, 0x74, 0x93, 0x38, 0x5e, 0x97, 0x70, 0xa7, 0x4b, 0xd5, 0xc6, 0x85, 0x66, 0x34, 0x8b, 0x1a, 0x13, 0xc6, 0xe2, 0x6f, 0xbc, 0xa7, 0xaa, 0x8a, 0xef, 0x21, 0xa0, 0xeb, 0x45, 0xd, 0x78, 0xb5, 0xc, 0xdb, 0x6e, 0x65, 0x92, 0xdf, 0x19, 0x46, 0x69, 0x5b, 0x60, 0x78, 0x26, 0x87, 0x53, 0x5d, 0x18, 0xcd, 0x5d, 0x2c, 0x5d, 0xfa, 0x9e, 0x52, 0xef, 0x21, 0x43, 0xd, 0x1e, 0xc7, 0x85, 0xeb, 0x35, 0x9d, 0x45, 0xd0, 0xb7, 0xe2, 0xfb, 0xc5, 0x74, 0x1a, 0x14, 0x70, 0xa7, 0xab, 0xac, 0x7, 0xb1, 0xa5, 0x38, 0xa1, 0x7a, 0x7, 0x70, 0x61, 0x5d, 0x41, 0x41, 0xb5, 0xc9, 0xc5, 0xbe, 0xaf, 0x23, 0x0, 0x7b, 0x48, 0xbc, 0xc4, 0x63, 0x3f, 0x89, 0xe7, 0x62, 0xa6, 0x43, 0x75, 0x79, 0xff, 0x3, 0xf8, 0xbe, 0x98, 0xf7, 0x80, 0xf1, 0x9a, 0xeb, 0x52, 0xff, 0x97, 0x52, 0xdb, 0x39, 0x8d, 0x42, 0x58, 0xcf, 0x7, 0x2a, 0x27, 0x34, 0x8b, 0x12, 0xf0, 0xe, 0x31, 0xc, 0xf5, 0xc2, 0x24, 0xbf, 0x53, 0xc0, 0xc5, 0x23, 0x54, 0x8f, 0x3a, 0x50, 0xed, 0xd8, 0xe2, 0x72, 0xdf, 0x20, 0x9, 0x6f, 0x12, 0x27, 0x8f, 0x50, 0x3b, 0x12, 0x9e, 0x10, 0x6f, 0xb3, 0x29, 0xe0, 0xe1, 0x7c, 0xcd, 0x90, 0xe6, 0x13, 0xe8, 0xbd, 0x7c, 0xd5, 0x85, 0x6b, 0x63, 0x8c, 0x1a, 0x1b, 0x3b, 0xd1, 0x33, 0x1e, 0xde, 0xc7, 0xc7, 0x54, 0x69, 0x7f, 0xe4, 0xfb, 0x6b, 0xd3, 0x1c, 0xb7, 0xea, 0x1c, 0x17, 0x5d, 0xbc, 0xeb, 0x3b, 0xda, 0xe3, 0x5e, 0xdd, 0x3, 0x76, 0xce, 0xe3, 0xd, 0x27, 0x4b, 0x7, 0xee, 0xac, 0xcd, 0xa2, 0x2, 0xbc, 0x2e, 0x86, 0x93, 0x21, 0x59, 0xe0, 0x5d, 0x47, 0xd5, 0xa0, 0x2f, 0x6d, 0xbc, 0x65, 0x1e, 0xf7, 0x11, 0xd2, 0xfa, 0x79, 0xb6, 0xf, 0xa6, 0xde, 0xef, 0x5, 0x75, 0xa5, 0x1d, 0x59, 0x95, 0xef, 0x1, 0xf8, 0x4b, 0x5d, 0xda, 0xc1, 0xbb, 0xf2, 0x5a, 0xa0, 0x17, 0xb8, 0x7b, 0x7b, 0x4d, 0xdf, 0xd2, 0x16, 0x9b, 0xc4, 0xdf, 0x5e, 0x53, 0xc9, 0xeb, 0xc0, 0xf6, 0xff, 0x3b, 0x6d, 0x2e, 0xe1, 0xdc, 0x43, 0xf8, 0x7e, 0xed, 0x71, 0xff, 0xd7, 0xd3, 0x71, 0xf3, 0x2c, 0xdf, 0x1f, 0x41, 0xb5, 0xb3, 0x6e, 0x14, 0x80, 0x57, 0x60, 0xa8, 0x53, 0xf3, 0x93, 0xfc, 0x4e, 0x11, 0x8d, 0x76, 0x3f, 0x9d, 0x1d, 0x37, 0xb0, 0x8f, 0x42, 0xf5, 0xe6, 0x28, 0x17, 0xaf, 0xd, 0x9b, 0xa4, 0xe, 0x17, 0x97, 0xb6, 0x77, 0x87, 0xbb, 0xa4, 0x9e, 0x69, 0xea, 0x6f, 0x38, 0x21, 0xee, 0xf5, 0x71, 0xdc, 0x26, 0x52, 0x55, 0x7b, 0x2f, 0x8d, 0x6b, 0xdc, 0xa1, 0xf8, 0x2, 0xb6, 0xe1, 0x10, 0xe9, 0x25, 0xf1, 0x7c, 0x4e, 0xaf, 0x9, 0x73, 0xf3, 0x6b, 0xee, 0xb6, 0x42, 0x27, 0xcc, 0x38, 0xd9, 0x83, 0x23, 0x30, 0x4c, 0xc0, 0x6b, 0xc5, 0xed, 0x5c, 0xab, 0x26, 0xdb, 0x53, 0x1c, 0x10, 0x3f, 0x69, 0x4d, 0x82, 0xca, 0x39, 0xd8, 0x45, 0x75, 0x16, 0x93, 0x88, 0xa3, 0x8b, 0x36, 0xfc, 0xdb, 0xa3, 0x54, 0xb, 0xdd, 0xa2, 0xaa, 0x86, 0x8a, 0xf6, 0xae, 0xf, 0x3b, 0x85, 0x9b, 0x84, 0x7e, 0xff, 0x91, 0xed, 0xb5, 0xdc, 0x39, 0x57, 0xf9, 0xdc, 0x87, 0x32, 0xa, 0xdb, 0xcf, 0xf9, 0xfe, 0x7c, 0x9a, 0x20, 0xa1, 0x5, 0xde, 0x25, 0x86, 0x2d, 0xf3, 0x6a, 0x8, 0xfa, 0xfb, 0x3c, 0xd5, 0x27, 0x10, 0xa2, 0x62, 0xdc, 0x8, 0xea, 0xde, 0x4e, 0x67, 0x41, 0x7f, 0x3, 0x18, 0x37, 0xb9, 0xdc, 0xef, 0x36, 0x74, 0xac, 0x80, 0xa6, 0x84, 0x68, 0x7d, 0xc0, 0xae, 0x7b, 0xd0, 0xd8, 0x5d, 0xae, 0x37, 0xc6, 0xdf, 0x6f, 0xda, 0x42, 0xa7, 0x4b, 0x31, 0xdf, 0x23, 0x91, 0xfb, 0xc8, 0x30, 0x2, 0xaf, 0x16, 0x6f, 0x44, 0x1b, 0xca, 0x53, 0x43, 0xd0, 0x67, 0xa8, 0x69, 0xfa, 0x40, 0xb8, 0x11, 0x8d, 0xfb, 0x74, 0xa9, 0xb6, 0x1, 0xb4, 0x62, 0xda, 0xaf, 0x6e, 0x9f, 0x79, 0x35, 0x93, 0x78, 0x44, 0x47, 0x61, 0x88, 0x80, 0x77, 0x3d, 0x9d, 0x1a, 0x42, 0x35, 0xfc, 0xa5, 0x80, 0xfb, 0x33, 0x57, 0xe2, 0x95, 0x13, 0xaa, 0x1b, 0x1a, 0x50, 0xa8, 0x80, 0x37, 0x88, 0x8e, 0xa, 0xa1, 0xce, 0xbc, 0x3d, 0x24, 0xfd, 0x7e, 0xc3, 0x0, 0x86, 0x1b, 0xe5, 0xf1, 0xab, 0x18, 0x76, 0xdd, 0x83, 0x14, 0x42, 0x6e, 0x53, 0xbe, 0xa1, 0xd6, 0xae, 0x9, 0xc9, 0x38, 0xe7, 0xd3, 0x31, 0x3, 0xc2, 0x11, 0xc5, 0x9d, 0x19, 0xd2, 0x2f, 0xd4, 0x87, 0x9d, 0x9e, 0x95, 0x95, 0x25, 0x25, 0xa5, 0x25, 0xbd, 0x67, 0xcd, 0x9d, 0xd7, 0x23, 0x4c, 0xc0, 0x83, 0xea, 0x73, 0x2b, 0xdb, 0x70, 0xa8, 0x3c, 0x1d, 0x22, 0x29, 0x5c, 0x28, 0xf1, 0x40, 0x5a, 0x37, 0xcb, 0xd1, 0xc3, 0x61, 0x34, 0xc6, 0xa3, 0x3e, 0xe7, 0x26, 0xd8, 0x94, 0x61, 0x20, 0xa8, 0xdf, 0x4d, 0xd8, 0x7e, 0x52, 0x9c, 0xe0, 0x88, 0x4c, 0x20, 0x8, 0xdd, 0x3f, 0xa1, 0x11, 0x8b, 0xc5, 0x64, 0xf2, 0x87, 0x9f, 0xdc, 0xb0, 0x79, 0xeb, 0xb6, 0x50, 0x0, 0x2f, 0xc6, 0x5, 0xa6, 0x5d, 0xb2, 0x77, 0x88, 0xbb, 0x7, 0xb8, 0x5e, 0x53, 0xb9, 0x1, 0x3c, 0x44, 0xcc, 0xd4, 0x71, 0xe9, 0xba, 0xe3, 0x3c, 0x1c, 0x87, 0x5d, 0x86, 0x50, 0xae, 0x1f, 0x82, 0x31, 0xc6, 0x19, 0xad, 0x8e, 0x12, 0x82, 0x4b, 0x7f, 0x6c, 0x86, 0xf5, 0xef, 0x6d, 0xc5, 0x1f, 0xc7, 0x72, 0x72, 0x64, 0xed, 0xfa, 0x8d, 0xa7, 0x7d, 0x53, 0x58, 0x74, 0x6c, 0x18, 0x80, 0x37, 0x4a, 0x9c, 0xa8, 0x0, 0xd0, 0xb, 0x19, 0xa0, 0xb7, 0x57, 0x86, 0xb4, 0x81, 0xf, 0xc7, 0x90, 0x1b, 0xcf, 0x21, 0x5c, 0xc7, 0xb1, 0xf0, 0x8a, 0x4c, 0x2f, 0x60, 0xdb, 0x10, 0x8c, 0x2f, 0x82, 0xae, 0x75, 0x52, 0x34, 0xdc, 0xf8, 0xcb, 0x32, 0xac, 0x7f, 0x38, 0x73, 0x46, 0x58, 0x99, 0x28, 0x95, 0x33, 0x7b, 0xea, 0xb4, 0xe9, 0x7d, 0x32, 0x1d, 0x78, 0xa3, 0x24, 0x5e, 0xca, 0xf, 0xbb, 0xc6, 0x10, 0x9, 0x27, 0xad, 0xe0, 0x2b, 0xdc, 0xf4, 0xf5, 0x5c, 0xb8, 0xde, 0x5b, 0xc6, 0x35, 0xbd, 0x20, 0x84, 0xbf, 0xe9, 0x38, 0xd8, 0x30, 0x14, 0x95, 0x3a, 0xc7, 0x68, 0x4f, 0xc8, 0xd0, 0x3e, 0x22, 0x28, 0x60, 0x75, 0x95, 0xdc, 0x5c, 0x59, 0xb8, 0x64, 0xf9, 0x99, 0xab, 0xd6, 0xac, 0xab, 0x96, 0x89, 0xc0, 0x83, 0xf3, 0x0, 0xae, 0xf8, 0xdf, 0xf1, 0x3d, 0x62, 0x32, 0x2f, 0x95, 0xf0, 0x3e, 0x2b, 0xaf, 0x38, 0xc1, 0x39, 0x92, 0x2e, 0xbd, 0xee, 0x71, 0x7f, 0x91, 0x23, 0x37, 0x83, 0x6d, 0x38, 0x3, 0x2e, 0xc8, 0xe0, 0xb1, 0xc5, 0xfa, 0x3d, 0x99, 0x6d, 0xc4, 0x4a, 0x7e, 0x96, 0xa1, 0xfd, 0xc4, 0x99, 0xe2, 0xfb, 0xd9, 0xd9, 0x59, 0xb2, 0x7d, 0xc7, 0xce, 0x43, 0x7f, 0x58, 0xbe, 0xa2, 0x63, 0xa6, 0x1, 0xf, 0x51, 0xb, 0x38, 0x78, 0xec, 0x6b, 0x2c, 0x82, 0xb3, 0x24, 0xb8, 0xf3, 0x18, 0xb7, 0x54, 0xd, 0x31, 0xd4, 0xcd, 0x74, 0x68, 0x87, 0xa4, 0x91, 0xf5, 0x9c, 0x2, 0x99, 0x8e, 0x1b, 0xa8, 0x49, 0xa7, 0x66, 0xe8, 0xd8, 0x1e, 0x4a, 0x6, 0x21, 0x9f, 0x2e, 0x93, 0xbd, 0xdd, 0x3f, 0x1d, 0x81, 0xed, 0x2e, 0x2f, 0x97, 0xa2, 0x45, 0x4b, 0x4e, 0x34, 0x81, 0x17, 0x94, 0x7, 0xb, 0x6, 0x3c, 0xe, 0xc7, 0x91, 0xc6, 0xf2, 0xa6, 0x61, 0x57, 0x20, 0xaf, 0xd, 0x67, 0x5f, 0xb3, 0x25, 0xdc, 0x94, 0xe5, 0x32, 0x88, 0xfd, 0x98, 0xa7, 0x89, 0xda, 0x2e, 0x11, 0xe7, 0xec, 0x10, 0xf3, 0x32, 0x52, 0x32, 0xcf, 0xd9, 0xd2, 0x56, 0xe2, 0x1, 0xf0, 0x9f, 0x64, 0xf8, 0x3a, 0xc0, 0x6e, 0x5c, 0x1e, 0xcb, 0x8d, 0xc9, 0xf7, 0xb, 0x17, 0x77, 0x36, 0x13, 0x61, 0x71, 0x70, 0x8a, 0x4c, 0xe0, 0x1c, 0xf1, 0xfe, 0x39, 0xe8, 0x31, 0xfe, 0x1e, 0xe, 0x3c, 0x3b, 0x25, 0x4c, 0x28, 0xec, 0x8b, 0xfb, 0xc9, 0x41, 0x14, 0xc5, 0xc1, 0xfd, 0xd7, 0xa2, 0xca, 0x8b, 0x7e, 0x9a, 0x45, 0x86, 0xf0, 0xa, 0x7f, 0x30, 0x22, 0x13, 0x76, 0x46, 0x0, 0xc8, 0x3f, 0x47, 0xd7, 0xf1, 0xde, 0xfb, 0xd1, 0x3e, 0xc5, 0x91, 0xe, 0x12, 0x7c, 0x91, 0x34, 0x8c, 0xb8, 0xd7, 0x2f, 0x24, 0xf8, 0xa2, 0x45, 0x87, 0x19, 0xed, 0x4c, 0xf, 0x6d, 0x5b, 0xac, 0x78, 0x69, 0x4e, 0x76, 0xf6, 0xc1, 0xc5, 0x9b, 0xb7, 0xb4, 0x8f, 0x25, 0x48, 0x8f, 0x20, 0x5d, 0xb1, 0xc8, 0x93, 0x7b, 0x89, 0x4e, 0x95, 0x5, 0x3e, 0xfe, 0x2e, 0x4a, 0x39, 0x20, 0x6, 0x14, 0xe9, 0x34, 0x8, 0xeb, 0x69, 0x41, 0x29, 0xaf, 0x81, 0x57, 0x95, 0xbb, 0x4c, 0x49, 0x2, 0xf0, 0x60, 0xbb, 0x21, 0x87, 0xc, 0x67, 0x46, 0x85, 0x64, 0x9c, 0xaf, 0xad, 0x12, 0x17, 0xaa, 0x50, 0x65, 0x0, 0x41, 0xb0, 0xf4, 0xa7, 0x26, 0x82, 0xb3, 0xa8, 0x46, 0x14, 0x90, 0x57, 0x93, 0x8b, 0xf8, 0xbf, 0xa9, 0x4, 0xe1, 0xd2, 0x0, 0xb4, 0xa6, 0xa6, 0x7c, 0x45, 0x8d, 0x94, 0x65, 0x19, 0x3e, 0x9e, 0x58, 0x37, 0x4b, 0xb3, 0x15, 0xf0, 0x36, 0x14, 0x6f, 0x6a, 0x10, 0x54, 0xe9, 0x87, 0x32, 0xe, 0x16, 0xca, 0x2e, 0x7c, 0x25, 0x4e, 0x1e, 0xd3, 0x64, 0xbe, 0xf7, 0x83, 0xb0, 0x88, 0x2e, 0xa4, 0xe3, 0x0, 0xe7, 0x2a, 0x79, 0x49, 0xec, 0x82, 0x3a, 0xf, 0x10, 0x35, 0x38, 0xf4, 0xb1, 0x40, 0xe7, 0x84, 0xcf, 0x6d, 0xe2, 0x82, 0x9c, 0xce, 0x45, 0xf9, 0x1f, 0x9, 0xcf, 0x21, 0xf4, 0xde, 0xe8, 0x29, 0xaa, 0x9e, 0x38, 0x2b, 0x1b, 0x40, 0xe1, 0x84, 0x5d, 0x57, 0x17, 0x2d, 0x1a, 0x44, 0xdb, 0xea, 0x3b, 0xaa, 0x53, 0xa8, 0xc3, 0x32, 0x93, 0x2, 0xa9, 0xd4, 0xe3, 0xbe, 0x69, 0x2f, 0xb1, 0xae, 0x3e, 0x97, 0xe9, 0x84, 0x0, 0x90, 0x93, 0x15, 0xf8, 0x6a, 0x99, 0xc0, 0x83, 0x53, 0xe3, 0xa, 0x4a, 0x79, 0x2f, 0xd5, 0x99, 0x2c, 0x4a, 0x53, 0xec, 0x18, 0xeb, 0x24, 0xf5, 0x72, 0xb, 0xe9, 0x4a, 0xc8, 0x61, 0x94, 0xe4, 0x7b, 0xaa, 0xff, 0x8, 0x75, 0x60, 0x11, 0xa5, 0xe7, 0x7a, 0xee, 0xc2, 0x15, 0x46, 0xbf, 0xb5, 0xa, 0xa, 0xc9, 0x7f, 0x10, 0xd5, 0xe5, 0x46, 0x5c, 0x0, 0xfa, 0xff, 0x9d, 0xc9, 0x50, 0xd5, 0x10, 0x72, 0xf5, 0x63, 0x4, 0x76, 0x3f, 0x8c, 0x5, 0xea, 0xb9, 0x3c, 0x46, 0xcd, 0x0, 0xa9, 0x36, 0x3d, 0x8, 0xc2, 0x3c, 0xf2, 0x31, 0xe4, 0x6b, 0xa8, 0x1d, 0x2c, 0x22, 0x0, 0x3f, 0xa2, 0x20, 0x2a, 0xf2, 0x40, 0x35, 0xad, 0xcd, 0x57, 0x8c, 0xfb, 0xef, 0x25, 0x9e, 0xbd, 0x91, 0xa9, 0x1a, 0x84, 0x3e, 0x6f, 0xcc, 0x33, 0x81, 0xa7, 0x6b, 0x6, 0x46, 0x91, 0x30, 0x19, 0x57, 0x51, 0x65, 0x32, 0x1, 0x57, 0x48, 0xc7, 0xc1, 0x14, 0xda, 0x8, 0xab, 0x53, 0xdc, 0xa1, 0x72, 0x8, 0xba, 0xe6, 0x5c, 0x84, 0xd8, 0x3d, 0x91, 0xfb, 0x87, 0xe2, 0xa8, 0x38, 0x3a, 0xc8, 0x97, 0x68, 0x3d, 0xcf, 0xf, 0x42, 0x72, 0x6, 0x79, 0x4, 0x5, 0xf, 0x92, 0x66, 0x4f, 0xa4, 0xba, 0xde, 0x8e, 0x1a, 0x41, 0x15, 0xb6, 0xdb, 0x51, 0xc8, 0xe1, 0x7b, 0xb, 0xe9, 0x0, 0x41, 0x24, 0x7, 0x2a, 0xb9, 0xad, 0x75, 0xb1, 0x5f, 0x10, 0x7e, 0xb7, 0x67, 0xfa, 0xe0, 0x55, 0x54, 0xc4, 0x2d, 0x90, 0x58, 0x0, 0x46, 0xbb, 0xdf, 0x4, 0xa9, 0x88, 0xf8, 0x4e, 0xf3, 0x41, 0x27, 0x38, 0xd0, 0x1c, 0x4d, 0x75, 0x30, 0x1d, 0x75, 0xa8, 0x9c, 0xbb, 0xda, 0x1a, 0x4a, 0x77, 0x5d, 0x45, 0xb, 0x2a, 0x18, 0x5c, 0xf0, 0xe7, 0x8a, 0x13, 0x59, 0x51, 0x35, 0x82, 0xe3, 0xa, 0x1, 0xb5, 0x84, 0xc, 0xdb, 0x1c, 0x1e, 0x72, 0xc4, 0x4b, 0x76, 0x24, 0x18, 0x1, 0xc4, 0xa3, 0x28, 0x98, 0x62, 0xf4, 0x21, 0x80, 0x91, 0x28, 0xba, 0x81, 0x63, 0xff, 0x22, 0x81, 0xb8, 0x3d, 0x8d, 0xf1, 0x17, 0xc3, 0xf9, 0x95, 0x15, 0x2, 0xe0, 0xa1, 0x8f, 0xa5, 0x31, 0x89, 0x36, 0x21, 0x7, 0xe, 0x19, 0x2, 0xc7, 0xf1, 0x3d, 0xd4, 0x9d, 0x21, 0x9c, 0x6c, 0xaf, 0xa8, 0xdc, 0x70, 0xb6, 0x8c, 0xa1, 0x5d, 0x34, 0x5e, 0xa2, 0x4f, 0xbb, 0xa9, 0xa2, 0x2f, 0x93, 0xf8, 0xe3, 0xb3, 0xeb, 0x13, 0x88, 0xa8, 0xc7, 0xd9, 0x9d, 0x6d, 0xa8, 0xa5, 0x75, 0x69, 0x5f, 0x5f, 0x40, 0x95, 0x14, 0x51, 0xfc, 0x4f, 0x48, 0xea, 0x75, 0x70, 0x36, 0xf2, 0x15, 0x26, 0x2, 0xa, 0xf8, 0xee, 0x90, 0xca, 0xd7, 0x5b, 0xf5, 0x7c, 0xa7, 0x1b, 0x3a, 0xf0, 0x32, 0x69, 0xd6, 0xb8, 0x51, 0x56, 0x69, 0x59, 0x59, 0xa4, 0x81, 0x57, 0x95, 0x12, 0x55, 0x83, 0xe, 0x35, 0x11, 0x7f, 0x23, 0xff, 0x1b, 0x49, 0xe2, 0x7, 0xad, 0x95, 0xfd, 0x97, 0x60, 0xc3, 0x4f, 0x95, 0x78, 0xfe, 0x24, 0x52, 0xbb, 0x7a, 0x12, 0x70, 0xdd, 0x38, 0x47, 0xa8, 0x2c, 0x80, 0x72, 0x81, 0x57, 0x52, 0x28, 0x4e, 0xaa, 0xc4, 0xd8, 0xd6, 0xe2, 0x2e, 0xba, 0x3a, 0x53, 0x7, 0x2, 0xd8, 0x6b, 0x94, 0x5f, 0x5f, 0xe, 0x6a, 0xe8, 0xe4, 0x43, 0x67, 0x47, 0x78, 0xd2, 0x61, 0x83, 0xfc, 0x92, 0x6d, 0xa8, 0x42, 0x17, 0x5, 0x0, 0xba, 0x28, 0xab, 0xf0, 0x95, 0x21, 0x78, 0x3a, 0xc7, 0xd2, 0x31, 0x83, 0x33, 0xdc, 0x51, 0xc6, 0x9c, 0xa0, 0x82, 0x1c, 0xe2, 0x50, 0xff, 0x90, 0xe2, 0xf5, 0xf4, 0xce, 0xda, 0x38, 0x4c, 0x3, 0x11, 0x55, 0xe0, 0xc1, 0xb6, 0x18, 0xca, 0x36, 0xce, 0x98, 0x6, 0x4a, 0xf8, 0xdd, 0xfa, 0x51, 0x23, 0xb8, 0xd6, 0x6f, 0xe4, 0x5c, 0x99, 0xa5, 0xdb, 0x91, 0xa9, 0x3d, 0x2c, 0xc9, 0x6b, 0x98, 0x89, 0xc0, 0x9d, 0x2c, 0xf0, 0x82, 0x27, 0xd4, 0x65, 0xc4, 0xb9, 0x5b, 0x5, 0x27, 0x71, 0x9b, 0x5d, 0xe7, 0x19, 0x4b, 0xb0, 0x9, 0x2f, 0x93, 0x78, 0x26, 0x8a, 0x6, 0xdf, 0xb1, 0x49, 0x7c, 0xb7, 0xd0, 0xd8, 0x31, 0x4f, 0xb2, 0xc0, 0xb, 0x96, 0x60, 0xb8, 0x9f, 0xc5, 0x36, 0xe, 0xe5, 0x3f, 0xb0, 0x6b, 0x3b, 0x14, 0x4, 0x47, 0x94, 0xae, 0x34, 0x80, 0xe3, 0x88, 0x5b, 0x92, 0x4, 0xed, 0x3c, 0x3, 0x78, 0x79, 0x16, 0x78, 0xc1, 0xaa, 0x99, 0x5a, 0xdf, 0x9f, 0x68, 0xd7, 0x73, 0xa8, 0x8, 0x25, 0xf0, 0x75, 0x59, 0x3c, 0xd8, 0x81, 0x2d, 0x93, 0xf8, 0xce, 0xbb, 0x7c, 0xc5, 0x11, 0x4e, 0x57, 0xb, 0xbc, 0xe0, 0xc8, 0xcc, 0x9a, 0x9e, 0x69, 0xd7, 0x72, 0xa8, 0x8, 0x7, 0xed, 0xcf, 0xb0, 0x8d, 0x14, 0xaa, 0x2e, 0x49, 0x7c, 0xe7, 0xd, 0x89, 0x47, 0x17, 0xf5, 0xb1, 0xc0, 0xb, 0x8e, 0x74, 0x1c, 0x25, 0xb2, 0x1c, 0x36, 0xda, 0xb5, 0x1c, 0x3a, 0x9a, 0x61, 0x0, 0xa9, 0x55, 0x12, 0x9f, 0x87, 0xf3, 0x4c, 0xa7, 0x4, 0x21, 0x48, 0xa2, 0xb9, 0x5, 0x5e, 0x30, 0x94, 0x69, 0xee, 0xfb, 0xa, 0x8b, 0xa5, 0x94, 0x68, 0xa5, 0x21, 0x30, 0x93, 0xb5, 0xd9, 0xc6, 0x1b, 0xf6, 0xfd, 0x95, 0x16, 0x78, 0xc1, 0x90, 0x2e, 0x11, 0x51, 0x4d, 0xd2, 0xcf, 0xf8, 0x76, 0x83, 0x1a, 0x5b, 0x2c, 0xa5, 0x44, 0x8, 0xe1, 0x2b, 0x4f, 0xf1, 0x3b, 0xc8, 0x11, 0xd4, 0x4e, 0x16, 0xc4, 0xe4, 0xb6, 0xb6, 0xc0, 0xf3, 0x9f, 0x16, 0xf3, 0x35, 0x27, 0x49, 0x55, 0xc5, 0x6b, 0xea, 0x65, 0xb1, 0x94, 0x12, 0x21, 0xb6, 0xb6, 0xba, 0x61, 0x2e, 0x24, 0x43, 0xf8, 0xdc, 0x68, 0xb6, 0x11, 0x4, 0x7f, 0x77, 0x86, 0xdc, 0x4b, 0x4d, 0x89, 0x3f, 0xc5, 0xa9, 0x6e, 0xd4, 0x81, 0x87, 0x43, 0xd5, 0x1d, 0x6c, 0x17, 0x4, 0xdc, 0x97, 0x6e, 0x16, 0x78, 0x29, 0x53, 0x2b, 0x43, 0xc5, 0x4c, 0x25, 0x21, 0x7a, 0xbc, 0x61, 0xeb, 0xc1, 0xc9, 0xd2, 0x2f, 0x3, 0xee, 0x5, 0xd1, 0x52, 0x88, 0xc4, 0x41, 0xe8, 0xe2, 0xc5, 0x51, 0x7, 0x1e, 0x82, 0x6e, 0x75, 0x9d, 0x96, 0x33, 0x2, 0x54, 0x37, 0x21, 0xb5, 0x1f, 0x92, 0x68, 0x87, 0xe5, 0x79, 0x41, 0xba, 0xb0, 0x12, 0x84, 0xe7, 0x9c, 0x14, 0x55, 0x54, 0x4, 0x4b, 0xe8, 0x27, 0x43, 0x3d, 0x22, 0xf1, 0xfc, 0xb7, 0xa0, 0x4c, 0xc, 0xfd, 0xe4, 0x22, 0xe4, 0x33, 0x4e, 0x8a, 0x3a, 0xf0, 0x40, 0xfa, 0xf9, 0x64, 0xad, 0x29, 0x75, 0x82, 0x20, 0x80, 0xae, 0x4b, 0xc8, 0xc6, 0xd, 0xc5, 0x83, 0x7, 0x5, 0xf8, 0xfb, 0x8, 0x76, 0xd6, 0xe5, 0x4, 0xbf, 0xa0, 0x10, 0x4d, 0x85, 0x90, 0xfd, 0xae, 0x1f, 0x14, 0x82, 0xf8, 0x4d, 0x14, 0xfe, 0x6d, 0x18, 0xd0, 0xbd, 0xe0, 0xf1, 0x69, 0x2d, 0xd8, 0xc6, 0x73, 0x2e, 0x96, 0xee, 0xf, 0xc0, 0xc3, 0x80, 0xeb, 0x8a, 0xc8, 0xb7, 0xca, 0x5e, 0x9e, 0xca, 0xe9, 0x21, 0x41, 0xaf, 0xd7, 0xde, 0x35, 0x84, 0xab, 0x85, 0x21, 0x4e, 0x14, 0xc5, 0x6b, 0x91, 0x14, 0x8c, 0xf4, 0x9c, 0x9b, 0x2, 0xea, 0xc3, 0x10, 0xc3, 0x2e, 0xaf, 0x6c, 0x2a, 0x15, 0x1e, 0xa4, 0xa9, 0x2b, 0x8e, 0x23, 0x98, 0x62, 0x2, 0x1, 0xed, 0xb7, 0xd0, 0xd5, 0x2, 0x4, 0xcf, 0x72, 0x1c, 0x95, 0xf8, 0x81, 0xa8, 0x2, 0xf, 0xa0, 0x7b, 0x98, 0xed, 0x36, 0x46, 0xdb, 0x6b, 0x42, 0x9a, 0xcb, 0x38, 0x89, 0x47, 0xd8, 0x7f, 0xc5, 0x76, 0x18, 0xc6, 0x19, 0x65, 0xf2, 0xf4, 0x3, 0x4b, 0x90, 0xa6, 0x83, 0x10, 0xae, 0x2a, 0x3e, 0xfe, 0x7e, 0x77, 0x71, 0xca, 0x37, 0x80, 0xbe, 0x94, 0xf4, 0x9e, 0xe0, 0x8b, 0x47, 0xba, 0x7d, 0xc8, 0x36, 0xa, 0xde, 0xa2, 0xc2, 0x80, 0x5f, 0xe7, 0x7b, 0x0, 0xd9, 0xd, 0x6c, 0xa3, 0xec, 0xc7, 0x40, 0xd9, 0xc3, 0x83, 0x51, 0xa3, 0x6c, 0x7f, 0x3c, 0x42, 0x69, 0x3, 0x42, 0xa1, 0x9e, 0xfb, 0x3c, 0xfe, 0x3d, 0x44, 0xc7, 0x4f, 0xe3, 0x40, 0x83, 0xe0, 0xe4, 0x39, 0x53, 0xc2, 0x53, 0x8c, 0x17, 0x3b, 0xc3, 0x0, 0x89, 0x67, 0xe4, 0xa3, 0x76, 0xa, 0xc2, 0xb1, 0xda, 0xfb, 0xf0, 0xdb, 0x28, 0x1d, 0xf1, 0xa, 0xc1, 0x5f, 0x46, 0x5b, 0x2d, 0x9d, 0xfa, 0x2c, 0x5b, 0xb9, 0xe3, 0xe8, 0xf9, 0xef, 0xc2, 0xb9, 0x39, 0xc5, 0xc3, 0x7b, 0x40, 0xa2, 0x1d, 0xaa, 0x7c, 0xeb, 0xa, 0xe8, 0xa8, 0x4a, 0x80, 0xa7, 0xc1, 0xee, 0xf1, 0x91, 0xe1, 0x51, 0x6, 0x1e, 0xa4, 0xc, 0x12, 0x5f, 0xf5, 0x73, 0x6, 0x30, 0x99, 0x8f, 0x8b, 0xfb, 0x65, 0x18, 0x1a, 0x11, 0xe4, 0xd3, 0xd, 0x9b, 0x6e, 0x32, 0x25, 0xf8, 0x4a, 0x89, 0x17, 0x5c, 0xd, 0x3, 0xe1, 0x81, 0x8e, 0x88, 0xfe, 0xd0, 0x7, 0xd8, 0x8, 0x3c, 0xfe, 0x8c, 0xea, 0x7a, 0x35, 0x8f, 0x7e, 0x13, 0xa5, 0x20, 0xde, 0x96, 0x78, 0x6d, 0xd5, 0x9b, 0x25, 0x1e, 0x7f, 0x99, 0xe, 0xc1, 0xa1, 0xd1, 0x8b, 0xea, 0xb3, 0x70, 0xc7, 0x9b, 0xc2, 0xdd, 0xdc, 0x6d, 0xd5, 0xf3, 0x22, 0xda, 0xa4, 0xe7, 0xf2, 0x3d, 0xd6, 0x1c, 0x32, 0xe2, 0x67, 0xec, 0xed, 0xb, 0x51, 0xf7, 0xb8, 0xe1, 0x1, 0x1c, 0x28, 0xe3, 0xa7, 0x33, 0x95, 0x51, 0xf, 0x12, 0x2e, 0xe7, 0x13, 0xd2, 0xbc, 0x2e, 0xa2, 0x63, 0x8e, 0x16, 0xa7, 0xea, 0xd6, 0x3c, 0xda, 0x26, 0x0, 0x34, 0x2a, 0x49, 0xd, 0xe7, 0x84, 0xeb, 0x87, 0x3a, 0x9a, 0x55, 0xd4, 0xaa, 0x84, 0x60, 0xcc, 0xde, 0x22, 0xe0, 0x74, 0xb0, 0x32, 0xce, 0xa2, 0x46, 0x52, 0x6d, 0x86, 0xdd, 0x5a, 0xdb, 0x85, 0xdf, 0xc0, 0xf8, 0xa1, 0x4a, 0x38, 0x32, 0xd3, 0x51, 0x3e, 0xf0, 0x40, 0x43, 0x38, 0x3e, 0xe2, 0xe2, 0xbd, 0x6c, 0x22, 0x18, 0xa0, 0xed, 0x20, 0x82, 0x28, 0x87, 0xf6, 0x2b, 0xee, 0x65, 0xb0, 0xc4, 0x1f, 0xf2, 0x59, 0x19, 0xc2, 0xb5, 0x90, 0x4d, 0x8f, 0xda, 0x31, 0x2f, 0x1b, 0x8e, 0x94, 0xf7, 0xb9, 0xbe, 0x3e, 0xff, 0xb9, 0x2f, 0xef, 0xf, 0xae, 0x6e, 0x48, 0x6c, 0x64, 0xa2, 0xeb, 0x67, 0xe, 0x1c, 0x43, 0xfd, 0x7f, 0x22, 0x55, 0xc1, 0x1a, 0x29, 0xa8, 0x12, 0x50, 0x55, 0xee, 0xa0, 0x24, 0xc3, 0xc0, 0x22, 0xef, 0x4f, 0x57, 0x2d, 0x7b, 0x93, 0x3b, 0xde, 0xc8, 0x4, 0xb0, 0xa1, 0xce, 0x8b, 0x3e, 0x57, 0xbc, 0x91, 0xbf, 0x9f, 0xe9, 0x34, 0x8f, 0xc0, 0x18, 0x21, 0xf1, 0x43, 0x6c, 0x3c, 0xa3, 0x60, 0x2c, 0x55, 0x68, 0xd4, 0x48, 0x41, 0xea, 0x55, 0x43, 0x49, 0x3e, 0x44, 0x2f, 0x8f, 0xea, 0xf8, 0x30, 0x8e, 0xdf, 0x7, 0x12, 0xaf, 0x10, 0xb0, 0x96, 0x2, 0xf2, 0x1, 0xf, 0xee, 0xa5, 0x9c, 0x3b, 0xf6, 0x19, 0x9c, 0xb, 0x50, 0x4b, 0xde, 0xc3, 0xb7, 0xb4, 0xff, 0xbb, 0x25, 0xb9, 0xe, 0xe, 0xe0, 0x3d, 0xc0, 0x16, 0x9d, 0x25, 0x4e, 0x3d, 0xd8, 0xee, 0xfc, 0xdf, 0x66, 0xee, 0xd6, 0x0, 0xe3, 0xd2, 0x7d, 0x5d, 0xc8, 0xeb, 0x1a, 0x9a, 0x99, 0x42, 0x5f, 0x53, 0x8a, 0xff, 0x59, 0x1c, 0x77, 0x39, 0xee, 0xbb, 0x37, 0x79, 0x5, 0x8d, 0xf9, 0x79, 0x34, 0x86, 0x35, 0x68, 0x70, 0xe, 0x87, 0xd2, 0x7c, 0x28, 0x61, 0xd7, 0x9a, 0x93, 0x95, 0xf8, 0xec, 0x80, 0x52, 0xaa, 0x95, 0xf, 0x1a, 0xc6, 0x7c, 0x22, 0x2d, 0x20, 0x28, 0xa1, 0x8e, 0xa0, 0xf2, 0xd6, 0x5d, 0x12, 0xcf, 0x17, 0x4c, 0x65, 0x87, 0xf0, 0x9b, 0x76, 0xb1, 0xaf, 0x78, 0x72, 0x13, 0x72, 0xe3, 0xfa, 0x72, 0x4c, 0x1a, 0x71, 0xb7, 0x18, 0x4c, 0x95, 0x74, 0x21, 0xed, 0x98, 0x65, 0x4, 0xd0, 0x4e, 0xf6, 0x17, 0x42, 0xbd, 0x2e, 0x3f, 0xdf, 0x9a, 0xc0, 0x6d, 0x96, 0x20, 0xec, 0xf1, 0x1b, 0xcf, 0x52, 0x98, 0xad, 0xf0, 0xf8, 0x7e, 0x26, 0x4b, 0xbc, 0xee, 0xe7, 0x50, 0xa, 0x8d, 0xa6, 0x6c, 0x83, 0x97, 0x13, 0x88, 0xf3, 0xd9, 0xd6, 0xc9, 0xd3, 0x50, 0xb1, 0x51, 0x3d, 0xd, 0x4e, 0xba, 0xc3, 0xb8, 0xb3, 0x99, 0x5, 0x95, 0xb6, 0x73, 0x8c, 0xee, 0x11, 0xa7, 0xe2, 0x5a, 0x52, 0x14, 0x33, 0x16, 0x5a, 0x79, 0xc4, 0xc1, 0xb7, 0x89, 0x83, 0x3e, 0x8e, 0x52, 0xf7, 0x1c, 0x2e, 0xa4, 0x26, 0xe4, 0xb3, 0x53, 0x58, 0x90, 0xd8, 0x3d, 0xff, 0x4d, 0x87, 0x40, 0x32, 0xcf, 0x21, 0x47, 0x76, 0x35, 0xca, 0xdc, 0x15, 0x48, 0xe5, 0x82, 0xa6, 0x4b, 0x8c, 0x39, 0x2a, 0xf3, 0x79, 0xdc, 0x16, 0x52, 0x58, 0x41, 0x68, 0xf5, 0xe1, 0xce, 0x84, 0x1a, 0xa2, 0xb9, 0xdc, 0xed, 0x75, 0x1, 0xdf, 0x54, 0x68, 0x1, 0x1d, 0x11, 0x4f, 0xed, 0xcd, 0xf9, 0xe0, 0x11, 0xa1, 0x8a, 0xd9, 0xbd, 0x5c, 0x3, 0xfd, 0xe8, 0x74, 0xeb, 0x48, 0x20, 0x35, 0x25, 0xf7, 0x4c, 0xe2, 0x3a, 0x15, 0x14, 0xd4, 0x13, 0x28, 0x38, 0x16, 0xa7, 0xda, 0x91, 0x18, 0x75, 0xe0, 0x6, 0xc9, 0x6c, 0x8f, 0x11, 0xa1, 0xaf, 0x28, 0xbd, 0x5b, 0x52, 0xfd, 0x0, 0x18, 0xe, 0xe7, 0xee, 0x56, 0x9d, 0xea, 0x44, 0x29, 0x25, 0xf7, 0x36, 0x2, 0x56, 0x67, 0x3a, 0xcf, 0xa4, 0x9a, 0x84, 0x85, 0x93, 0xca, 0xd9, 0xdc, 0x6a, 0xaa, 0xb5, 0x9d, 0xa5, 0x72, 0xa9, 0x4a, 0x4f, 0xd2, 0x78, 0xdf, 0x44, 0x69, 0x1c, 0x4, 0x2d, 0xa6, 0x1a, 0x7d, 0x3f, 0x77, 0xaf, 0x6e, 0xdc, 0x41, 0xda, 0x53, 0x70, 0xd5, 0xe4, 0xee, 0x50, 0x8d, 0xbb, 0xda, 0x4e, 0xa, 0x29, 0xf4, 0x79, 0x1d, 0xed, 0xed, 0xd9, 0xb4, 0xb1, 0x67, 0x49, 0x70, 0xf, 0x7d, 0xd1, 0x8e, 0x97, 0x47, 0xe9, 0x6c, 0x3b, 0x92, 0x26, 0x4, 0xec, 0xb2, 0xb6, 0xc4, 0x42, 0xd, 0xae, 0x85, 0xdd, 0xdc, 0xd1, 0xb6, 0x72, 0x37, 0x9f, 0xcf, 0xf9, 0x87, 0x76, 0x33, 0x57, 0xf6, 0x70, 0x4c, 0x90, 0x2c, 0xfd, 0x57, 0x80, 0x1, 0x0, 0xc5, 0xb1, 0xf0, 0x59, 0xcd, 0x2e, 0xe2, 0x4, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; @@ -33,14 +17,6 @@ + (NSData *)parse_logo_png { return [NSData dataWithBytes:parse_logo_png length:sizeof(parse_logo_png)]; } - static const unsigned char facebook_icon3x_png[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0x42, 0x0, 0x0, 0x0, 0x42, 0x8, 0x6, 0x0, 0x0, 0x0, 0xe3, 0x54, 0x0, 0xe8, 0x0, 0x0, 0x0, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x0, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x61, 0x64, 0x79, 0x71, 0xc9, 0x65, 0x3c, 0x0, 0x0, 0x3, 0x23, 0x69, 0x54, 0x58, 0x74, 0x58, 0x4d, 0x4c, 0x3a, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x78, 0x6d, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x3d, 0x22, 0xef, 0xbb, 0xbf, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x57, 0x35, 0x4d, 0x30, 0x4d, 0x70, 0x43, 0x65, 0x68, 0x69, 0x48, 0x7a, 0x72, 0x65, 0x53, 0x7a, 0x4e, 0x54, 0x63, 0x7a, 0x6b, 0x63, 0x39, 0x64, 0x22, 0x3f, 0x3e, 0x20, 0x3c, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x3d, 0x22, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x3a, 0x6e, 0x73, 0x3a, 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x22, 0x20, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x74, 0x6b, 0x3d, 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x58, 0x4d, 0x50, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x35, 0x2e, 0x35, 0x2d, 0x63, 0x30, 0x31, 0x34, 0x20, 0x37, 0x39, 0x2e, 0x31, 0x35, 0x31, 0x34, 0x38, 0x31, 0x2c, 0x20, 0x32, 0x30, 0x31, 0x33, 0x2f, 0x30, 0x33, 0x2f, 0x31, 0x33, 0x2d, 0x31, 0x32, 0x3a, 0x30, 0x39, 0x3a, 0x31, 0x35, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x3e, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x72, 0x64, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x31, 0x39, 0x39, 0x39, 0x2f, 0x30, 0x32, 0x2f, 0x32, 0x32, 0x2d, 0x72, 0x64, 0x66, 0x2d, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2d, 0x6e, 0x73, 0x23, 0x22, 0x3e, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x64, 0x66, 0x3a, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x3d, 0x22, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x6d, 0x6d, 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x73, 0x54, 0x79, 0x70, 0x65, 0x2f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x23, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x3a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x6f, 0x6c, 0x3d, 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x73, 0x68, 0x6f, 0x70, 0x20, 0x43, 0x43, 0x20, 0x28, 0x4d, 0x61, 0x63, 0x69, 0x6e, 0x74, 0x6f, 0x73, 0x68, 0x29, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x69, 0x69, 0x64, 0x3a, 0x37, 0x32, 0x42, 0x32, 0x44, 0x31, 0x37, 0x39, 0x33, 0x44, 0x43, 0x39, 0x31, 0x31, 0x45, 0x34, 0x38, 0x33, 0x35, 0x43, 0x42, 0x42, 0x36, 0x30, 0x39, 0x42, 0x42, 0x31, 0x39, 0x35, 0x32, 0x44, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x64, 0x69, 0x64, 0x3a, 0x37, 0x32, 0x42, 0x32, 0x44, 0x31, 0x37, 0x41, 0x33, 0x44, 0x43, 0x39, 0x31, 0x31, 0x45, 0x34, 0x38, 0x33, 0x35, 0x43, 0x42, 0x42, 0x36, 0x30, 0x39, 0x42, 0x42, 0x31, 0x39, 0x35, 0x32, 0x44, 0x22, 0x3e, 0x20, 0x3c, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x20, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x69, 0x69, 0x64, 0x3a, 0x37, 0x32, 0x42, 0x32, 0x44, 0x31, 0x37, 0x37, 0x33, 0x44, 0x43, 0x39, 0x31, 0x31, 0x45, 0x34, 0x38, 0x33, 0x35, 0x43, 0x42, 0x42, 0x36, 0x30, 0x39, 0x42, 0x42, 0x31, 0x39, 0x35, 0x32, 0x44, 0x22, 0x20, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x64, 0x69, 0x64, 0x3a, 0x37, 0x32, 0x42, 0x32, 0x44, 0x31, 0x37, 0x38, 0x33, 0x44, 0x43, 0x39, 0x31, 0x31, 0x45, 0x34, 0x38, 0x33, 0x35, 0x43, 0x42, 0x42, 0x36, 0x30, 0x39, 0x42, 0x42, 0x31, 0x39, 0x35, 0x32, 0x44, 0x22, 0x2f, 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x3e, 0x20, 0x3c, 0x2f, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x3e, 0x20, 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x65, 0x6e, 0x64, 0x3d, 0x22, 0x72, 0x22, 0x3f, 0x3e, 0x90, 0x6f, 0x2b, 0x47, 0x0, 0x0, 0x3, 0x4d, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xec, 0x9c, 0xdf, 0x4b, 0x53, 0x61, 0x18, 0xc7, 0xcf, 0x39, 0x9b, 0x4e, 0xdc, 0x28, 0x6d, 0xb3, 0xd4, 0xd9, 0x36, 0x1c, 0x4a, 0x2c, 0x49, 0xa2, 0x1b, 0x17, 0x24, 0xde, 0xc8, 0x48, 0x85, 0xa3, 0x5e, 0xf4, 0x17, 0x94, 0xd2, 0xa5, 0x5e, 0x8c, 0x6, 0x42, 0x41, 0x46, 0x30, 0x6, 0x61, 0x74, 0x57, 0xd7, 0x43, 0x2f, 0x92, 0xae, 0x84, 0x89, 0x45, 0x9b, 0x3f, 0x82, 0x5, 0xf9, 0xa3, 0x99, 0x76, 0xe3, 0x61, 0x3, 0x65, 0x84, 0xc2, 0xf4, 0xa0, 0xec, 0x6c, 0x3b, 0x3b, 0x3d, 0xcb, 0x6e, 0xba, 0x48, 0x5f, 0x73, 0x9c, 0xce, 0xf6, 0x3e, 0xf, 0x1c, 0x36, 0xb6, 0x67, 0xe7, 0x3d, 0xfb, 0xec, 0xf9, 0xf1, 0x7d, 0xde, 0x3, 0x63, 0x19, 0x30, 0x97, 0xcb, 0x65, 0xb, 0x4, 0x2, 0xcf, 0xdc, 0x6e, 0xf7, 0x9d, 0x9a, 0x9a, 0x1a, 0x3, 0xbc, 0xa4, 0x30, 0xe5, 0x6d, 0xec, 0xe1, 0xe1, 0x61, 0xf6, 0xb, 0xd8, 0xd8, 0xd8, 0xd8, 0xe3, 0x48, 0x24, 0xb2, 0x5a, 0x80, 0x60, 0xdf, 0xda, 0xda, 0x8a, 0x29, 0x94, 0x5a, 0x2a, 0x95, 0xda, 0xe9, 0xea, 0xea, 0xba, 0xc9, 0x84, 0x42, 0xa1, 0xa0, 0x42, 0xb9, 0xad, 0xac, 0xac, 0x7c, 0x60, 0x45, 0x51, 0xdc, 0x36, 0x99, 0x4c, 0x8d, 0xc, 0xc5, 0x96, 0xcf, 0xe7, 0xf, 0x38, 0x80, 0xc0, 0x31, 0x94, 0x1b, 0xc7, 0x71, 0x2c, 0x47, 0x41, 0x61, 0x24, 0x31, 0x85, 0x43, 0x6, 0xbf, 0xa3, 0x2, 0x11, 0x20, 0x88, 0xb2, 0x2, 0x91, 0x83, 0xee, 0x97, 0x85, 0x47, 0xf9, 0xbc, 0x27, 0xd2, 0x97, 0xd0, 0x97, 0xce, 0x80, 0x10, 0x5c, 0x9c, 0x9f, 0x9f, 0xff, 0xb8, 0xbc, 0xbc, 0xbc, 0x9a, 0x48, 0x24, 0xb6, 0x41, 0x1d, 0x8a, 0x70, 0xe4, 0xcd, 0x66, 0xb3, 0xe, 0xde, 0xaf, 0x80, 0xc3, 0x0, 0xcf, 0x8d, 0xd5, 0xd5, 0xd5, 0x17, 0xea, 0xea, 0xea, 0xcc, 0x9d, 0x9d, 0x9d, 0xb7, 0x7, 0x6, 0x6, 0x1e, 0x90, 0x95, 0x4b, 0x45, 0xd9, 0xd1, 0xb8, 0xde, 0x91, 0x82, 0xc1, 0xe0, 0xcb, 0x8e, 0x8e, 0xe, 0xd7, 0x59, 0xc9, 0xf5, 0xf5, 0xf5, 0xb9, 0x9, 0xd7, 0xd8, 0xd7, 0x74, 0x44, 0x8, 0x82, 0xf0, 0x75, 0x68, 0x68, 0xe8, 0xfe, 0xdc, 0xdc, 0x5c, 0xf4, 0x5f, 0x3e, 0xf, 0x91, 0x61, 0x2c, 0xf9, 0xd4, 0x88, 0xc5, 0x62, 0x8b, 0xf0, 0x8b, 0xf2, 0xf1, 0x78, 0x7c, 0x8f, 0xda, 0x62, 0x99, 0x4c, 0x26, 0x5, 0x9e, 0xe7, 0x7, 0xd5, 0x82, 0xa0, 0x59, 0x10, 0xa3, 0xa3, 0xa3, 0xf, 0x61, 0x22, 0xfe, 0x41, 0x75, 0xfb, 0x8c, 0x46, 0xa3, 0x33, 0x93, 0x93, 0x93, 0x21, 0xea, 0x75, 0xc4, 0xc4, 0xc4, 0xc4, 0x2b, 0xa8, 0xe2, 0x74, 0xb, 0xaa, 0x54, 0x2a, 0xb5, 0x3d, 0x3b, 0x3b, 0x1b, 0x2e, 0x9a, 0xf0, 0xc8, 0x64, 0x8e, 0x4a, 0xb2, 0x6b, 0x80, 0x60, 0xfa, 0xbc, 0xbb, 0xbb, 0x4b, 0x7c, 0xf1, 0x6d, 0x6d, 0x6d, 0xf6, 0xfe, 0xfe, 0xfe, 0xbb, 0x2d, 0x2d, 0x2d, 0x2e, 0x10, 0x50, 0x26, 0x96, 0x65, 0xff, 0x90, 0x48, 0xf5, 0xf5, 0xf5, 0xd6, 0x92, 0x4, 0xb1, 0xbe, 0xbe, 0xbe, 0x46, 0xea, 0x3b, 0x3c, 0x3c, 0x3c, 0x8, 0x69, 0xf4, 0xc6, 0x60, 0x30, 0xd4, 0x96, 0x5d, 0x6a, 0x80, 0x6c, 0x4e, 0x90, 0xf8, 0xd9, 0xed, 0x76, 0xb, 0x40, 0x78, 0x5d, 0x2c, 0x8, 0x9a, 0x3, 0x1, 0x73, 0xc3, 0x3e, 0x89, 0x1f, 0xcc, 0x10, 0x6e, 0x80, 0x70, 0xa9, 0x6c, 0x8b, 0x25, 0xe4, 0x38, 0xd1, 0x14, 0xd9, 0xdc, 0xdc, 0x6c, 0xc3, 0x31, 0xbc, 0x50, 0xd8, 0xf4, 0xfa, 0xa, 0x4, 0x71, 0x3c, 0x31, 0x2b, 0x8, 0x82, 0xa6, 0x59, 0x3, 0x41, 0x20, 0x88, 0x63, 0xab, 0xac, 0xac, 0x24, 0x2a, 0x82, 0x55, 0x55, 0x55, 0x86, 0xa2, 0x17, 0x60, 0x15, 0xf7, 0x18, 0xe2, 0xd3, 0xd3, 0xd3, 0x6f, 0x4f, 0xea, 0x9e, 0x20, 0xb1, 0x37, 0x48, 0xce, 0x15, 0x89, 0x44, 0x3e, 0x19, 0x8d, 0xc6, 0x17, 0xcc, 0x29, 0x37, 0xa7, 0x7a, 0x7a, 0x7a, 0x3c, 0xe, 0x87, 0xe3, 0x3a, 0x69, 0x5, 0x56, 0x65, 0xcf, 0x32, 0x1c, 0xe, 0xcf, 0xa8, 0x1d, 0x61, 0xb0, 0xe6, 0x3b, 0xd2, 0x3d, 0x4b, 0xd5, 0x52, 0x43, 0xa7, 0xd3, 0xa9, 0x3a, 0xd7, 0x80, 0xf2, 0x64, 0x6d, 0x36, 0x9b, 0x93, 0xfa, 0x62, 0x69, 0xb1, 0x58, 0x2e, 0xc2, 0x44, 0x7a, 0x85, 0x7a, 0x10, 0xd, 0xd, 0xd, 0x97, 0xa1, 0x8e, 0xd4, 0x52, 0xf, 0xc2, 0x6a, 0xb5, 0x36, 0x9e, 0xa5, 0x19, 0x94, 0x2d, 0x8, 0xe8, 0x16, 0x76, 0x14, 0x54, 0xc7, 0x13, 0xaa, 0x3, 0x41, 0x30, 0xbf, 0x36, 0x6f, 0xb4, 0x9, 0x42, 0x96, 0xe5, 0x9c, 0x9a, 0x20, 0x9a, 0x9a, 0x9a, 0xae, 0x6a, 0x52, 0x59, 0x3a, 0x9d, 0xce, 0x6b, 0x81, 0x40, 0xe0, 0xe9, 0x49, 0xca, 0x12, 0x94, 0x67, 0x70, 0x69, 0x69, 0xe9, 0xdb, 0x69, 0xe7, 0xf2, 0x78, 0x3c, 0xee, 0xee, 0xee, 0xee, 0xde, 0xbf, 0x29, 0x4b, 0xd0, 0x2c, 0x6c, 0x6b, 0x6b, 0xeb, 0x8d, 0xb3, 0xce, 0xf6, 0x9a, 0xb9, 0x1b, 0x3e, 0x32, 0x32, 0x72, 0x8f, 0xe4, 0x9a, 0xfd, 0x7e, 0xbf, 0xb7, 0xc8, 0x4b, 0xef, 0x6b, 0xaa, 0x46, 0x48, 0x92, 0x94, 0x25, 0xf1, 0x4b, 0xa7, 0xd3, 0x12, 0x8e, 0xe1, 0xb8, 0x1f, 0x81, 0x20, 0x10, 0x4, 0x82, 0x40, 0x10, 0x8, 0x2, 0x41, 0x20, 0x8, 0x4, 0x81, 0x20, 0x10, 0x4, 0x82, 0x40, 0x10, 0x8, 0x2, 0x41, 0x20, 0x8, 0x4, 0x51, 0x7e, 0x20, 0x58, 0xc4, 0xc0, 0xb0, 0x9c, 0x24, 0x49, 0x88, 0xa1, 0x10, 0x11, 0x85, 0xbf, 0xe, 0xa0, 0x1d, 0x82, 0x20, 0x8, 0xdf, 0x39, 0xaf, 0xd7, 0xeb, 0x13, 0x45, 0x31, 0xa9, 0x95, 0x10, 0x2d, 0xb2, 0xdf, 0xa9, 0x26, 0xcb, 0xf2, 0x91, 0xcf, 0xe7, 0x7b, 0xa4, 0x5f, 0x58, 0x58, 0x58, 0xe3, 0x79, 0xbe, 0xd7, 0xef, 0xf7, 0x3f, 0x6f, 0x6f, 0x6f, 0xbf, 0x55, 0x1, 0xf6, 0x1f, 0x41, 0x64, 0x9, 0xfd, 0xa, 0xf9, 0x7c, 0x70, 0x9e, 0x85, 0x72, 0xb9, 0x9c, 0xbc, 0xb9, 0xb9, 0xb9, 0x31, 0x3e, 0x3e, 0xfe, 0x64, 0x6a, 0x6a, 0xea, 0xfd, 0x4f, 0x1, 0x6, 0x0, 0xec, 0x28, 0x31, 0x86, 0x11, 0x87, 0xbb, 0xa9, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; - - - - + (NSData *)facebook_icon3x_png { - return [NSData dataWithBytes:facebook_icon3x_png length:sizeof(facebook_icon3x_png)]; - } - static const unsigned char apple_icon2x_png[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0x24, 0x0, 0x0, 0x0, 0x2c, 0x8, 0x6, 0x0, 0x0, 0x0, 0xd, 0x53, 0x1a, 0xf5, 0x0, 0x0, 0x0, 0x1, 0x73, 0x52, 0x47, 0x42, 0x0, 0xae, 0xce, 0x1c, 0xe9, 0x0, 0x0, 0x3, 0x6, 0x49, 0x44, 0x41, 0x54, 0x58, 0x9, 0xcd, 0x98, 0xcb, 0x6b, 0xd5, 0x40, 0x14, 0xc6, 0x9b, 0xd6, 0x7, 0x6d, 0x15, 0x8a, 0x50, 0x8a, 0x6e, 0xac, 0xd7, 0xc7, 0x42, 0x41, 0xdd, 0x15, 0xc5, 0x95, 0xf, 0x5c, 0x54, 0xea, 0xc2, 0x85, 0x2b, 0xbb, 0x10, 0x51, 0xa4, 0x20, 0x8, 0xba, 0xf3, 0xf, 0xd0, 0xae, 0x4a, 0x2b, 0xae, 0xc4, 0x85, 0x28, 0x2a, 0xea, 0x4a, 0xc4, 0x85, 0xd5, 0x5a, 0x1f, 0x28, 0x28, 0x15, 0xc1, 0x6e, 0x4a, 0x11, 0x6f, 0xb5, 0xa8, 0x20, 0x22, 0x14, 0xb9, 0x95, 0xda, 0x5e, 0x7f, 0xdf, 0x35, 0x49, 0x27, 0x93, 0xe4, 0xf6, 0xa, 0x66, 0xe2, 0x81, 0x8f, 0x39, 0xe7, 0xcc, 0xc9, 0x7c, 0x1f, 0x93, 0xcc, 0x64, 0x92, 0xba, 0xba, 0xc, 0xad, 0x5c, 0x2e, 0x17, 0xc0, 0x59, 0x30, 0x2, 0xae, 0x64, 0x48, 0x55, 0x7d, 0x68, 0xc8, 0x9b, 0x41, 0x1f, 0x98, 0x5, 0x81, 0x5d, 0xad, 0x7e, 0xd5, 0x9f, 0xde, 0x45, 0xb5, 0x14, 0xfd, 0x4d, 0xd, 0xec, 0x2b, 0xa9, 0xbf, 0xf, 0x36, 0x59, 0xd7, 0x15, 0xad, 0x38, 0xfb, 0x10, 0x31, 0x2d, 0x60, 0x2c, 0x98, 0x12, 0xab, 0xdd, 0x99, 0xbd, 0x2, 0x8b, 0x1, 0x1, 0x37, 0x2d, 0x11, 0x41, 0x58, 0xc4, 0xf9, 0xe7, 0x77, 0xc3, 0xa2, 0x8f, 0x86, 0x10, 0xee, 0x8, 0xd8, 0x13, 0xda, 0x63, 0xd1, 0x6a, 0x7, 0x11, 0x22, 0xd2, 0x66, 0x67, 0x88, 0xbe, 0x7a, 0x7, 0x12, 0xe6, 0x29, 0x20, 0x5c, 0x2, 0x7e, 0x0, 0xdb, 0xde, 0x90, 0x68, 0x9d, 0xaf, 0x74, 0xe4, 0x41, 0xba, 0xce, 0x56, 0x42, 0xac, 0x19, 0x5b, 0xe1, 0x48, 0x42, 0x94, 0x6, 0xe2, 0xe, 0x5f, 0xd0, 0x4f, 0xda, 0xbb, 0x60, 0x6f, 0xb4, 0xa2, 0xf6, 0xc8, 0xab, 0xa5, 0x14, 0x2, 0xed, 0x2d, 0xab, 0xc0, 0x1c, 0x18, 0xf7, 0x3c, 0x6f, 0xca, 0xbc, 0x8e, 0x7e, 0xad, 0x20, 0xf5, 0x4f, 0xd2, 0x37, 0x1b, 0xf4, 0x91, 0x6f, 0xc2, 0x5f, 0xb, 0xa, 0xa0, 0x19, 0x7c, 0x2, 0xaf, 0xec, 0xeb, 0xc9, 0x2d, 0x6c, 0xc, 0xb6, 0x1, 0xf4, 0x83, 0x9, 0x60, 0xdb, 0x5b, 0x12, 0x67, 0x40, 0xbb, 0x3d, 0x12, 0xb9, 0x26, 0x70, 0x8, 0xdc, 0x1, 0xd3, 0xc0, 0x36, 0xed, 0xde, 0x7a, 0x95, 0x9c, 0x0, 0x8d, 0xf6, 0xf5, 0xb1, 0x19, 0xf2, 0x8b, 0xce, 0x51, 0x78, 0x1c, 0x2c, 0xb4, 0x77, 0x94, 0xa9, 0x79, 0x4, 0x86, 0xc1, 0x37, 0xd0, 0x1, 0xba, 0xc0, 0x72, 0x50, 0x8b, 0x69, 0xf7, 0x3e, 0xcc, 0x8c, 0x3d, 0x4c, 0x2c, 0x46, 0x4c, 0x2b, 0x78, 0xe, 0x5c, 0xda, 0xc, 0x64, 0xdd, 0x31, 0x41, 0x24, 0x1b, 0x81, 0x96, 0x69, 0x1e, 0x26, 0x51, 0xbb, 0x24, 0xca, 0xdc, 0xb0, 0x2e, 0x10, 0x6f, 0x8e, 0x29, 0x75, 0x93, 0x18, 0x85, 0x66, 0x22, 0xa4, 0x42, 0xdd, 0xf6, 0x3c, 0xa6, 0xc5, 0xe7, 0x7c, 0x4a, 0xbb, 0x2c, 0x14, 0x23, 0x87, 0xc4, 0xbd, 0x9c, 0x4, 0xbd, 0x87, 0xb7, 0xc5, 0x14, 0xe3, 0x91, 0x58, 0x43, 0xe2, 0x9d, 0x99, 0x74, 0xe8, 0xef, 0x66, 0x85, 0x3d, 0x30, 0xf9, 0xf4, 0xc, 0xed, 0x31, 0x13, 0xe, 0xfd, 0x61, 0x5b, 0x8c, 0xb8, 0x25, 0xa8, 0xf2, 0x74, 0x3b, 0x14, 0x12, 0x50, 0x25, 0x1e, 0x69, 0x25, 0x68, 0x7d, 0x50, 0xe1, 0xb8, 0x1d, 0x4c, 0xe2, 0x93, 0x20, 0xf7, 0xc7, 0x3, 0xd6, 0x11, 0xbc, 0x1f, 0xff, 0x27, 0x41, 0x25, 0x9e, 0x9f, 0x99, 0x34, 0x41, 0xd3, 0x49, 0x1d, 0x19, 0xe7, 0xf4, 0x2, 0x4e, 0x7c, 0xdf, 0xe9, 0x96, 0x7d, 0xc9, 0x98, 0x3c, 0x6d, 0xf8, 0xd5, 0x49, 0x1d, 0x79, 0xa, 0xda, 0x97, 0x26, 0xe8, 0x73, 0x52, 0x87, 0x83, 0x9c, 0xce, 0x4c, 0x9a, 0x90, 0x88, 0x29, 0x31, 0x12, 0xc9, 0xb8, 0xb, 0x36, 0x42, 0x75, 0xd4, 0xa6, 0x93, 0xa0, 0x21, 0x3b, 0xe9, 0x30, 0xee, 0x65, 0x96, 0xb6, 0x98, 0x7c, 0x7a, 0x97, 0xe9, 0x54, 0xa8, 0xd3, 0x5e, 0xe2, 0x53, 0x6f, 0x16, 0x67, 0xe4, 0xeb, 0x9c, 0xdd, 0xc9, 0x36, 0xf0, 0x5a, 0xe3, 0xd7, 0xe3, 0xfc, 0xa2, 0x7d, 0xac, 0x20, 0x27, 0xd3, 0x7, 0xc4, 0x13, 0x26, 0xa6, 0x7, 0x34, 0x54, 0xce, 0xd4, 0x38, 0x7, 0x49, 0x5e, 0xcf, 0x49, 0x90, 0x49, 0x7b, 0x39, 0x10, 0xb4, 0x98, 0xec, 0x7, 0xd0, 0x66, 0xf6, 0xe6, 0xe0, 0x77, 0x57, 0x96, 0x9d, 0xbf, 0x8d, 0x5f, 0xca, 0x41, 0x80, 0x49, 0xf9, 0x95, 0xe0, 0x56, 0x45, 0x90, 0x9f, 0xd5, 0x99, 0xba, 0x64, 0x56, 0x38, 0xf6, 0x7, 0x98, 0x98, 0x52, 0x28, 0x88, 0x40, 0x6f, 0xdf, 0x5e, 0xc7, 0x22, 0x2, 0x3a, 0xcd, 0x4e, 0x7f, 0x10, 0x84, 0x2d, 0xf, 0xb7, 0x3e, 0x85, 0x74, 0xce, 0x75, 0x6d, 0x47, 0x42, 0x11, 0xb6, 0x83, 0x92, 0x2e, 0xc7, 0x6a, 0x9e, 0xc1, 0x57, 0x59, 0x5c, 0xb6, 0x96, 0x30, 0xa6, 0x60, 0xc0, 0x91, 0xa8, 0xef, 0xf0, 0xb4, 0x87, 0xc4, 0x69, 0xe, 0x45, 0x4b, 0xc1, 0xcb, 0x8c, 0x45, 0xcd, 0x31, 0xfe, 0x81, 0x34, 0xd, 0xb1, 0x3c, 0xc5, 0x6d, 0x60, 0x3c, 0x43, 0x51, 0x27, 0x63, 0xa4, 0x24, 0xaa, 0xde, 0x3b, 0xc4, 0x14, 0xa8, 0xb9, 0xd, 0xb6, 0x26, 0x5d, 0x4c, 0x6e, 0xc, 0xdc, 0x0, 0xfa, 0x14, 0x2e, 0x82, 0x6, 0xa0, 0x8f, 0x86, 0xfd, 0xa0, 0x13, 0x68, 0xc3, 0xb5, 0x4d, 0x27, 0xd4, 0xd3, 0xac, 0xea, 0xf3, 0x76, 0x47, 0x4d, 0x31, 0xa2, 0xf4, 0xff, 0x50, 0xff, 0x82, 0x5e, 0x80, 0x29, 0x30, 0xa, 0x2e, 0x82, 0x6d, 0xd5, 0x6, 0xa0, 0x5f, 0x7f, 0x52, 0x4e, 0x81, 0x41, 0xa0, 0x95, 0xab, 0x5f, 0xc3, 0xd7, 0x80, 0x8e, 0x1d, 0xa9, 0xf6, 0x1b, 0xf5, 0x4e, 0xf9, 0x49, 0xea, 0xad, 0xd1, 0x32, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; @@ -49,14 +25,6 @@ + (NSData *)apple_icon2x_png { return [NSData dataWithBytes:apple_icon2x_png length:sizeof(apple_icon2x_png)]; } - static const unsigned char twitter_icon2x_png[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0x2c, 0x0, 0x0, 0x0, 0x24, 0x8, 0x6, 0x0, 0x0, 0x0, 0xf2, 0xd7, 0xd8, 0x6c, 0x0, 0x0, 0x0, 0x1, 0x73, 0x52, 0x47, 0x42, 0x0, 0xae, 0xce, 0x1c, 0xe9, 0x0, 0x0, 0x0, 0x9, 0x70, 0x48, 0x59, 0x73, 0x0, 0x0, 0x2e, 0x23, 0x0, 0x0, 0x2e, 0x23, 0x1, 0x78, 0xa5, 0x3f, 0x76, 0x0, 0x0, 0x1, 0xcb, 0x69, 0x54, 0x58, 0x74, 0x58, 0x4d, 0x4c, 0x3a, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x78, 0x6d, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x3d, 0x22, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x3a, 0x6e, 0x73, 0x3a, 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x22, 0x20, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x74, 0x6b, 0x3d, 0x22, 0x58, 0x4d, 0x50, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x35, 0x2e, 0x34, 0x2e, 0x30, 0x22, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x72, 0x64, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x31, 0x39, 0x39, 0x39, 0x2f, 0x30, 0x32, 0x2f, 0x32, 0x32, 0x2d, 0x72, 0x64, 0x66, 0x2d, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2d, 0x6e, 0x73, 0x23, 0x22, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x64, 0x66, 0x3a, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x3d, 0x22, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x74, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x69, 0x66, 0x66, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x22, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x78, 0x6d, 0x70, 0x3a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x6f, 0x6c, 0x3e, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x61, 0x64, 0x79, 0x3c, 0x2f, 0x78, 0x6d, 0x70, 0x3a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x6f, 0x6c, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x66, 0x66, 0x3a, 0x4f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x31, 0x3c, 0x2f, 0x74, 0x69, 0x66, 0x66, 0x3a, 0x4f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x3e, 0xa, 0x3c, 0x2f, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x3e, 0xa, 0x29, 0x2e, 0xcd, 0x3d, 0x0, 0x0, 0x5, 0xbd, 0x49, 0x44, 0x41, 0x54, 0x58, 0x9, 0xc5, 0x98, 0x5b, 0xa8, 0x95, 0x45, 0x14, 0xc7, 0xdd, 0x9e, 0xa3, 0x42, 0x56, 0x50, 0x91, 0x5, 0x86, 0x9c, 0xae, 0x44, 0x50, 0x68, 0x46, 0xd1, 0x85, 0x12, 0x7a, 0x28, 0x22, 0x88, 0xa0, 0x22, 0x2, 0xe9, 0x25, 0x90, 0x82, 0xea, 0x21, 0xe8, 0xf6, 0x90, 0xd1, 0x4b, 0x29, 0xbd, 0x56, 0x4, 0x81, 0x51, 0x50, 0xd4, 0x93, 0x2f, 0x85, 0x74, 0x21, 0x3a, 0xa6, 0x60, 0x54, 0x90, 0x12, 0x89, 0x91, 0xfa, 0x90, 0x5d, 0xf5, 0xa1, 0x9b, 0x78, 0x3d, 0xbb, 0xdf, 0x6f, 0xed, 0x59, 0xdf, 0xf9, 0xbe, 0x7d, 0xf6, 0xf6, 0xec, 0xbd, 0xf, 0xda, 0x82, 0xff, 0x59, 0x6b, 0xd6, 0xcc, 0xac, 0xf9, 0xcf, 0xcc, 0x9a, 0xd9, 0xf3, 0x9d, 0x79, 0xf3, 0x90, 0x76, 0xbb, 0xdd, 0x52, 0x2b, 0xd8, 0xf3, 0x3b, 0xd6, 0xdc, 0xff, 0xd6, 0x63, 0x61, 0x4f, 0x80, 0xe7, 0xc1, 0x24, 0xf8, 0x19, 0x1c, 0x7, 0x3f, 0x81, 0xcf, 0xc0, 0x33, 0xe0, 0x82, 0x1c, 0x11, 0x7b, 0x1, 0x18, 0xcf, 0xb2, 0x9a, 0xf2, 0x32, 0xd0, 0xd2, 0x8, 0xb2, 0xe8, 0xd3, 0xc0, 0xe9, 0xa5, 0x72, 0xac, 0xde, 0x78, 0x14, 0x9b, 0x58, 0x55, 0xc, 0x6c, 0x89, 0x1e, 0x4, 0x75, 0x99, 0xaa, 0x17, 0xb0, 0xff, 0x6, 0x4f, 0x74, 0x8f, 0x85, 0x6f, 0x5, 0xf8, 0x10, 0x3c, 0x1b, 0x75, 0x18, 0x31, 0x13, 0xf4, 0x23, 0x60, 0x5b, 0x76, 0x48, 0x7f, 0x96, 0x87, 0xd1, 0xf4, 0x8d, 0x5d, 0x42, 0xb7, 0xc0, 0x46, 0x90, 0x72, 0x4, 0x43, 0x1c, 0x3, 0x12, 0x56, 0xa7, 0xf, 0x33, 0xe4, 0x2d, 0xfe, 0xde, 0x8, 0xd6, 0x82, 0xcd, 0x40, 0x39, 0x4, 0xce, 0x4b, 0xc2, 0xb9, 0xc2, 0x9b, 0xa2, 0xaa, 0xdd, 0x7e, 0x27, 0xc9, 0x51, 0x6e, 0x6c, 0x4b, 0xfa, 0x67, 0xd3, 0xf4, 0xcb, 0x98, 0x6f, 0x96, 0x98, 0xe, 0x98, 0x24, 0x25, 0xda, 0xb, 0xd6, 0x8b, 0x5e, 0x72, 0x7b, 0x63, 0x4c, 0x5a, 0x2c, 0x1, 0x7f, 0xd4, 0x5a, 0x7e, 0x80, 0xbd, 0xc0, 0x46, 0xe8, 0x85, 0x8d, 0xc6, 0xb3, 0x14, 0x68, 0x9f, 0x3b, 0x76, 0x7f, 0x89, 0xe7, 0xa, 0xf6, 0x22, 0xd8, 0xcf, 0x97, 0xc4, 0xd5, 0x7f, 0x82, 0x7b, 0xa, 0x8f, 0x55, 0xd8, 0xf, 0xe4, 0x1, 0x73, 0xb9, 0xcf, 0x2e, 0x5c, 0x8e, 0xa0, 0xef, 0x0, 0x5b, 0x69, 0xb0, 0xb4, 0xd5, 0x6a, 0x39, 0xe0, 0x98, 0x28, 0xf5, 0x7d, 0x15, 0x6d, 0x68, 0xde, 0x3a, 0x56, 0x1a, 0x3c, 0xd9, 0xb7, 0xe1, 0x9, 0x2a, 0x88, 0x21, 0x27, 0x77, 0xc8, 0xf1, 0x3e, 0x5, 0x57, 0xe2, 0xdb, 0x89, 0xfe, 0x8, 0xec, 0x5, 0xb1, 0x8a, 0x57, 0xe3, 0xc, 0x99, 0x42, 0x30, 0xe, 0x97, 0xe2, 0x7e, 0xf4, 0xbd, 0xd1, 0xa8, 0xd3, 0x6e, 0x9c, 0x72, 0x5f, 0xe2, 0x59, 0x87, 0xbe, 0x16, 0x28, 0xc6, 0xf2, 0x36, 0xe8, 0xb7, 0x9a, 0x3d, 0xfd, 0x1d, 0xa, 0x55, 0x3f, 0xe3, 0x28, 0x77, 0x26, 0xf, 0xb7, 0xfd, 0x22, 0xf0, 0xaf, 0x5e, 0xc4, 0x1, 0x14, 0x57, 0x36, 0xe5, 0x5d, 0x8c, 0x89, 0xec, 0x80, 0xed, 0x8a, 0x4b, 0x3e, 0x72, 0xb5, 0xe6, 0xcf, 0x74, 0x78, 0x94, 0x3a, 0xe5, 0x28, 0xe8, 0x49, 0xaa, 0xdb, 0x5f, 0x48, 0xd6, 0xdb, 0x66, 0x3e, 0xbb, 0x78, 0x91, 0xc3, 0xe8, 0xce, 0x99, 0xc2, 0xf0, 0xde, 0xfb, 0x1e, 0x28, 0x39, 0x48, 0xda, 0xd9, 0xd1, 0x6b, 0xe7, 0x45, 0xb0, 0x34, 0x9, 0xaa, 0x29, 0xcf, 0x7, 0xb1, 0xf2, 0xe8, 0xc8, 0x77, 0xf4, 0x3a, 0xa0, 0xc, 0x9c, 0xbf, 0x5d, 0x84, 0x73, 0xd1, 0xf6, 0x11, 0xe3, 0xa6, 0x32, 0x4e, 0x90, 0x75, 0xb0, 0x31, 0xf2, 0xee, 0x28, 0xce, 0x4d, 0x56, 0x20, 0x53, 0x1d, 0x25, 0x97, 0x98, 0x91, 0x39, 0x65, 0xbd, 0x77, 0xf4, 0xd3, 0xc0, 0x89, 0x79, 0xf5, 0xdc, 0x6, 0x16, 0xd3, 0x77, 0xca, 0xbc, 0x5, 0xc7, 0x81, 0xf9, 0xaf, 0xe4, 0xd9, 0x30, 0x48, 0x63, 0x17, 0x3a, 0xd5, 0x33, 0xff, 0xd2, 0xb7, 0x5d, 0xf3, 0x1e, 0x2f, 0xf6, 0x1b, 0xf8, 0xbf, 0x20, 0xc6, 0x22, 0x74, 0x9c, 0xd, 0x3, 0x67, 0xc3, 0xd7, 0xb1, 0x1d, 0xd0, 0x55, 0xa, 0xd2, 0x19, 0x84, 0xe, 0xde, 0x18, 0xfa, 0x24, 0x7e, 0x6, 0x58, 0xd, 0x9c, 0xe0, 0xe, 0xea, 0xde, 0x6, 0x6b, 0xc0, 0xd, 0x60, 0x2, 0x9f, 0xf2, 0x4b, 0x47, 0xcd, 0x23, 0x44, 0x83, 0x48, 0x71, 0xf, 0xac, 0xf2, 0x86, 0xca, 0x83, 0x1c, 0x5b, 0x5a, 0xad, 0x0, 0x3, 0x3e, 0x7, 0x94, 0x13, 0x1d, 0x14, 0xeb, 0xdc, 0xea, 0x4c, 0x15, 0xdb, 0xa7, 0x78, 0xd, 0xed, 0x2, 0x7b, 0x8b, 0xa3, 0x9e, 0x93, 0xc3, 0xd8, 0xa6, 0xa5, 0xb2, 0xd6, 0xa9, 0xa1, 0x3b, 0xb9, 0x8b, 0x3d, 0xee, 0xa, 0x20, 0x4b, 0x8a, 0xfd, 0x2, 0xb6, 0xd7, 0xdb, 0xe3, 0xc0, 0x6d, 0xa9, 0xb6, 0x16, 0x3b, 0xc5, 0xe, 0xb, 0xca, 0xca, 0xd9, 0xc6, 0x95, 0xd7, 0x67, 0xac, 0x33, 0xb1, 0x45, 0xe4, 0x13, 0x65, 0xcd, 0xb9, 0xc8, 0xfe, 0xee, 0xce, 0x49, 0xe8, 0xa, 0x2a, 0xbe, 0x63, 0xd0, 0x57, 0xd0, 0x5b, 0xc1, 0x16, 0xe0, 0xf5, 0x15, 0xa9, 0x81, 0xbf, 0x31, 0x72, 0x21, 0x4b, 0x75, 0x4c, 0xc8, 0xd9, 0x7b, 0xe, 0x6c, 0x2b, 0x9c, 0x84, 0xf9, 0x8c, 0x1a, 0x5c, 0xba, 0xc6, 0xc8, 0xce, 0xfb, 0xba, 0x23, 0x44, 0x5, 0x8d, 0x2f, 0xa4, 0x62, 0x17, 0xc8, 0xa5, 0x3f, 0x8c, 0x9d, 0xf9, 0xd3, 0xdd, 0xe7, 0x64, 0x97, 0x3d, 0x53, 0x2e, 0xa4, 0x79, 0xbb, 0x92, 0x89, 0x6f, 0x87, 0x9f, 0xb, 0xe2, 0x42, 0x74, 0xb6, 0x9c, 0xc2, 0x1e, 0xec, 0x6f, 0x74, 0x20, 0x1e, 0xac, 0x45, 0x61, 0xfd, 0x3f, 0x7f, 0xf2, 0x12, 0x70, 0x75, 0xe5, 0xa5, 0xc4, 0x4e, 0x6b, 0xc4, 0x1d, 0xaa, 0x81, 0xbc, 0xdf, 0x51, 0x71, 0x6b, 0x64, 0xa7, 0xe2, 0x3a, 0x35, 0xaa, 0xa4, 0x45, 0x92, 0xfb, 0x96, 0x85, 0xf4, 0xee, 0x9f, 0x8f, 0xae, 0xf8, 0xb8, 0xf4, 0xb1, 0xd4, 0x68, 0xf3, 0xd7, 0xb4, 0x30, 0x15, 0x5c, 0xe5, 0xcc, 0x23, 0xcc, 0x69, 0x29, 0x41, 0xc3, 0x51, 0xb7, 0xa7, 0x5b, 0x8c, 0x6e, 0xd5, 0x89, 0x11, 0xe5, 0x93, 0x12, 0x29, 0xcf, 0x59, 0x14, 0x83, 0x3d, 0x3, 0x7b, 0xc2, 0xf, 0xe1, 0x79, 0xa8, 0x34, 0x92, 0xb4, 0x79, 0x3c, 0x43, 0xba, 0x82, 0xce, 0xa8, 0x9f, 0xa3, 0xc3, 0x95, 0xf4, 0xce, 0x77, 0x11, 0x3f, 0x2e, 0xb1, 0xaa, 0xd5, 0xb5, 0x1c, 0xec, 0x21, 0xe1, 0x9d, 0x2a, 0xe9, 0xcd, 0xf8, 0xee, 0x6, 0x76, 0xc8, 0x3c, 0x6e, 0x74, 0xc0, 0x5f, 0xc9, 0x49, 0x20, 0x9f, 0xbb, 0xfd, 0x39, 0xb1, 0x77, 0x96, 0x1d, 0xcc, 0x14, 0x89, 0x71, 0xab, 0xe5, 0xa6, 0x41, 0x92, 0xde, 0x48, 0xcd, 0x25, 0xc0, 0x5f, 0x32, 0xd3, 0xc2, 0x3c, 0x47, 0x9d, 0x52, 0xd9, 0x50, 0x46, 0xf3, 0x76, 0x68, 0xc, 0x3e, 0x23, 0x4f, 0x21, 0xe7, 0x9b, 0x61, 0x31, 0x30, 0x45, 0xee, 0x2, 0x8f, 0x81, 0x95, 0xc0, 0x99, 0xfa, 0x3, 0x41, 0x8c, 0x4e, 0x90, 0xba, 0x4d, 0xdd, 0x5c, 0xc5, 0xd5, 0xf5, 0x5a, 0xfd, 0x1, 0x5c, 0xc5, 0x18, 0x7e, 0xa5, 0x54, 0x63, 0x65, 0xf0, 0xbc, 0x77, 0xe3, 0x91, 0x52, 0x88, 0x1c, 0xa4, 0xd2, 0xfc, 0x59, 0xe, 0x7e, 0x5, 0xe7, 0x0, 0x25, 0x26, 0x97, 0x64, 0xc3, 0xd1, 0x35, 0xfb, 0x68, 0x35, 0xf7, 0x3f, 0xeb, 0xa, 0x59, 0x53, 0x74, 0xfa, 0xd, 0xd1, 0x2b, 0x2e, 0x33, 0x8a, 0x9, 0xa0, 0x57, 0x83, 0xba, 0xf4, 0x7c, 0x7, 0x74, 0x3d, 0x9, 0x7b, 0xb6, 0x21, 0xc8, 0x6c, 0x7e, 0xc7, 0xf1, 0x6d, 0xa2, 0x7c, 0x9d, 0xbc, 0xb0, 0x67, 0xec, 0x7e, 0xd6, 0xd5, 0x75, 0x6c, 0xb9, 0xe, 0x3a, 0xbc, 0x67, 0x4, 0xc4, 0xcf, 0xf3, 0x7c, 0x9f, 0xce, 0x36, 0xf8, 0x28, 0xf5, 0xc6, 0xce, 0xf8, 0x37, 0x97, 0xb1, 0xab, 0x9d, 0xaf, 0x93, 0xeb, 0x69, 0xd3, 0x39, 0xe, 0x22, 0x7a, 0x11, 0x98, 0x4, 0x6d, 0x56, 0x52, 0x22, 0xbe, 0xfc, 0x3d, 0x98, 0x6, 0x1f, 0x85, 0x58, 0xbf, 0x3e, 0xf9, 0x39, 0xb6, 0x7e, 0x68, 0xb2, 0x39, 0x3, 0x8, 0xc5, 0x77, 0x1b, 0x7a, 0x21, 0x78, 0xd, 0xf4, 0x92, 0x7e, 0x4, 0x6, 0xf5, 0x1b, 0x33, 0xc9, 0x4e, 0xd6, 0xc6, 0x1e, 0x28, 0x15, 0xb2, 0x7d, 0xa5, 0x9, 0x56, 0x7d, 0x6c, 0x62, 0x5f, 0x7, 0x36, 0x80, 0xdd, 0xe0, 0x77, 0x90, 0x3, 0xd, 0x4a, 0xae, 0xbb, 0x1d, 0x21, 0xe2, 0x9f, 0x23, 0xea, 0x3d, 0x20, 0xbe, 0xd8, 0xd1, 0xd5, 0x98, 0x15, 0x91, 0x61, 0xc, 0x2, 0x78, 0x7, 0x37, 0x5e, 0x6d, 0x94, 0x1f, 0x6, 0xe6, 0xb5, 0x32, 0x6a, 0x7a, 0x78, 0x65, 0x29, 0x7e, 0x95, 0x5f, 0x26, 0x27, 0xb4, 0xbf, 0x70, 0xb3, 0xb, 0xd, 0x25, 0x55, 0x47, 0x7e, 0x11, 0x37, 0xbe, 0x8a, 0x69, 0x73, 0x3e, 0x78, 0x19, 0xe4, 0xea, 0xe, 0x4b, 0x96, 0xae, 0x31, 0xc1, 0xec, 0xbf, 0x87, 0xf2, 0xa5, 0x32, 0x44, 0xf, 0x46, 0x76, 0xf6, 0xe9, 0x44, 0xb0, 0xcb, 0x9, 0xf8, 0x12, 0x38, 0x0, 0x52, 0x86, 0x25, 0x6b, 0x4a, 0x78, 0x75, 0xa9, 0x95, 0xcd, 0x20, 0xee, 0x77, 0xf4, 0x50, 0x64, 0xbd, 0xc6, 0x96, 0x41, 0xdc, 0x44, 0x3f, 0x0, 0xdc, 0x7e, 0x3f, 0x97, 0x26, 0xc0, 0x35, 0xe0, 0x56, 0x70, 0x3d, 0xc8, 0x77, 0x85, 0xaf, 0x38, 0xf3, 0x6c, 0x90, 0x83, 0x61, 0x1b, 0x7f, 0x56, 0xf3, 0x7d, 0x90, 0x57, 0xd5, 0x7a, 0x7e, 0x10, 0x9e, 0xc2, 0x1f, 0x2b, 0x8b, 0x6d, 0xcc, 0xc1, 0x5, 0xc2, 0xcb, 0x81, 0xff, 0x61, 0xfc, 0x7, 0xb8, 0x5d, 0xb9, 0x65, 0x98, 0x95, 0xb8, 0x3a, 0xae, 0xaa, 0xd2, 0x38, 0x40, 0xde, 0x78, 0x89, 0x52, 0x67, 0x3b, 0xaf, 0x3f, 0xe3, 0x64, 0x1f, 0xcc, 0xf6, 0x16, 0xe0, 0xe4, 0x43, 0xb0, 0x47, 0x3f, 0x60, 0x74, 0x36, 0x5f, 0x1f, 0x4, 0x5f, 0x81, 0xba, 0xf8, 0xf5, 0x2a, 0x59, 0xa1, 0x2d, 0x24, 0xe3, 0xd5, 0x2c, 0x71, 0xed, 0xee, 0x36, 0xb8, 0x1a, 0xb2, 0x8d, 0xd2, 0x7d, 0x35, 0xa2, 0x8d, 0xb3, 0x91, 0xfe, 0x81, 0x35, 0xc1, 0xaa, 0x17, 0x9b, 0x9d, 0x28, 0xdf, 0x2, 0x5e, 0x5, 0x3f, 0x82, 0x51, 0xc5, 0xbe, 0xde, 0xdf, 0xab, 0xea, 0x44, 0x28, 0x67, 0x5a, 0xd4, 0xdd, 0x43, 0xd9, 0x91, 0x8b, 0x4, 0x52, 0xfb, 0x94, 0xab, 0x1e, 0x1b, 0xf8, 0xcc, 0xdb, 0x15, 0xc0, 0x5c, 0xf6, 0x21, 0x74, 0x31, 0x38, 0x17, 0x9c, 0x5, 0xbc, 0x37, 0x6d, 0x6b, 0xde, 0xff, 0x5, 0x7e, 0x3, 0xbb, 0xc1, 0x76, 0xf0, 0x25, 0xd8, 0x41, 0x2c, 0x5f, 0x7b, 0x21, 0x85, 0xa8, 0x5f, 0xd2, 0x8d, 0xa7, 0x62, 0xd6, 0xf, 0xa3, 0xff, 0x3, 0xf7, 0x93, 0x7f, 0xd4, 0xd5, 0x86, 0x9a, 0x4d, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; - - - - + (NSData *)twitter_icon2x_png { - return [NSData dataWithBytes:twitter_icon2x_png length:sizeof(twitter_icon2x_png)]; - } - static const unsigned char parse_logo2x_png[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x1, 0xbb, 0x0, 0x0, 0x0, 0x88, 0x8, 0x6, 0x0, 0x0, 0x0, 0x7e, 0xf0, 0x45, 0xa9, 0x0, 0x0, 0x0, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x0, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x61, 0x64, 0x79, 0x71, 0xc9, 0x65, 0x3c, 0x0, 0x0, 0x3, 0x23, 0x69, 0x54, 0x58, 0x74, 0x58, 0x4d, 0x4c, 0x3a, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x78, 0x6d, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x3d, 0x22, 0xef, 0xbb, 0xbf, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x57, 0x35, 0x4d, 0x30, 0x4d, 0x70, 0x43, 0x65, 0x68, 0x69, 0x48, 0x7a, 0x72, 0x65, 0x53, 0x7a, 0x4e, 0x54, 0x63, 0x7a, 0x6b, 0x63, 0x39, 0x64, 0x22, 0x3f, 0x3e, 0x20, 0x3c, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x3d, 0x22, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x3a, 0x6e, 0x73, 0x3a, 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x22, 0x20, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x74, 0x6b, 0x3d, 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x58, 0x4d, 0x50, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x35, 0x2e, 0x35, 0x2d, 0x63, 0x30, 0x31, 0x34, 0x20, 0x37, 0x39, 0x2e, 0x31, 0x35, 0x31, 0x34, 0x38, 0x31, 0x2c, 0x20, 0x32, 0x30, 0x31, 0x33, 0x2f, 0x30, 0x33, 0x2f, 0x31, 0x33, 0x2d, 0x31, 0x32, 0x3a, 0x30, 0x39, 0x3a, 0x31, 0x35, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x3e, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x72, 0x64, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x31, 0x39, 0x39, 0x39, 0x2f, 0x30, 0x32, 0x2f, 0x32, 0x32, 0x2d, 0x72, 0x64, 0x66, 0x2d, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2d, 0x6e, 0x73, 0x23, 0x22, 0x3e, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x64, 0x66, 0x3a, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x3d, 0x22, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x6d, 0x6d, 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x73, 0x54, 0x79, 0x70, 0x65, 0x2f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x23, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x3a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x6f, 0x6c, 0x3d, 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x73, 0x68, 0x6f, 0x70, 0x20, 0x43, 0x43, 0x20, 0x28, 0x4d, 0x61, 0x63, 0x69, 0x6e, 0x74, 0x6f, 0x73, 0x68, 0x29, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x69, 0x69, 0x64, 0x3a, 0x34, 0x31, 0x30, 0x31, 0x39, 0x34, 0x30, 0x45, 0x34, 0x30, 0x30, 0x43, 0x31, 0x31, 0x45, 0x34, 0x41, 0x33, 0x35, 0x31, 0x39, 0x31, 0x30, 0x33, 0x32, 0x36, 0x42, 0x31, 0x39, 0x32, 0x31, 0x42, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x64, 0x69, 0x64, 0x3a, 0x34, 0x31, 0x30, 0x31, 0x39, 0x34, 0x30, 0x46, 0x34, 0x30, 0x30, 0x43, 0x31, 0x31, 0x45, 0x34, 0x41, 0x33, 0x35, 0x31, 0x39, 0x31, 0x30, 0x33, 0x32, 0x36, 0x42, 0x31, 0x39, 0x32, 0x31, 0x42, 0x22, 0x3e, 0x20, 0x3c, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x20, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x69, 0x69, 0x64, 0x3a, 0x34, 0x31, 0x30, 0x31, 0x39, 0x34, 0x30, 0x43, 0x34, 0x30, 0x30, 0x43, 0x31, 0x31, 0x45, 0x34, 0x41, 0x33, 0x35, 0x31, 0x39, 0x31, 0x30, 0x33, 0x32, 0x36, 0x42, 0x31, 0x39, 0x32, 0x31, 0x42, 0x22, 0x20, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x64, 0x69, 0x64, 0x3a, 0x34, 0x31, 0x30, 0x31, 0x39, 0x34, 0x30, 0x44, 0x34, 0x30, 0x30, 0x43, 0x31, 0x31, 0x45, 0x34, 0x41, 0x33, 0x35, 0x31, 0x39, 0x31, 0x30, 0x33, 0x32, 0x36, 0x42, 0x31, 0x39, 0x32, 0x31, 0x42, 0x22, 0x2f, 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x3e, 0x20, 0x3c, 0x2f, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x3e, 0x20, 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x65, 0x6e, 0x64, 0x3d, 0x22, 0x72, 0x22, 0x3f, 0x3e, 0xe8, 0x51, 0xff, 0x90, 0x0, 0x0, 0x26, 0xd1, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xec, 0x5d, 0x7, 0x98, 0x14, 0x55, 0xd6, 0xbd, 0xd, 0x33, 0xcc, 0x90, 0x54, 0x24, 0x88, 0xa2, 0x2, 0x8a, 0x28, 0x20, 0x62, 0x40, 0x51, 0x5c, 0x57, 0x10, 0x51, 0x44, 0xd7, 0x35, 0xff, 0xbb, 0x46, 0x5c, 0x31, 0xc3, 0x9a, 0x45, 0xd4, 0x55, 0x74, 0xd7, 0xac, 0xb0, 0x86, 0x5d, 0x73, 0x5e, 0x75, 0x4d, 0x6b, 0x56, 0x14, 0x11, 0xcc, 0x1, 0x41, 0xc9, 0x51, 0x82, 0x8, 0x8, 0x22, 0x82, 0x48, 0x9a, 0xf8, 0xbf, 0x63, 0x9d, 0x96, 0xa6, 0xe6, 0x55, 0x4f, 0xcf, 0x4c, 0x55, 0x77, 0x55, 0xf5, 0x3d, 0xdf, 0x77, 0x3f, 0xe0, 0x55, 0x33, 0x53, 0xfd, 0xea, 0xd5, 0x3b, 0x37, 0xbf, 0xc4, 0x49, 0x83, 0x86, 0xb4, 0x13, 0x91, 0x53, 0x8c, 0x34, 0x96, 0xf8, 0xa2, 0xbe, 0x91, 0xa9, 0x46, 0x66, 0x19, 0x99, 0x61, 0x64, 0xb5, 0x91, 0x52, 0x51, 0x28, 0x14, 0xa, 0x45, 0x6c, 0xb0, 0x66, 0xed, 0x3a, 0x19, 0x3a, 0x68, 0xa0, 0xec, 0xb3, 0x47, 0xd7, 0x2a, 0xd7, 0xa, 0x8c, 0xdc, 0x62, 0xa4, 0xb7, 0x91, 0xe2, 0x18, 0xcf, 0x41, 0x82, 0xe4, 0x56, 0x66, 0xa4, 0xc4, 0xc8, 0x14, 0x92, 0xdf, 0x24, 0xfe, 0x1d, 0xb2, 0x41, 0x97, 0x8a, 0x42, 0xa1, 0x50, 0xc4, 0x13, 0x20, 0xbb, 0xed, 0x8c, 0x34, 0xe3, 0xdf, 0xf3, 0x5, 0x6d, 0x8c, 0x1c, 0xca, 0xbf, 0xff, 0x42, 0xd2, 0xfb, 0xd0, 0xc8, 0x33, 0xfc, 0x7b, 0xa5, 0x2e, 0xd, 0x85, 0x42, 0xa1, 0x88, 0xf, 0xea, 0x19, 0x29, 0x37, 0x52, 0x91, 0xc7, 0x73, 0xd0, 0xc4, 0x48, 0x4f, 0x23, 0x43, 0x8c, 0x8c, 0x33, 0x32, 0xd2, 0xc8, 0x31, 0x46, 0xa, 0x75, 0x79, 0x28, 0x14, 0xa, 0x45, 0x7c, 0xc8, 0x4e, 0xb1, 0x11, 0x20, 0xb8, 0x43, 0x8c, 0xbc, 0x68, 0x64, 0xb4, 0x91, 0x63, 0x75, 0x8e, 0x14, 0xa, 0x85, 0x22, 0xfa, 0xf0, 0x72, 0x5d, 0x22, 0x89, 0x63, 0x6a, 0x8c, 0x8, 0xbd, 0x95, 0x91, 0x46, 0xfc, 0x73, 0xeb, 0xc, 0x9, 0xec, 0x0, 0xca, 0x28, 0x23, 0x7f, 0x17, 0xc7, 0xcd, 0xa9, 0x50, 0x28, 0x14, 0x8a, 0x18, 0x91, 0xdd, 0x93, 0x46, 0x6e, 0x8c, 0xd1, 0xf7, 0x6c, 0x40, 0xb2, 0xdb, 0xca, 0x48, 0x6b, 0x23, 0x9d, 0x53, 0xc8, 0xc, 0xf1, 0xbb, 0x44, 0x9a, 0xff, 0xdb, 0x97, 0x9f, 0xbb, 0xd7, 0xc8, 0x75, 0x46, 0x56, 0xe9, 0xb2, 0x51, 0x28, 0x14, 0x8a, 0xe8, 0x59, 0x3d, 0x36, 0x34, 0x8c, 0xd9, 0xf7, 0x44, 0x6, 0xe6, 0x4a, 0x23, 0x33, 0x8d, 0xbc, 0x4f, 0xe2, 0x3a, 0xd1, 0x48, 0x27, 0x23, 0xfd, 0x8d, 0x3c, 0x6a, 0xe4, 0xbb, 0x34, 0xff, 0x1f, 0x99, 0xaa, 0x17, 0x19, 0x79, 0xdb, 0x48, 0x77, 0x5d, 0x36, 0xa, 0x85, 0x42, 0x11, 0xf, 0xb2, 0xcb, 0x17, 0x20, 0x13, 0x13, 0x9, 0x29, 0x7f, 0x31, 0x72, 0x90, 0x91, 0x2b, 0x8d, 0xcc, 0x4d, 0xf3, 0xf9, 0x1e, 0x46, 0xde, 0x32, 0x32, 0x40, 0x97, 0x8e, 0x42, 0xa1, 0x50, 0x28, 0xd9, 0x45, 0x11, 0xb3, 0x8d, 0xdc, 0x64, 0x64, 0x2f, 0x71, 0xdc, 0x95, 0xcb, 0x3c, 0x3e, 0xd7, 0x82, 0x96, 0x20, 0xdc, 0xbc, 0x9, 0x9d, 0x36, 0x85, 0x42, 0xa1, 0x50, 0xb2, 0x8b, 0x22, 0xe0, 0xee, 0x1c, 0x66, 0xa4, 0x8f, 0x91, 0x17, 0xd2, 0x7c, 0x6e, 0xa8, 0x38, 0xee, 0xd0, 0x22, 0x9d, 0x32, 0x85, 0x42, 0xa1, 0x50, 0xb2, 0x8b, 0x2a, 0xd0, 0x55, 0xe5, 0x78, 0x23, 0x3, 0x8d, 0xac, 0xf0, 0xf8, 0xcc, 0xd9, 0x46, 0x1e, 0x96, 0xf8, 0xc5, 0x38, 0x15, 0xa, 0x85, 0x42, 0xc9, 0x2e, 0xcf, 0x0, 0x32, 0x43, 0xed, 0xdd, 0xd7, 0x1e, 0xd7, 0x4f, 0xa2, 0x85, 0xa7, 0x45, 0xe8, 0xa, 0x85, 0x42, 0xa1, 0x64, 0x17, 0x69, 0x8c, 0x17, 0xa7, 0x4, 0xe1, 0x4d, 0x8f, 0xeb, 0xa7, 0x89, 0xe3, 0xfa, 0x54, 0x28, 0x14, 0xa, 0x85, 0x92, 0x5d, 0xa4, 0xb1, 0xdc, 0xc8, 0x9f, 0xc4, 0x49, 0x4e, 0xb1, 0x1, 0x99, 0x9c, 0x67, 0xea, 0x34, 0x29, 0x14, 0xa, 0x85, 0x92, 0x5d, 0xd4, 0x81, 0xa3, 0x81, 0x10, 0xc3, 0x7b, 0xc8, 0xe3, 0xfa, 0x8, 0x23, 0xbd, 0x74, 0x9a, 0x14, 0xa, 0x85, 0x42, 0xc9, 0x2e, 0xea, 0x40, 0xd3, 0xec, 0xc1, 0xe2, 0xf4, 0xcf, 0x74, 0x3, 0x67, 0x2, 0x22, 0x7e, 0xd7, 0x42, 0xa7, 0x49, 0xa1, 0x50, 0x28, 0x94, 0xec, 0xa2, 0x8e, 0xf5, 0xb4, 0xf0, 0x3e, 0xb6, 0x5c, 0xdb, 0x45, 0x9c, 0x33, 0x2, 0xb, 0x74, 0x9a, 0x14, 0xa, 0x85, 0x42, 0xc9, 0x2e, 0xea, 0x40, 0x3d, 0xde, 0x0, 0x23, 0xdf, 0x5a, 0xae, 0x9d, 0x6a, 0xe4, 0x70, 0x9d, 0x22, 0x85, 0x42, 0xa1, 0x50, 0xb2, 0x8b, 0x3, 0xe6, 0x18, 0x19, 0x24, 0xce, 0x29, 0xe8, 0xa9, 0x48, 0x9e, 0x0, 0xbf, 0x85, 0x4e, 0x91, 0x42, 0xa1, 0x50, 0x28, 0xd9, 0xc5, 0x1, 0xaf, 0x19, 0xb9, 0xdb, 0x32, 0xbe, 0xb3, 0x91, 0x8b, 0x75, 0x7a, 0x14, 0xa, 0x85, 0x42, 0xc9, 0x2e, 0x2e, 0xb8, 0xd9, 0xc8, 0x44, 0xcb, 0xf8, 0x19, 0x46, 0x76, 0xd2, 0xe9, 0x51, 0x28, 0x14, 0xa, 0x25, 0xbb, 0x38, 0xe0, 0x7, 0x23, 0x97, 0x59, 0xc6, 0xb7, 0x11, 0xe7, 0x68, 0x20, 0x85, 0x42, 0xa1, 0x50, 0x28, 0xd9, 0xc5, 0x2, 0x38, 0xd1, 0xfc, 0x19, 0xcb, 0x38, 0x92, 0x55, 0xda, 0xeb, 0xf4, 0x28, 0x14, 0xa, 0x85, 0x92, 0x5d, 0x5c, 0x80, 0xa2, 0xf2, 0x9f, 0x5d, 0x63, 0xa8, 0xbd, 0xfb, 0x8b, 0x4e, 0x8d, 0x42, 0xa1, 0x50, 0x28, 0xd9, 0xc5, 0x5, 0xe3, 0x8c, 0xbc, 0x6a, 0x19, 0x3f, 0xc1, 0x48, 0x4b, 0x9d, 0x1e, 0x85, 0x42, 0xa1, 0x50, 0xb2, 0x8b, 0x93, 0x75, 0xe7, 0x46, 0x47, 0xd1, 0x36, 0x62, 0xa, 0x85, 0x42, 0xa1, 0x64, 0x17, 0x23, 0x7c, 0x65, 0xe4, 0xd, 0xcb, 0xf8, 0x19, 0x3a, 0x35, 0xa, 0x85, 0x42, 0xa1, 0x64, 0x17, 0x17, 0x54, 0x1a, 0x79, 0xce, 0x32, 0xde, 0xd3, 0x48, 0x3b, 0x9d, 0x1e, 0x85, 0x42, 0xa1, 0x50, 0xb2, 0x8b, 0xb, 0xde, 0x36, 0x32, 0xd7, 0x35, 0xd6, 0x54, 0x9c, 0x33, 0xf1, 0x14, 0xa, 0x85, 0x42, 0xa1, 0x64, 0x17, 0xb, 0x2c, 0x35, 0xf2, 0xa5, 0x65, 0xfc, 0x77, 0x3a, 0x35, 0xa, 0x85, 0x42, 0xa1, 0x64, 0x17, 0x27, 0xd8, 0xb2, 0x32, 0xf7, 0x36, 0xd2, 0x5a, 0xa7, 0x46, 0xa1, 0x50, 0x28, 0x94, 0xec, 0xe2, 0x82, 0xb1, 0x46, 0x4a, 0x5c, 0x63, 0x68, 0x1d, 0xb6, 0x9d, 0x4e, 0x8d, 0x42, 0xa1, 0x50, 0x28, 0xd9, 0xc5, 0x5, 0x3f, 0x1a, 0x99, 0xea, 0x1a, 0x2b, 0x10, 0xed, 0x95, 0xa9, 0x50, 0x28, 0x14, 0x59, 0x87, 0x1e, 0x30, 0x1a, 0x1c, 0x70, 0xc0, 0xeb, 0x27, 0x46, 0xf6, 0x70, 0x8d, 0xef, 0x66, 0xe4, 0xe9, 0x8, 0x7f, 0xaf, 0x42, 0x23, 0xd, 0x8c, 0x34, 0xf1, 0xb0, 0x52, 0x13, 0x46, 0xd6, 0x19, 0x59, 0x48, 0xcb, 0x76, 0x83, 0x38, 0xa7, 0xbb, 0x2b, 0x14, 0x99, 0xee, 0x49, 0xc9, 0x35, 0x86, 0xf5, 0xd5, 0x50, 0x9c, 0xc, 0x67, 0x9b, 0xa2, 0xe, 0x85, 0xf2, 0x7b, 0xae, 0x2f, 0xac, 0xb5, 0x72, 0x9d, 0x3e, 0x5f, 0x90, 0xe0, 0xfc, 0xe3, 0x59, 0x6c, 0x6d, 0x64, 0x4b, 0xcb, 0x3b, 0x8c, 0xf9, 0xc7, 0x99, 0x9e, 0x8b, 0x8c, 0x94, 0x89, 0x73, 0xcc, 0x59, 0x45, 0xd8, 0x17, 0x96, 0x22, 0x38, 0xcc, 0xb0, 0x8c, 0xed, 0x1c, 0xb1, 0x8d, 0x7, 0x27, 0xaf, 0x77, 0x30, 0xd2, 0xc9, 0xc8, 0x5e, 0x46, 0xda, 0xf2, 0xdf, 0x45, 0xdc, 0x94, 0x2a, 0x2d, 0x2f, 0x4a, 0x5, 0x17, 0xff, 0x4f, 0xe2, 0x9c, 0xf9, 0x87, 0x79, 0x98, 0x69, 0x64, 0x16, 0xff, 0xfc, 0x26, 0xa6, 0xcf, 0xbb, 0x1e, 0x37, 0x9, 0xe1, 0xc6, 0x5b, 0xaa, 0xaf, 0x40, 0x5a, 0x6c, 0x6b, 0x64, 0x47, 0xa, 0xd6, 0x19, 0x9a, 0x2f, 0xa0, 0x79, 0xfa, 0xf6, 0x54, 0xa6, 0xa, 0x39, 0xa7, 0x95, 0x1e, 0x1b, 0x72, 0x39, 0x37, 0x5a, 0x6c, 0xba, 0xf3, 0xc5, 0x39, 0x48, 0x79, 0x26, 0xff, 0x3e, 0xdb, 0xc8, 0x2, 0x6e, 0xc6, 0x8a, 0xf4, 0x68, 0xcd, 0xf7, 0xbb, 0x3, 0xf7, 0xa7, 0x2e, 0x46, 0x76, 0x30, 0xd2, 0x86, 0x7b, 0x40, 0x7d, 0x8f, 0xf7, 0x3c, 0x39, 0xff, 0xdf, 0x73, 0xee, 0x67, 0xf0, 0x1d, 0x9f, 0xc2, 0x77, 0x7c, 0x9e, 0x92, 0x5d, 0xfe, 0x60, 0x11, 0x17, 0x49, 0x22, 0x65, 0xac, 0x63, 0xc8, 0xef, 0x19, 0xbd, 0x3c, 0xf, 0x31, 0x72, 0xb0, 0x91, 0xae, 0x5c, 0xfc, 0xad, 0x6a, 0xf1, 0x73, 0x1a, 0xf0, 0x67, 0x61, 0x43, 0xeb, 0x95, 0x32, 0x8e, 0xd, 0x68, 0xba, 0x91, 0x31, 0x46, 0xfe, 0x27, 0x4e, 0x89, 0x46, 0x1c, 0x2c, 0x3f, 0x28, 0x2, 0xb7, 0x53, 0x9, 0x10, 0x6e, 0x2, 0x77, 0x18, 0x79, 0x25, 0x8b, 0xf7, 0xd0, 0x90, 0xd6, 0xd0, 0xce, 0x54, 0x4a, 0x5a, 0xf3, 0x7e, 0x92, 0x8d, 0xc8, 0x8b, 0x68, 0x1, 0x5d, 0x60, 0xe4, 0xbb, 0x1c, 0xcc, 0x11, 0x7e, 0x7f, 0x37, 0x23, 0x87, 0x89, 0x93, 0xac, 0xb5, 0x13, 0x89, 0xae, 0x7e, 0x1d, 0xf6, 0xaf, 0x22, 0xae, 0x33, 0x6c, 0xcc, 0xfb, 0xbb, 0x3c, 0x2b, 0xdf, 0x52, 0xd9, 0x1a, 0x2f, 0xce, 0xb9, 0x93, 0x93, 0xe8, 0x69, 0xc8, 0x77, 0xd4, 0xe7, 0x3e, 0x84, 0xf7, 0xbc, 0x37, 0x9f, 0x43, 0xe7, 0x3a, 0xcc, 0x7f, 0x52, 0x61, 0xe9, 0x9d, 0x72, 0x6d, 0x1e, 0x15, 0x8e, 0x64, 0xb, 0xc5, 0xaf, 0xa5, 0x6a, 0xe, 0x83, 0x92, 0x5d, 0x8c, 0xb0, 0xd8, 0xc8, 0x2f, 0xe2, 0xd4, 0xd8, 0x25, 0xd1, 0x82, 0xda, 0x6a, 0x98, 0x36, 0x78, 0xb8, 0x29, 0x50, 0xf4, 0x7e, 0x84, 0x91, 0xc3, 0x49, 0x50, 0x41, 0xa1, 0x2d, 0xa5, 0x9f, 0x91, 0xeb, 0x8d, 0x7c, 0x64, 0xe4, 0x29, 0x23, 0x6f, 0x8a, 0x53, 0xb2, 0x11, 0x55, 0x1c, 0x21, 0x55, 0x5b, 0xc2, 0x2d, 0xa, 0x98, 0xec, 0xb0, 0x69, 0x75, 0x37, 0xb2, 0x9f, 0x91, 0x3, 0x8c, 0xec, 0x23, 0x4e, 0xf, 0xd6, 0xa2, 0x6a, 0xfe, 0xdf, 0xf3, 0x46, 0xfe, 0x9b, 0xc5, 0xb9, 0x1, 0xb1, 0xf5, 0x31, 0x72, 0x1a, 0xad, 0x87, 0x6c, 0xec, 0x3b, 0xc5, 0xdc, 0xd0, 0x21, 0xfd, 0x8d, 0xc, 0xe5, 0x6, 0x8c, 0x86, 0xf, 0x23, 0xb9, 0xee, 0xf2, 0xd, 0xed, 0xa9, 0xc4, 0x9e, 0xc8, 0xf7, 0xbd, 0x41, 0xc0, 0xbf, 0xab, 0x3d, 0x9, 0x75, 0x8, 0x95, 0x8e, 0xff, 0x70, 0xee, 0xc7, 0x2b, 0xd9, 0xc5, 0xf, 0x38, 0x1, 0x61, 0x8d, 0x8b, 0xec, 0x8a, 0xa8, 0x7d, 0x2f, 0x8, 0xc1, 0xfd, 0x61, 0x23, 0x38, 0x95, 0x1b, 0x75, 0xb7, 0x1c, 0x69, 0xfa, 0x7d, 0x28, 0xd3, 0x8c, 0x3c, 0x6e, 0xe4, 0x3e, 0xa9, 0x7a, 0x72, 0x44, 0x14, 0x60, 0x73, 0xb5, 0x95, 0x7, 0xb8, 0x91, 0x9c, 0xcc, 0x79, 0xeb, 0x4e, 0xcb, 0xa6, 0x26, 0x48, 0x64, 0x61, 0x3e, 0x12, 0x24, 0x19, 0x9c, 0xf8, 0xd1, 0xd7, 0xf5, 0xe, 0xe4, 0x6a, 0xaf, 0x83, 0x5, 0x73, 0x95, 0x38, 0x67, 0x4f, 0xc2, 0xb3, 0x80, 0x23, 0xb9, 0x9e, 0xa5, 0x15, 0x18, 0x67, 0xec, 0x6e, 0xe4, 0x1c, 0x23, 0x87, 0x4a, 0x6e, 0xba, 0x38, 0x25, 0xc3, 0x21, 0xff, 0xe0, 0xdc, 0x7f, 0xc0, 0xf7, 0xfc, 0x1d, 0x7a, 0x40, 0x94, 0xec, 0x62, 0x80, 0xd5, 0x46, 0xd6, 0x5a, 0xb4, 0xf1, 0x46, 0x39, 0xbe, 0xaf, 0x83, 0xb8, 0x9, 0x1d, 0x23, 0x8e, 0xeb, 0xab, 0xa6, 0xc0, 0x26, 0xe, 0x3f, 0x3d, 0x12, 0x51, 0x56, 0x88, 0x13, 0x9b, 0x4a, 0x70, 0xc3, 0x87, 0x65, 0x81, 0x58, 0x4b, 0x73, 0x23, 0x9b, 0xd5, 0xe0, 0x67, 0xc2, 0x8d, 0x72, 0x8b, 0x91, 0xb3, 0xc4, 0x39, 0xf9, 0xfd, 0x71, 0x89, 0x56, 0xcc, 0xab, 0x32, 0xc3, 0xb1, 0xba, 0xa0, 0x27, 0x37, 0xad, 0xa3, 0x42, 0x40, 0x1e, 0xe9, 0x80, 0xe6, 0x9, 0x57, 0x53, 0xab, 0xaf, 0xd, 0xb1, 0xae, 0xa4, 0x60, 0xfe, 0x96, 0x71, 0x43, 0x4c, 0xfe, 0x1c, 0x78, 0x44, 0xb6, 0x20, 0xc1, 0x37, 0xa2, 0x57, 0xa2, 0xb0, 0x86, 0x3f, 0xbf, 0x1, 0x37, 0x7e, 0xc8, 0xa5, 0x46, 0x6e, 0x23, 0xe9, 0xc5, 0xcd, 0xc5, 0x9, 0x4b, 0xff, 0x5c, 0x5a, 0x72, 0xb5, 0xb1, 0xe2, 0xa0, 0x74, 0x22, 0xee, 0xe, 0xf7, 0xe3, 0xf2, 0x94, 0xf5, 0x5c, 0xc9, 0xf5, 0xd7, 0x94, 0xcf, 0x21, 0xe9, 0xad, 0xca, 0x4, 0x9b, 0x1b, 0xf9, 0x3, 0x15, 0x6c, 0x58, 0x78, 0x77, 0xd0, 0xd3, 0x10, 0x78, 0x72, 0x91, 0x92, 0x5d, 0xb0, 0xc0, 0x42, 0xf9, 0xc5, 0xb2, 0x1, 0xe6, 0xc2, 0x85, 0x59, 0x9f, 0x9b, 0xe4, 0x59, 0xb4, 0x8, 0x32, 0x8d, 0x93, 0x94, 0x93, 0xd0, 0x3e, 0x17, 0xa7, 0xc9, 0x35, 0x82, 0xcf, 0x70, 0x37, 0x2e, 0xa1, 0x46, 0x9c, 0x4a, 0x76, 0x15, 0x29, 0x64, 0x87, 0x17, 0xa0, 0x15, 0xad, 0x10, 0x4, 0xbc, 0x7f, 0x4f, 0xcd, 0xba, 0xba, 0x97, 0xe, 0xbe, 0xff, 0x7, 0x8d, 0xfc, 0xd9, 0xc8, 0xe5, 0xb9, 0x72, 0x79, 0x84, 0xc, 0x3d, 0x8c, 0x5c, 0xc8, 0xe7, 0x57, 0x1c, 0xe2, 0xfb, 0x44, 0x72, 0xc9, 0x35, 0x46, 0x4e, 0xcf, 0x70, 0x73, 0xc5, 0xba, 0x41, 0xec, 0x10, 0xb1, 0x34, 0xc4, 0x76, 0xe6, 0x51, 0x89, 0x5a, 0xc9, 0x77, 0x47, 0xaa, 0x21, 0xbb, 0x86, 0x54, 0xaa, 0x40, 0x78, 0xad, 0xb9, 0xce, 0xba, 0xd3, 0x8a, 0xd8, 0x3c, 0xc3, 0xd, 0x78, 0x57, 0x2a, 0x56, 0x3, 0x68, 0x79, 0xbc, 0x17, 0x83, 0xf5, 0x2, 0xeb, 0xed, 0x62, 0x2a, 0xb4, 0x99, 0x5a, 0xfd, 0x78, 0x97, 0x67, 0xf1, 0x3d, 0x1f, 0xc7, 0xe7, 0xb0, 0x84, 0xef, 0x77, 0x2a, 0xd9, 0x25, 0x95, 0xda, 0x26, 0x54, 0x66, 0x93, 0x64, 0xb7, 0xd, 0xdf, 0xef, 0xae, 0x54, 0x76, 0x9a, 0x57, 0xc3, 0x2f, 0x9, 0x3e, 0x2b, 0x58, 0xd7, 0x3, 0x8d, 0xdc, 0x4a, 0x4b, 0x4f, 0xc9, 0x2e, 0xa2, 0xa8, 0x97, 0x25, 0x97, 0x51, 0x75, 0xe8, 0x4f, 0xf7, 0x41, 0xaf, 0x1a, 0x68, 0xd6, 0xe3, 0xb9, 0xf0, 0xb1, 0x0, 0x27, 0xd0, 0x4a, 0xcd, 0x4, 0xc9, 0xec, 0xb7, 0xf9, 0x16, 0x6d, 0x1a, 0x19, 0x5e, 0x87, 0x51, 0xa3, 0x3e, 0xa0, 0x1a, 0xb, 0x17, 0xd6, 0xe7, 0x28, 0x5a, 0x8, 0xff, 0xce, 0xd3, 0xf5, 0x83, 0xac, 0xc4, 0x21, 0x54, 0x50, 0x6a, 0xfa, 0xae, 0x42, 0x2b, 0x5f, 0x98, 0x42, 0x1e, 0x73, 0xb9, 0x69, 0x81, 0x5c, 0x3e, 0xe, 0xe0, 0x5e, 0xf1, 0x5c, 0xef, 0x12, 0x27, 0x26, 0x97, 0xe, 0x3f, 0x70, 0x33, 0x7d, 0x5f, 0x9c, 0xf8, 0xcd, 0x2c, 0xa9, 0xb9, 0x1b, 0x71, 0x59, 0x35, 0x7b, 0x1a, 0x48, 0x10, 0x9, 0x43, 0x7, 0x8a, 0x93, 0xb4, 0xd2, 0x85, 0x9b, 0x71, 0x3a, 0xf4, 0xe6, 0x9a, 0xbc, 0xdb, 0xc8, 0x30, 0x89, 0xa6, 0x2b, 0x1d, 0xdf, 0xfd, 0x4c, 0x2a, 0x1c, 0x99, 0x74, 0x6a, 0x42, 0x1c, 0xed, 0xb, 0x71, 0x7a, 0xf9, 0x7e, 0xc8, 0x77, 0x37, 0xd3, 0x24, 0x12, 0x58, 0xc1, 0x3f, 0x7a, 0x5c, 0xc3, 0xfc, 0xef, 0xce, 0xf7, 0x1c, 0x4a, 0xee, 0xde, 0x24, 0x47, 0x2f, 0xf4, 0xe1, 0xfb, 0xfe, 0xb0, 0x91, 0x9b, 0xa4, 0x6a, 0x5f, 0x61, 0x25, 0x3b, 0x45, 0xb5, 0xc0, 0xb, 0x7f, 0xa5, 0x91, 0x23, 0x33, 0x78, 0xd6, 0x15, 0xd4, 0xb0, 0x9f, 0xe0, 0x46, 0x34, 0xc1, 0xe7, 0x7b, 0xc1, 0x4b, 0x34, 0x83, 0x82, 0x33, 0xff, 0xf6, 0x35, 0x72, 0x34, 0x37, 0xf2, 0x2d, 0x3c, 0xfe, 0x4f, 0x33, 0x23, 0xff, 0xa2, 0xa6, 0x8e, 0x4d, 0x7f, 0x5d, 0x1e, 0x3d, 0xbb, 0x53, 0xb8, 0x69, 0x75, 0xc8, 0xf0, 0xf3, 0x20, 0x8c, 0x89, 0xdc, 0xb8, 0xbe, 0x22, 0xa9, 0x2d, 0x94, 0xec, 0x24, 0xfd, 0xc0, 0xea, 0x84, 0xeb, 0x39, 0x5d, 0x62, 0xc, 0xb2, 0xf1, 0x1e, 0xa5, 0xe5, 0x34, 0x25, 0xc0, 0x7b, 0x29, 0xa3, 0x62, 0x36, 0x96, 0x22, 0x5c, 0x3f, 0x70, 0x1, 0xff, 0x89, 0xa, 0x5f, 0x61, 0x9a, 0xfd, 0xf0, 0x22, 0xbe, 0x37, 0x58, 0x97, 0x33, 0x23, 0xb4, 0x5e, 0x92, 0x61, 0x80, 0x23, 0x32, 0x98, 0x9f, 0xd1, 0xe2, 0x24, 0x8b, 0x20, 0x76, 0xf6, 0x6d, 0x0, 0xf7, 0x82, 0xf7, 0xf4, 0x53, 0x4a, 0x82, 0x64, 0x77, 0x38, 0xd7, 0x74, 0xfb, 0x34, 0x96, 0x1e, 0x2c, 0xbc, 0xbe, 0x5c, 0xf7, 0x4f, 0x28, 0xd9, 0x45, 0xb, 0x30, 0xe5, 0x9b, 0x7a, 0x3c, 0xd8, 0xa0, 0x2d, 0x2, 0xb8, 0x31, 0xce, 0x91, 0xea, 0x33, 0xf3, 0x16, 0xd3, 0x82, 0x7a, 0x82, 0xda, 0x5d, 0xb6, 0xe2, 0x64, 0x9f, 0x51, 0x86, 0xf3, 0x5e, 0xe1, 0xfa, 0xf2, 0x3a, 0xcd, 0x7d, 0x30, 0x5d, 0x24, 0x27, 0xd1, 0xad, 0x12, 0x67, 0x40, 0x23, 0xbf, 0x9d, 0xdf, 0x35, 0x13, 0x5, 0x2, 0x1b, 0xfa, 0x5b, 0x46, 0x5e, 0x26, 0xc1, 0x95, 0x65, 0xf1, 0x5e, 0xb, 0xf9, 0xfc, 0x6, 0xa5, 0xf9, 0xcc, 0x47, 0xb4, 0x96, 0x5e, 0x92, 0xdc, 0xc5, 0x60, 0x93, 0x4a, 0xd6, 0x63, 0xb4, 0x38, 0xce, 0x33, 0x72, 0x6c, 0x1a, 0x25, 0xb, 0xd6, 0x8, 0xd2, 0xe5, 0x7, 0x70, 0xc3, 0x8e, 0x82, 0x62, 0x84, 0xe7, 0xd0, 0x22, 0xcd, 0x67, 0xf0, 0xde, 0xa0, 0xd4, 0xe7, 0x11, 0xbe, 0x77, 0x95, 0x59, 0xba, 0xb7, 0x4a, 0x5a, 0x8f, 0x10, 0xb8, 0x2a, 0x8f, 0xe1, 0xbe, 0xd4, 0xd3, 0xe3, 0xf3, 0xc8, 0xd4, 0x7e, 0x9c, 0x4a, 0xc9, 0x10, 0x7a, 0x2, 0x7c, 0x81, 0xb6, 0xb, 0xb, 0x16, 0x70, 0xd3, 0x15, 0x5b, 0x2c, 0xa8, 0xa0, 0xb2, 0xbf, 0xea, 0x91, 0x34, 0xa0, 0x3d, 0x5f, 0x50, 0xd, 0xd1, 0x2d, 0xa4, 0xbb, 0xe6, 0x20, 0xbe, 0xd4, 0xef, 0xe5, 0x68, 0x33, 0x5a, 0xca, 0x45, 0xdd, 0x87, 0x1b, 0xa2, 0x17, 0xfa, 0x51, 0x1b, 0x6d, 0x16, 0xe3, 0xf5, 0x82, 0xd, 0xe0, 0x9d, 0xc, 0x88, 0x6e, 0x39, 0xad, 0x63, 0x3c, 0x3b, 0xb8, 0x8a, 0xfe, 0x29, 0x8e, 0xdb, 0xb8, 0x2c, 0xcb, 0xf7, 0x3b, 0x22, 0xd, 0xd1, 0x2d, 0xe2, 0xa6, 0x86, 0x24, 0x95, 0xe7, 0x24, 0x1c, 0xc9, 0x46, 0x15, 0xf4, 0x58, 0xc, 0xe4, 0x7a, 0x43, 0x46, 0xa0, 0x57, 0x62, 0x44, 0x47, 0x12, 0xde, 0x81, 0x21, 0x5e, 0x2f, 0x5, 0x24, 0x90, 0xc7, 0xd3, 0x10, 0x5d, 0x5, 0x49, 0x1e, 0xdf, 0xf7, 0x4c, 0x92, 0x77, 0x65, 0x8e, 0xee, 0x17, 0x99, 0xe9, 0x4f, 0xf2, 0x5e, 0xb0, 0xc6, 0xa7, 0xa6, 0xf9, 0xec, 0xe9, 0x54, 0xe2, 0x7a, 0x28, 0xd9, 0x45, 0x3, 0x4d, 0xa5, 0x6a, 0x5c, 0x6a, 0x43, 0x40, 0xae, 0x3, 0x68, 0xac, 0x23, 0xa9, 0xb9, 0xed, 0x98, 0xe6, 0x73, 0x88, 0x91, 0xc0, 0xb5, 0x89, 0xb6, 0x65, 0xd7, 0x85, 0xc8, 0x55, 0x33, 0x99, 0x5a, 0xdf, 0x5f, 0x65, 0x63, 0x72, 0x82, 0x1b, 0x88, 0xb, 0x3d, 0x95, 0x46, 0x23, 0x8f, 0x32, 0x4e, 0xe4, 0xf3, 0xeb, 0x9a, 0xe6, 0x33, 0x8b, 0xa8, 0xa0, 0xec, 0x46, 0x6b, 0xf8, 0xe3, 0x1c, 0xde, 0x2f, 0xea, 0xd6, 0xce, 0xf7, 0xb8, 0xf6, 0x16, 0x35, 0xf3, 0xfb, 0x25, 0xbc, 0xae, 0x67, 0x90, 0xde, 0xb9, 0x54, 0x16, 0x3e, 0xf4, 0xf8, 0x4c, 0xb, 0x2a, 0x58, 0x5d, 0x42, 0x78, 0xff, 0xf0, 0x82, 0x20, 0x83, 0x14, 0xb1, 0x78, 0x2f, 0x4f, 0xd1, 0xe7, 0xfc, 0x7e, 0x20, 0x8e, 0xaf, 0x43, 0x74, 0xef, 0x50, 0xf6, 0x9f, 0x26, 0x91, 0xd, 0x4d, 0x63, 0xbd, 0xc1, 0x9d, 0xfc, 0x6, 0xf7, 0x5, 0x25, 0xbb, 0x90, 0x3, 0xd9, 0x88, 0xee, 0xf4, 0xfb, 0x1f, 0xc4, 0xdf, 0x6c, 0x4c, 0x68, 0x77, 0x97, 0x88, 0xe3, 0x8a, 0xec, 0x5b, 0x8d, 0x1b, 0xe3, 0x6, 0x5a, 0x3, 0x8, 0x2, 0xaf, 0xc, 0xe9, 0x9c, 0xc1, 0xe5, 0x75, 0x38, 0x49, 0xd9, 0x8b, 0xf0, 0x86, 0x4b, 0x38, 0x12, 0x7f, 0xfc, 0xc2, 0x60, 0x6a, 0xdf, 0x4d, 0xd3, 0x68, 0xe7, 0xf, 0x50, 0x23, 0x86, 0x82, 0xb2, 0x24, 0xc7, 0xf7, 0x8b, 0x58, 0xeb, 0xdf, 0x3d, 0xae, 0xdd, 0xc1, 0xeb, 0x73, 0x22, 0x32, 0xf7, 0x88, 0x5f, 0xf5, 0xa7, 0x75, 0x6c, 0xc3, 0xb6, 0xb4, 0x9c, 0xb6, 0xc, 0xd1, 0x3d, 0xb7, 0xa5, 0x17, 0xc4, 0x8b, 0x4, 0xa0, 0x50, 0x27, 0x4b, 0x3f, 0xde, 0xd, 0xf1, 0xdc, 0xc3, 0xd2, 0xbb, 0x99, 0x7b, 0xd2, 0x48, 0x8f, 0xcf, 0x34, 0xe7, 0xfc, 0x5f, 0xa0, 0x64, 0x17, 0x6e, 0x6c, 0x6f, 0x19, 0x9b, 0xef, 0xb3, 0xe5, 0x8, 0x17, 0xd1, 0xed, 0x69, 0xdc, 0x18, 0x58, 0xf8, 0x88, 0xc7, 0xed, 0xc3, 0x17, 0x20, 0xa, 0xbd, 0x2, 0x3f, 0xe5, 0x6, 0xf4, 0x59, 0x1a, 0x17, 0xc7, 0xc5, 0x31, 0x58, 0x1f, 0x50, 0x54, 0xae, 0x15, 0x27, 0x8b, 0xd1, 0x2b, 0x69, 0x2, 0xc9, 0x26, 0x70, 0xe1, 0x9e, 0x1d, 0x12, 0x2b, 0x1c, 0xb1, 0xd3, 0x3b, 0xc5, 0x5e, 0xba, 0x72, 0xa3, 0x38, 0x75, 0x6b, 0x51, 0xab, 0x57, 0x43, 0x79, 0x10, 0x12, 0x53, 0x4e, 0x13, 0x7b, 0x88, 0x61, 0x2f, 0x3e, 0xa7, 0x30, 0x0, 0x56, 0x26, 0xba, 0xd, 0xed, 0xef, 0x71, 0x7d, 0x1a, 0xdf, 0x1d, 0x28, 0xb6, 0x51, 0xc9, 0x28, 0x9d, 0x42, 0x5, 0x17, 0x56, 0x9e, 0x2d, 0xeb, 0xbb, 0x9, 0x95, 0x91, 0xcb, 0x94, 0xec, 0xc2, 0xb, 0x5b, 0x26, 0x9d, 0x9f, 0x1a, 0x2f, 0x5c, 0x19, 0x7, 0xa4, 0xb9, 0xfe, 0x39, 0x17, 0x11, 0x5e, 0xe2, 0xa8, 0x35, 0x5f, 0xfe, 0x86, 0x16, 0xc2, 0x27, 0x1e, 0xd7, 0x61, 0x59, 0xfc, 0x3e, 0xe2, 0xeb, 0x3, 0x75, 0x5d, 0xc3, 0xaa, 0xb1, 0x72, 0xfb, 0xd2, 0x6a, 0xf, 0xb, 0xb0, 0xe9, 0xdb, 0x4e, 0xbb, 0xb8, 0x85, 0xca, 0x54, 0x94, 0x1, 0xa5, 0x10, 0xc9, 0x2b, 0xb6, 0xf8, 0xe2, 0xb9, 0x54, 0x3a, 0x72, 0x89, 0x4e, 0xb4, 0xe8, 0xbc, 0xfa, 0x58, 0xbe, 0x40, 0x6b, 0x2e, 0x8a, 0xb5, 0x82, 0x15, 0xb4, 0xf2, 0x8e, 0x13, 0xef, 0xee, 0x52, 0x37, 0x53, 0x29, 0x51, 0xb2, 0xb, 0x19, 0xa0, 0xa9, 0xef, 0x6a, 0x19, 0x9f, 0xec, 0xe3, 0xef, 0x98, 0x27, 0x76, 0x77, 0x12, 0x12, 0x18, 0xae, 0x20, 0x19, 0x8c, 0x8e, 0xf0, 0x1c, 0x7e, 0xcf, 0xc5, 0x6f, 0x4b, 0x55, 0x47, 0x2d, 0xcf, 0x8, 0x9, 0x77, 0x27, 0x91, 0x74, 0x80, 0x5b, 0x66, 0x88, 0xc7, 0x35, 0x3c, 0x3f, 0xb4, 0x3, 0x43, 0xfc, 0xf2, 0xc7, 0x10, 0xdd, 0x33, 0x14, 0xa7, 0x13, 0x2c, 0xe3, 0x2f, 0x92, 0xe8, 0x2a, 0x63, 0xf0, 0xde, 0xa2, 0x3c, 0xe2, 0x7c, 0xcb, 0x77, 0xc1, 0xfb, 0xdc, 0x26, 0x87, 0xf7, 0x5, 0xc5, 0xf6, 0x71, 0xf1, 0x3e, 0xf, 0x13, 0xef, 0x2, 0x4a, 0x2b, 0xa2, 0x7e, 0xca, 0xc3, 0x3b, 0x5c, 0x67, 0x5f, 0x7a, 0xf0, 0xd5, 0x70, 0x7a, 0xf, 0x94, 0xec, 0x42, 0x4, 0xc4, 0xea, 0xf6, 0xb3, 0x8c, 0xcf, 0xf2, 0xf1, 0x77, 0xe0, 0x85, 0xbc, 0x47, 0x36, 0x3d, 0x1f, 0x6f, 0x24, 0xad, 0x1, 0x68, 0xda, 0x25, 0x31, 0x98, 0xc7, 0x25, 0xb4, 0x4c, 0x6d, 0x41, 0xec, 0x3d, 0xeb, 0xea, 0xda, 0xc8, 0x11, 0x50, 0xc3, 0x75, 0x87, 0xc7, 0x35, 0x14, 0xd4, 0xa2, 0x9d, 0xd2, 0x53, 0x21, 0xbb, 0x67, 0x64, 0x15, 0x5f, 0x2c, 0x55, 0xdd, 0xad, 0x8b, 0x39, 0x5e, 0x16, 0xa3, 0x77, 0x17, 0x1d, 0x7c, 0x1e, 0x4a, 0xf9, 0x37, 0xdc, 0xe9, 0xe8, 0x21, 0xfb, 0x4c, 0x8e, 0xee, 0x7, 0xa, 0x1d, 0x5a, 0x6a, 0xed, 0xed, 0x71, 0xfd, 0x1a, 0x3e, 0x83, 0xb8, 0x9c, 0xe7, 0x87, 0x2c, 0xcd, 0x3f, 0xca, 0xc6, 0x3a, 0x49, 0x9b, 0x17, 0xe1, 0x7c, 0x25, 0xbb, 0xf0, 0x0, 0x8d, 0x95, 0xdd, 0xad, 0x7a, 0x16, 0x5, 0xa0, 0x79, 0x55, 0x70, 0xa1, 0x63, 0x61, 0xdc, 0xc4, 0x45, 0xf2, 0x75, 0xcc, 0xe6, 0x72, 0x2, 0xdd, 0x17, 0xb6, 0xc4, 0x1e, 0x8c, 0xef, 0x16, 0xa1, 0xef, 0x2, 0x57, 0x98, 0x57, 0xcc, 0xb, 0x5d, 0x6b, 0xe, 0x16, 0xef, 0x58, 0x65, 0x2e, 0x81, 0x98, 0x6f, 0x6f, 0xcb, 0xf8, 0xdf, 0x24, 0x98, 0xec, 0xe2, 0x5c, 0x3, 0x1e, 0x13, 0x64, 0x36, 0xa3, 0x1e, 0xf, 0xa1, 0x2, 0xa4, 0xcc, 0xaf, 0xcd, 0xc1, 0x7d, 0x60, 0x9d, 0x20, 0xa6, 0xeb, 0x55, 0x2, 0x71, 0x95, 0x78, 0x27, 0xb, 0x45, 0x19, 0x8b, 0xa9, 0xf4, 0xbd, 0xe2, 0xc1, 0x5b, 0xe8, 0x67, 0xda, 0x5f, 0xc9, 0x2e, 0x1c, 0x38, 0xd2, 0x43, 0x63, 0x59, 0x18, 0xc0, 0xef, 0x5a, 0xca, 0xdf, 0x77, 0x65, 0x4c, 0xac, 0x39, 0x1b, 0x60, 0xe9, 0x3c, 0x6a, 0x19, 0x47, 0xf0, 0x7a, 0x50, 0x44, 0xbe, 0x3, 0x6a, 0xb7, 0xee, 0x13, 0x7b, 0x7f, 0xcb, 0x2f, 0xf9, 0xc, 0xe7, 0x85, 0xf4, 0xde, 0x61, 0xd9, 0xb8, 0x33, 0x60, 0xe1, 0x92, 0x7f, 0x2e, 0xa6, 0xeb, 0xd, 0xef, 0xe9, 0x19, 0xe2, 0x14, 0x62, 0xe7, 0xd2, 0x6a, 0x1d, 0x4c, 0xcf, 0x86, 0x97, 0x45, 0x77, 0x63, 0x8c, 0xf7, 0x50, 0x24, 0xe, 0xd, 0xf0, 0x50, 0xfe, 0x10, 0xc6, 0x40, 0x86, 0x72, 0xa6, 0x1d, 0x86, 0x94, 0xec, 0x2, 0x2, 0xfa, 0x40, 0xda, 0x3a, 0x4, 0xa0, 0x8b, 0x40, 0x50, 0xc5, 0xb5, 0xab, 0xf3, 0x60, 0x5e, 0x87, 0x79, 0x90, 0x1, 0x62, 0x15, 0x5d, 0x43, 0x7e, 0xef, 0x28, 0xf0, 0x47, 0xdd, 0x59, 0x5b, 0xcb, 0xb5, 0xc9, 0xb4, 0x20, 0x16, 0x87, 0xf4, 0xde, 0xe1, 0x92, 0x3f, 0xd4, 0xe2, 0x51, 0xb8, 0x47, 0xaa, 0x36, 0x3a, 0x57, 0xf8, 0x7, 0xa4, 0xe4, 0xdf, 0x22, 0xf6, 0x32, 0x9b, 0xbb, 0x62, 0x6a, 0xd1, 0xb9, 0x81, 0x12, 0x29, 0xc4, 0xed, 0x6d, 0xde, 0xaa, 0x36, 0xb4, 0xb8, 0x33, 0x3a, 0x5d, 0x45, 0xc9, 0x2e, 0x18, 0xa0, 0xc0, 0x7b, 0x67, 0xd7, 0x18, 0xfc, 0xe9, 0x63, 0x74, 0x6a, 0xea, 0x84, 0xef, 0xf8, 0xf2, 0xbb, 0x81, 0x98, 0xc6, 0xd9, 0x21, 0xbf, 0x77, 0xd4, 0xc7, 0xf5, 0xf2, 0xb0, 0x20, 0x50, 0x50, 0x1e, 0x66, 0x57, 0x20, 0x36, 0xdd, 0xad, 0x5d, 0x63, 0x70, 0xc7, 0xbf, 0xac, 0x4b, 0x32, 0x30, 0xa0, 0x6d, 0xdc, 0xdd, 0x62, 0x3f, 0x3d, 0x2, 0x9d, 0x5d, 0x2e, 0xcb, 0xa3, 0xb9, 0xc0, 0x5a, 0x3b, 0xd9, 0xe3, 0x1d, 0x41, 0x8f, 0xdd, 0x8c, 0xca, 0x42, 0x94, 0xec, 0x82, 0xc1, 0x11, 0x16, 0x6d, 0x3, 0xe9, 0xb4, 0x1f, 0xeb, 0xd4, 0xd4, 0x19, 0xe8, 0x68, 0x31, 0xc9, 0x32, 0x7e, 0xbc, 0x64, 0xd6, 0xe9, 0x3d, 0x17, 0x40, 0x31, 0xf8, 0x85, 0x96, 0x71, 0xc4, 0x80, 0x90, 0xac, 0x32, 0x25, 0xe4, 0x73, 0xe, 0x2f, 0x85, 0x3b, 0xc6, 0x88, 0x92, 0x90, 0x65, 0xba, 0x1c, 0x3, 0x3, 0x36, 0x70, 0x5b, 0x89, 0x1, 0x9a, 0x7d, 0xa3, 0xc, 0xa2, 0x24, 0xcf, 0xe6, 0x63, 0x2a, 0xdf, 0x21, 0x9b, 0x67, 0xc, 0x39, 0xb, 0x47, 0x29, 0xd9, 0x65, 0x1f, 0x68, 0xf, 0xf6, 0x7f, 0x96, 0x71, 0xd4, 0xc7, 0x6c, 0xd0, 0xe9, 0xa9, 0x33, 0xd0, 0x75, 0xe1, 0x1e, 0xcb, 0x78, 0xcb, 0x4c, 0x16, 0x7c, 0x96, 0x51, 0x42, 0xab, 0x13, 0xd6, 0xa8, 0xad, 0x4f, 0x29, 0xd2, 0xf5, 0x47, 0x86, 0x7c, 0xbe, 0x11, 0x5f, 0xb4, 0x9d, 0x62, 0xff, 0xb6, 0x2e, 0xc5, 0xc0, 0xd0, 0x97, 0x4a, 0x90, 0x1b, 0xd8, 0x3f, 0xd0, 0x6f, 0x74, 0x71, 0x9e, 0xce, 0xb, 0xf6, 0x50, 0xaf, 0x2c, 0x66, 0xd4, 0xac, 0xb6, 0x50, 0xb2, 0xcb, 0x2e, 0x50, 0x8, 0xdd, 0xd1, 0x35, 0x6, 0x6d, 0xe4, 0x39, 0x9d, 0x1a, 0xdf, 0x80, 0x14, 0xf0, 0x19, 0xae, 0xb1, 0x4, 0xc9, 0xae, 0x28, 0x44, 0xf7, 0x9, 0xb2, 0x43, 0x3d, 0xdd, 0x5e, 0x96, 0x6b, 0x48, 0x7c, 0x18, 0x11, 0x81, 0xb9, 0x46, 0x1f, 0x52, 0xdb, 0xb1, 0x2c, 0x9f, 0xeb, 0x32, 0xc, 0x4, 0x50, 0x8e, 0x6e, 0xb7, 0xec, 0xcd, 0x28, 0x33, 0x42, 0xe6, 0xe5, 0x67, 0x79, 0x3e, 0x3f, 0xc8, 0x38, 0xff, 0xc0, 0x32, 0x8e, 0xce, 0x32, 0x43, 0x94, 0xec, 0xb2, 0x87, 0x22, 0xba, 0x18, 0xdc, 0x80, 0xcb, 0x67, 0x92, 0x4e, 0x8f, 0x6f, 0x40, 0x52, 0xc4, 0xf3, 0x96, 0x71, 0x9c, 0x90, 0xbc, 0x7d, 0x88, 0xee, 0x13, 0x75, 0x51, 0x36, 0xf7, 0xe5, 0x3c, 0x8f, 0xf1, 0xb0, 0x92, 0x9d, 0x7b, 0x4e, 0xe1, 0xbe, 0x5c, 0xa1, 0xcb, 0x30, 0x10, 0x60, 0xff, 0xb0, 0x95, 0xd2, 0x8c, 0x15, 0xe7, 0x6c, 0xc7, 0x7c, 0x7, 0x5a, 0xa0, 0x9d, 0x27, 0xf6, 0xc4, 0xa8, 0xf3, 0x3c, 0x14, 0x4b, 0x25, 0xbb, 0x0, 0x80, 0xd4, 0x71, 0x5b, 0xcf, 0x3a, 0xa4, 0xcd, 0xaf, 0xd7, 0xe9, 0xf1, 0x15, 0xb0, 0x94, 0xdd, 0x1d, 0xf5, 0x51, 0xd7, 0xd8, 0x33, 0x44, 0xf7, 0x88, 0x17, 0xaf, 0xb9, 0x6b, 0xc, 0x59, 0x8c, 0xc3, 0x24, 0x98, 0x12, 0x94, 0x20, 0xd0, 0xc4, 0x62, 0x2d, 0xa3, 0x31, 0xc2, 0x6a, 0x5d, 0x82, 0xbe, 0x3, 0xa7, 0xa9, 0xdb, 0xba, 0x83, 0x60, 0x9d, 0x5f, 0xa4, 0x7b, 0xc8, 0x6f, 0x98, 0x4a, 0xeb, 0xd7, 0x8d, 0x46, 0x95, 0x95, 0x95, 0xd7, 0x16, 0x35, 0x68, 0xd0, 0x40, 0xc9, 0x2e, 0x58, 0xa0, 0xb3, 0x84, 0xad, 0x33, 0xf7, 0x7c, 0x51, 0x17, 0x66, 0x10, 0x80, 0x1b, 0xd3, 0x76, 0x34, 0x4b, 0xbf, 0x90, 0xdf, 0x37, 0xda, 0xb7, 0x3d, 0x1d, 0xa1, 0x79, 0xb6, 0x95, 0x4a, 0x20, 0x76, 0x54, 0xa6, 0x4b, 0xd0, 0x77, 0xa0, 0x2b, 0x88, 0xed, 0x0, 0x63, 0xc4, 0xa8, 0x27, 0xea, 0xf4, 0x6c, 0x2, 0x34, 0x86, 0x9e, 0xe6, 0x1e, 0x34, 0x44, 0xd7, 0xef, 0x8d, 0xd1, 0x1f, 0xf4, 0x56, 0xb2, 0xb, 0x16, 0xa7, 0x79, 0x58, 0x75, 0x88, 0xcb, 0xac, 0xd2, 0xe9, 0xf1, 0x1d, 0x65, 0x1e, 0x64, 0xb7, 0xaf, 0x84, 0x2b, 0x6e, 0xe7, 0x26, 0x89, 0x2b, 0x23, 0x46, 0x14, 0x4d, 0x2c, 0x63, 0x68, 0xdd, 0x56, 0xaa, 0x4b, 0xd0, 0x57, 0x20, 0x2e, 0x3a, 0xc0, 0x32, 0x3e, 0x4f, 0xa2, 0x11, 0xdb, 0xcd, 0x36, 0xb0, 0xa7, 0x5e, 0xef, 0x1e, 0x2c, 0x28, 0x28, 0x28, 0x9c, 0x38, 0x6d, 0xe6, 0x25, 0xd3, 0x67, 0xcf, 0x4d, 0x28, 0xd9, 0x5, 0x3, 0xd4, 0x20, 0x5d, 0x61, 0x19, 0x9f, 0x2d, 0xb9, 0xeb, 0xa7, 0x97, 0xf, 0x40, 0x92, 0x84, 0xdb, 0xb5, 0x83, 0x73, 0xc7, 0x3a, 0x87, 0xf4, 0x7e, 0xd1, 0xc8, 0x77, 0x42, 0xc4, 0xe6, 0xd8, 0xd6, 0xa2, 0x6d, 0xb5, 0xf8, 0x7b, 0x26, 0xa3, 0xc2, 0x51, 0x96, 0xb7, 0xb1, 0x8c, 0xa3, 0x65, 0xd9, 0x12, 0x9d, 0x1e, 0x2b, 0x70, 0xca, 0xc3, 0x26, 0x8d, 0xee, 0x13, 0x86, 0xe2, 0x4a, 0x4a, 0x4b, 0xfb, 0xbe, 0xfc, 0xf6, 0x7b, 0x87, 0x54, 0x54, 0x54, 0x28, 0xd9, 0xf9, 0xc, 0x68, 0x10, 0xe8, 0x64, 0x60, 0x3b, 0x1d, 0xfc, 0x1f, 0xe2, 0x7d, 0xa, 0xaf, 0xa2, 0xee, 0x98, 0x60, 0xd9, 0x8, 0x90, 0xcd, 0xb6, 0x4b, 0x8, 0xef, 0x15, 0xa7, 0x17, 0xdc, 0x11, 0x13, 0x92, 0x80, 0x15, 0x52, 0xac, 0xcb, 0xcf, 0x37, 0x6c, 0xee, 0x61, 0xd5, 0xa1, 0x98, 0xfa, 0x5e, 0x9d, 0x1e, 0x4f, 0xa0, 0x51, 0xc7, 0xad, 0x6e, 0x2f, 0x43, 0xe3, 0x46, 0xd, 0x65, 0xfc, 0xa4, 0xa9, 0x83, 0xbf, 0x9e, 0x3a, 0xa3, 0xbe, 0x92, 0x9d, 0xbf, 0x40, 0xab, 0xaa, 0xd3, 0x2d, 0xe3, 0xef, 0x1b, 0x79, 0x56, 0xa7, 0x27, 0x70, 0x2, 0x59, 0x60, 0x51, 0x3e, 0xc2, 0x48, 0x76, 0x6f, 0x89, 0xbf, 0x27, 0x5e, 0x64, 0x53, 0x99, 0x73, 0xa3, 0xbe, 0x2e, 0x3d, 0x5f, 0x81, 0x63, 0x93, 0x6c, 0xb1, 0xd1, 0x7f, 0x4b, 0xb8, 0x8e, 0x78, 0xa, 0x23, 0x50, 0x86, 0x30, 0xae, 0xa, 0xb, 0x96, 0x57, 0xf4, 0x5a, 0xb7, 0x7e, 0x43, 0x77, 0x25, 0x3b, 0xff, 0x80, 0xb6, 0x60, 0x23, 0x2c, 0xf3, 0x88, 0xf4, 0xd8, 0x28, 0x9e, 0xd8, 0x1c, 0x45, 0x4c, 0xb3, 0x8c, 0x6d, 0x1b, 0xb2, 0x7b, 0x44, 0xbd, 0xdd, 0xdd, 0x11, 0x9d, 0x5f, 0x9b, 0x67, 0x2, 0x87, 0xb7, 0x36, 0xd6, 0xa5, 0xe7, 0xb, 0x10, 0x5f, 0x3e, 0xd6, 0x32, 0x8e, 0xc2, 0xf1, 0xa7, 0x74, 0x7a, 0xaa, 0x5, 0xc2, 0x18, 0x55, 0x4a, 0x32, 0x8a, 0x8b, 0x8b, 0x1a, 0xff, 0xe7, 0xc5, 0xd7, 0x8f, 0x57, 0xb2, 0xf3, 0x7, 0x88, 0xd, 0x3d, 0x6c, 0x64, 0x2b, 0xcb, 0x35, 0xb8, 0xab, 0xbe, 0xd4, 0x29, 0xca, 0xa, 0x6c, 0xf5, 0x8b, 0x88, 0xa1, 0x16, 0x86, 0xe8, 0x1e, 0xdf, 0x95, 0xe8, 0xc5, 0xea, 0x92, 0xb0, 0xc5, 0x8b, 0x60, 0x85, 0x34, 0xd5, 0xa5, 0xe7, 0xb, 0xe0, 0x85, 0xe8, 0x65, 0x19, 0x7f, 0x43, 0xbc, 0x4f, 0xec, 0x56, 0x6c, 0x8a, 0x57, 0xdc, 0x73, 0x55, 0x2f, 0x91, 0x90, 0x1f, 0x57, 0xae, 0x3a, 0xe9, 0xb5, 0x51, 0x63, 0x37, 0x53, 0xb2, 0xab, 0x1b, 0x50, 0x3b, 0x5, 0x17, 0xe5, 0x9e, 0x96, 0x6b, 0x1f, 0x89, 0x73, 0x7c, 0xbc, 0x22, 0x3b, 0xb0, 0x6d, 0x8, 0xcd, 0xc4, 0x69, 0xdb, 0x16, 0x6, 0x20, 0xae, 0xf0, 0x5f, 0x89, 0x6e, 0xaa, 0x3e, 0xba, 0xce, 0x2f, 0x75, 0x8d, 0x41, 0x91, 0xe8, 0xa9, 0x4b, 0xcf, 0x17, 0xf4, 0x11, 0x7b, 0xf6, 0xf0, 0x23, 0x3a, 0x35, 0x19, 0x3, 0x2d, 0x4, 0x1f, 0x4b, 0x1d, 0x48, 0x18, 0xb2, 0x2b, 0x29, 0x29, 0x6d, 0x3d, 0x67, 0xfe, 0xb7, 0x7d, 0x95, 0xec, 0x6a, 0x8f, 0x2d, 0xb8, 0x79, 0x1d, 0x6c, 0xb9, 0x86, 0xae, 0xfc, 0xe8, 0xbe, 0x5f, 0xa2, 0xd3, 0x94, 0x35, 0xd8, 0x3a, 0xa1, 0xb7, 0xe, 0x91, 0xe5, 0x1, 0xcb, 0xe8, 0xf5, 0x8, 0xcf, 0xef, 0x4f, 0x1e, 0x73, 0xfc, 0x47, 0x5d, 0x7a, 0xbe, 0xe0, 0x78, 0xcb, 0xd8, 0x78, 0x8a, 0x22, 0x73, 0xe0, 0x1d, 0xdb, 0xa4, 0xd1, 0x41, 0xc3, 0xe2, 0x6, 0x32, 0x7d, 0xf6, 0xdc, 0xa3, 0xd, 0xe1, 0x29, 0xd9, 0xd5, 0x2, 0xb0, 0x18, 0x9e, 0xf7, 0x20, 0x3a, 0x10, 0xdc, 0x99, 0x62, 0x8f, 0x21, 0x29, 0x82, 0xc3, 0x5a, 0x8b, 0x72, 0x1, 0xa2, 0x6b, 0x10, 0x92, 0xfb, 0x1b, 0x49, 0xc2, 0x88, 0x2a, 0x56, 0x79, 0x6c, 0xbc, 0xb0, 0x48, 0x3a, 0xea, 0xf2, 0xab, 0x13, 0x76, 0x12, 0xfb, 0x39, 0x8c, 0x50, 0xa6, 0xb5, 0x8e, 0xb1, 0x66, 0xc0, 0xc9, 0x21, 0x9b, 0x84, 0xa, 0xa, 0xa, 0xa, 0x64, 0xc9, 0xd2, 0xe5, 0xfb, 0x2d, 0x5f, 0xf1, 0x53, 0x1b, 0x25, 0xbb, 0x9a, 0x1, 0xbe, 0xf5, 0xb7, 0x3c, 0x88, 0xe, 0x18, 0x2c, 0xe1, 0xef, 0x60, 0x1f, 0x47, 0xa0, 0x95, 0x92, 0x3b, 0x89, 0x2, 0xae, 0xc3, 0xb0, 0xa4, 0xf8, 0xc7, 0x21, 0x23, 0x77, 0xb4, 0x65, 0x3e, 0xe1, 0xca, 0xbf, 0x5c, 0x97, 0x5f, 0x9d, 0x80, 0x73, 0x2, 0xdd, 0xee, 0x76, 0xf4, 0x7c, 0xd4, 0xa3, 0xc0, 0x6a, 0xe, 0x24, 0xaa, 0x8c, 0x4a, 0x1d, 0xa8, 0xac, 0xac, 0x34, 0x84, 0x57, 0xbf, 0x5d, 0x79, 0x45, 0xc5, 0xee, 0x4a, 0x76, 0x35, 0x73, 0x35, 0xe0, 0x85, 0xef, 0xe1, 0x71, 0x1d, 0x7, 0x73, 0x3e, 0xa0, 0xd3, 0x94, 0x33, 0x94, 0xbb, 0xfe, 0x8d, 0x1a, 0xb0, 0x30, 0x74, 0x51, 0x81, 0xff, 0x64, 0x72, 0xc, 0xe6, 0xf7, 0x1d, 0x23, 0x73, 0x2d, 0xe3, 0x67, 0x88, 0x93, 0x36, 0xaf, 0xa8, 0x1d, 0xd0, 0x71, 0xc9, 0x5d, 0xda, 0x31, 0x4f, 0xc2, 0x7f, 0xbe, 0x61, 0x58, 0xf1, 0x86, 0x5b, 0x29, 0x6b, 0x58, 0x5c, 0x54, 0xef, 0xc9, 0x17, 0x5e, 0xdb, 0x7f, 0x43, 0x49, 0x89, 0x92, 0x5d, 0x35, 0xc0, 0xf9, 0x48, 0x48, 0x19, 0x47, 0x2f, 0xc3, 0x6d, 0x3c, 0x3e, 0x73, 0x83, 0x38, 0x8d, 0x7d, 0x15, 0xb9, 0x83, 0x7b, 0xc3, 0x40, 0x6, 0x56, 0x93, 0x10, 0xdc, 0xd7, 0xa7, 0x12, 0x8f, 0x3, 0x4e, 0x51, 0x4a, 0x73, 0xbf, 0xc7, 0xb5, 0xfb, 0x8c, 0x1c, 0xa6, 0x4b, 0xb0, 0xc6, 0x40, 0x48, 0xa4, 0x8b, 0x65, 0x1c, 0x56, 0x9d, 0x36, 0xd9, 0xae, 0x1d, 0x10, 0x42, 0x9a, 0xed, 0x1e, 0x2c, 0x2d, 0x2b, 0x3b, 0xa0, 0x41, 0x61, 0x61, 0x42, 0xc9, 0xce, 0xe, 0x6c, 0x94, 0x28, 0x14, 0x47, 0x3b, 0xaa, 0x41, 0x46, 0xa, 0x2c, 0x9f, 0x41, 0x76, 0x1d, 0x8e, 0xe3, 0xb8, 0x5a, 0xa7, 0x2b, 0x94, 0xa8, 0xc, 0xc1, 0x3d, 0x6c, 0x8, 0xc9, 0x7d, 0xf8, 0x81, 0xc7, 0xc4, 0x1e, 0x8f, 0xc6, 0xa6, 0x8d, 0x18, 0xd3, 0xa9, 0xba, 0xe4, 0x6a, 0x84, 0x76, 0x46, 0x3a, 0x59, 0xc6, 0xc7, 0xe8, 0xd4, 0xd4, 0x1a, 0x25, 0xee, 0xf9, 0xfb, 0x35, 0x2b, 0xb3, 0xb4, 0xb4, 0xfb, 0xec, 0x79, 0xb, 0x5a, 0x28, 0xd9, 0x6d, 0x8a, 0x86, 0xe2, 0xb4, 0xed, 0x81, 0xcb, 0x12, 0xa9, 0xbf, 0x3b, 0x78, 0x7c, 0xe, 0xda, 0xfa, 0x49, 0xd4, 0x6a, 0x15, 0xa, 0x2f, 0xc4, 0xe9, 0xfd, 0x5a, 0x2e, 0xce, 0xe1, 0x98, 0xb6, 0x12, 0x8a, 0xcd, 0xf8, 0xbe, 0xa0, 0x13, 0x7d, 0x2b, 0x7d, 0xec, 0x19, 0x61, 0x3b, 0xee, 0x37, 0x6e, 0x5, 0x4d, 0xeb, 0x73, 0xeb, 0x86, 0x8f, 0xdd, 0x64, 0xf7, 0xcb, 0x2f, 0x6b, 0x8b, 0x47, 0x8e, 0xf9, 0x68, 0x8f, 0x7a, 0x21, 0xd6, 0x8a, 0xb3, 0x5, 0xbc, 0xa8, 0xbd, 0xc4, 0xe9, 0x63, 0x9, 0x5f, 0xf9, 0xa3, 0x46, 0xf6, 0x49, 0xf3, 0xf9, 0x2f, 0x8c, 0x1c, 0x22, 0x7a, 0x6c, 0x8f, 0x22, 0xff, 0x80, 0xf4, 0xee, 0x6b, 0x3d, 0xae, 0xa1, 0x85, 0xd8, 0x5, 0xdc, 0xac, 0x71, 0x54, 0x4d, 0x6b, 0x9d, 0xae, 0xb4, 0xb0, 0x35, 0x2b, 0x47, 0x7c, 0x57, 0x9b, 0x3e, 0xd7, 0xd, 0xd3, 0xc5, 0x75, 0xb0, 0x2b, 0x8, 0xaf, 0xb8, 0xa8, 0xa8, 0x73, 0x41, 0x9a, 0x85, 0x8b, 0x6b, 0x89, 0x18, 0x4d, 0x42, 0x25, 0xbf, 0x53, 0x63, 0xba, 0xf, 0xba, 0x89, 0x73, 0x1c, 0xc, 0xfe, 0xbe, 0x67, 0x6, 0xdf, 0x15, 0x49, 0x10, 0x77, 0x8a, 0xd3, 0xf4, 0x79, 0xa5, 0xae, 0x29, 0x45, 0x9e, 0x2, 0xd, 0x13, 0xd0, 0x35, 0xe8, 0xaf, 0x69, 0x2c, 0x96, 0x7b, 0x48, 0x78, 0xaf, 0x89, 0xe3, 0xfe, 0x9c, 0x91, 0x67, 0xa, 0x74, 0x26, 0xb0, 0x95, 0x1c, 0xe0, 0x50, 0x52, 0x3d, 0xa0, 0xb5, 0x6e, 0x40, 0xad, 0xf3, 0x42, 0x71, 0xb9, 0x88, 0xcb, 0xca, 0xcb, 0x3d, 0xc9, 0xe, 0xf1, 0x2a, 0xa4, 0xd8, 0xc7, 0xc9, 0xd, 0x53, 0xc9, 0x97, 0x14, 0x49, 0x27, 0x45, 0x52, 0xb3, 0x66, 0xb6, 0x63, 0xc5, 0xc9, 0xb8, 0x1c, 0x9b, 0xa7, 0xb, 0x8, 0xf3, 0x85, 0x62, 0xfa, 0x86, 0x29, 0xf3, 0x57, 0xc9, 0xf5, 0xd1, 0x82, 0x73, 0x89, 0xf8, 0xd4, 0xa, 0xd7, 0x7c, 0xe3, 0xdf, 0xf0, 0xa3, 0xaf, 0xa1, 0x82, 0xa0, 0xc5, 0xf6, 0xd1, 0x47, 0x5, 0x2d, 0xb8, 0xf9, 0x7c, 0x27, 0xbc, 0x8a, 0xf7, 0x3b, 0x51, 0x40, 0x8a, 0xef, 0x19, 0x79, 0xc9, 0xc8, 0x67, 0xa2, 0x99, 0x86, 0x49, 0xd8, 0x1a, 0x3f, 0xcf, 0x54, 0xa5, 0xa0, 0xce, 0x58, 0x4a, 0xc2, 0xfb, 0x8d, 0xec, 0x1a, 0x35, 0x2c, 0x96, 0xcf, 0x27, 0x4c, 0xda, 0xda, 0x8b, 0xec, 0xb6, 0xa6, 0xe4, 0x3b, 0x92, 0xc7, 0xbf, 0x3f, 0x9d, 0x27, 0x1b, 0x35, 0xda, 0x40, 0xc1, 0xad, 0xbb, 0x87, 0x38, 0x6e, 0x96, 0x5d, 0xb8, 0xe, 0x70, 0x7a, 0x72, 0x33, 0x17, 0xd9, 0x55, 0x90, 0xec, 0x52, 0x8b, 0xb7, 0x93, 0x5a, 0x69, 0xc2, 0x45, 0x76, 0x70, 0x2b, 0xa0, 0x38, 0x19, 0x59, 0x7d, 0xc8, 0x34, 0x43, 0x8b, 0xaf, 0x6f, 0x29, 0xd8, 0x34, 0xe7, 0xf0, 0x73, 0x7a, 0xfa, 0x75, 0x74, 0x80, 0x6, 0xe8, 0xe3, 0xf8, 0x7e, 0xf4, 0x48, 0xf3, 0x39, 0x94, 0x81, 0xf4, 0xa7, 0x2c, 0xe3, 0xff, 0x41, 0x5c, 0xe5, 0x4d, 0x5a, 0x7c, 0xf9, 0xda, 0x2c, 0x7d, 0x7b, 0xf, 0xb2, 0x53, 0xd4, 0x1d, 0xdf, 0x18, 0xe9, 0xeb, 0xb2, 0xec, 0x5a, 0x16, 0xe8, 0xbc, 0x54, 0x1, 0x36, 0x5d, 0xf4, 0xb7, 0x7c, 0x88, 0xda, 0x68, 0xdc, 0xdd, 0xa, 0x70, 0xa7, 0xec, 0x26, 0x4e, 0xaf, 0x43, 0xd4, 0xfd, 0x20, 0x29, 0xa7, 0x71, 0x2d, 0xad, 0x7a, 0xf7, 0x19, 0x67, 0xdb, 0x64, 0xf0, 0x7f, 0x4a, 0x49, 0x80, 0x58, 0xa0, 0x13, 0xc5, 0xa9, 0xe7, 0x9a, 0x4c, 0x57, 0xc4, 0x7c, 0xd1, 0x53, 0xde, 0xc3, 0xc, 0xbc, 0x27, 0xbd, 0x8d, 0x5c, 0x22, 0x4e, 0xf7, 0xa0, 0xed, 0xab, 0xf9, 0x3c, 0x92, 0x57, 0xe, 0xa7, 0x5c, 0xc7, 0xe7, 0x8b, 0x42, 0xe0, 0x4f, 0x48, 0x7c, 0x33, 0xe8, 0x5, 0x88, 0x3b, 0xa0, 0x30, 0x36, 0xb1, 0xec, 0x3b, 0x7a, 0xf6, 0xa5, 0x3f, 0xa8, 0x52, 0x13, 0x9a, 0x48, 0x24, 0x36, 0x57, 0xb2, 0xdb, 0xb8, 0xd0, 0x90, 0x56, 0x8d, 0x93, 0x6f, 0xdf, 0xa7, 0xe6, 0x19, 0x57, 0x77, 0x2, 0x48, 0xac, 0x83, 0x91, 0xa3, 0x8d, 0x1c, 0x6a, 0x64, 0x57, 0x5a, 0x6e, 0xb9, 0xb4, 0x26, 0xb7, 0xa4, 0xec, 0x9d, 0x32, 0xe, 0xab, 0x70, 0x1e, 0x5, 0xee, 0xaf, 0xb1, 0x7c, 0x46, 0xeb, 0x74, 0xb9, 0x86, 0xa, 0x78, 0x1e, 0x48, 0xee, 0x42, 0xf9, 0x1, 0xce, 0x76, 0x1c, 0x28, 0x76, 0x17, 0x9d, 0xed, 0xb9, 0xef, 0x44, 0x39, 0x8f, 0x4a, 0xcd, 0xc, 0x3e, 0x63, 0xbc, 0x7f, 0x1f, 0x50, 0xe1, 0x89, 0xa3, 0xb2, 0x89, 0xee, 0x33, 0xee, 0xbd, 0x17, 0xdf, 0x7f, 0xb9, 0x2e, 0x27, 0x5f, 0x30, 0xdf, 0x32, 0xb6, 0x59, 0xbe, 0x91, 0x1d, 0x5c, 0x26, 0x70, 0xa5, 0xe1, 0x40, 0xc4, 0xa5, 0xdc, 0x48, 0x91, 0x3d, 0x86, 0xda, 0x8c, 0xd9, 0x12, 0xef, 0x7e, 0x74, 0xdb, 0xd0, 0xb4, 0x3f, 0xc5, 0xc8, 0xef, 0x24, 0x1c, 0x1d, 0x46, 0xd2, 0x21, 0x49, 0x80, 0x7b, 0x19, 0x39, 0x8e, 0xcf, 0x6, 0x9a, 0xef, 0x48, 0x12, 0xdf, 0x24, 0x5a, 0x82, 0x3f, 0x8b, 0xc6, 0x39, 0xc2, 0x80, 0x39, 0x24, 0xbd, 0xbb, 0x8c, 0x1c, 0x43, 0xe2, 0x43, 0x56, 0x73, 0xb3, 0xc, 0xff, 0x3f, 0x4e, 0xeb, 0xee, 0x41, 0x39, 0x9d, 0xef, 0xea, 0x12, 0x3e, 0xeb, 0xf, 0x69, 0xf9, 0xcf, 0x90, 0xaa, 0x27, 0x30, 0x44, 0x11, 0xb0, 0xea, 0xdc, 0x39, 0x3, 0x3f, 0xc7, 0xe4, 0xbb, 0x85, 0x1, 0xf3, 0xb8, 0x5f, 0xa4, 0x1e, 0xf3, 0xd5, 0xc8, 0x8b, 0xec, 0x5e, 0xa0, 0xa6, 0x16, 0x27, 0xac, 0xe5, 0x82, 0x4a, 0x92, 0xdd, 0xf7, 0x12, 0x9e, 0xfe, 0x89, 0x41, 0x2, 0xae, 0xa5, 0xb3, 0xb9, 0x1, 0xd5, 0xe5, 0x4, 0xef, 0x52, 0x4a, 0x32, 0x16, 0xb7, 0x58, 0xec, 0x49, 0x3e, 0xb8, 0x8e, 0x7e, 0x7f, 0xdb, 0x52, 0x7b, 0xad, 0xc7, 0x3f, 0xeb, 0x4b, 0xdd, 0x12, 0x9e, 0xa, 0x49, 0xd8, 0x7f, 0xa1, 0xac, 0xa0, 0xc5, 0x87, 0x26, 0xc5, 0xd, 0xf5, 0xfd, 0xe, 0xd, 0xf0, 0x7e, 0x3d, 0x46, 0x41, 0xec, 0xb7, 0x27, 0xd7, 0xde, 0x7e, 0x35, 0x7c, 0x4e, 0x50, 0xc6, 0xda, 0x89, 0x53, 0xf7, 0xa, 0x41, 0x36, 0xf4, 0x4c, 0x92, 0xea, 0x44, 0x92, 0xe0, 0x4, 0x5a, 0x44, 0x51, 0x53, 0x76, 0x90, 0xb1, 0x5a, 0x6c, 0xb1, 0x90, 0xb1, 0x1f, 0xe9, 0xa1, 0xb8, 0x75, 0xc7, 0x1a, 0xae, 0x97, 0x54, 0xb2, 0xdb, 0xc2, 0x8b, 0xec, 0xbe, 0x36, 0xf2, 0xa2, 0xce, 0x59, 0xa4, 0x81, 0xc4, 0x12, 0xc4, 0x51, 0x2e, 0x12, 0x27, 0x93, 0x32, 0x53, 0x20, 0x6b, 0x72, 0x1, 0x5d, 0x1, 0xb, 0x68, 0xf1, 0x22, 0x91, 0x64, 0x91, 0x38, 0x6e, 0xa5, 0xe4, 0x42, 0x42, 0x32, 0x49, 0xc2, 0x83, 0xec, 0xea, 0xa5, 0x2c, 0xb4, 0x26, 0x24, 0x3e, 0x64, 0xed, 0xa1, 0xfb, 0xf8, 0x56, 0xdc, 0xc4, 0xf0, 0xc2, 0xa3, 0x16, 0xab, 0x25, 0xc7, 0x8b, 0x6b, 0x61, 0xf9, 0x25, 0x13, 0x1f, 0x14, 0xe1, 0xc4, 0x57, 0x94, 0x7b, 0xb9, 0x1e, 0xf1, 0xac, 0x10, 0xe3, 0xeb, 0x4a, 0xc5, 0xab, 0x26, 0x9e, 0x25, 0x28, 0x4b, 0x9d, 0x29, 0x47, 0x1a, 0xb9, 0x4a, 0x9c, 0xd3, 0x24, 0xd0, 0xe5, 0xe8, 0x7d, 0x12, 0xdf, 0x2c, 0xb1, 0x1f, 0x47, 0x14, 0x36, 0x94, 0x5b, 0x8, 0x1a, 0xdf, 0x6b, 0xae, 0x2e, 0x19, 0x5f, 0x50, 0x29, 0x16, 0xcf, 0x95, 0xd7, 0x62, 0x2b, 0xd6, 0xf9, 0x8a, 0x34, 0xe0, 0xaa, 0x1c, 0x2a, 0xf6, 0x76, 0x44, 0x36, 0x8b, 0xd, 0xee, 0x21, 0xb8, 0x72, 0x3f, 0xe0, 0xb, 0xb7, 0x40, 0x36, 0x2d, 0x23, 0xa8, 0xd, 0x4a, 0x52, 0xb4, 0x2c, 0x2f, 0xf7, 0x4c, 0xa3, 0x14, 0xb2, 0x83, 0xd5, 0x86, 0x44, 0x19, 0x74, 0x28, 0xef, 0x2e, 0x4e, 0x10, 0xbf, 0x50, 0x1f, 0x65, 0x2c, 0x50, 0x41, 0x65, 0xe9, 0x41, 0x4a, 0x4b, 0xae, 0x4d, 0x3c, 0x6f, 0x34, 0x68, 0x40, 0xbd, 0x6b, 0xb3, 0x1a, 0x92, 0x1f, 0x14, 0xaa, 0xe6, 0x2e, 0x85, 0x7, 0xae, 0x4e, 0x14, 0x15, 0x23, 0xe6, 0x87, 0xd3, 0xe1, 0x91, 0xe8, 0x14, 0x95, 0x6c, 0xcf, 0x7a, 0x6a, 0xd5, 0x5, 0xb, 0x4d, 0x50, 0x89, 0x17, 0x60, 0x2d, 0xdd, 0x40, 0xb2, 0xab, 0x6e, 0xf3, 0x41, 0x6, 0x1c, 0x62, 0x21, 0x38, 0x9f, 0x6f, 0xaa, 0xe4, 0xa6, 0xb4, 0x62, 0x2d, 0x89, 0x35, 0x79, 0xda, 0xf8, 0xb, 0xfc, 0x13, 0xee, 0x2e, 0x24, 0x2e, 0xf4, 0x12, 0xc7, 0xd, 0x6, 0xad, 0xb7, 0x8b, 0xe8, 0x29, 0x1d, 0x71, 0xc1, 0xf, 0x14, 0x28, 0x57, 0xf7, 0xd0, 0xea, 0x7, 0xf9, 0xfd, 0x5e, 0x1c, 0x77, 0x27, 0xce, 0xc9, 0xdb, 0x41, 0x6a, 0x7e, 0xda, 0xfc, 0x8e, 0x94, 0x23, 0x8c, 0x5c, 0x2f, 0x4e, 0xec, 0xe6, 0x15, 0x92, 0xdf, 0x67, 0xa2, 0x31, 0x31, 0x25, 0x3b, 0x45, 0x2c, 0x80, 0xce, 0xf3, 0x48, 0xe, 0xe8, 0x50, 0xd, 0xb9, 0x3c, 0x45, 0xf9, 0x44, 0xc2, 0x9b, 0x90, 0x83, 0xf8, 0xc5, 0x24, 0xca, 0x5d, 0xb4, 0x4, 0x40, 0x76, 0xfb, 0xf3, 0x7b, 0x22, 0x6b, 0xb3, 0x81, 0x3e, 0xf2, 0xd8, 0x0, 0xa5, 0x27, 0x5f, 0x50, 0x80, 0x56, 0x24, 0xbb, 0xce, 0xb4, 0xfa, 0x90, 0xe8, 0x2, 0xb7, 0x67, 0x4d, 0x92, 0xaa, 0xa, 0x49, 0x9a, 0x97, 0x51, 0x90, 0xe5, 0x39, 0x8e, 0xa, 0xd5, 0x58, 0x71, 0xb5, 0x94, 0xca, 0x81, 0x15, 0x97, 0xd0, 0xc7, 0xae, 0x64, 0xa7, 0xa8, 0x39, 0xd0, 0xa5, 0xe2, 0x16, 0xf1, 0x76, 0x3f, 0x23, 0xa5, 0x19, 0x8d, 0x7a, 0x11, 0x3b, 0x99, 0x1f, 0x51, 0x4b, 0x60, 0x2c, 0xe5, 0x66, 0x6e, 0x62, 0x28, 0x9d, 0xe8, 0xc7, 0xcd, 0x50, 0xdd, 0x9d, 0xf1, 0xc2, 0x32, 0xca, 0x67, 0x5c, 0xb7, 0x78, 0xbe, 0x6d, 0xa9, 0xe4, 0xe0, 0x79, 0xef, 0x46, 0x4b, 0x70, 0xab, 0x1a, 0xfc, 0xcc, 0x64, 0xbc, 0xef, 0x34, 0x7a, 0x12, 0x90, 0x80, 0xf7, 0x32, 0x7f, 0x47, 0x2e, 0x3c, 0x1a, 0xe5, 0x2e, 0x4f, 0x5, 0xe2, 0x4c, 0x1b, 0xf4, 0xd1, 0xd7, 0xd, 0xe8, 0x83, 0xb9, 0x6e, 0xfd, 0x6, 0x29, 0x2f, 0xdf, 0xe4, 0x88, 0x4b, 0xc4, 0x7b, 0x57, 0x2a, 0xd9, 0x45, 0x1f, 0x68, 0xcc, 0x3b, 0x2c, 0xcd, 0x75, 0x58, 0x71, 0xb7, 0xd2, 0x4a, 0x8a, 0x3, 0xb0, 0x8a, 0xa7, 0x53, 0xf0, 0xbd, 0x10, 0xaf, 0x79, 0x58, 0x9c, 0x18, 0x9f, 0x22, 0x9e, 0x80, 0x7, 0x62, 0xe, 0xe5, 0x19, 0x92, 0xc4, 0x2e, 0x54, 0x7a, 0x50, 0xaa, 0x70, 0x8, 0x2d, 0xff, 0x4c, 0x2d, 0x3f, 0x10, 0x27, 0x4e, 0x70, 0x18, 0x2c, 0x4e, 0x6c, 0xf, 0xeb, 0xe7, 0xd, 0xa9, 0x7a, 0x8, 0x70, 0x50, 0x40, 0xfc, 0x72, 0xbd, 0x4b, 0x49, 0x83, 0xcb, 0xf5, 0x6c, 0x12, 0xa1, 0xa2, 0x96, 0x58, 0x6f, 0x88, 0xee, 0x98, 0xc3, 0xfa, 0x48, 0x87, 0xf6, 0x6d, 0xdd, 0x96, 0xb4, 0x92, 0x5d, 0xc4, 0x81, 0xb8, 0xc4, 0xdf, 0x3c, 0xae, 0xc1, 0x82, 0xbb, 0x9a, 0x64, 0x17, 0x57, 0x20, 0x23, 0x14, 0x7d, 0x17, 0xd7, 0x28, 0xd9, 0xe5, 0x15, 0x10, 0x73, 0x9e, 0x46, 0x81, 0x75, 0x76, 0x8d, 0x38, 0x25, 0x36, 0x7, 0x18, 0xe9, 0x43, 0xcb, 0x6f, 0xb7, 0xc, 0x7e, 0xe, 0x62, 0x82, 0x47, 0x52, 0xe0, 0x35, 0x18, 0x2e, 0x4e, 0xf3, 0xea, 0xc0, 0xf7, 0x64, 0xa9, 0x9a, 0x8d, 0x9, 0xeb, 0x3, 0x9, 0x35, 0x1a, 0x57, 0xac, 0x8b, 0x56, 0x54, 0x56, 0x26, 0x5d, 0x3a, 0x76, 0x90, 0x6e, 0x5d, 0x76, 0xae, 0x72, 0x4d, 0x3, 0xfe, 0xd1, 0xc5, 0xe0, 0x34, 0x44, 0x7, 0x2d, 0xf5, 0xa0, 0x98, 0x13, 0x5d, 0x12, 0x8d, 0x75, 0x1d, 0xeb, 0x1e, 0x27, 0x4e, 0x26, 0xe6, 0x63, 0xe2, 0x24, 0x67, 0x61, 0xed, 0xa3, 0x81, 0x2, 0x8a, 0xdc, 0x67, 0x65, 0x68, 0xb1, 0xf5, 0x12, 0x27, 0x99, 0xe5, 0x79, 0x5a, 0x8c, 0x41, 0x2, 0x8d, 0x8a, 0xdd, 0x2e, 0x4b, 0x94, 0xd2, 0xb4, 0xd7, 0x47, 0x59, 0x37, 0xc0, 0x8d, 0xb9, 0xa1, 0xc4, 0x9e, 0x6b, 0xa7, 0x9b, 0x44, 0x34, 0x81, 0x6c, 0xb3, 0x5b, 0x3c, 0xae, 0xa1, 0xa7, 0xe7, 0x51, 0xe2, 0xb8, 0x45, 0x14, 0x8a, 0x7c, 0x4, 0x9a, 0x46, 0xbc, 0x4b, 0x65, 0x10, 0x47, 0x79, 0x1d, 0x28, 0x4e, 0xa2, 0xd3, 0xe4, 0xea, 0xf6, 0x4a, 0x71, 0xba, 0xf5, 0x20, 0x4b, 0xf9, 0x1c, 0x9, 0x2e, 0x89, 0x4, 0xbb, 0xf1, 0x32, 0xd7, 0x18, 0xea, 0x51, 0xf5, 0xc, 0xc0, 0x0, 0xa1, 0x64, 0x17, 0x3d, 0x20, 0x28, 0x8f, 0x74, 0x6d, 0x5b, 0x37, 0xa, 0x74, 0xa0, 0x3f, 0x57, 0xf4, 0xf4, 0x0, 0x85, 0x22, 0x9, 0xb8, 0xc, 0x51, 0x7a, 0x70, 0x1, 0x2d, 0x3e, 0xb4, 0x31, 0x7b, 0xb3, 0x1a, 0x6b, 0xf, 0xd9, 0xa0, 0xf7, 0x52, 0x82, 0x6a, 0xab, 0xb7, 0xc0, 0x42, 0xb4, 0x3b, 0xe8, 0xe3, 0x52, 0xb2, 0x53, 0x6c, 0x7c, 0x5e, 0xb0, 0xe8, 0x6c, 0x8d, 0x76, 0x9f, 0x14, 0x27, 0xc5, 0x5a, 0x89, 0x4e, 0xa1, 0xb0, 0x3, 0x59, 0xc9, 0xcf, 0x8a, 0xe3, 0x19, 0x41, 0x6c, 0xef, 0x25, 0x49, 0x5f, 0x5f, 0x7a, 0x36, 0x3f, 0x13, 0x44, 0xa3, 0xf4, 0x19, 0x96, 0xb1, 0x1d, 0xf5, 0x11, 0x29, 0xd9, 0x29, 0x1c, 0xa0, 0xd5, 0xd2, 0x9f, 0x2d, 0xe3, 0x68, 0x97, 0x74, 0x8e, 0x4e, 0x8f, 0x42, 0x91, 0x11, 0x2a, 0xf9, 0xce, 0xa0, 0x67, 0x27, 0xea, 0x36, 0xdf, 0x4b, 0xf3, 0x59, 0x5c, 0x7f, 0x24, 0x0, 0xb, 0xcf, 0x46, 0x76, 0x28, 0xa8, 0xd7, 0xee, 0x55, 0x4a, 0x76, 0x79, 0xf, 0xb8, 0x39, 0x2e, 0x97, 0xaa, 0xc5, 0xd4, 0x88, 0x4f, 0xe0, 0x88, 0x14, 0x4d, 0x59, 0x56, 0x28, 0x6a, 0xe, 0x10, 0x1d, 0x8e, 0xba, 0xba, 0x50, 0x9c, 0x5e, 0x9b, 0x36, 0xc0, 0x12, 0xbc, 0x55, 0xfc, 0x8d, 0xe1, 0x81, 0xec, 0xdc, 0xae, 0x54, 0x94, 0x4f, 0x68, 0x56, 0xb1, 0x92, 0x5d, 0xde, 0x3, 0xf1, 0x86, 0x43, 0x2c, 0xe3, 0xc8, 0x38, 0x9b, 0xa6, 0xd3, 0xa3, 0x50, 0xd4, 0x1a, 0x70, 0xfd, 0xdf, 0x69, 0xe4, 0xf, 0xe2, 0x7d, 0x5a, 0x38, 0x14, 0xca, 0xa3, 0x7c, 0xfc, 0x9d, 0x68, 0xaa, 0xbe, 0xd8, 0x35, 0x6, 0x45, 0xb6, 0x87, 0x3e, 0xe, 0x25, 0xbb, 0x7c, 0xc7, 0xf9, 0x96, 0x31, 0xf4, 0xb4, 0x7c, 0x5c, 0xa7, 0x46, 0xa1, 0xf0, 0x5, 0x48, 0x64, 0x39, 0xc6, 0x83, 0xf0, 0xa, 0xa8, 0x58, 0x36, 0xf5, 0xe9, 0x77, 0x2d, 0xf2, 0x50, 0x52, 0x7b, 0xeb, 0x63, 0x50, 0xb2, 0xcb, 0x67, 0xa0, 0x29, 0xf2, 0xfe, 0x96, 0x71, 0x94, 0x19, 0xfc, 0xa4, 0xd3, 0xa3, 0x50, 0xf8, 0x6, 0x10, 0x10, 0x8a, 0xcc, 0x97, 0x58, 0xae, 0xa1, 0xdd, 0xd8, 0xa9, 0x3e, 0xfd, 0x1e, 0xd4, 0x6, 0x7e, 0x65, 0x19, 0x47, 0x1f, 0x50, 0x8d, 0xdb, 0x29, 0xd9, 0xe5, 0x2d, 0x10, 0xb8, 0x6e, 0xe5, 0x1a, 0x43, 0xbf, 0xc8, 0x67, 0x74, 0x6a, 0x14, 0xa, 0xdf, 0x81, 0x42, 0xf4, 0x81, 0x62, 0x8f, 0x83, 0x23, 0x11, 0xcc, 0xaf, 0xc3, 0x82, 0xd1, 0x8c, 0xdd, 0x7d, 0x80, 0x34, 0x7a, 0x7e, 0xee, 0xae, 0x8f, 0x40, 0xc9, 0x2e, 0x5f, 0xb1, 0x97, 0x65, 0xc, 0xd9, 0x64, 0xda, 0x5a, 0x48, 0xa1, 0x8, 0x6, 0xa8, 0xc5, 0x7b, 0xc9, 0x32, 0x8e, 0xee, 0x2a, 0x7, 0xf8, 0xf4, 0x3b, 0xf0, 0xe, 0xbb, 0x3d, 0x33, 0x4d, 0x7c, 0xfc, 0xf9, 0xa, 0x25, 0xbb, 0x48, 0x1, 0x2e, 0x8d, 0xee, 0x96, 0xf1, 0x51, 0x3a, 0x35, 0xa, 0x45, 0xa0, 0xb8, 0x4d, 0x9c, 0xbe, 0xab, 0xa9, 0x40, 0x12, 0x49, 0x2f, 0x9f, 0x7e, 0xfe, 0xcf, 0x46, 0x46, 0x5b, 0xc6, 0x4f, 0x11, 0x3d, 0xc2, 0x4a, 0xc9, 0x2e, 0xf, 0x81, 0xde, 0x8f, 0xee, 0x33, 0xea, 0x90, 0xb2, 0xfc, 0xb5, 0x4e, 0x8d, 0x42, 0x11, 0x28, 0x26, 0x8a, 0xd3, 0x3a, 0xcc, 0x8d, 0x1e, 0x3e, 0x92, 0xd1, 0x2b, 0x96, 0xb1, 0xae, 0xe2, 0x1c, 0x5a, 0xac, 0x50, 0xb2, 0xcb, 0x3b, 0xcb, 0xce, 0x1d, 0xaf, 0x43, 0x5f, 0xbd, 0xe5, 0x3a, 0x35, 0xa, 0x45, 0xe0, 0x78, 0xce, 0x32, 0x86, 0x98, 0xda, 0x66, 0x3e, 0xfd, 0xfc, 0x31, 0x46, 0xe6, 0x5a, 0xc6, 0x4f, 0xd7, 0xa9, 0x57, 0xb2, 0xcb, 0x37, 0xd8, 0x5a, 0x83, 0x81, 0xec, 0x56, 0xeb, 0xd4, 0x28, 0x14, 0x81, 0x3, 0x19, 0x93, 0xa5, 0xae, 0x31, 0x9c, 0x50, 0xb0, 0xb9, 0x4f, 0x3f, 0x1f, 0x59, 0x9f, 0xef, 0x58, 0xc6, 0x51, 0xe8, 0xae, 0xed, 0xc3, 0x94, 0xec, 0xf2, 0xa, 0x8d, 0x3d, 0x9e, 0x5b, 0x42, 0xa7, 0x46, 0xa1, 0x8, 0x1c, 0xe8, 0x50, 0xb4, 0xd0, 0x32, 0xde, 0xce, 0xc7, 0xdf, 0x81, 0xa3, 0xb8, 0xdc, 0x59, 0x99, 0x68, 0xf8, 0xfe, 0x27, 0x9d, 0x7e, 0x25, 0xbb, 0x7c, 0x42, 0xa5, 0x4e, 0x81, 0x42, 0x91, 0x33, 0xac, 0x12, 0x7b, 0xd6, 0xb3, 0x9f, 0xca, 0x26, 0x4a, 0x10, 0x6c, 0xb1, 0x41, 0x9c, 0x60, 0xd2, 0x5c, 0x1f, 0x81, 0x92, 0x5d, 0xbe, 0xa0, 0xc4, 0x83, 0x0, 0x95, 0x4, 0x37, 0xce, 0x45, 0x85, 0x4e, 0x83, 0x22, 0x20, 0xfc, 0x62, 0x64, 0x45, 0xc0, 0xbf, 0x3, 0xeb, 0xf7, 0x7e, 0xcb, 0x78, 0x1b, 0x12, 0x9e, 0x42, 0xc9, 0x2e, 0x2f, 0xb0, 0xc0, 0x32, 0x6, 0xd7, 0x66, 0x91, 0x4e, 0xcd, 0xaf, 0x40, 0x81, 0x6f, 0x2b, 0x9d, 0x6, 0x45, 0xc0, 0xa, 0x55, 0xd0, 0x78, 0xd5, 0xc8, 0x78, 0xcb, 0xf8, 0x59, 0x46, 0xb6, 0xd7, 0x47, 0xa0, 0x64, 0x97, 0xf, 0x40, 0x17, 0x7, 0x77, 0xad, 0xcf, 0xd6, 0xe2, 0x4, 0xc9, 0x15, 0x4e, 0x9a, 0x76, 0x43, 0x9d, 0x6, 0x45, 0x40, 0x48, 0x64, 0x69, 0x9f, 0xc4, 0x3b, 0x7e, 0xa7, 0x65, 0x7c, 0x3b, 0x23, 0x97, 0xea, 0x63, 0x50, 0xb2, 0xcb, 0x7, 0xac, 0x33, 0xf2, 0x8d, 0x6b, 0xac, 0x91, 0x5a, 0x33, 0xbf, 0xe1, 0x8f, 0x3a, 0x5, 0x8a, 0x0, 0x81, 0xc6, 0xcf, 0xb6, 0xb8, 0x59, 0x10, 0xae, 0x73, 0x94, 0x39, 0x4c, 0xb4, 0x8c, 0xe3, 0x10, 0x59, 0x3d, 0xd, 0xa1, 0x2a, 0xba, 0x89, 0x93, 0xad, 0x9e, 0x11, 0x8f, 0x29, 0xd9, 0x45, 0x83, 0xec, 0xe6, 0x58, 0xc6, 0xf7, 0xd4, 0xa9, 0x91, 0xd6, 0xe2, 0x1c, 0xae, 0xa9, 0x50, 0x4, 0x85, 0x26, 0x16, 0xb2, 0x83, 0x5b, 0x73, 0x56, 0x0, 0xbf, 0x6b, 0x83, 0x91, 0x9b, 0xa5, 0xea, 0x39, 0x77, 0x28, 0x60, 0xbf, 0x4b, 0xfc, 0xab, 0xed, 0x8b, 0xcb, 0xbb, 0xff, 0x82, 0x38, 0xe7, 0x2, 0xbe, 0x6b, 0xe4, 0xa, 0xb1, 0x77, 0x9a, 0x52, 0xb2, 0x8b, 0x10, 0xb0, 0xf0, 0xa7, 0x5a, 0xc6, 0xf, 0xd5, 0xa9, 0xf9, 0x35, 0x9e, 0xd1, 0x46, 0xa7, 0x41, 0x11, 0xf0, 0xa6, 0xda, 0xde, 0x35, 0x86, 0xe3, 0x79, 0xd6, 0x4, 0xf4, 0xfb, 0x5e, 0x34, 0x32, 0xd2, 0x32, 0x8e, 0xd3, 0x10, 0x2e, 0xd6, 0xc7, 0xf1, 0x1b, 0xfe, 0x4f, 0x9c, 0xce, 0x52, 0x68, 0xba, 0x81, 0x63, 0x91, 0x6e, 0xe2, 0xbc, 0x15, 0x2b, 0xd9, 0x45, 0x1b, 0x68, 0xd, 0x56, 0x61, 0xb1, 0xec, 0xb6, 0xcd, 0xe3, 0x39, 0xc1, 0xa9, 0xce, 0x7f, 0xd5, 0xa5, 0xa1, 0x8, 0x18, 0xbb, 0x18, 0xa9, 0xef, 0x1a, 0x9b, 0x2c, 0x4e, 0x96, 0x66, 0x10, 0x40, 0x1, 0xfb, 0x95, 0x62, 0x6f, 0x1a, 0x31, 0xd4, 0xc8, 0xef, 0xf4, 0x91, 0xfc, 0x5a, 0x83, 0x78, 0xa5, 0x65, 0x1c, 0x46, 0x41, 0x99, 0x92, 0x5d, 0xb4, 0x31, 0x9e, 0xda, 0x64, 0x2a, 0xd0, 0xc1, 0xe1, 0xc8, 0x3c, 0x9d, 0xf, 0x24, 0xd, 0xdc, 0x2a, 0x5a, 0x83, 0xa4, 0x8, 0x1e, 0xfd, 0x3c, 0x94, 0xcf, 0xd2, 0x0, 0x7f, 0xe7, 0x24, 0x23, 0x77, 0x58, 0xc6, 0xe1, 0xce, 0xbc, 0xcf, 0xc8, 0x36, 0x79, 0xfe, 0x4c, 0xae, 0x15, 0x7b, 0xce, 0xc2, 0xbf, 0x94, 0xec, 0xa2, 0xf, 0x94, 0x1f, 0x7c, 0x62, 0xd9, 0xf0, 0x8f, 0x95, 0xfc, 0xec, 0x8e, 0x7e, 0x89, 0x91, 0xfe, 0xba, 0x2c, 0x14, 0x1, 0x63, 0x4b, 0xb, 0xd9, 0xc1, 0xc3, 0xf2, 0x65, 0x16, 0x7e, 0xf7, 0x70, 0xb1, 0x17, 0x9a, 0xc3, 0xa3, 0x71, 0xaf, 0xe4, 0x6f, 0xe9, 0x11, 0x14, 0xfc, 0xb3, 0x2c, 0xe3, 0x98, 0xab, 0x37, 0xd3, 0xfd, 0x47, 0x25, 0xbb, 0xe8, 0xc0, 0xd6, 0x1d, 0x1d, 0x2e, 0x8d, 0xdf, 0xe7, 0xd9, 0x3c, 0xc0, 0x3f, 0xff, 0x37, 0x5d, 0xe, 0x59, 0xc1, 0xbe, 0x92, 0xdf, 0x49, 0x11, 0xc7, 0x19, 0x69, 0xe6, 0x1a, 0x83, 0x87, 0x65, 0x42, 0x16, 0x7e, 0x37, 0xdc, 0x98, 0x70, 0xd3, 0xff, 0xe4, 0xb1, 0xe1, 0xff, 0x23, 0xf, 0x9f, 0x7, 0x2c, 0x5a, 0x94, 0x67, 0xd4, 0xb7, 0x5c, 0xbb, 0x41, 0xaa, 0x71, 0x2d, 0x2b, 0xd9, 0x45, 0x7, 0xaf, 0x4b, 0xd5, 0xee, 0xe8, 0xb0, 0xea, 0x2e, 0xcf, 0xa3, 0x39, 0xc0, 0x29, 0xce, 0xf, 0x8b, 0x66, 0xa5, 0x65, 0x3, 0x97, 0x51, 0x5b, 0x7e, 0x44, 0x9c, 0x8c, 0xc4, 0x7c, 0x3, 0x12, 0x1d, 0x4e, 0xb7, 0xec, 0x91, 0xef, 0x19, 0x99, 0x9f, 0xa5, 0x7b, 0x80, 0xbb, 0x14, 0x59, 0x86, 0x36, 0xd7, 0x1c, 0x6a, 0xef, 0x86, 0xe6, 0xd1, 0xf3, 0x68, 0xcc, 0xb5, 0xd8, 0xce, 0x72, 0xed, 0x49, 0x23, 0x6f, 0x57, 0xf7, 0x3, 0x94, 0xec, 0xa2, 0x83, 0xd5, 0xdc, 0xe8, 0xdd, 0x38, 0x58, 0x1c, 0x77, 0x66, 0x3e, 0x68, 0x75, 0xcf, 0x48, 0xd5, 0xcc, 0x38, 0x85, 0xbf, 0x80, 0x7b, 0xc, 0x87, 0x96, 0x22, 0x26, 0x5a, 0xc0, 0xb5, 0x95, 0x8f, 0x84, 0x77, 0x2a, 0x2d, 0x5b, 0x37, 0x1e, 0xcf, 0xf2, 0x7d, 0x3c, 0x64, 0xe4, 0x41, 0x8f, 0x6b, 0xd7, 0x1b, 0x39, 0x39, 0x4f, 0x9e, 0x7, 0xd6, 0xa4, 0x2d, 0x3, 0x1d, 0x8a, 0x47, 0x46, 0x9e, 0x1e, 0x25, 0xbb, 0x68, 0xe1, 0x9, 0xa9, 0xda, 0x81, 0x1d, 0xb1, 0xbb, 0x1b, 0xc5, 0x49, 0x91, 0x8e, 0x2b, 0x90, 0x62, 0x8c, 0x9a, 0x9a, 0x6e, 0x96, 0x6b, 0x3f, 0x48, 0xf0, 0xbd, 0xb, 0xf3, 0x9, 0x37, 0x4a, 0xd5, 0x8e, 0x1d, 0xc7, 0x8b, 0xe3, 0x46, 0xdf, 0x2a, 0x4f, 0xe6, 0xa0, 0x2d, 0x89, 0xc4, 0x8d, 0xb7, 0xc4, 0x1e, 0x47, 0xb, 0x12, 0x88, 0x11, 0x5e, 0xe8, 0x61, 0xb9, 0x14, 0x90, 0x8, 0x4f, 0x8d, 0xf1, 0xb3, 0xc0, 0x77, 0x1c, 0x21, 0xf6, 0x1e, 0xa1, 0x65, 0xf4, 0x40, 0x2c, 0x50, 0xb2, 0x8b, 0x1f, 0xbe, 0x13, 0x27, 0x1b, 0xcb, 0x8d, 0x8e, 0x62, 0xcf, 0xde, 0x8a, 0x3, 0xd0, 0x39, 0x2, 0x45, 0xa3, 0xfb, 0x59, 0xae, 0x7d, 0x6b, 0x64, 0xa0, 0xe8, 0x41, 0xb6, 0x7e, 0xc2, 0x6b, 0x4f, 0x38, 0x88, 0xcf, 0x61, 0xf7, 0x98, 0x7f, 0x7f, 0xc4, 0x83, 0x86, 0x5b, 0x88, 0x1d, 0xd9, 0x97, 0x77, 0x49, 0x9a, 0x6c, 0xbf, 0x0, 0x81, 0x66, 0xf0, 0x3, 0xc4, 0x39, 0x5b, 0xcf, 0x8d, 0x62, 0xee, 0x9, 0x43, 0x62, 0xfa, 0x3c, 0x6e, 0x25, 0xd9, 0xdb, 0x30, 0x82, 0x4a, 0x70, 0x9d, 0x16, 0xb6, 0x22, 0xbc, 0xf8, 0xa7, 0xd8, 0x5b, 0xa, 0x9d, 0x98, 0x66, 0x51, 0x44, 0x15, 0x28, 0x1c, 0x7d, 0x5d, 0xec, 0x7, 0xd8, 0x7e, 0x6f, 0xe4, 0x4, 0x23, 0xa3, 0x44, 0x7b, 0x63, 0xfa, 0x9, 0x58, 0x34, 0x5e, 0x59, 0x6d, 0xbb, 0xf2, 0x79, 0x1c, 0x17, 0xe3, 0xef, 0x7f, 0x9d, 0x91, 0x63, 0x2c, 0xe3, 0x2f, 0x89, 0xbd, 0xd8, 0x3b, 0x5b, 0xc0, 0x7a, 0x87, 0xcb, 0x72, 0xb6, 0xe5, 0x1a, 0xd6, 0x3f, 0x3a, 0xaf, 0xdc, 0x46, 0x4b, 0x28, 0xe, 0x80, 0xdb, 0xfc, 0x1, 0x23, 0x17, 0x79, 0x5c, 0x47, 0x48, 0xa3, 0x46, 0x31, 0x4b, 0x25, 0xbb, 0xe8, 0x61, 0x2d, 0x1f, 0xf2, 0x7a, 0xcb, 0x35, 0x64, 0x68, 0x9d, 0x12, 0x93, 0x85, 0xe, 0x52, 0xc7, 0xa1, 0x96, 0x2d, 0x2c, 0xd7, 0x91, 0x11, 0x7, 0xd7, 0xda, 0xe7, 0xa2, 0xc9, 0x2a, 0x7e, 0xe3, 0x27, 0x6e, 0xaa, 0x5e, 0x1b, 0x3b, 0x3a, 0xd6, 0xfc, 0x87, 0xa4, 0x10, 0xb7, 0xb2, 0x97, 0xab, 0x8d, 0x5c, 0xe5, 0x31, 0x27, 0x57, 0x87, 0xe0, 0xfe, 0xa6, 0x19, 0x39, 0xda, 0xc8, 0x4c, 0x8f, 0xeb, 0x97, 0xf2, 0xd9, 0xb4, 0x8c, 0xf8, 0x73, 0xc0, 0x29, 0xf, 0xe8, 0x13, 0x7a, 0xa6, 0xc7, 0x75, 0x9c, 0x10, 0x1, 0xb7, 0x66, 0xb9, 0x92, 0x5d, 0xfc, 0x81, 0xd8, 0xc1, 0x70, 0xcb, 0x38, 0x32, 0x96, 0x90, 0xc4, 0x12, 0x65, 0x1f, 0x3e, 0xdc, 0x65, 0x63, 0x8c, 0x5c, 0x20, 0xf6, 0x14, 0xe3, 0xe9, 0xd4, 0xbc, 0x3f, 0xd2, 0x65, 0x10, 0x28, 0xe1, 0xc1, 0x53, 0xe0, 0xe5, 0x22, 0x42, 0x12, 0xcb, 0x35, 0x46, 0xde, 0x31, 0xb2, 0x47, 0xc, 0xbe, 0x2f, 0xd6, 0xd9, 0x30, 0x23, 0x7f, 0xb7, 0x5c, 0xc3, 0x86, 0x3a, 0xd8, 0xc3, 0xa2, 0xca, 0x5, 0xa6, 0xd2, 0xb2, 0x9e, 0x93, 0xc6, 0x1b, 0x32, 0x8a, 0xef, 0x51, 0x14, 0x81, 0xfa, 0xd9, 0xb1, 0xe2, 0xdd, 0xf3, 0xf6, 0x25, 0x2a, 0x63, 0xab, 0x6a, 0xfa, 0x83, 0x95, 0xec, 0xa2, 0xb, 0xd4, 0x95, 0xd8, 0xdc, 0x4d, 0x85, 0xe2, 0x14, 0x9d, 0xe, 0x8c, 0xd8, 0xf7, 0xd9, 0x41, 0x9c, 0x60, 0x3b, 0x2c, 0xa, 0xaf, 0x86, 0xae, 0x78, 0x89, 0xf, 0x31, 0xf2, 0x85, 0x3e, 0xfe, 0xac, 0x59, 0x78, 0xf7, 0xa6, 0xf9, 0xcc, 0x81, 0xe2, 0x24, 0x4e, 0xa0, 0x75, 0x53, 0x71, 0x44, 0xbf, 0x27, 0xa, 0xc7, 0x91, 0x6d, 0x7a, 0xad, 0xc7, 0xf5, 0x11, 0xf4, 0x30, 0x84, 0x9, 0x53, 0x8c, 0x1c, 0x2e, 0x55, 0x1b, 0x4d, 0x24, 0xd1, 0x8d, 0xd6, 0xcf, 0xb5, 0x12, 0x9d, 0x2c, 0x5a, 0x3c, 0x87, 0xdb, 0xa9, 0x60, 0xb5, 0x4f, 0x63, 0xd1, 0xd, 0x10, 0x7b, 0x2b, 0x35, 0x25, 0xbb, 0x18, 0x63, 0x2d, 0x9, 0xcd, 0x16, 0xb4, 0x6e, 0x44, 0xe2, 0x80, 0xf5, 0xd7, 0x34, 0xe4, 0xdf, 0x63, 0x3b, 0x5a, 0x9, 0xe3, 0xf9, 0x7d, 0xa, 0x3d, 0x3e, 0x87, 0x56, 0x40, 0x28, 0xa6, 0xfd, 0x4e, 0x1f, 0x7d, 0xd6, 0x80, 0x2e, 0xfc, 0xe7, 0x89, 0x13, 0xb, 0x5e, 0xef, 0xf1, 0x99, 0x96, 0x54, 0xbc, 0x90, 0xa5, 0xf8, 0x87, 0x88, 0x7d, 0x3f, 0x28, 0x4e, 0xef, 0xa6, 0xf1, 0x84, 0x20, 0xfb, 0x39, 0xac, 0xb5, 0x6c, 0x38, 0x75, 0x1, 0x2e, 0xcd, 0xb7, 0x3c, 0xae, 0x37, 0xa6, 0xb5, 0x8a, 0xba, 0xc0, 0x7e, 0x21, 0x7e, 0x6, 0xc8, 0x26, 0x47, 0x48, 0x2, 0x9e, 0x1a, 0x74, 0x46, 0xf2, 0x8a, 0xbf, 0xa3, 0x4, 0x3, 0x21, 0x9a, 0x9f, 0x6b, 0xfb, 0x8b, 0x94, 0xec, 0xa2, 0x8d, 0x25, 0xd4, 0xbe, 0x67, 0x78, 0x5c, 0x47, 0x70, 0x17, 0xae, 0xa6, 0x7d, 0x43, 0x78, 0xef, 0xd0, 0xde, 0x90, 0x41, 0x3a, 0x5a, 0x9c, 0xf8, 0xcf, 0x16, 0x69, 0xbe, 0xe3, 0x69, 0x46, 0x6, 0xa5, 0xd9, 0x70, 0x13, 0x96, 0xb1, 0x72, 0x5d, 0x1e, 0xbe, 0x1, 0x5d, 0x2b, 0xe0, 0xd6, 0xfc, 0x36, 0xcd, 0x67, 0x60, 0x8d, 0xc3, 0xc5, 0xf4, 0x9a, 0x84, 0xdf, 0x85, 0xb6, 0x13, 0xad, 0x39, 0x24, 0xdb, 0x78, 0xb9, 0x61, 0x51, 0xa8, 0x7c, 0x8e, 0xe4, 0x26, 0xfb, 0x32, 0x53, 0x2c, 0x13, 0xa7, 0xe, 0xf2, 0x9f, 0x69, 0x3e, 0xb3, 0x37, 0xbf, 0xe7, 0xb3, 0x46, 0x76, 0xb, 0x19, 0xc9, 0xf5, 0x25, 0x59, 0x23, 0x3e, 0xd7, 0xc9, 0xe3, 0x73, 0xc8, 0x44, 0x45, 0x1c, 0xf5, 0xec, 0xba, 0x10, 0x9d, 0x92, 0x5d, 0x3c, 0x80, 0xa0, 0x35, 0x7c, 0xf8, 0x5e, 0x41, 0xeb, 0x7d, 0x49, 0x28, 0xc8, 0xd4, 0xca, 0xf5, 0x29, 0x9, 0x2d, 0x68, 0x9d, 0xe1, 0xc5, 0x43, 0xb3, 0xdb, 0x8b, 0xb9, 0xf1, 0x78, 0xe1, 0x79, 0x71, 0x5a, 0xa2, 0x3d, 0x91, 0xe6, 0x33, 0x78, 0x19, 0x56, 0x5a, 0xc6, 0x5b, 0xeb, 0xd2, 0xf0, 0x15, 0x20, 0x32, 0x34, 0x30, 0x78, 0x35, 0xcd, 0x67, 0x10, 0xfb, 0x3a, 0x42, 0x1c, 0x77, 0x33, 0x48, 0xef, 0xa8, 0x34, 0x4a, 0x4c, 0x2e, 0xb0, 0x97, 0x38, 0x47, 0xc1, 0x7c, 0x26, 0x4e, 0x77, 0x14, 0x2f, 0x2f, 0xc2, 0xfd, 0x46, 0xce, 0x10, 0xe7, 0x2c, 0xc9, 0xb0, 0x63, 0x1d, 0x95, 0x5a, 0x28, 0xbd, 0xdf, 0xa7, 0x79, 0x2e, 0x27, 0xf0, 0x7b, 0xa3, 0x4c, 0x21, 0x97, 0x2d, 0x6, 0x1b, 0x73, 0xf, 0x0, 0x1, 0x23, 0x64, 0x71, 0x68, 0x35, 0xd6, 0x2b, 0xbc, 0x5, 0xa8, 0xfd, 0xac, 0xf3, 0x61, 0xb9, 0x4a, 0x76, 0xf1, 0x0, 0x82, 0xd6, 0x8, 0xec, 0xbe, 0xeb, 0x71, 0x1d, 0x6e, 0xcd, 0x4b, 0xe9, 0xd2, 0x80, 0x6b, 0x63, 0xfb, 0x2c, 0xde, 0x5b, 0x23, 0x2e, 0xe8, 0xbb, 0x49, 0xba, 0xaf, 0xf0, 0xc5, 0x6b, 0x52, 0xcd, 0x22, 0x3f, 0x85, 0x9f, 0x9b, 0x5b, 0xcd, 0xcf, 0x5f, 0xe5, 0x61, 0xd9, 0x9e, 0x2f, 0xd1, 0x8d, 0x23, 0x85, 0x15, 0x48, 0xd2, 0x80, 0xcb, 0x9, 0x6e, 0xcd, 0xe5, 0xd5, 0xec, 0x2b, 0x47, 0x90, 0x20, 0xf1, 0xcc, 0x6f, 0xa1, 0xe6, 0x5e, 0x98, 0x83, 0x7b, 0xde, 0x92, 0x44, 0xf0, 0x3c, 0xd7, 0xff, 0x15, 0x1c, 0xb3, 0x1, 0xb5, 0x74, 0x70, 0xa5, 0x9d, 0x2b, 0xc1, 0x9e, 0x6a, 0x10, 0x4, 0x10, 0x57, 0xec, 0x43, 0x12, 0xf1, 0x42, 0x43, 0x5a, 0x48, 0xa3, 0x68, 0x51, 0xd, 0xc8, 0x92, 0x32, 0x2, 0x2b, 0x6e, 0x47, 0x71, 0xc2, 0x15, 0xc9, 0x3d, 0xa0, 0x7f, 0x35, 0xfc, 0xf3, 0x0, 0x3d, 0x4, 0xef, 0xf8, 0x75, 0x13, 0x5, 0xfa, 0xfe, 0xc6, 0x6, 0x20, 0x85, 0xa3, 0xb9, 0xb1, 0x9c, 0xe7, 0xf1, 0x19, 0x58, 0x51, 0x8, 0x5a, 0x23, 0xd3, 0xf1, 0x65, 0x71, 0x82, 0xc1, 0xe8, 0xbf, 0xb7, 0xc8, 0xc7, 0xfb, 0xd8, 0x8e, 0xb, 0xbb, 0x2b, 0x35, 0xc8, 0x9e, 0x46, 0xb6, 0x16, 0xbb, 0xab, 0xd1, 0xd, 0xb8, 0xc9, 0x1e, 0x13, 0xc7, 0xbd, 0x99, 0xa9, 0xcb, 0xa2, 0x82, 0x1a, 0xab, 0xbb, 0xf6, 0xb, 0x1a, 0xe1, 0x4, 0x6e, 0x2, 0xb7, 0xd1, 0x2, 0x54, 0xd4, 0x1d, 0x98, 0xc7, 0x3b, 0xb9, 0x9, 0x5d, 0x4d, 0x85, 0x24, 0xdd, 0x3e, 0xb2, 0x27, 0x5, 0x4d, 0x8d, 0x91, 0x58, 0x81, 0xa4, 0xaa, 0x4f, 0xc5, 0xc9, 0xaa, 0x5d, 0xe8, 0x87, 0xc6, 0xee, 0x2, 0x36, 0xef, 0x9d, 0x8d, 0x74, 0xe6, 0xe6, 0x7f, 0xa8, 0xd8, 0xcb, 0x57, 0xdc, 0x98, 0x44, 0x12, 0x1f, 0x13, 0x71, 0x2f, 0xcf, 0x91, 0x24, 0xeb, 0x2b, 0xf8, 0x2e, 0xda, 0x80, 0x92, 0x91, 0x7e, 0x94, 0xdb, 0x68, 0x85, 0xc3, 0xca, 0x9a, 0x4c, 0xc5, 0xb1, 0xd2, 0x87, 0x7b, 0x69, 0xce, 0xe7, 0x0, 0xcf, 0x12, 0x62, 0xa3, 0x7, 0x66, 0xa8, 0x7c, 0x8e, 0x13, 0x27, 0x6, 0xfc, 0x8a, 0xdf, 0x93, 0xa3, 0x64, 0x17, 0x2f, 0xfc, 0x42, 0x8b, 0x6, 0xc9, 0x1e, 0x28, 0x32, 0x6d, 0x99, 0x66, 0x43, 0x18, 0x40, 0x99, 0xc5, 0x17, 0x7d, 0xa, 0x17, 0xda, 0x54, 0x6a, 0xed, 0xa5, 0xdc, 0x88, 0x52, 0x49, 0xaa, 0x92, 0x6b, 0xa6, 0x3e, 0xb5, 0x63, 0xf4, 0xab, 0x44, 0xc1, 0x37, 0x32, 0x29, 0xd1, 0xc5, 0x5, 0x35, 0x58, 0xed, 0x49, 0x76, 0x35, 0xf1, 0x1a, 0xfc, 0x40, 0x4d, 0xe, 0x44, 0x37, 0xa7, 0x16, 0xdf, 0x1b, 0xc4, 0x3d, 0x54, 0xaa, 0x9e, 0x6f, 0x7, 0x6b, 0x62, 0x8, 0x7f, 0xee, 0x22, 0x5d, 0x1e, 0xbe, 0x2, 0x64, 0x75, 0x12, 0xe7, 0x16, 0x73, 0xdf, 0xbb, 0x9a, 0xcf, 0x63, 0xa3, 0xeb, 0x2e, 0x1b, 0x33, 0x6d, 0xe7, 0x92, 0xec, 0xe6, 0x71, 0xed, 0xc1, 0xd, 0xbf, 0x98, 0xe3, 0xa5, 0x24, 0xd5, 0x4a, 0xcb, 0xfa, 0x4b, 0x70, 0xd, 0xd6, 0xe3, 0xfa, 0x83, 0x22, 0xd5, 0x81, 0x8a, 0x5c, 0x27, 0x7a, 0x2d, 0x76, 0xa6, 0x47, 0x21, 0x13, 0xac, 0xa6, 0x72, 0xf5, 0x6f, 0xae, 0xc3, 0xa8, 0xa3, 0x92, 0xdf, 0x5, 0xd6, 0xdb, 0x20, 0x12, 0x5f, 0x3a, 0x8b, 0x1a, 0x8a, 0xc0, 0xe9, 0x94, 0xef, 0xf9, 0x5c, 0xe7, 0x90, 0xf8, 0xb0, 0x17, 0x7c, 0x93, 0x66, 0x3f, 0x10, 0xfe, 0xec, 0x62, 0xce, 0x3f, 0xf6, 0x82, 0x3d, 0x38, 0xff, 0x3b, 0x72, 0x4f, 0xc8, 0xd4, 0xbb, 0xf2, 0x1d, 0x15, 0xf5, 0x27, 0xa5, 0x16, 0x65, 0x5, 0x4a, 0x76, 0xf9, 0x8b, 0x47, 0xe8, 0xb2, 0xb9, 0x96, 0x1b, 0x52, 0xba, 0xc5, 0xde, 0x91, 0x72, 0x1c, 0x5f, 0x94, 0xd, 0xdc, 0x68, 0xd0, 0x6f, 0x6e, 0xbd, 0x6b, 0x71, 0x57, 0x90, 0x40, 0x5b, 0x91, 0xf0, 0xa, 0xea, 0xb8, 0x86, 0xd0, 0x9, 0xe6, 0x7f, 0xe2, 0xd4, 0x6, 0xd6, 0x85, 0x8c, 0xf0, 0x42, 0xc2, 0x4d, 0x3a, 0xcc, 0x72, 0x6d, 0xad, 0xd8, 0xeb, 0xf5, 0x14, 0xfe, 0x0, 0x9b, 0xea, 0x68, 0x5a, 0xd2, 0x83, 0xa8, 0xc1, 0x67, 0xe2, 0xae, 0xdc, 0x81, 0x72, 0x60, 0xca, 0x58, 0x69, 0x8a, 0x5, 0x3e, 0x87, 0x7f, 0xb7, 0x79, 0x4, 0x10, 0x7b, 0x6e, 0x9a, 0xb2, 0xfe, 0x6a, 0xf3, 0x7c, 0x57, 0x71, 0xed, 0xdd, 0x29, 0xf6, 0x8e, 0x44, 0x51, 0xc7, 0x6c, 0x7a, 0x70, 0x1e, 0x15, 0x27, 0x36, 0x7e, 0x94, 0x54, 0x9f, 0x99, 0xdd, 0x9a, 0xd2, 0x3b, 0xe5, 0x7d, 0xc7, 0x33, 0x28, 0xe7, 0x7e, 0xb0, 0xc6, 0xf2, 0x3c, 0xda, 0x51, 0xb1, 0x68, 0x50, 0xcb, 0xbd, 0x60, 0x3a, 0x9f, 0x3, 0xde, 0xdf, 0xa5, 0x41, 0x4e, 0x88, 0xd7, 0x42, 0xd1, 0x58, 0x5e, 0xf4, 0x31, 0x9f, 0xda, 0x1a, 0x88, 0xef, 0x12, 0x6e, 0x46, 0xd5, 0x3d, 0xd7, 0x4, 0x35, 0x31, 0x48, 0xd7, 0x80, 0xee, 0xb, 0x2f, 0xc, 0xe2, 0xa, 0x88, 0xa1, 0x8c, 0x35, 0xf2, 0xa3, 0x4f, 0x3f, 0x17, 0x41, 0xec, 0x5d, 0xa5, 0xaa, 0x3b, 0x33, 0x91, 0xa5, 0xf9, 0xae, 0x9f, 0xe1, 0x58, 0x1c, 0x81, 0x4d, 0x11, 0x6e, 0x27, 0x24, 0xaf, 0x1c, 0x60, 0xe4, 0xcf, 0xe2, 0xc4, 0xf6, 0x6a, 0x7a, 0x92, 0x7c, 0x61, 0xa, 0x51, 0x76, 0xb, 0xe8, 0x5e, 0x57, 0x90, 0x0, 0x9e, 0xa1, 0x7, 0x24, 0xee, 0x40, 0x98, 0x2, 0xa5, 0x15, 0x7b, 0xf3, 0xb9, 0x9c, 0x26, 0xde, 0x31, 0x4b, 0x1b, 0xf, 0x24, 0x2d, 0xb3, 0xce, 0x3e, 0xde, 0x13, 0xc8, 0xf3, 0xb, 0x7a, 0x5, 0x5e, 0x15, 0xef, 0xc4, 0x1a, 0xdf, 0xc9, 0x6e, 0x83, 0x54, 0x6d, 0xfb, 0x53, 0x2a, 0x8a, 0xb8, 0xe0, 0x43, 0xa, 0xb4, 0xb5, 0xf3, 0xb8, 0x19, 0x65, 0xbb, 0x7b, 0x3d, 0x5c, 0x53, 0x53, 0x48, 0x72, 0x6f, 0x4a, 0x30, 0x2e, 0x45, 0xac, 0xd9, 0x93, 0xa9, 0x29, 0x9e, 0x23, 0x1b, 0x5d, 0xb8, 0xd, 0x24, 0x3b, 0xf1, 0x3a, 0x5b, 0x46, 0xe8, 0xea, 0x3c, 0x5b, 0x6b, 0xf0, 0xc, 0x7c, 0x40, 0x41, 0x3c, 0xf, 0x9d, 0x6e, 0x8e, 0xa4, 0xe2, 0xd4, 0x36, 0x87, 0xf7, 0x5, 0x8b, 0xe1, 0x4b, 0xae, 0x3d, 0xa4, 0xb9, 0xe7, 0x63, 0xe3, 0xf0, 0x71, 0x94, 0x9b, 0xf9, 0x9e, 0x20, 0x81, 0xa8, 0xbb, 0x64, 0xb7, 0xe, 0x17, 0x7b, 0xc0, 0xc7, 0x46, 0x9e, 0x16, 0xa7, 0x20, 0x3e, 0xab, 0x65, 0x1d, 0x5, 0x34, 0x71, 0xfb, 0xa4, 0x30, 0x78, 0x5, 0x6f, 0x46, 0x11, 0x2f, 0x8c, 0xa1, 0x40, 0x43, 0xeb, 0xcb, 0x4d, 0x68, 0x1f, 0xf1, 0xbf, 0xc3, 0x42, 0x19, 0x37, 0xf9, 0x9, 0xb4, 0xdc, 0xf0, 0xe7, 0x34, 0xc9, 0xce, 0x81, 0x97, 0x50, 0xdc, 0xae, 0xe1, 0x86, 0x96, 0x4c, 0x8c, 0x81, 0x3b, 0x67, 0x59, 0x16, 0x7e, 0xf7, 0x53, 0xd4, 0x84, 0x1b, 0xf3, 0xdf, 0x20, 0xd8, 0x17, 0xf3, 0x78, 0xbd, 0xc1, 0x62, 0x7f, 0x90, 0x82, 0xf8, 0x4d, 0x17, 0x71, 0x12, 0x96, 0xb0, 0xd7, 0x20, 0xbe, 0xd3, 0x28, 0x40, 0xab, 0x7b, 0x3d, 0x15, 0x2a, 0x28, 0x79, 0xa3, 0x53, 0xd6, 0xa0, 0xc2, 0x79, 0x17, 0x86, 0x53, 0x60, 0xed, 0xe1, 0x34, 0x11, 0x94, 0x94, 0xa0, 0xc4, 0x67, 0x73, 0xf1, 0xd7, 0xab, 0xb7, 0x8e, 0x96, 0x25, 0xba, 0xec, 0x7c, 0xca, 0xbf, 0x2f, 0xcb, 0xd5, 0x17, 0x4f, 0x9c, 0x34, 0x68, 0x88, 0x3e, 0xfe, 0xfc, 0x44, 0x3d, 0x5a, 0x3f, 0xfb, 0x8b, 0x73, 0x8c, 0xe, 0x12, 0x4b, 0x5a, 0xd3, 0xc5, 0xd1, 0x9c, 0x1b, 0x11, 0x12, 0x59, 0x8a, 0x52, 0x88, 0xe4, 0x27, 0x8e, 0x63, 0x33, 0x41, 0xcc, 0x63, 0xd, 0xc7, 0x20, 0xf3, 0x68, 0xc1, 0x21, 0xb0, 0x3d, 0x93, 0xd7, 0x2a, 0x74, 0x9a, 0x15, 0x2e, 0x14, 0x72, 0x7d, 0x81, 0xfc, 0x76, 0x11, 0x27, 0x99, 0xa1, 0xd, 0xd7, 0x5d, 0x33, 0x71, 0xd2, 0xe3, 0x37, 0xe7, 0xda, 0x81, 0xe2, 0x90, 0xda, 0xe8, 0xbb, 0x84, 0x6b, 0x2d, 0xf9, 0xf7, 0x1f, 0xb9, 0xce, 0xf0, 0xe7, 0xf, 0x5c, 0x7f, 0xd3, 0x69, 0xc5, 0x2d, 0xe3, 0x9a, 0x55, 0x64, 0x6, 0xcc, 0x39, 0x92, 0x4b, 0xe0, 0x3e, 0xee, 0x44, 0x45, 0xb1, 0x15, 0xc7, 0x93, 0xe5, 0x9, 0x5b, 0xc8, 0xc6, 0xe, 0x27, 0x6b, 0x52, 0x3c, 0x17, 0x2b, 0xb9, 0x1f, 0x2c, 0xa3, 0x15, 0x8d, 0x78, 0x2b, 0xe2, 0xa0, 0x70, 0x13, 0xc3, 0x6d, 0x9c, 0xb5, 0x6, 0xf, 0x6b, 0xd6, 0xae, 0x93, 0xa1, 0x83, 0x6, 0xca, 0x3e, 0x7b, 0x54, 0x8d, 0xc2, 0xfc, 0xbf, 0x0, 0x3, 0x0, 0x73, 0x78, 0xf7, 0xf2, 0x7e, 0x74, 0x3a, 0x48, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; @@ -75,26 +43,8 @@ + (NSData *)parse_logo3x_png { static const unsigned char apple_icon_png[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x16, 0x8, 0x6, 0x0, 0x0, 0x0, 0xcd, 0x5f, 0xcc, 0x41, 0x0, 0x0, 0x0, 0x1, 0x73, 0x52, 0x47, 0x42, 0x0, 0xae, 0xce, 0x1c, 0xe9, 0x0, 0x0, 0x1, 0x54, 0x49, 0x44, 0x41, 0x54, 0x38, 0x11, 0xa5, 0x93, 0x31, 0x2c, 0x83, 0x41, 0x14, 0xc7, 0xbf, 0xfb, 0x52, 0xd4, 0x86, 0xa5, 0x13, 0x91, 0x8a, 0x44, 0x22, 0x6, 0x6, 0x83, 0x98, 0x24, 0x62, 0xb3, 0x74, 0xb3, 0x4a, 0xba, 0x32, 0x1a, 0xd, 0x16, 0x89, 0xd1, 0x6a, 0x68, 0x62, 0x94, 0xb0, 0xd9, 0x30, 0x18, 0x6c, 0x48, 0x58, 0x1a, 0x2c, 0x6, 0xb1, 0x10, 0x83, 0x90, 0x56, 0xfa, 0xf9, 0xbd, 0xea, 0xbb, 0x6b, 0x85, 0xc4, 0x3d, 0x2f, 0xf9, 0xe5, 0xbd, 0x77, 0xf7, 0xfe, 0xff, 0x5c, 0xbf, 0xde, 0x25, 0x49, 0x44, 0x64, 0x59, 0x56, 0x86, 0x6b, 0x58, 0x8c, 0x90, 0x85, 0x51, 0x84, 0x29, 0xec, 0x82, 0xc6, 0x68, 0xd8, 0x8d, 0xa8, 0x50, 0xaf, 0xa8, 0x3, 0xf9, 0xc, 0x5c, 0x84, 0x3c, 0x8c, 0x22, 0xbc, 0x6d, 0x19, 0x3d, 0x91, 0x27, 0xc3, 0x4e, 0x44, 0x85, 0xb0, 0x1f, 0x1a, 0x70, 0x4, 0x23, 0xbf, 0x49, 0x3b, 0x8e, 0xc8, 0xe0, 0x18, 0x83, 0x73, 0x30, 0xe, 0xf7, 0xb0, 0xf, 0x55, 0xe8, 0x81, 0x1, 0x28, 0xc1, 0x14, 0x74, 0xc3, 0x25, 0x54, 0x9c, 0x73, 0x8f, 0xe4, 0xaf, 0xc0, 0x20, 0x7, 0xeb, 0xf0, 0x1, 0xdf, 0xe3, 0x9c, 0x85, 0x53, 0xf8, 0x69, 0xef, 0x95, 0xf5, 0x25, 0xf5, 0x49, 0x68, 0xb6, 0xc0, 0x1a, 0x2f, 0x8, 0xb, 0x62, 0x32, 0x1, 0x75, 0xa3, 0x4b, 0xd, 0xdd, 0x6c, 0xf3, 0x44, 0x14, 0x15, 0xa3, 0x89, 0xc8, 0x36, 0xdb, 0x7f, 0xd6, 0xdd, 0x3f, 0x8c, 0xfc, 0x55, 0x70, 0x98, 0xbc, 0xe1, 0x9a, 0xf7, 0xce, 0x7f, 0x2f, 0x1a, 0x8c, 0xf6, 0xf2, 0xaf, 0xd5, 0x44, 0x92, 0x42, 0x5d, 0xa, 0x43, 0x88, 0xd6, 0x1f, 0x40, 0x9a, 0x70, 0xf, 0xe2, 0xdd, 0x16, 0x54, 0x22, 0x46, 0x17, 0xda, 0x18, 0xb2, 0x5c, 0x9b, 0x3e, 0xd1, 0x89, 0xd1, 0xb1, 0xc1, 0x40, 0x25, 0x43, 0x14, 0x87, 0x98, 0xd, 0xca, 0xc7, 0x2e, 0xd0, 0xc8, 0x73, 0xe8, 0xd2, 0x5d, 0x43, 0x3e, 0x49, 0x5b, 0x6f, 0x65, 0xcf, 0x20, 0x6e, 0x97, 0xec, 0x34, 0x1b, 0x4e, 0x55, 0x84, 0x77, 0xb0, 0xc4, 0x15, 0xa2, 0x9c, 0x77, 0xa5, 0x59, 0x33, 0xb8, 0xc8, 0x43, 0x9e, 0xf1, 0x26, 0x52, 0xb0, 0x20, 0xdf, 0xeb, 0x20, 0xd2, 0x6c, 0xb5, 0xc3, 0x44, 0x1b, 0x4c, 0xf2, 0xb0, 0xd, 0xcf, 0x70, 0x3, 0x1b, 0x30, 0xd, 0xc3, 0x30, 0xf, 0xf2, 0x2e, 0x1f, 0xa0, 0xa, 0xcb, 0xaa, 0x93, 0xfc, 0x9, 0x73, 0x3f, 0x88, 0x2b, 0xe2, 0x2d, 0x37, 0x24, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; - - + (NSData *)apple_icon_png { return [NSData dataWithBytes:apple_icon_png length:sizeof(apple_icon_png)]; } - static const unsigned char facebook_icon_png[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0x16, 0x0, 0x0, 0x0, 0x16, 0x8, 0x6, 0x0, 0x0, 0x0, 0xc4, 0xb4, 0x6c, 0x3b, 0x0, 0x0, 0x0, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x0, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x61, 0x64, 0x79, 0x71, 0xc9, 0x65, 0x3c, 0x0, 0x0, 0x3, 0x23, 0x69, 0x54, 0x58, 0x74, 0x58, 0x4d, 0x4c, 0x3a, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x78, 0x6d, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x3d, 0x22, 0xef, 0xbb, 0xbf, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x57, 0x35, 0x4d, 0x30, 0x4d, 0x70, 0x43, 0x65, 0x68, 0x69, 0x48, 0x7a, 0x72, 0x65, 0x53, 0x7a, 0x4e, 0x54, 0x63, 0x7a, 0x6b, 0x63, 0x39, 0x64, 0x22, 0x3f, 0x3e, 0x20, 0x3c, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x3d, 0x22, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x3a, 0x6e, 0x73, 0x3a, 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x22, 0x20, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x74, 0x6b, 0x3d, 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x58, 0x4d, 0x50, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x35, 0x2e, 0x35, 0x2d, 0x63, 0x30, 0x31, 0x34, 0x20, 0x37, 0x39, 0x2e, 0x31, 0x35, 0x31, 0x34, 0x38, 0x31, 0x2c, 0x20, 0x32, 0x30, 0x31, 0x33, 0x2f, 0x30, 0x33, 0x2f, 0x31, 0x33, 0x2d, 0x31, 0x32, 0x3a, 0x30, 0x39, 0x3a, 0x31, 0x35, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x3e, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x72, 0x64, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x31, 0x39, 0x39, 0x39, 0x2f, 0x30, 0x32, 0x2f, 0x32, 0x32, 0x2d, 0x72, 0x64, 0x66, 0x2d, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2d, 0x6e, 0x73, 0x23, 0x22, 0x3e, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x64, 0x66, 0x3a, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x3d, 0x22, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x6d, 0x6d, 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x73, 0x54, 0x79, 0x70, 0x65, 0x2f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x23, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x3a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x6f, 0x6c, 0x3d, 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x73, 0x68, 0x6f, 0x70, 0x20, 0x43, 0x43, 0x20, 0x28, 0x4d, 0x61, 0x63, 0x69, 0x6e, 0x74, 0x6f, 0x73, 0x68, 0x29, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x69, 0x69, 0x64, 0x3a, 0x37, 0x46, 0x34, 0x42, 0x46, 0x44, 0x38, 0x36, 0x33, 0x44, 0x43, 0x39, 0x31, 0x31, 0x45, 0x34, 0x38, 0x33, 0x35, 0x43, 0x42, 0x42, 0x36, 0x30, 0x39, 0x42, 0x42, 0x31, 0x39, 0x35, 0x32, 0x44, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x64, 0x69, 0x64, 0x3a, 0x37, 0x46, 0x34, 0x42, 0x46, 0x44, 0x38, 0x37, 0x33, 0x44, 0x43, 0x39, 0x31, 0x31, 0x45, 0x34, 0x38, 0x33, 0x35, 0x43, 0x42, 0x42, 0x36, 0x30, 0x39, 0x42, 0x42, 0x31, 0x39, 0x35, 0x32, 0x44, 0x22, 0x3e, 0x20, 0x3c, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x20, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x69, 0x69, 0x64, 0x3a, 0x37, 0x32, 0x42, 0x32, 0x44, 0x31, 0x37, 0x46, 0x33, 0x44, 0x43, 0x39, 0x31, 0x31, 0x45, 0x34, 0x38, 0x33, 0x35, 0x43, 0x42, 0x42, 0x36, 0x30, 0x39, 0x42, 0x42, 0x31, 0x39, 0x35, 0x32, 0x44, 0x22, 0x20, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x64, 0x69, 0x64, 0x3a, 0x37, 0x32, 0x42, 0x32, 0x44, 0x31, 0x38, 0x30, 0x33, 0x44, 0x43, 0x39, 0x31, 0x31, 0x45, 0x34, 0x38, 0x33, 0x35, 0x43, 0x42, 0x42, 0x36, 0x30, 0x39, 0x42, 0x42, 0x31, 0x39, 0x35, 0x32, 0x44, 0x22, 0x2f, 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x3e, 0x20, 0x3c, 0x2f, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x3e, 0x20, 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x65, 0x6e, 0x64, 0x3d, 0x22, 0x72, 0x22, 0x3f, 0x3e, 0x98, 0x50, 0xa6, 0xc2, 0x0, 0x0, 0x1, 0x78, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0x62, 0xd8, 0xbc, 0x79, 0xf3, 0x9a, 0xbf, 0x7f, 0xff, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xf, 0x6a, 0xe0, 0x7f, 0xff, 0xfe, 0x7d, 0xdf, 0xb5, 0x6b, 0xd7, 0x26, 0x46, 0x20, 0xe7, 0x2f, 0x3, 0x3, 0x3, 0x13, 0x3, 0x95, 0x1, 0xc8, 0xc0, 0x3f, 0xc, 0xd4, 0x7, 0x7f, 0x59, 0xc8, 0xd1, 0xf5, 0xf9, 0xf3, 0xe7, 0xf, 0x6b, 0xd7, 0xae, 0x5d, 0x75, 0xf6, 0xec, 0xd9, 0x73, 0xbf, 0x7f, 0xff, 0xfe, 0xc9, 0xc1, 0xc1, 0xc1, 0xe5, 0xe1, 0xe1, 0xe1, 0xe, 0xc4, 0x7e, 0x70, 0x45, 0xc0, 0xa0, 0xf8, 0xf9, 0x9f, 0x4, 0x70, 0xef, 0xde, 0xbd, 0x5b, 0x3a, 0x3a, 0x3a, 0x1a, 0xe8, 0x96, 0x65, 0x65, 0x65, 0x25, 0x21, 0x29, 0xfb, 0x43, 0x72, 0xd8, 0xe6, 0xe4, 0xe4, 0x64, 0x5d, 0xb9, 0x72, 0xe5, 0x6, 0x16, 0x29, 0x46, 0x64, 0xe, 0x49, 0x41, 0xf1, 0xe8, 0xd1, 0xa3, 0x7b, 0x7b, 0xf6, 0xec, 0x39, 0x0, 0xe3, 0xeb, 0xeb, 0xeb, 0x6b, 0x45, 0x46, 0x46, 0x46, 0x70, 0x73, 0x73, 0x73, 0x18, 0x1a, 0x1a, 0x1a, 0xa1, 0x28, 0x26, 0x25, 0x28, 0x4e, 0x9e, 0x3c, 0x79, 0x18, 0x59, 0xef, 0x91, 0x23, 0x47, 0xf6, 0xe1, 0x50, 0x4a, 0x5a, 0x50, 0x30, 0x32, 0xa2, 0xf8, 0x96, 0x41, 0x0, 0x8, 0xf0, 0x25, 0x37, 0xa2, 0x1, 0x33, 0x33, 0x33, 0xba, 0xfa, 0xff, 0xb8, 0xd4, 0x12, 0xc, 0xe3, 0x97, 0x2f, 0x5f, 0x3e, 0xf, 0xb, 0xb, 0xb, 0xf9, 0xf9, 0xf3, 0xe7, 0xef, 0x2f, 0x5f, 0xbe, 0x7c, 0x46, 0x96, 0x3, 0x86, 0x6f, 0x2c, 0x17, 0x17, 0x17, 0x37, 0x88, 0x5d, 0x55, 0x55, 0x55, 0xee, 0xe7, 0xe7, 0x17, 0x4c, 0xb4, 0xc1, 0x40, 0x3, 0x7f, 0x1c, 0x3a, 0x74, 0xe8, 0x18, 0x36, 0xb9, 0xcb, 0x97, 0x2f, 0x5f, 0xc3, 0xe5, 0x1b, 0x82, 0x41, 0x1, 0x8a, 0x9, 0x62, 0x82, 0x49, 0x5e, 0x5e, 0x5e, 0x81, 0xa4, 0xa0, 0x10, 0x14, 0x14, 0x14, 0xea, 0xe8, 0xe8, 0x68, 0xfd, 0x3, 0x4, 0x4f, 0x9e, 0x3c, 0x79, 0x38, 0x63, 0xc6, 0x8c, 0x79, 0x48, 0x69, 0x3a, 0x4d, 0x42, 0x42, 0x42, 0x9a, 0x8d, 0x8d, 0x8d, 0x55, 0x51, 0x51, 0x51, 0x99, 0xec, 0xe4, 0x76, 0xed, 0xda, 0xb5, 0x73, 0xc8, 0x7a, 0xef, 0xde, 0xbd, 0x7b, 0x9d, 0x2a, 0xc9, 0xd, 0x18, 0x79, 0x5f, 0xd1, 0xf8, 0x5f, 0xa8, 0x92, 0xdc, 0x48, 0x2d, 0x36, 0x47, 0xd, 0x86, 0x1b, 0x4c, 0x74, 0x9, 0x47, 0x64, 0x92, 0x6, 0xe7, 0x17, 0xa6, 0xdd, 0xbb, 0x77, 0x6f, 0x5, 0x6a, 0xf8, 0x5, 0xad, 0xa2, 0x88, 0xc1, 0xc8, 0x16, 0x61, 0xc8, 0x3, 0xc5, 0x7e, 0x1f, 0x3c, 0x78, 0x70, 0x17, 0x40, 0x80, 0x1, 0x0, 0x86, 0x7f, 0xa9, 0xd0, 0x39, 0x35, 0xd1, 0x78, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; - - - - + (NSData *)facebook_icon_png { - return [NSData dataWithBytes:facebook_icon_png length:sizeof(facebook_icon_png)]; - } - - static const unsigned char twitter_icon_png[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0x16, 0x0, 0x0, 0x0, 0x12, 0x8, 0x6, 0x0, 0x0, 0x0, 0x5f, 0x25, 0x2e, 0x2d, 0x0, 0x0, 0x0, 0x1, 0x73, 0x52, 0x47, 0x42, 0x0, 0xae, 0xce, 0x1c, 0xe9, 0x0, 0x0, 0x0, 0x9, 0x70, 0x48, 0x59, 0x73, 0x0, 0x0, 0x2e, 0x23, 0x0, 0x0, 0x2e, 0x23, 0x1, 0x78, 0xa5, 0x3f, 0x76, 0x0, 0x0, 0x1, 0xcb, 0x69, 0x54, 0x58, 0x74, 0x58, 0x4d, 0x4c, 0x3a, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x78, 0x6d, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x3d, 0x22, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x3a, 0x6e, 0x73, 0x3a, 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x22, 0x20, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x74, 0x6b, 0x3d, 0x22, 0x58, 0x4d, 0x50, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x35, 0x2e, 0x34, 0x2e, 0x30, 0x22, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x72, 0x64, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x31, 0x39, 0x39, 0x39, 0x2f, 0x30, 0x32, 0x2f, 0x32, 0x32, 0x2d, 0x72, 0x64, 0x66, 0x2d, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2d, 0x6e, 0x73, 0x23, 0x22, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x64, 0x66, 0x3a, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x3d, 0x22, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x74, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x69, 0x66, 0x66, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x22, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x78, 0x6d, 0x70, 0x3a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x6f, 0x6c, 0x3e, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x61, 0x64, 0x79, 0x3c, 0x2f, 0x78, 0x6d, 0x70, 0x3a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x6f, 0x6c, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x66, 0x66, 0x3a, 0x4f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x31, 0x3c, 0x2f, 0x74, 0x69, 0x66, 0x66, 0x3a, 0x4f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x3e, 0xa, 0x3c, 0x2f, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x3e, 0xa, 0x29, 0x2e, 0xcd, 0x3d, 0x0, 0x0, 0x2, 0x34, 0x49, 0x44, 0x41, 0x54, 0x38, 0x11, 0x8d, 0x93, 0xbd, 0x6b, 0x54, 0x41, 0x14, 0x47, 0xdf, 0x6e, 0x36, 0x51, 0x8b, 0xa0, 0x9d, 0x44, 0x8b, 0x10, 0xb4, 0x10, 0xac, 0x4, 0xb1, 0x52, 0x50, 0x10, 0x8b, 0x80, 0x76, 0x36, 0x16, 0xfe, 0x7, 0xda, 0x5a, 0x58, 0x8b, 0xad, 0x88, 0x20, 0x16, 0x82, 0x36, 0x36, 0x12, 0x10, 0x24, 0xda, 0x89, 0x48, 0x10, 0x92, 0x42, 0xc1, 0x2e, 0x5a, 0xaa, 0x85, 0x22, 0x2a, 0x4a, 0xd4, 0xe8, 0xee, 0xbe, 0x9c, 0x33, 0x6f, 0xee, 0x63, 0xb2, 0x1b, 0xd4, 0xb, 0xe7, 0xdd, 0x3b, 0x77, 0x66, 0x7e, 0xef, 0xce, 0x57, 0x55, 0x61, 0x75, 0x5d, 0x77, 0xb3, 0x9f, 0xd0, 0x6f, 0x65, 0x8c, 0x49, 0x7d, 0xf8, 0x39, 0xb8, 0xb, 0xef, 0xe0, 0x3b, 0x2c, 0xc3, 0xf9, 0x98, 0x43, 0x7c, 0x6, 0xe, 0xa4, 0x36, 0xc1, 0x7d, 0x38, 0x6e, 0x3, 0x3f, 0x5, 0xe9, 0x47, 0xa9, 0xb3, 0xc9, 0x85, 0xe8, 0x41, 0xfa, 0xbe, 0xc0, 0x56, 0xf6, 0x80, 0xe4, 0x4b, 0x58, 0x84, 0x6d, 0xa, 0xed, 0x86, 0x3e, 0xfc, 0x84, 0x13, 0x85, 0xd8, 0x24, 0xed, 0x2e, 0x74, 0x8a, 0xdc, 0x12, 0x6d, 0x6d, 0xd, 0xfa, 0x43, 0xc, 0xff, 0x1b, 0xfe, 0x80, 0xe6, 0xa, 0xae, 0xc2, 0x39, 0x85, 0x67, 0x21, 0x55, 0xd1, 0x8c, 0xab, 0x2f, 0xd3, 0xee, 0x15, 0x62, 0x29, 0x26, 0x77, 0x18, 0x14, 0x1a, 0x64, 0x41, 0xe3, 0x1c, 0xa6, 0xfc, 0x2f, 0xda, 0xda, 0x2b, 0x98, 0x4b, 0xf3, 0x9, 0x56, 0xcd, 0x60, 0x56, 0xae, 0xbd, 0x81, 0x8b, 0xb0, 0xb7, 0xf8, 0xc1, 0x31, 0x3b, 0xb0, 0x41, 0x26, 0x9, 0x13, 0xeb, 0xa3, 0x62, 0x75, 0xb6, 0xc7, 0x1c, 0xab, 0x3e, 0xb, 0x9a, 0x3, 0x5c, 0x5a, 0xd8, 0x57, 0x82, 0x27, 0x70, 0x5, 0x6e, 0xe4, 0x64, 0x2b, 0x98, 0x57, 0x68, 0x3a, 0xe6, 0x3c, 0x56, 0x94, 0x76, 0xaf, 0xc7, 0xc7, 0xaa, 0x76, 0xc0, 0x23, 0x98, 0x87, 0x1, 0xf4, 0xa1, 0x86, 0x9d, 0xe0, 0xbe, 0xa7, 0xbd, 0x57, 0xa1, 0xd3, 0x69, 0xb7, 0xbc, 0x22, 0x76, 0x4c, 0x69, 0x6b, 0xb9, 0x31, 0x74, 0xff, 0xd6, 0xe1, 0x16, 0x78, 0x13, 0xdc, 0x8a, 0x5e, 0x31, 0x61, 0x48, 0xce, 0x1f, 0x69, 0x5d, 0xf2, 0x9b, 0x6e, 0x8b, 0xc9, 0xe6, 0x5f, 0xed, 0xf, 0x56, 0xcd, 0x61, 0x13, 0xe, 0xfe, 0x44, 0x70, 0x1b, 0xa6, 0x60, 0x58, 0x88, 0xd2, 0xac, 0x3a, 0x4c, 0x9c, 0xc4, 0x5b, 0xc0, 0x98, 0x68, 0x1a, 0xd0, 0x54, 0x1d, 0x7d, 0xcb, 0xe6, 0xb0, 0x66, 0x25, 0x4c, 0x9e, 0x86, 0xa7, 0x10, 0xe6, 0x1, 0xb5, 0x7b, 0xf9, 0x8f, 0x38, 0xe, 0xfc, 0x3d, 0xe3, 0x76, 0x25, 0x55, 0xdf, 0x1, 0x8d, 0xb8, 0xfc, 0x33, 0xc4, 0x37, 0xc1, 0x3b, 0xaa, 0xfd, 0xaf, 0xf8, 0x7a, 0x33, 0xbc, 0xbe, 0x96, 0x45, 0x9b, 0xd7, 0x4b, 0x32, 0x84, 0x4f, 0x12, 0x7f, 0x0, 0x85, 0xbd, 0x1d, 0x9b, 0x84, 0xf3, 0xd, 0x18, 0x5d, 0x45, 0x54, 0xfb, 0x8d, 0xf1, 0xb3, 0x6d, 0xb5, 0x6, 0x1a, 0xc9, 0x74, 0xd4, 0xf8, 0x3b, 0xd0, 0x5a, 0xf9, 0x10, 0x48, 0x8e, 0x8a, 0xda, 0x8e, 0x6a, 0x2f, 0x64, 0x9d, 0xf6, 0x61, 0x25, 0x51, 0x6, 0xb4, 0x9, 0xe2, 0x4b, 0xf0, 0x2, 0x3e, 0x43, 0x3c, 0xad, 0x52, 0xd4, 0xb4, 0xab, 0x89, 0x97, 0xb6, 0x90, 0xaa, 0x2b, 0xa, 0x8c, 0xf6, 0x98, 0x67, 0x92, 0xcf, 0xf7, 0x35, 0x68, 0xb1, 0x5c, 0xc5, 0x15, 0xf4, 0x31, 0x44, 0xee, 0x21, 0x71, 0x6c, 0x65, 0xdc, 0x8c, 0x46, 0x8f, 0x8e, 0x3d, 0xb0, 0xf, 0xf6, 0xc3, 0x69, 0xb8, 0x7, 0x3f, 0x40, 0x73, 0xaf, 0x15, 0x51, 0x4c, 0x14, 0xf, 0xbb, 0x1e, 0x15, 0x91, 0x68, 0xe, 0x2c, 0x12, 0x7a, 0x92, 0x87, 0x60, 0x1, 0xa2, 0xa, 0xc2, 0xbf, 0xda, 0x33, 0x7a, 0x4f, 0x85, 0x6, 0xf1, 0xb8, 0x28, 0x9d, 0x71, 0x68, 0xfa, 0xa3, 0xe0, 0x84, 0x23, 0xe0, 0x9, 0xcf, 0x80, 0xaf, 0xee, 0x23, 0xbc, 0x85, 0x15, 0x58, 0xe4, 0x1, 0x3d, 0xc7, 0x5b, 0x90, 0x4b, 0xf7, 0x89, 0x8f, 0x3e, 0x6b, 0xbb, 0xab, 0xd, 0x23, 0x5c, 0xa6, 0xb2, 0xce, 0x6d, 0xd4, 0xea, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; - - - - + (NSData *)twitter_icon_png { - return [NSData dataWithBytes:twitter_icon_png length:sizeof(twitter_icon_png)]; - } - @end diff --git a/ParseUI/ParseUIDemo/Classes/AppDelegate.m b/ParseUI/ParseUIDemo/Classes/AppDelegate.m index 1f7ccd8a3..8ea22be75 100644 --- a/ParseUI/ParseUIDemo/Classes/AppDelegate.m +++ b/ParseUI/ParseUIDemo/Classes/AppDelegate.m @@ -23,8 +23,6 @@ #import "PFUIDemoViewController.h" @import ParseCore; -@import ParseTwitterUtils; -@import ParseFacebookUtilsiOS; @implementation AppDelegate @@ -34,9 +32,6 @@ @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [Parse setApplicationId:@"UdNpOP2XFoEiXLZEBDl6xONmCMH8VjETmnEsl0xJ" clientKey:@"wNJFho0fQaQFQ2Fe1x9b67lVBakJiAtFj1Uz30A9"]; - [PFFacebookUtilsDevice initializeFacebookWithApplicationLaunchOptions:launchOptions]; - [PFTwitterUtils initializeWithConsumerKey:@"3Q9hMEKqqSg4ie2pibZ2sVJuv" - consumerSecret:@"IEZ9wv2d1EpXNGFKGp7sAGdxRtyqtPwygyciFZwTHTGhPp4FMj"]; self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:[[PFUIDemoViewController alloc] init]]; @@ -49,16 +44,6 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( return YES; } -- (BOOL)application:(UIApplication *)application - openURL:(NSURL *)url - sourceApplication:(NSString *)sourceApplication - annotation:(id)annotation { - return [[FBSDKApplicationDelegate sharedInstance] application:application - openURL:url - sourceApplication:sourceApplication - annotation:annotation]; -} - #pragma mark - #pragma mark Test Data diff --git a/ParseUI/ParseUIDemo/Classes/PFUIDemoViewController.m b/ParseUI/ParseUIDemo/Classes/PFUIDemoViewController.m index 552f99b86..c053dbe54 100644 --- a/ParseUI/ParseUIDemo/Classes/PFUIDemoViewController.m +++ b/ParseUI/ParseUIDemo/Classes/PFUIDemoViewController.m @@ -55,8 +55,6 @@ typedef NS_ENUM(uint8_t, PFUIDemoType) { PFUIDemoTypeLogInPasswordForgotten, PFUIDemoTypeLogInDone, PFUIDemoTypeLogInEmailAsUsername, - PFUIDemoTypeLogInFacebook, - PFUIDemoTypeLogInFacebookAndTwitter, PFUIDemoTypeLogInAll, PFUIDemoTypeLogInAllNavigation, PFUIDemoTypeLogInCustomizedLogoAndBackground, @@ -129,8 +127,6 @@ - (void)viewDidLoad { @"Log In Password Forgotten", @"Log In Done Button", @"Log In Email as Username", - @"Log In Facebook", - @"Log In Facebook and Twitter", @"Log In All", @"Log In All as Navigation", @"Log In Customized Background", @@ -272,30 +268,12 @@ - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath [self presentViewController:logInController animated:YES completion:nil]; break; } - case PFUIDemoTypeLogInFacebook: { - PFLogInViewController *logInController = [[PFLogInViewController alloc] init]; - logInController.fields = (PFLogInFieldsUsernameAndPassword - | PFLogInFieldsFacebook - | PFLogInFieldsDismissButton); - logInController.delegate = self; - [self presentViewController:logInController animated:YES completion:nil]; - break; - } - case PFUIDemoTypeLogInFacebookAndTwitter: { - PFLogInViewController *logInController = [[PFLogInViewController alloc] init]; - logInController.fields = PFLogInFieldsFacebook | PFLogInFieldsTwitter | PFLogInFieldsDismissButton; - logInController.delegate = self; - [self presentViewController:logInController animated:YES completion:nil]; - break; - } case PFUIDemoTypeLogInAll: { PFLogInViewController *logInController = [[PFLogInViewController alloc] init]; logInController.fields = (PFLogInFieldsUsernameAndPassword | PFLogInFieldsLogInButton | PFLogInFieldsPasswordForgotten | PFLogInFieldsApple - | PFLogInFieldsFacebook - | PFLogInFieldsTwitter | PFLogInFieldsSignUpButton | PFLogInFieldsDismissButton); logInController.delegate = self; @@ -315,8 +293,6 @@ - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath logInController.fields = (PFLogInFieldsUsernameAndPassword | PFLogInFieldsLogInButton | PFLogInFieldsPasswordForgotten - | PFLogInFieldsFacebook - | PFLogInFieldsTwitter | PFLogInFieldsSignUpButton | PFLogInFieldsDismissButton); logInController.delegate = self; @@ -332,7 +308,7 @@ - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath } case PFUIDemoTypeLogInCustomizedLogoAndBackground: { PFLogInViewController *logInController = [[CustomLogInViewController alloc] init]; - logInController.fields = PFLogInFieldsDefault | PFLogInFieldsFacebook | PFLogInFieldsTwitter; + logInController.fields = PFLogInFieldsDefault; logInController.delegate= self; PFSignUpViewController *signUpController = [[CustomSignUpViewController alloc] init]; diff --git a/ParseUI/ParseUIDemo/Other/Info.plist b/ParseUI/ParseUIDemo/Other/Info.plist index b237c9e95..6bad7e063 100644 --- a/ParseUI/ParseUIDemo/Other/Info.plist +++ b/ParseUI/ParseUIDemo/Other/Info.plist @@ -33,44 +33,12 @@ CFBundleVersion 1.1.1 - FacebookAppID - 1515945585583756 - FacebookClientToken - 5c2983cb4d07b0693935a24faeb6fe35 - LSApplicationQueriesSchemes - - fbapi - fb-messenger-api - fbauth2 - fbshareextension - LSRequiresIPhoneOS NSAppTransportSecurity NSExceptionDomains - akamaihd.net - - NSExceptionRequiresForwardSecrecy - - NSIncludesSubdomains - - - facebook.com - - NSExceptionRequiresForwardSecrecy - - NSIncludesSubdomains - - - fbcdn.net - - NSExceptionRequiresForwardSecrecy - - NSIncludesSubdomains - - local NSIncludesSubdomains diff --git a/ParseUI/ParseUIDemo/Swift/AppDelegate.swift b/ParseUI/ParseUIDemo/Swift/AppDelegate.swift index 34d465a11..4d951a50c 100644 --- a/ParseUI/ParseUIDemo/Swift/AppDelegate.swift +++ b/ParseUI/ParseUIDemo/Swift/AppDelegate.swift @@ -21,8 +21,6 @@ import UIKit import ParseCore -import ParseFacebookUtilsiOS -import ParseTwitterUtils @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { @@ -33,8 +31,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool { Parse.setApplicationId("UdNpOP2XFoEiXLZEBDl6xONmCMH8VjETmnEsl0xJ", clientKey: "wNJFho0fQaQFQ2Fe1x9b67lVBakJiAtFj1Uz30A9") - PFFacebookUtilsDevice.initializeFacebook(applicationLaunchOptions: launchOptions) - PFTwitterUtils.initialize(withConsumerKey: "3Q9hMEKqqSg4ie2pibZ2sVJuv", consumerSecret: "IEZ9wv2d1EpXNGFKGp7sAGdxRtyqtPwygyciFZwTHTGhPp4FMj") window = UIWindow(frame: UIScreen.main.bounds) window?.rootViewController = UINavigationController(rootViewController: UIDemoViewController()) window?.makeKeyAndVisible() @@ -46,10 +42,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate { return true } - func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool { - return ApplicationDelegate.shared.application(application, open:url, sourceApplication: sourceApplication, annotation: annotation) - } - // MARK: Test Data private func setupTestData() { diff --git a/ParseUI/ParseUIDemo/Swift/UIDemoViewController.swift b/ParseUI/ParseUIDemo/Swift/UIDemoViewController.swift index e4c4fa154..11739cfdd 100644 --- a/ParseUI/ParseUIDemo/Swift/UIDemoViewController.swift +++ b/ParseUI/ParseUIDemo/Swift/UIDemoViewController.swift @@ -30,8 +30,6 @@ enum UIDemoType : Int { case LogInPasswordForgotten case LogInDone case LogInEmailAsUsername - case LogInFacebook - case LogInFacebookAndTwitter case LogInAll case LogInAllNavigation case LogInCustomizedLogoAndBackground @@ -81,10 +79,6 @@ extension UIDemoType : CustomStringConvertible { return "Log In Done Button" case .LogInEmailAsUsername: return "Log In Email as Username" - case .LogInFacebook: - return "Log In Facebook" - case .LogInFacebookAndTwitter: - return "Log In Facebook and Twitter" case .LogInAll: return "Log In All" case .LogInAllNavigation: @@ -201,20 +195,10 @@ extension UIDemoViewController { logInViewController.fields = [.usernameAndPassword, .logInButton, .signUpButton, .dismissButton] logInViewController.emailAsUsername = true present(logInViewController, animated: true, completion: nil) - case .LogInFacebook: - let logInViewController = PFLogInViewController() - logInViewController.delegate = self - logInViewController.fields = [.usernameAndPassword, .facebook, .dismissButton] - present(logInViewController, animated: true, completion: nil) - case .LogInFacebookAndTwitter: - let logInViewController = PFLogInViewController() - logInViewController.delegate = self - logInViewController.fields = [.facebook, .twitter, .dismissButton] - present(logInViewController, animated: true, completion: nil) case .LogInAll: let logInViewController = PFLogInViewController() logInViewController.delegate = self - logInViewController.fields = [.usernameAndPassword, .passwordForgotten, .logInButton, .facebook, .twitter, .signUpButton, .dismissButton] + logInViewController.fields = [.usernameAndPassword, .passwordForgotten, .logInButton, .signUpButton, .dismissButton] if let signUpController = logInViewController.signUpController { signUpController.delegate = self signUpController.fields = [.usernameAndPassword, .email, .additional, .signUpButton, .dismissButton] @@ -223,7 +207,7 @@ extension UIDemoViewController { case .LogInAllNavigation: let logInViewController = PFLogInViewController() logInViewController.delegate = self - logInViewController.fields = [.usernameAndPassword, .passwordForgotten, .logInButton, .facebook, .twitter, .signUpButton, .dismissButton] + logInViewController.fields = [.usernameAndPassword, .passwordForgotten, .logInButton, .signUpButton, .dismissButton] if let signUpViewController = logInViewController.signUpController { signUpViewController.delegate = self signUpViewController.fields = [.usernameAndPassword, .email, .additional, .signUpButton, .dismissButton] @@ -232,7 +216,7 @@ extension UIDemoViewController { case .LogInCustomizedLogoAndBackground: let logInViewController = CustomLogInViewController() logInViewController.delegate = self - logInViewController.fields = [.default, .facebook, .twitter] + logInViewController.fields = [.default] let signUpViewController = CustomSignUpViewController() signUpViewController.delegate = self diff --git a/Rakefile b/Rakefile index 154e24945..26001e5a6 100644 --- a/Rakefile +++ b/Rakefile @@ -201,46 +201,6 @@ namespace :test do end end - namespace :facebook_utils do - desc 'Test iOS FacebookUtils framework.' - task :ios do - task = XCTask::BuildTask.new do |t| - t.directory = script_folder - t.workspace = 'Parse.xcworkspace' - t.scheme = 'ParseFacebookUtilsV4-iOS' - t.sdk = 'iphonesimulator' - t.destinations = [ios_simulator] - t.configuration = 'Debug -enableCodeCoverage YES' - t.actions = [XCTask::BuildAction::TEST] - t.formatter = XCTask::BuildFormatter::XCPRETTY - end - unless task.execute - puts 'Failed to build iOS FacebookUtils Framework.' - exit(1) - end - end - end - - namespace :twitter_utils do - desc 'Test iOS TwitterUtils framework.' - task :ios do - task = XCTask::BuildTask.new do |t| - t.directory = script_folder - t.workspace = 'Parse.xcworkspace' - t.scheme = 'ParseTwitterUtils-iOS' - t.sdk = 'iphonesimulator' - t.destinations = [ios_simulator] - t.configuration = 'Debug -enableCodeCoverage YES' - t.actions = [XCTask::BuildAction::TEST] - t.formatter = XCTask::BuildFormatter::XCPRETTY - end - unless task.execute - puts 'Failed to build iOS TwitterUtils Framework.' - exit(1) - end - end - end - namespace :parseui do task :all do Rake::Task['test:parseui:framework'].invoke